タイトルが長い。
こんな長いタイトルでも伝えたいことの1/3も伝わらない。
もう少し正確にしたいことを書くと、
Fabricを使ってリモートホスト上で立ち上げたdockerコンテナ上でagent forwardした鍵を使って任意のユーザーでsshをしたい
だ。
まぁ一つづつ見ていきたい
fabricでagent forwardをする方法
env.forward_agent = True
...
Done
docker内でagent forwardしたソケットを利用する方法
このforwardした秘密鍵は通常、環境変数のSSH_AUTH_SOCK
にソケットのパスが設定されている
つまりdockerコンテナ内からこの環境変数内で定義されているソケットを見ることができればそのまま使えそう。
sudo('docker run --rm -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent -v ~/:/var/tmp/ <image id> ssh-add -l)
[<remo_tehost>] Executing task 'run_ssh'
[<remote_host>] sudo: docker run --rm -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent -v ~/:/var/tmp/ 568c07941a38 ssh-add -l
[<remote_host>] out: sudo password:
[<remote_host>] out: /usr/bin/docker-current: Error response from daemon: Invalid volume spec ":/ssh-agent": Invalid volume specification: ':/ssh-agent'.
[<remote_host>] out: See '/usr/bin/docker-current run --help'.
[<remote_host>] out:
Fatal error: sudo() received nonzero return code 125 while executing!
Requested: docker run --rm -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent -v ~/:/var/tmp/ 568c07941a38 ssh-add -l
Executed: sudo -S -p 'sudo password:' /bin/bash -l -c "docker run --rm -v \$SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent -v ~/:/var/tmp/ 568c07941a38 ssh-add -l"
Aborting.
どうも環境変数であるSSH_AUTH_SOCKがうまく渡ってないようである。ちなみにrun()
で環境変数が渡っていることは確認済み。つまりsudo()
でうまいこと環境変数が渡っていないようである
fabric sudo
fabricではenv.*に環境変数として色々な設定がされている。その中でenv.sudo_prefix
という変数がある。そのままでsudo()
実行時のオプションとかが設定されている。ちなみにデフォルトはsudo -S -p '%(sudo_prompt)s'
なのでこれではsudo実行時にAUTH_SSH_SOCK環境変数が使用できるわけがなかったので
env.sudo_prefix = "sudo -E -S -p '%(sudo_prompt)s'"
と-Eを追加してやれば
...
[<remote_host>] sudo: docker run --rm -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent -v ~/:/var/tmp/ 568c07941a38 ssh-add -l
[<remote_host>] out: 2017/10/05 23:11:10 [ssh-add -l]
[<remote_host>] out: 4096 ec:15:14:fd:0b:76:d5:44:b4:48:d0:78:c9:33:f2:d8 /Users/user/.ssh/id_rsa(RSA)
[<remote_host>] out: 2048 63:4c:f5:47:cd:f8:60:2d:78:98:15:8b:9b:a4:2e:5a /Users/user/.ssh/id_rsa_git (RSA)
・・・
おお見えとる見えとる
とりあえずこれでdockerコンテナ内のrootユーザーがsshagentにおいてある秘密鍵を使えるようになりました。
コンテナ内のroot以外のユーザーからsshできるようするには。
デフォルトの設定はコンテナを起動してコマンドを実行しようとするとrootユーザーで実行される。(確か)
多分、コンテナ内で別ユーザーに変更してそのユーザーを使用してsshをしたいはずだ・・・。そんなことはしたくないか。そうか。
そのような場合ざっくりコンテナ内でこんな感じでユーザーを作ってみた
user=test
useradd $user
su -c 'ssh-add -l' $user
Could not open a connection to your authentication agent.
むぅ
そこで該当のsocketの権限を見ると
srwxr-xr-x 1 18650 users 0 Oct 5 23:41 /ssh-agent
あーwriteがその他のユーザーにないのがだめか?
というわけでchmod -R 666 /ssh-agent
(危険です。用法用量は守って注意して使ってください)で権限を変更すると
4096 ec:15:14:fd:0b:76:d5:44:b4:48:d0:78:c9:33:f2:d8 /Users/user/.ssh/id_rsa.2015-12-16 (RSA)
2048 63:4c:f5:47:cd:f8:60:2d:78:98:15:8b:9b:a4:2e:5a /Users/user/.ssh/id_rsa_git (RSA)
見れるようになりましたとさ。
まぁもうちょっと他に方法があるかなとは思うけど覚書程度に。