OpenSSHでは、デフォルトだと.ssh/authorized_keysというファイルに公開鍵を置いておく(別のファイルを指定することも可能)のだが、このファイルに設定を記述することで、その公開鍵の挙動を制限することができる。有名どころとしてはcommandとfromなのだが、そのほかにもいろいろと設定できるので便利そうなのをいくつかまとめておくことにする。
ここを見る限り、以下の項目について設定ができるようだ。

  • agent-forwarding
  • cert-authority
  • command="command"
  • environment="NAME=value"
  • no-agent-forwarding
  • no-port-forwarding
  • no-pty
  • no-user-rc
  • no-X11-forwarding
  • permitopen="host:port"
  • port-forwarding
  • principals="principals"
  • pty
  • restrict
  • tunnel="n"
  • user-rc
  • X11-forwarding

1.ssh接続時に特定のコマンドが実行されるようにする

前にここでも書いたのだが、ssh接続と同時に指定したコマンドが実行されるようにするには、authorized_keysで以下のように記述すればよい。

command="コマンドPATH" ssh-rsa ..

例えば、authorized_keysに以下のように記述していたとする。

command="pwd;cat .ssh/auth*;ls -la" ssh-rsa AAAAB...

その場合、その鍵ファイルでログインすると以下のようにコマンドの実行結果が返され、処理終了と同時に接続が切断される。

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01
command="cat .ssh/auth*;pwd;ls -la" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8CB356HRtiXR5RXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+4BXUzTPf417jyUL3ktSJsmdVPAyyUFxpdrBpAKkG3pj4Tfhj3mYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYB3XWhllb5CyI7EcVM4dP7TTpBARzQBQpeaLsVp2gsbb4V8UuwdZyPbXahps90GadQgrDjR5647EGArOCIWRNuP+5ALK4tFFNEraG76cRRAs3lDLD462ZAcPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//9zszOtlDlr4GcgYJhX6px4Qtv1v/fjRn1 root@BS-PUB-CENT7-02.blacknon.local
/home/test
合計 16
drwx------. 3 test test  90  9月 21 23:48 .
drwxr-xr-x. 3 root root  17  9月 21 23:46 ..
-rw-------. 1 test test  25  9月 21 23:46 .bash_history
-rw-r--r--. 1 test test  18  8月  3 01:00 .bash_logout
-rw-r--r--. 1 test test 193  8月  3 01:00 .bash_profile
-rw-r--r--. 1 test test 231  8月  3 01:00 .bashrc
drwx------. 2 test test  28  9月 21 23:53 .ssh
Connection to bs-pub-cent7-01 closed.

このとき、環境変数として$SSH_ORIGINAL_COMMANDを用いることでsshコマンドの引数を実行コマンドに利用することも可能だ。
例えば、authorized_keysに以下のように記述していたとする。

command="echo $SSH_ORIGINAL_COMMAND;ls -la $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB...

その場合、接続時に引数を与えると以下のように結果が返ってくる。

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 .ssh/auth*
.ssh/authorized_keys
-rw-------. 1 test test 483  9月 22 00:02 .ssh/authorized_keys

なお、一応いろいろといじってみた限りでは指定されたコマンド以外は実行できないようになっている(引数でエスケープさせて任意のコマンドを実行させられない)ようだが、できればラッパーコマンドを別途用意しておくといいだろう。

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 '/tmp && echo aaa'
/tmp && echo aaa
/tmp:
合計 4
drwxrwxrwt.  7 root root   88  9月 21 21:34 .
dr-xr-xr-x. 17 root root 4096  1月  1  2016 ..
drwxrwxrwt.  2 root root    6  1月  1  2016 .ICE-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .Test-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .X11-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .XIM-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .font-unix
ls: && にアクセスできません: そのようなファイルやディレクトリはありません
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません
[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 '/tmp || echo aaa'
/tmp || echo aaa
/tmp:
合計 4
drwxrwxrwt.  7 root root   88  9月 21 21:34 .
dr-xr-xr-x. 17 root root 4096  1月  1  2016 ..
drwxrwxrwt.  2 root root    6  1月  1  2016 .ICE-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .Test-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .X11-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .XIM-unix
drwxrwxrwt.  2 root root    6  1月  1  2016 .font-unix
ls: || にアクセスできません: そのようなファイルやディレクトリはありません
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: aaa にアクセスできません: そのようなファイルやディレクトリはありません
[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 "echo $(hostname)"
echo BS-PUB-CENT7-02.blacknon.local
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: BS-PUB-CENT7-02.blacknon.local にアクセスできません: そのようなファイルやディレクトリはありません
[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01 "echo `hostname`"
echo BS-PUB-CENT7-02.blacknon.local
ls: echo にアクセスできません: そのようなファイルやディレクトリはありません
ls: BS-PUB-CENT7-02.blacknon.local にアクセスできません: そのようなファイルやディレクトリはありません

2.特定のIPアドレスからのみ接続を許可する

公開鍵で特定のIPアドレスやネットワークからの接続のみを許可する場合は、以下のように記述する。

from="ネットワークアドレス/CIDR or IPアドレス" ssh-rsa ...
from="ネットワークアドレス/CIDR or IPアドレス1,ネットワークアドレス/CIDR or IPアドレス2,..." ssh-rsa ... # 複数指定する場合はカンマで区切る

3.ポートフォワーディングやエージェントフォワーディングなどを無効にする

ポートフォワーディングやエージェントフォワーディングといった機能を使えないように設定することもできる。
以下、無効関係の設定の一覧。

  • no-agent-forwarding … エージェントフォワーディングを無効にする
  • no-port-forwarding … ポートフォワーディングを無効にする
  • no-pty … PTYを無効にする(対話形式の処理をできないようにする)
  • no-user-rc … ~/.ssh/rcの実行を無効にする
  • no-X11-forwarding … X11フォワーディングを無効にする

なお、これらに限らずだがそれぞれの設定はカンマ区切りにすることで複数指定することが可能だ。

no-agent-forwarding,no-port-forwarding,no-pty ssh-rsa ...

4.公開鍵に紐づいて環境変数を定義する

sshdで「PermitUserEnvironment」が有効になっている場合のみ、以下のように記述することで公開鍵に紐づき環境変数を定義することができる。

environment="環境変数=値" ssh-rsa ...

例えば、「NAME」という環境変数に「Value」という値を入れた場合。

[root@BS-PUB-CENT7-01 ~]# cat /home/test/.ssh/authorized_keys
environment="NAME=Value",command="echo $NAME" ssh-rsa ...

--------

[root@BS-PUB-CENT7-02 ~]# ssh test@BS-PUB-CENT7-01
Value
Connection to bs-pub-cent7-01 closed.

そのほか、sshトンネル(tunnel)やポートフォワード(permitopen)、証明書の信頼性について別リストから検証させるようにする(principals)など、いろいろと設定できるようだ。