公開鍵に特定のコマンド(sshとかscp)を指定してssh接続時にそのコマンドしか実行できないようにする

sshの踏み台サーバの構築で、ユーザにログイン先の公開鍵が見れないようにしたい。
ということは、踏み台サーバへのssh接続時にcatとかその辺がつかえないようにして、sshコマンドだけを利用可能にすればいいのだけど、そんなやり方あるのかなぁ…と思って調べてみたところ、サーバ側の鍵ファイルに使えるコマンドを設定してやることで実現できそうだ。今回は、sshの踏み台サーバとしてCentOS 7を利用する。

1.鍵ファイルの作成

まずは踏み台サーバへログインするための鍵ファイル作成から。
以下のコマンドを実行する。

bash
ssh-keygen
shell
[ssh-user@BS-PUB-CENT7-01 ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ssh-user/.ssh/id_rsa): Created directory '/home/ssh-user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ssh-user/.ssh/id_rsa. Your public key has been saved in /home/ssh-user/.ssh/id_rsa.pub. The key fingerprint is: 8e:3d:bd:e9:e0:f9:53:7b:f6:18:f2:fb:d9:de:b4:77 ssh-user@BS-PUB-CENT7-01.blacknon.local The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | | | S | | + . . | | . = ..... .| | . +.o.oo+E| | oo=. o+BO| +-----------------+

出来上がった鍵ファイルをクライアント・サーバに配置しておく。

2.サーバ側の設定

次に、sshサーバ側(公開鍵認証でログインされる側)の設定を行う。
まず、「authorized_keys」の作成を行う。

bash
cat .ssh/id_rsa.pub >> .ssh/authorized_keys

次に、「authorized_keys」で今回追記した鍵ファイルの行の先頭に、以下の内容を追記する。
(先頭から,まで)

properties
command="コマンドのPATH(+引数の内容)", ssh-rsa ...

shell
command="/bin/ssh blacknon@172.20.XXX.XXX",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa AA...

これで、sshへの接続と同時に指定したコマンドが実行されるようになった。

3.接続

あとは、対象のサーバにssh接続するだけで、指定されたコマンドが接続と同時に実行される。

bash
ssh -i 鍵ファイル ユーザ@ホスト

なお、今回の場合は特定のサーバへの踏み台サーバとして作成したのだが、引数でどのサーバへの踏み台として動作させるか指定させたいこともあるだろう。
そんなときは、「$SSH_ORIGINAL_COMMAND」でsshコマンド実行時に引数を渡してやればよい…と思ったのだが、どうもそのやり方だとプロンプトが表示されないようだ。

もし複数サーバへの踏み台として構築して、どのサーバにログインするのかを選択したいのであれば、以前書いたこちらのようなスクリプトをcommandに指定してやるとよいだろう。