2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

SELinuxが有効な環境でSSH公開鍵認証を使う

(2013/02/06)

Targeted ポリシーとSSH

RHEL6系の SELinux(Targetedポリシー) から SSH も管理対象になりました。

5系のsshd

$ ps axZ | grep ssh
system_u:system_r:unconfined_t:SystemLow-SystemHigh 2186 ? Ss   0:00 /usr/sbin/sshd
system_u:system_r:unconfined_t:SystemLow-SystemHigh 2423 ? Ss   0:00 sshd: ishikawa [priv]

6系のsshd

$ ps axZ | grep ssh
system_u:system_r:sshd_t:s0-s0:c0.c1023 1058 ? Ss     0:00 /usr/sbin/sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 1854 ? Ss     0:00 sshd: ishikawa [priv]

これが原因で、公開鍵認証に失敗することがあります。

ssh-keygen コマンドや ssh-copy-id コマンドなどで ~/.ssh 直下に公開鍵を"直接"作成した場合などは問題ありませんが、別のホストから持ってきた公開鍵を一時的にどこかのディレクトりに配置してから ~/.ssh に移動した場合は sshd(sshd_t)から公開鍵が読み取れず(読み取る権限がなく)エラーになってしまいます。

ssh-keygen を使用して ~/.ssh に直接鍵を作成した場合

ここでは、id_rad.pub が直接 ~/.ssh 以下に作られ、それを mv コマンドで authorized_keys に変名しているので、sshd(sshd_t) から読み取れるラベル(ssh_home_t)が付与されたままになっています。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ishikawa/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ishikawa/.ssh/id_rsa.
Your public key has been saved in /home/ishikawa/.ssh/id_rsa.pub.
The key fingerprint is:
8e:c9:7c:26:bd:a4:5a:7e:59:19:93:01:d2:77:24:69 ishikawa@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|      .....o.    |
|       .. E..    |
|         o +     |
|          +      |
|        S  +     |
|     o =  o      |
|      B *o       |
|     o *o.       |
|    ..o..        |
+-----------------+

$ ls -Z ~/.ssh/
-rw-------. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 id_rsa
-rw-r--r--. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 id_rsa.pub

$ mv id_rad.pub authorized_keys

$ ssh localhost
Last login: Wed Feb  6 12:25:05 2013 from 192.168.56.1

出力先を ~/.ssh 以外のディレクトリにして指定していた場合は sshd(sshd_t) が読み取れないラベルが付与されてしまうかもしれません。

以下の例では、公開鍵を /tmp 以下に作成していますので、公開鍵のファイルコンテキストは tmp_t となっています。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ishikawa/.ssh/id_rsa): /tmp/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /tmp/id_rs.
Your public key has been saved in /tmp/id_rs.pub.
The key fingerprint is:
e2:ae:7a:81:3d:b1:9d:37:b3:33:96:7e:ff:06:b8:6a ishikawa@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|    .            |
|   o +..S  .     |
|  . =.o.+ . .    |
|     o.. = . .   |
|    ..  E o   .  |
|  .o...+o= ..o.  |
+-----------------+

$ ls -Z /tmp/id_rsa*
-rw-------. ishikawa ishikawa unconfined_u:object_r:tmp_t:s0   id_rsa
-rw-r--r--. ishikawa ishikawa unconfined_u:object_r:tmp_t:s0   id_rsa.pub

他のホストから一度どこかのディレクトリにファイル転送して ~/.sshに mv した場合

他のホストで使用している公開鍵を ssh-copy-id コマンド以外でコピーした場合、sshd(sshd_t) が読み取れないラベルが付与されてしまうかもしれないことに注意してください。

以下の例では、/root 直下に一時保存した公開鍵を /home/ishikawa/.ssh に移動しています。

所有者・所有グループこそ ishikawa:ishikawa に変更していますが、公開鍵のファイルコンテキストが admin_home_t のままになっています。これでは sshd(sshd_t)から公開鍵を読み取ることができません。

# scp ishikawa@192.168.56.102:~/.ssh/authorized_keys /root/

# mv /root/authorized_keys ~ishikawa/.ssh/
mv: overwrite `/home/ishikawa/.ssh/authorized_keys'? y

# chown -R ishikawa:ishikawa ~ishikawa/.ssh/

# ls -Z ~ishikawa/.ssh/
-rw-r--r--. ishikawa ishikawa unconfined_u:object_r:admin_home_t:s0 authorized_keys
-rw-------. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 id_rsa
-rw-r--r--. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 known_hosts

$ ssh localhost
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

ログの確認 (/var/log/audit/audit.log)

パーミッションは正しいですが、SELinux によってアクセスが拒否されました。/var/log/audit/audit.log を確認すると以下のようなログが見つかります。

scontext(sshd_t) が tcontext(admin_home_t) の tclass(file) の { read } を拒否した。

# ausearch -m avc
----
time->Wed Feb  6 12:33:37 2013
type=SYSCALL msg=audit(1360121617.995:956): arch=c000003e syscall=2 success=no exit=-13 a0=7fbb0a6c96e0 a1=800 a2=1 a3=4 items=0 ppid=2247 pid=2446 auid=500 uid=0 gid=0 euid=500 suid=0 fsuid=500 egid=500 sgid=0 fsgid=500 tty=(none) ses=2 comm="sshd" exe="/usr/sbin/sshd" subj=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1360121617.995:956): avc:  denied  { read } for  pid=2446 comm="sshd" name="authorized_keys" dev=dm-0 ino=13510 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file

対処方法

RHEL6系から仕様が変更されたため、CentOS6.0などにのリリースノートには既知の不具合としてこう書かれています。

要は

ということです。(sshd_t が read できる file のラベルはこちら → sesearch -A -C -s sshd_t -c file)

というわけで実際に再ラベル付けを行います。

# restorecon -RFv ~ishikawa/.ssh/
restorecon reset /home/ishikawa/.ssh/authorized_keys context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:ssh_home_t:s0

# ls -Z ~ishikawa/.ssh
-rw-r--r--. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 authorized_keys
-rw-------. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 id_rsa
-rw-r--r--. ishikawa ishikawa unconfined_u:object_r:ssh_home_t:s0 known_hosts

念のため、sshd_t が ssh_home_t を読み取れるか確認してみます。

# sesearch -A -C -s sshd_t -t ssh_home_t -c file
Found 2 semantic av rules:
   allow sshd_t ssh_home_t : file { ioctl read getattr lock open } ;
   allow ssh_server ssh_home_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;

sesearch の結果には読み取れるとあるようです。これで無事公開鍵認証を使って SSH が出来るようになります。