🔑
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 インスタンスに入ってもらう
command
に docker 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