GeekFactory

int128.hatenablog.com

SSHログインごとに独立したコンテナを割り当てる

SSHのログインごとに独立したコンテナを割り当てる方法を書きます。

手順

まず、適当なユーザを作って公開鍵でログインできるようにしておきます。

sudo useradd -m -G docker newworld
sudo -u newworld -i mkdir -m 700 .ssh
sudo -u newworld -i tee .ssh/authorized_keys < ~/.ssh/id_rsa.pub
sudo -u newworld -i chmod 600 .ssh/authorized_keys
% ssh newworld@localhost
[newworld@localhost ~]$ 

sshd_configに下記を追記してreload sshdします。

# /etc/ssh/sshd_config

Match User newworld
  ForceCommand [ "$SSH_ORIGINAL_COMMAND" ] && docker run base $SSH_ORIGINAL_COMMAND || docker run -i -t base /bin/bash

ログインして適当なファイルを作ってみます。

% ssh newworld@localhost
bash-4.2# touch /tmp/hogehoge
bash-4.2# ls -l /tmp
total 0
-rw-r--r--. 1 root root 0 Sep  2 09:18 hogehoge
bash-4.2# exit

もう一度ログインしてみましょう。

% ssh newworld@localhost 
bash-4.2# ls -l /tmp
total 0
bash-4.2# exit

おや、不思議ですね。先ほど作ったファイルがなくなっています!

まとめ

OpenSSHのForceCommandにdockerコマンドを設定することで、ログインごとに独立したコンテナを割り当てることができます。dockerコマンドに-uを渡すことで非rootユーザでの実行も可能です。

この方法が何の役に立つかというと・・・集合研修とか?

当初はJenkins Slaveをコンテナで実行してdisposableにするために考えていたのですが、よく考えたらジョブの中でdocker runすればいいだけですね。なのでボツネタです。

known issues

  • いったんログアウトすると二度と同じ世界には戻れません。
  • scpやsftpが使えません。
  • 接続が途中で切れた場合にゴミが残ります。