121

Githubでは、同じsshデプロイキーを複数のプロジェクトに使用することはできません。これは、場合によっては非常に便利です(たとえば、プライベートサブモジュールを使用するプロジェクトを処理するCIサーバー)。この制限は「セキュリティ上の理由」のためにあると言っているように見えるさまざまなスレッドを見てきましたが、それがどのようなリスクをもたらすかについての説得力のある説明はまだ見ていません。

Githubがアカウントレベルのキーの再利用を許可していないという事実は理にかなっていることに注意してください(2人のユーザーがキーを共有するべきではありません)。私が質問しているのは、 DeployKeysの制限だけです。

そして明確にするために、私は回避策(ダミーユーザーを作成し、複数のキーを使用するなど)を探していませんが、キーの展開に関するこの制限のもっともらしい説明だけを探しています。

関連スレッド:

4

4 に答える 4

24

残念ながら、これはgithubがキーペアとアカウントまたはプロジェクトの違いを誤って解釈するシナリオです。

キーペアは認証と承認に使用されるため、事実上IDです。Githubアカウントは別のアイデンティティです。githubアカウントをキーペアに接続すると、githubアカウントベースのIDとキーペアIDの間に1:Nマッピングが効果的に確立されます。

逆に、githubはプロジェクトのキーペアベースのIDへの1:Nマッピングを強制します。現実世界の類似点は、多くの異なる人々がロックを解除できるプロジェクトへのアクセスを許可するドアがあるということです。しかし、それらのいずれかがドアの鍵を取得すると、他のドアのその他の鍵を取得することはできなくなります。

キーが危険にさらされた場合に違反を封じ込めるという観点から、キーを頻繁に再利用しないことは理にかなっています。しかし、それは良い管理ポリシーです。原則として、キーが複数回使用されるのを防ぐことはあまり意味がありません。決して再利用されないいくつかのドアのためのいくつかの鍵があるということ、まあ、それはポリシー次第です。


もう少し複雑なビューは、キーペアをロールとして示すことです。あなたは多くのキーペアを所有することができるので、多くの役割を担います。秘密鍵は、役割に対してユーザーを認証します。

プロジェクトへのGithubのデプロイキーマッピングでは、ロールに複数のタスクを含めることはできないと記載されています。それはめったに現実的ではありません。

もちろん、githubが許可するものを変更するものはありません。

于 2018-03-19T21:09:20.043 に答える
22

参照する回避策(単一の「ビルド」ユーザーを作成するか、id_rsa.REPONAME.pubリポジトリごとに同じユーザーを共有する)で示されている唯一の理由は、次のとおりです。

別のユーザーの公開鍵/秘密鍵の共有は避けてください

あなたの状況(複数のプロジェクトを構築する)ではそうではありませんが、同じsshキーを再利用できるようにすると、2人の異なるユーザーが同じsshキーを共有する可能性があり、認証の目的が損なわれます。

認証とは、「特定のsshキーを使用するということは、誰がそれを使用しているかを知って
いるはずだということを意味するはずです」という意味です。


GitHubページの「デプロイキーの管理」では、sshを使用したさまざまなアカウントについて詳しく説明しています。

  • SSHエージェント転送:エージェント転送は、サーバーにSSHで接続してgitコマンドを実行するときに、ローカル開発マシンにすでに設定されているSSHキーを使用します。
    サーバー上で実行されているかのように、リモートサーバーにローカルのssh-agentへのアクセスを選択的に許可できます。
    したがって、サーバー上で秘密鍵を複製する必要はありません。

  • マシンユーザー:(これは「ダミーアカウント」戦略です)ユーザーアカウントにキーを添付します。このアカウントは人間が使用することはないため、マシンユーザーと呼ばれます。
    ただし、このユーザーは人間と同じように扱い、通常のアカウントであるかのようにマシンのユーザーアカウントにキーを添付します。
    アカウントの共同編集者またはチームに、アクセスが必要なリポジトリへのアクセスを許可します。
    したがって、サーバーごとに1つずつ、1つの「マシンユーザー」に関連付けられた1つの秘密鍵。

DHaは、コメントでデプロイキーの制限数を指摘しています。また、マシンユーザーアカウントは1つしか持てません)

  • デプロイキー(GitHubリポジトリごとに1つ)サーバーに保存され、GitHub上の単一のリポジトリへのアクセスを許可するSSHキー。
    このキーは、ユーザーアカウントではなく、リポジトリに直接添付されます
    アカウント設定に移動する代わりに、ターゲットリポジトリの管理ページに移動します。
    「」に移動し、「Deploy Keys」をクリックしますAdd deploy key。公開鍵を貼り付けて送信します。

今回は、sshキーはユーザー(複数のリポジトリへのアクセスを許可できる)ではなく、1つのリポジトリに関連付けられています。複数の
リポジトリ にsshアクセスを許可することは、「マシンユーザー」に相当します。

認証に関して:

  • 複数のリポジトリに同じキーを使用することは、ユーザー(自分のアカウントに関連付けられたキーを持っている)によって行われる場合は問題ありません。
  • 誰が何にアクセスしたかがまったくわからないため、複数のリポジトリに同じキーを使用することは、キーがリポジトリによってアタッチされている場合は問題ありません。
    これは、「ユーザー」が多くのリポジトリの共同作業者として宣言されている「マシンユーザー」とは異なります。
    ここ(Deploy key)には、「コラボレーター」はなく、リポジトリに直接sshアクセスが許可されているだけです。

Yusuf Bhabhrawalaは、コメントでこのモデルの制限をさらに示しています。

これらの非常に妥当なユースケース(プライベートpipモジュールを使用するPythonプロジェクトまたはプライベートnpmパッケージを使用するノードプロジェクト)を検討してください。どちらも同じ組織内の別のリポジトリからのものです。

現在、デプロイキーまたはアカウントキー(他のリポジトリが多すぎる)を使用して、この非常に単純なユースケースをデプロイする方法はありません。

そして、Chris Stenkampは、環境変数の設定を含む「 ' 'がsshキーを検索している場所を見つける方法pip install git+ssh://...」を指摘しています。GIT_SSH_COMMAND

于 2012-11-05T07:01:18.537 に答える
3

影響を合理化するために私は多くのことを考え、このシナリオを思いつきました。

複数のリポジトリに割り当てたユーザーに対して単一のデプロイキーを作成するとします。そのキーを取り消す必要がありますが、複数の場所で使用されています。したがって、すべてのアクセスを取り消すことができる代わりに、誤って部分的なアクセスのみを取り消す可能性があります。

これはメリットのように聞こえるかもしれませんが、人的要因を考慮すると、この多対1の関係は実際には本質的に安全ではありません。これは、実際に割り当てた場所を忘れた場合に、すべてのリポジトリを調べて各公開鍵を個別に比較しないと、すべてのアクセスを本当に取り消したかどうかを確実に知ることができないためです。

非常に多くの一意のキーを割り当てて管理することは間違いなくイライラしますが、GitHubがポリシーをどのように設定したかによって、セキュリティへの影響は明らかです。キーを取り消すと、そのキーによって付与されたすべてのアクセスが取り消されることが保証されます。これは、1か所でしか使用されないためです。 。

于 2017-11-08T23:40:22.363 に答える
2

あなたは回避策を探していないと思いますが、多くのユーザーがこのページにアクセスし、簡単な解決策も望んでいると思います。リンクを投稿した回避策は、githubdocsにあるものと似ています。手動で実行すると、プロセスでエラーが発生しやすくなります。

参考までに、Bitbucket.orgにはこの制限はありません。複数のリポジトリで同じ読み取り専用アクセスキーを使用できます。これにより、複数のリポジトリを持つ単一の本番サーバーを非常に簡単に使用できます。

Githubを使い続けている場合は、実行することでリポジトリの所有者名とリポジトリ名を渡すだけのスクリプト./generateDeployKey.sh repo_owner_name repo_nameを作成しました。これにより、すべてが実行され、コピーが必要になる可能性のあるものがすべて出力されます。

以下をという名前の新しいファイルに保存しますgenerateDeployKey.sh

#!/bin/sh
# This script generates a ssh key for a single repository
# and adds a custom configuration to the users (not global) ssh config file,
# and outputs the public key for you to copy and paste as the repo deploy key
# and outputs the url for you to clone the repo on the machine.
# Github docs ref:
# https://docs.github.com/en/developers/overview/managing-deploy-keys#using-multiple-repositories-on-one-server
#
# 1. Add the script to the user account of the machine. The home directory is fine.
# 2. Make the script executable by running the following command as the user:
# chmod u+x generateDeployKey.sh
# 3. Run script like `./generateDeployKey.sh REPO_OWNER_NAME REPO_NAME` Note the space between owner and repo name. Example:
# ./generateDeployKey.sh yourname hello_world
# If you make a mistake with what you pass in, you can remove change from your ~/.ssh/config file
# by deleting the most recent "New Key Generated on...." and deleting the related .pub and private keys


# Check if user passed in both parameters
if [ -z "$1" ] || [ -z "$2" ]
then
  echo "Make sure to pass in both parameters REPO_OWNER_NAME and REPO_NAME. Example:"
  echo "./generateDeployKey.sh yourname hello_world"
else
  REPO_OWNER_NAME=$1
  REPO_NAME=$2
  KEY_PATH=~/.ssh/id_rsa.$REPO_NAME
  echo "Generating ssh key At ${KEY_PATH}"
  ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa.${REPO_NAME}
  echo "Your ssh deploy key is:"
  PUB_KEY_PATH=$KEY_PATH".pub"
  cat $PUB_KEY_PATH
  echo ""
  # Will create config if it does not exist
  echo "Updating ~/.ssh/config"
  DATE_TIME=$(date +"%Y-%m-%d at %r")
  echo "
  # New Key Generated on $DATE_TIME
  Host github.com-$REPO_NAME
    HostName github.com
    User git
    IdentityFile $KEY_PATH" >> ~/.ssh/config
  echo ""
  echo "Here is your hostname's alias to interact with the repository using SSH:"
  echo "git clone git@github.com-$REPO_NAME:$REPO_OWNER_NAME/$REPO_NAME.git"
fi
于 2021-08-09T02:25:07.570 に答える