2012年3月18日日曜日

セキュリティっぽい設定

春。花粉症になったかもしんない。

WEBサーバ公開とは関係ないイベントだけど、SSHとsudoの設定をしてみる。いちおうセキュリティ対策。といっても外部からの攻撃に対する防御というより、自分がセキュリティ意識を高く保つために設定ファイルをいじってみたい、というかんじ。

まずSSHの設定だけど、rootログインを禁止する。rootユーザはすべてのファイルを書き換えることができるし、削除することもできる。そんな強い権限を持ってふらっとログインしてはぱたぱたコマンド叩くというのはお行儀がよくない。基本的には一般ユーザアカウントでログインして、必要な時だけ「su -」でユーザ切り換え、というのが正しい。うちの場合「管理者=自分」なので実際には何をするにもひと手間ふえるだけなんだけど、まぁroot権限が必要な操作っていうのは本来それなりに面倒でしかるべきなのだと思ってあきらめる。
ではsshdの設定ファイル、/etc/ssh/sshd_config を編集する。書き換えるのはPermitRootLogin のディレクティブ。デフォルトでは「yes」になっているのを「no」にする。こんだけ。

次にsudoの設定。sudoってのは特定のコマンドを特定のユーザの権限で実行できるプログラム。たいていは一般ユーザに対してroot権限(の一部)を委譲する目的で使う。例えばシステムログ/var/log/messagesはroot権限でしか閲覧することができないので、一般ユーザが
less /var/log/messages
ってしても「Permission denied」って怒られる。もちろん「su -」でrootユーザになっちゃえば読めるんだけど、ちょっとログ見たいだけなのにほいほいrootユーザになれって言われてもねぇ、rootパスワードだって結構ふくざつなのにしてるし・・・・。って場合でも、sudoに「○○さん(一般ユーザ)にはroot権限による less コマンドの実行を許可する」という設定をしておけば、○○さんに限って
sudo less /var/log/messages
とすることでrootユーザにならずともログを見ることができる、というわけ。
このときデフォルト設定ではパスワードを聞かれるんだけど、聞かれてるのはrootパスワードじゃなくて「○○さんのパスワード」。つまり「あなたはほんとに(root権限を委譲された)○○さんなの?」ってことを確認される。ほんともなにも○○ユーザでログインしている限りパスワードは知ってて当然なんだけど、なぜわざわざパスワードを確認されるのか。「これからsudoするんだからちょっと慎重になれよ」ってメッセージなのか。
まぁ無理やり実用的な解釈をすれば、例えばログインした人とコマンド実行している人が別人だっていう可能性を排除しているのかも。LAN、つまり自分の部屋の中で操作する時はそんなこと起きないんだけど、例えば会社とか、他人が自分のパソコンを触るかもしれない状況でリモートアクセスしてて、ログインしたまま放置して席を離れたりすると、実際にログインしていない人、つまりパスワードを知らない人がsudoできちゃう、って状況はあるかもしれない。それならsudo実行時にパスワードを確認する意味はあるかも。
ただねぇ。これもデフォルト設定では「最後にsudoしてから5分間はパスワード確認なしでsudoできる」ってことになってて。なんか矛盾してない?ってか中途半端じゃない?

まぁいいや。

sudoの設定ファイルは/etc/sudoersなんだけど、ファイルの編集にはvisudoって特別なコマンドが用意されている。文法チェックとかロック取ったりとかしてくれるそうだ。visudoやりよる。
で書式はこんな感じ。
ADMIN            ALL=(ALL)       ALL
なんかこの書式も好きじゃないんだけどね。まぁいいや。4つ設定箇所があるんだけど、左から
・sudoを許可するユーザ
・sudoを許可するホスト(接続元)
・権限を委譲するユーザ
・権限を委譲するコマンド

を表していて、これだと「ADMINユーザはどこから接続しても、どのユーザ権限でも、どのコマンドでも実行できる」ことになる。ADMIN無敵。
「ADMIN」は上でエイリアス(別名)を定義してるだけで、直接ユーザ名を書いてもだいじょぶ。定義はこんな感じ。
User_Alias ADMIN = (ユーザ名1),(ユーザ名2),(ユーザ名3),...
「(ALL)」はroot以外の一般ユーザの権限も含めて全部って意味だけど、(SELinuxとか設定してなければ)rootで何でもできるので「(root)」って書いてもたぶん同じことだと思う。

実行許可を与えるコマンドを制限しなきゃsudoのありがたみがない。たとえば
ADMIN            ALL=(ALL)       /usr/bin/less
にすれば、「lessだけはsudoできる」設定になる。ほかのコマンドをroot権限で実行したかったらrootユーザになるしかない。またコマンドにもエイリアスを定義できるので
Cmnd_Alias SHUTDOWN = /sbin/halt,/sbin/poweroff,/sbin/reboot,/sbin/shutdown
ADMIN            ALL=(ALL)       ALL, !SHUTDOWN
にすれば、「シャットダウン系のコマンドはsudoできない」っていう設定にもできる。まぁコマンドの制限はそこまで厳格にしなくていいや。どうせ自分以外にユーザはいないし。
あとは例のパスワードのキャッシュの設定。
Defaults timestamp_timeout = 0
これを設定しておけば、5分とおかず毎回パスワードを聞かれるようになる。
「パスワード確認は必要ない」と思ったら
ADMIN            ALL=(ALL)       NOPASSWD:ALL, !SHUTDOWN 
ってしておけば、パスワードの確認がされなくなる。便利とセキュリティとどっちをとるかって話だけど。

さっきの「他人が自分のパソコンを触ってるかもしれない」状況を考えると、リモートアクセスではパスワード確認がほしいところだけど、LAN内からのアクセスならパスワード確認は冗長だと思うわけで、理想としては
Host_Alias LOCAL = 192.168.230.0/24
ADMIN          LOCAL=(ALL)     NOPASSWD: ALL, !SHUTDOWN
ADMIN           !LOCAL=(ALL)    ALL, !SHUTDOWN
みたいな設定が望ましい。

ところがこれが何故かうまく行かなくって。なんかねぇ、接続元ホストってイメージしてたのと違うみたい。例えば普段LANからアクセスする時って「192.168.230.2」(Windows)から「192.168.230.230」(CentOS)にSSHでアクセスしてるんだけど、この場合の「接続元ホスト」って「192.168.230.2」じゃなくて「192.168.230.230」なんだって!よくわかんないけど!ほんとわけわかんない!じゃあ接続元ホストってなんなのよ!LANからのアクセスか、外部からのアクセスか、見分ける方法はどこにあるのか!

0 件のコメント:

コメントを投稿