sshの鍵認証で、特定のカギのみをrootで許可してやり、一般ユーザに勝手に追加させないようにしたいなぁ…という話があり、やり方を考えてみた。 で、当初は『.ssh/authorized_keys』ファイルの所有者をrootに変えてやり、一般ユーザには読み込み権限だけを与えてしまえばいいかなと思ったのだが、どうもそれではうまくいかない。 というのも、『.ssh/』ディレクトリの所有者はその一般ユーザになるので、『.ssh/authorized_keys』を削除して作り変えてしまえるためだ。

[test@BS-PUB-CENT7-01 ~]$ ls -al .ssh/
合計 4
drwx------. 2 test test  28  2月 23 00:15 .
drwx------. 3 test test  90  2月 23 00:15 ..
<span style="color: #ff0000;">-rw-r--r--. 1 root root 405  2月 23 00:15 authorized_keys</span>
[test@BS-PUB-CENT7-01 ~]$ echo test > .ssh/authorized_keys
-bash: .ssh/authorized_keys: 許可がありません
[test@BS-PUB-CENT7-01 ~]$ echo test >> .ssh/authorized_keys
-bash: .ssh/authorized_keys: 許可がありません
[test@BS-PUB-CENT7-01 ~]$ cp .ssh/authorized_keys{,.bk}
[test@BS-PUB-CENT7-01 ~]$ rm .ssh/authorized_keys
rm: 書き込み保護されたファイル 通常ファイル `.ssh/authorized_keys' を削除しますか?y
[test@BS-PUB-CENT7-01 ~]$ cp .ssh/authorized_keys{.bk,}
[test@BS-PUB-CENT7-01 ~]$ ls -la .ssh/
合計 8
drwx------. 2 test test  53  2月 23 00:16 .
drwx------. 3 test test  90  2月 23 00:15 ..
<span style="color: #ff0000;">-rw-r--r--. 1 test test 405  2月 23 00:16 authorized_keys</span>
-rw-r--r--. 1 test test 405  2月 23 00:16 authorized_keys.bk

だからと言って、『.ssh』フォルダの所有者を変更してしまっては鍵認証でのログインはできない。 ディレクトリの所有者なので、スティッキービットを設定しても意味がない。 ではどうすればいいのか? とりあえず、たとえディレクトリの所有者であろうとも『.ssh/authorized_keys』の削除を行えなければ回避できるはずだ。

という訳で、ファイルの所有者をrootにした状態で、さらにchattrを使って拡張属性で削除不可(追記のみ可能)にしてやればいけるのではないかと考えた。 所有者がrootであれば、一般ユーザでchattrを使ってもフラグを変更できないため、何もできないはずだ。

というわけで、さっそくやってみた。

[root@BS-PUB-CENT7-01 ~]# ls -la /home/test/.ssh/authorized_keys
-rw-r--r--. 1 root root 405  2月 23 00:16 /home/test/.ssh/authorized_keys
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # chattr +a で追記のみ可能にする
[root@BS-PUB-CENT7-01 ~]# chattr +a /home/test/.ssh/authorized_keys
[root@BS-PUB-CENT7-01 ~]# lsattr /home/test/.ssh/authorized_keys
-----a---------- /home/test/.ssh/authorized_keys
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# su - test
最終ログイン: 2017/02/23 (木) 00:23:34 JST日時 pts/1
[test@BS-PUB-CENT7-01 ~]$
[test@BS-PUB-CENT7-01 ~]$ ls -la .ssh/authorized_keys
-rw-r--r--. 1 root root 405  2月 23 00:16 .ssh/authorized_keys
[test@BS-PUB-CENT7-01 ~]$ ls -la .ssh
合計 4
drwx------. 2 test test  28  2月 23 00:22 .
drwx------. 3 test test  90  2月 23 00:15 ..
-rw-r--r--. 1 root root 405  2月 23 00:16 authorized_keys
[test@BS-PUB-CENT7-01 ~]$
[test@BS-PUB-CENT7-01 ~]$ # 追記のみ可能だが、書き込み権限がないので何もできない
[test@BS-PUB-CENT7-01 ~]$ echo aaa > .ssh/authorized_keys
-bash: .ssh/authorized_keys: 許可がありません
[test@BS-PUB-CENT7-01 ~]$ echo aaa >> .ssh/authorized_keys
-bash: .ssh/authorized_keys: 許可がありません
[test@BS-PUB-CENT7-01 ~]$
[test@BS-PUB-CENT7-01 ~]$ # 追記のみ可能なので、ファイルの削除もできない
[test@BS-PUB-CENT7-01 ~]$ rm -rf .ssh/authorized_keys
rm: `.ssh/authorized_keys' を削除できません: 許可されていない操作です

もちろん、ssh-copy-idなどでも鍵の追加が行えないようになった。

blacknon@BS-PUB-DEVELOP:~$ ssh-copy-id -i test test@BS-PUB-CENT7-01
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "test.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
sh: .ssh/authorized_keys: 許可がありません

注意点としては、拡張属性で定義してしまってるので、rootであっても追記しか行えない状態になったということだろうか。 編集を行う場合は、一度属性を解除してから編集する必要があるので注意。