web-dev-qa-db-ja.com

SSHは、グループが読み取り可能な権限を持つキーの使用を許可していません

liveブランチがプッシュされたときにライブサーバーにデプロイする開発gitサーバーがあります。すべてのユーザーが独自のログインを持っているため、ライブデプロイを行うpost-receiveフックは自分のユーザーで実行してください。

ユーザーの公開キーをリモートライブサーバーの承認済みキーとして維持する必要がないので、リモートライブサーバーに追加するためにgitシステムに属する一連のキーを作成しました( post-receiveフック$GIT_SSHを使用して-iオプションで秘密鍵を設定しています)


私の問題は、すべてのユーザーがライブで展開したい場合があるため、gitシステムの秘密鍵は少なくともグループが読み取り可能である必要があり、SSHは本当にこれを好まないということです。

エラーのサンプルは次のとおりです。

XXXX@XXXX /srv/git/identity % ssh -i id_rsa XXXXX@XXXXX
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: id_rsa

私はsshに接続を強制する方法で何かを見つけることを期待して周りを見回しましたが、1人のユーザー以外にはアクセスを許可すべきでないと盲目的に言っている人しか見つかりませんでした。

9
Jessie Ross

これが、シンプルで安全な方法です。

Ssh転送用の新しいユーザーを作成します。これをgit-syncと呼びます。 gitリポジトリのグループメンバーシップを持つ同様のユーザーをサーバーに作成します。 sync-userの公開鍵をそのユーザーのauthorized_keys2ファイルに追加します。私はgitユーザーがすべてgitgroupのメンバーであることを想定しています。 git-syncユーザーがこのグループのメンバーでもあることを確認してください。

/ etc/sudoersファイルを編集して、次のような行を含めます。

%gitgroup ALL=(git-sync) NOPASSWD: /usr/bin/git

これにより、gitgroupグループのメンバーは、パスワードなしでgit-syncとしてコマンド/ usr/bin/bitを実行できます。

次に、このようなものをpost-receiveフックに入れます。

Sudo -u git-sync /usr/bin/git Push Origin
5
Kent Hulick

あなたは[〜#〜] can [〜#〜]あなたがキーの所有者でない限り、グループが読み取り可能なIDファイルを使用します。したがって、たとえばrootユーザーが所有するようにIDファイルを設定すると、すべてのgitリポジトリユーザーが移動するように設定されます。

これの素晴らしい利点は、Sudoが必要ないことです。解決策はより単純になります。

Rootを使用してgitリポジトリにPushしている場合、これは元の問題に再度遭遇することに注意してください。

11
Linus Swälas
Permissions 0640 for 'id_rsa' are too open.

秘密鍵は秘密にしておく必要があります。誰にもそれを読ませてはいけません。

ユーザーの公開キーをリモートライブサーバーの承認済みキーとして維持する必要がないので、リモートライブサーバーに追加するgitシステムに「属している」キーのセットを作成しました( post-receiveフック$GIT_SSHを使用して、-iオプションで秘密鍵を設定しています)

  1. devから本番サーバーにsshするためのキーペアを設定します
  2. post-receiveフックスクリプトで、次のように試してください。

    if [ "live" == "$branch" ]; then
        ssh -t user@prod "git --work-tree=... --git-dir=... checkout -f"
    fi
    
2
quanta