Git: SSH ルートログインを無効にして、ルート所有のリポジ​​トリに SSH 経由でプッシュする

Git: SSH ルートログインを無効にして、ルート所有のリポジ​​トリに SSH 経由でプッシュする

それは可能でしょうか?

要約すると、私はサーバー上で Puppet Master を実行しており、理想的には SSH 経由のルートログインを無効にし、ルートアクセスが必要な場合は sudo 経由のすべてのアクセスを強制したいと考えています。

しかし、マニフェストを管理するためにgitリポジトリを使用してPuppetをインストールしましたが、このリポジトリは現在ルートによって所有されており、現在のところ2つの解決策しか知りません。

  1. (あまり理想的ではない) キー認証のみでルート アクセスを許可します。その場合、git push コマンドのみを許可するには、何をロックすればよいでしょうか?
  2. /etc/puppet 内のリポジトリを別の所有者として所有します - これで puppet は確実に動作しますか?
  3. 関連する Sudo 設定とコマンドでこれを回避できますか?

答え1

Git リポジトリは、グループの書き込み権限を維持するように構成できます (--sharedリポジトリ作成時のオプション)。これを使用すると、リポジトリへのアクセスが必要なアカウントを特定のグループに追加して、アクセスできるようにすることができます。

私はこれを Git サーバーで実行しています。また、各ユーザーのホーム ディレクトリに、各ユーザーがアクセスできるリポジトリへのシンボリック リンクを配置して、相対 URL で全員がアクセスできるようにしています。

答え2

自分の質問に答えるために、ダニエルが提供した情報を見ましたが、一致しませんでした。git group writeを調べて、http://andyregan.net/blog/archives/504

リポジトリ グループの所有権を共通グループ (puppet) に付与し、関連するユーザーをそのグループに追加して、次を実行します。

chmod -R g+swX /etc/puppet/
cd /etc/puppet
git repo-config core.sharedRepository true

私にとっては完璧に機能しました。ルート所有のリポジ​​トリにプッシュでき、Puppet も引き続き機能し、そのためにルート ssh ログインを使用しません。

勝ち、勝ち

アップデート

私も Puppet でこの問題に遭遇しましたが、もっと良い方法で対処しようと考え、env_reset 行の後に次のコードを追加することで、sudoers 構成の適切な部分を変更してこの問題を解決しました。

Defaults    env_keep += SSH_AUTH_SOCK

これにより、次のようなコマンドを実行できます。

cd /etc/puppet && sudo git pull && sudo git submodule sync && sudo git submodule update --init --recursive

たとえば、Rakefile で (私のユーザーは既に Sudo 経由で nopasswd 権限を持っています)、すべてがそれに応じて動作します。私が達成したのは、基本的に、ssh-agent が転送した ssh キーを root ユーザーに渡し、root ユーザー (またはサーバー上の非特権アカウント) の下に ssh キーを保存せずに、非 root ユーザーとして接続しているかのように git pull を実行することです。Win Win

答え3

私が好んで行うのは、Puppet マスターに「ステージング」ベア Git リポジトリを用意し、そこにプッシュして、さまざまな pre-commit フックと post-commit フックを実行することです。pre-commit フックは Puppet 構文をチェックし (構文の正しくないコードはコミットできないようにするため)、post-commit フックは実際にコードを /etc/puppet にドロップし、Apache を再起動します (puppet 2.6 の古いキャッシュ バグを修正するため)。

プッシュするステージング領域があると、Puppet コードのデプロイ プロセスがよりアトミックになります。そうしないと、Puppetmaster が半分コミットされたコードをクライアントに提供してしまう可能性があります。

関連情報