web-dev-qa-db-ja.com

通常のユーザーのsshキーを使用してコマンド(gitなど)を使用する方法(Sudoファイルのアクセス許可)

次のようにプロジェクトを複製できます。

$ git clone [email protected]:root/myproject.git ~/bla

しかし、私はそれを/var/wwwに複製したいと思います。だから私は

$ git clone [email protected]:root/myproject.git ~/var/www

残念ながら、私には/var/wwwへの書き込み権限がありません。須藤さんが助けに!

$ Sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:

これは何ですか?パスワードを求められますか?悪意のあるパスワードは必要ありません。

Rootユーザーのsshキーをリクエストと共に送信しているのは明らかです。これらのキーはgitリポジトリにインポートされていないため、拒否されています。これまでの私の解決策は、一時的にフォルダのアクセス許可を変更するか、最初にアクセス可能な場所にそれを複製してから、Sudoを使用して移動することでしたが、そのための正しい方法を学びたいと考えています。

では、通常のユーザーのsshキーでgitを使用するにはどうすればよいですか。

4
user1032531

sshエージェントを実行している場合は、次のようにします。

Sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...

これは基本的に、gitによって開始されたrootコマンドに、sshエージェントを使用するように指示します(またはgitコマンドによって開始されたsshコマンド)。 (それに接続する方法。どのrootにもすべての権限があるため、これに接続できるはずです)。

Sshエージェントを実行していない場合は、事前に次のコマンドで開始できます。

eval "$(ssh-agent)"

(そして、必要に応じてssh-addでそれにキーを追加します)。

別の方法として、

Sudo -E git clone...

every環境変数を$SSH_AUTH_SOCKだけでなく、Sudo全体に渡します。

私はnot @ NgOon-Eeのコメントで$SSH_AUTH_SOCKenv_keepリストに追加するというコメントを得ました。一般に、rootの環境は、サービスを開始するユーザーであるため、汚染しないようにします。たとえば、Sudo sshdを開始してsshdサービスを開始すると、そのサービスを通じて開始されたすべてのsshセッションが$SSH_AUTH_SOCKを継承し、ユーザー環境を汚染できるもので汚染し、使用しないでください。 root以外のターゲットユーザーでも、ターゲットユーザーがその認証エージェントを利用できなかったため、変数を渡しても意味がありません。

現在は、キー認証のみに対応しています。 rootにも~/.ssh/configの設定を継承させたい場合は、ssh環境変数ではできませんが、git環境ではできます。変数。たとえば、sugit関数を次のように定義します。

sugit() {
  Sudo "GIT_SSH_COMMAND=
    exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
             -o User=$LOGNAME \
             -F ~$LOGNAME/.ssh/config" git "$@"
}

つまり、ルートの代わりにssh設定ファイルとエージェントおよびユーザー名を使用するgitコマンドを使用するようにsshに指示します。

または、もっと良いのは、gitに元のユーザーとしてsshを実行するように伝えることです。

sugit() {
  Sudo "GIT_SSH_COMMAND=
    exec Sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}
3

Sudoを実行しているユーザーがキーファイル(またはソケット)を読み取れない場合、ファイル(またはソケット)のアクセス許可は複雑になる可能性があります。これには、rootにアクセス権がないネットワーク共有にファイルが存在する場合、またはホームディレクトリを暗号化してrootアクセスを再び拒否する場合に、rootが最も確実に含まれます。

拡張ACLをサポートするUnixシステムでのもう1つの方法は、それらを使用することです。この場合、通常の基本アクセス権に加えて追加の書き込みアクセス権を付与できます。

$ Sudo chown Apache:www /var/www/html
$ Sudo chmod g+s /var/www/html
$ Sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 Apache www 25 Nov 21 19:42 /var/www/html
$ 

しかし、webeditグループは、setfaclのおかげで権限を持っています

$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 Apache www   25 Nov 21 19:42 .
drwxr-xr-x  4 root   root  31 Oct 19 20:39 ..
drwxrwsr-x  3 jdoe   www   14 Nov 21 19:42 a
drwxrwsr-x  8 jdoe   www  152 Nov 21 19:42 .git
$ 

ただし、拡張ACLにはさまざまな問題があります。たとえば、バックアップソフトウェアがそれらをどのように処理するかを確認します。

0
thrig