🔑

authorized_keysのcommands引数でSSHログイン時に指定したコマンドが実行されるようにする

に公開

環境

Ubuntu 22.04

OpenSSH_8.9p1 Ubuntu-3ubuntu0.11, OpenSSL 3.0.2 15 Mar 2022

authorized_keys commands について

リモートのホストにSSHログインをするとき、SSHキーの公開鍵をログインしたいユーザの authorized_keys に書き加えておくことで、SSHキーによる認証が可能となる。

/home/pi/.ssh/authorized_keys
ssh-rsa AAAAB3N{...}= abc@xyz

ここに、command="command" を書き足すことができる。これで、その公開鍵をつかってログインしたユーザは、指定されたコマンドがログイン時に実行される

/home/pi/.ssh/authorized_keys
command="echo hello" ssh-rsa AAAAB3N{...}= abc@xyz

実際に接続してみると、echo hi が実行されていることがわかる。指定したコマンドが終了すると、シェルは起動されずコネクションが切断される。シェルが置き換わったような挙動になる。

$ ssh raspberry.local -l pi
Enter passphrase for key '/home/abc/.ssh/id_rsa': 
hi
Connection to raspberry.local closed. 

利用例

ログイン後に docker インスタンスに入ってもらう

commanddocker run --rm を指定すれば、そのSSH鍵でログインした時点でdockerインスタンスが作成されて孤立した環境で作業できる。ログアウトした時にインスタンスを削除することもできる。

/home/pi/.ssh/authorized_keys
command="docker run --rm -it ubuntu:focal bash" ssh-rsa AAAAB3N{...}= abc@xyz

例えば、Jenkinsエージェントの設定を行う際、コントローラからエージェントに対してSSHログインをするようセットアップすることがある。コントローラからSSHログイン時にDockerインスタンスに閉じ込めることで、ビルド時にうっかりシステムを書き換えてしまうなど、想定外の副作用を抑えることができる。

事前準備

command はシェルを起動しないが、 もちろん自分でシェルを指定することもできる。
bash に入る前にカレントディレクトリを移動させてみる。

/home/pi/.ssh/authorized_keys
command="cd /tmp && bash" ssh-rsa AAAAB3N{...}= abc@xyz

ドキュメント

man sshd に書いてある。

...
AUTHORIZED_KEYS FILE FORMAT
     AuthorizedKeysFile specifies the files containing public keys for public key authentication;
...
     command="command"
             Specifies that the command is executed whenever this key is used for authentication.  The
             command supplied by the user (if any) is ignored.  The command is run on a pty if the client
             requests a pty; otherwise it is run without a tty.  If an 8-bit clean channel is required,
             one must not request a pty or should specify no-pty.  A quote may be included in the command
             by quoting it with a backslash.

command 以外には、期限切れ時刻を指定するexpiry-time、ポートフォワードの制御を行うpermitopen permitlisten などがある。

Discussion