LoginSignup
0
2

More than 5 years have passed since last update.

Fabricを使ってリモートホスト上にDockerコンテナを立ち上げてその中でsshを任意のユーザーで実行する方法

Posted at

タイトルが長い。
こんな長いタイトルでも伝えたいことの1/3も伝わらない。
もう少し正確にしたいことを書くと、

Fabricを使ってリモートホスト上で立ち上げたdockerコンテナ上でagent forwardした鍵を使って任意のユーザーでsshをしたい

だ。
まぁ一つづつ見ていきたい

fabricでagent forwardをする方法

fabfile.py
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環境変数が使用できるわけがなかったので

fabfile.py
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をしたいはずだ・・・。そんなことはしたくないか。そうか。

そのような場合ざっくりコンテナ内でこんな感じでユーザーを作ってみた

container_setup.sh
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)

見れるようになりましたとさ。

まぁもうちょっと他に方法があるかなとは思うけど覚書程度に。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2