web-dev-qa-db-ja.com

github deploy keys:単一のマシンに対して複数のリポジトリを承認するにはどうすればよいですか

それで、私にはホストがあり、それをrobと呼びます。 robでssh-keygenを使用して公開鍵を取得しました。これは、リポジトリcheechの新しいデプロイキーの追加画面でgithubに提供しました。次に、chongrobにデプロイしたいと思います。しかし、githubのリポジトリchongの新しいデプロイキーの追加画面に移動し、robで生成した公開キーを貼り付けると、key already in use。それらのキーが使用されている場合、chongrobに複製できると思いましたが、それは許可が拒否されたことを示しています。

明らかに、これは思ったよりも複雑で、複数のキーなどがあることを意味します。 chongrobのクローンを作成するにはどうすればよいですか?

ご協力ありがとうございました。

36
user1552512

あるキーがデプロイキーとして1つのリポジトリにアタッチされると、そのキーを別のリポジトリで使用することはできません。デプロイキーの設定中にこのエラーが発生した場合は、リモートを変更し、~/.ssh/configファイルを設定して存在しないgithub.comホスト名。sshはリポジトリの正しいsshデプロイキーを選択するために使用できます。

# first we remove the Origin
$ git remote -v
Origin  [email protected]:username/foo.git (fetch)
Origin  [email protected]:username/foo.git (Push)
$ git remote rm Origin

# here we add a new Origin using a Host nickname called
# foo.github.com that we will reference with a Host stanza in our
# ~/.ssh/config to specify which key to use with which fake hostname.
$ git remote add Origin [email protected]:username/foo.git
$ git remote -v
Origin  [email protected]:username/foo.git (fetch)
Origin  [email protected]:username/foo.git (Push)

リポジトリのデプロイキーを生成し、次のような適切な名前を付けます。

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa-foo -C https://github.com/username/foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa-foo.
Your public key has been saved in /home/username/.ssh/id_rsa-foo.pub.
The key fingerprint is:
c0:ff:ee:34:24:11:5e:6d:7c:4c:b1:a0:de:ad:be:ef https://github.com/username/foo
The key's randomart image is:
+--[ RSA 2048]----+
|  E   o..o.oo.   |
| M o o o .+CoW   |
|  + o = o. ..    |
| .   . +         |
|        S        |
|       o .       |
|        +        |
|       . o       |
|        ..o.     |
+-----------------+

デプロイキーを追加 したら、次のスタンザを~/.ssh/configファイルに追加する必要があります。

Host fake-hostname-foo.github.com
    Hostname github.com
    IdentityFile ~/.ssh/id_rsa-foo

これでテストできます:

$ ssh -T [email protected]
Hi username! You've successfully authenticated, but GitHub
does not provide Shell access.
65
aculich

私が見つけた最も簡単な解決策は概説されました ここ

1)次のコマンドを入力します(必要な数のキーに対してこれを実行します):

ssh-keygen -t rsa -C "[email protected]"

2)以下のステートメントでプロンプトが表示されたら、一意の名前(つまり、foo1_rsa)を入力します。ファイルは現在のディレクトリに作成され、整頓したい場合は.sshに移動する必要がある場合があります。

キーを保存するファイルを入力してください(/Users/you/.ssh/id_rsa):[Enterキーを押します]

3)SSH構成ファイルを更新します。

vi〜/ .ssh/config

空の可能性があります:

Host cheech github.com
Hostname github.com
IdentityFile ~/.ssh/foo1_rsa

Host chong github.com
Hostname github.com
IdentityFile ~/.ssh/foo2_rsa
11
Naruto Sempai

Githubのデプロイキーは一意です...他のリポジトリの新しいキーを生成する必要があります。もう一度ssh-keygenを実行してください

これについてはgithubのドキュメントを参照してください: https://help.github.com/articles/managing-deploy-keys

3
klaustopher

GitHubアカウントのすべてのプライベートリポジトリへのrobアクセスを許可する場合は、cheechからデプロイキーとしてキーを削除し、SSHキーとして追加できます。 GitHubアカウント全体。これにより、robcheechchongの両方へのアクセス権が付与されます。

アカウントにrobにアクセスさせたくない他のリポジトリがある場合、これは機能しません。

より細かい制御が必要な場合は、robに追加のキーを生成し、それらを特定のリポジトリーへのデプロイキーとして割り当てる必要があります。

2
Nathan

私はこれが5歳以上であることを知っていますが、この人気のある質問に対する回答は受け入れられていないため、清潔さと将来の読みやすさを考慮した最善の方法を以下に示します:


導入ユーザーをチームに追加します

ステップ1:新しいdeployユーザーの組織のドメインに新しいメールアドレスを作成します。 [email protected]のようなもの。

ステップ2:そのメールボックスを使用して新しいGitHubアカウントを作成します( GitHubがこれらの「マシンユーザー」を呼び出します )ユーザー名を指定しますdeploy-ExampleOrganisationのように、その役割は明確です。

ステップ3:次のようなコマンドを使用して、サーバーに "deploy"というユーザーを作成します。

useradd -d /home/deploy -m deploy

パスフレーズを指定せず、/ home/deploy/.ssh/id_rsaをファイルの場所として指定して、deploy @ servernameのSSHキーを生成します:

ssh-keygen -t rsa -b 4096 -C "deploy@servername"

/ home/deploy/.ssh/id_rsa.pubのコンテンツを新しいdeploy-ExampleOrganisationGitHubにSSHキーとして追加しますアカウント:設定> SSHおよびGPGキー>新しいSSHキーに移動します。

ステップ4: "Read-only deploy users"、新しいユーザーをチームに追加し、展開するすべてのリポジトリへの読み取りアクセス権をチームに付与します。 (組織アカウントを持っていない場合でも、このユーザーに複数のプライベートリポジトリへのアクセス権を与えることができます)

ステップ5:独自のパーソナルマシンのSSHキーを追加して、ユーザーの承認済みキーファイルをデプロイします(/ home/deploy/.ssh/authorized_keys)コードをデプロイするときに、ユーザー(またはデプロイスクリプト)がdeployとしてログインできるようにします。

ブーム!それだけです...これで、クリーンで自己文書化されたフローが完成しました。


P.S。私はaculichの非常に高い投票の答えを試しましたが、偽のホスト名をいじくりまわしていたので、数年後にこれに戻ってきたら、すべてのキーを作成する方法を簡単に理解して、その方法を理解できると思いましたそのSSH構成ファイルは、これらの面白い存在しないリモートアドレスを機能させますか?おそらくそうではありません!

偽のホスト名メソッドに対するデプロイユーザーの利点:

  • ハックなし!これは、明確な名前を持つ標準のユーザーアカウントであり、実際のホスト名を介してリポジトリにアクセスします。
  • 浮遊するキーが少なくなります。
  • 追加のサーバーに移動する場合、または追加のサーバーにデプロイするときに、すべてのサーバーのアカウントを簡単にデプロイできます。GitHubアカウントに新しいキーを1つ追加するだけで、新しいサーバーのアカウントでコードをデプロイする準備が整います。
  • デプロイユーザーには、チームにリストされているリポジトリのみへの低い権限の読み取り専用アクセス権があり、個人のSSHキーはサーバーに保持されないため、悪意のあるユーザーがサーバーにアクセスした場合、すべてのリポジトリを破壊することはできません同じように。
  • 展開ツールの構成ファイル(例:カピストラーノ)は、これらの紛らわしい偽のホスト名が含まれていることで汚れることはありません。 (私がその方法で本当に不快になったのは、サーバーを超えて広がり始めたときでした。)
  • ファイルの所有権によってデプロイユーザーls -laに誘導される何年も前にこれを行った方法を忘れた場合、SSHキーによりGitHubアカウント名ssh -T [email protected]に誘導され、うまくいけば、完全に再びスピードアップ。
  • そして最後に... GitHubが推奨する方法です。
2
Martin Joiner

Pimkinのアイデアは素晴らしかったが、nodeをこれだけのためにインストールしたくなかったので、bashに同様のものを作成しました。

https://Gist.github.com/blvz/8eeebacae11011c25fc79eff12f49ae9

インストールして使用:

curl https://Gist.githubusercontent.com/blvz/8eeebacae11011c25fc79eff12f49ae9/raw/6f2f7f3709a0fe852d8a3a5bb125325e3ffbc7d8/gh-deploy-clone.sh > /usr/local/bin/gh-deploy-clone
chmod +x /usr/local/bin/gh-deploy-clone

gh-deploy-clone user/repo

# You can also give it a name, in case
# you have multiple deploy targets:

gh-deploy-clone user/repo staging
2
blvz

小さなnpmモジュール github-add-key を使用すると、複数のGitHubデプロイキーの管理が簡単になります。 this で説明されているアプローチを使用しているため、必要なのは

$ github-add-key rob/chong

ローカルでクローンされたrob/chongと簡単な自動化プロセスに従ってください。

1
Vassiliy Pimkin

ここでは良い答えや簡単な答えは見たことがなかったので、自分の解決策を投入すると思いました。ドメイン名を変更したり、ラッパースクリプトを使用したり、キーリングをねじ込んだり、.ssh設定ファイルをいじったりする必要がある場合、私は答えが好きではありません。 SSHはgitのトランスポートにすぎないので、重要なsshフォルダーと構成をハックと設定でいっぱいにして、一度設定したら気にせず、リポジトリごとに1つしか持たない複数のデプロイキーを使用したくありません。これはgit configである必要があります-そうです。

さらに、資格情報をリポジトリの.gitフォルダーに保存しないでください。リポジトリフォルダーを削除すると、デプロイキーが削除されます。

/ tmp/deploy_keyがプライベートデプロイキーの初期(一時)ロケーションであると想定します。

# Initial clone of repo    
GIT_SSH_COMMAND="ssh -i /tmp/deploy_key" git clone [email protected]:folder/reponame.git

# cd to the folder to assure we only change config for the repo instead of user/global.
cd reponame
# Could probably just mv instead of cp/chmod/rm the key but lets be precise
cp /tmp/deploy_key ./.git/deploy_key
chmod 600 ./.git/deploy_key
rm /tmp/deploy_key

# This is the magic - note the backslash escaping the $ as PWD is always the repo's
# folder when pulling or pushing etc... and at git (run) command time $PWD is the
# repo's root folder.
git config core.sshCommand "ssh -i \$PWD/.git/deploy_key"

もちろん、キーを別の場所に保存し、$ PWDなしの絶対パスをデプロイキーに使用することもできます。

# Initial clone of repo    
GIT_SSH_COMMAND="ssh -i /path/to/a/deploy_key" git clone [email protected]:folder/reponame.git
# cd to repo to configure only for this repo
cd reponame
git config core.sshCommand "ssh -i /path/to/a/deploy_key"

しかし、私はそれをリポジトリの内部.gitフォルダーに保持することを好むので、リポジトリのフォルダーを削除した場合、保持されている認証情報がないことがわかり、結局、デプロイキーごとに1つのリポジトリしか持てません。

0
Jimmy

Sshラッパーを作成してGIT_SSHとして渡すこともできます。このオプションには、gitリモートを変更する必要がないという利点があります。 https://stackoverflow.com/a/14221028/3461

0
Benjamin Atkin