こんばんは、最近寒い夜が続いていて自転車通勤がつらくなってきた naoya です。
ウノウでは、フォト蔵や社内システムなどは、すべて専用サーバを構築して運用をしています。
今日は、専用サーバを構築するときに、僕がウノウで学んだ専用サーバでまず行う4つの設定を紹介します。
なお、今回の設定はすべて Fedora Core 5 をもとにしています。
(1) sudo を使えるようにする
sudo コマンドを使えるようにします。sudo コマンドは、別のユーザとしてコマンドを実行できるコマンドです。
sudo コマンドを使えるようにするには、/etc/sudoers に sudo を許可するグループを追加します。次の例は、unoh グループを追加する例です。
%unoh ALL = (ALL) ALL, !/bin/su, /bin/su postgres, /bin/su * postgres
(2) su を使えないようにする
su コマンドでスーパーユーザになるのは便利なのですが、一度 root になってしまうと誤って重要なファイルを削除しまうことがあるため、su コマンドでスーパーユーザになれないようにします。この設定をすると、スーパーユーザになるには sudo を使うことしかできなくなりますので、注意してください。
su コマンドを使えないようにするには、/etc/pam.d/su ファイルの次の行をコメントを外します。
#auth required pam_wheel.so use_uid
(3) root のパスワードを削除する
root でログインできないように root のパスワードを削除します。
root のパスワードを削除するには、/etc/shadow ファイルの root のパスワード部分に「!!」と変更します。次のような内容になります。
root:!!:13410:0:99999:7:::
(4) iptables を設定する
最後に iptables を設定して、不要なポートにアクセスできないように設定します。
基本的なポリシーとしては、次のようになります。
- 外部からの接続は、基本的にすべて拒否するが、ローカルネットワーク内からの接続は許可する
- ポート転送は許可しない
- ローカルホストからの接続は、すべて許可する
最初に、すでに定義されている INPUT チェインを削除します。
$ sudo /sbin/iptables -P INPUT DROP
次に、外部からの INPUT チェインを定義します。INPUT チェインを定義するには、次のコマンドを実行します。このコマンドの意味は、「サービスに対して接続が確立した場合は、それ以降のパケットを通過させる」ということになります。
$ sudo /sbin/iptables -A INPUT -i all -m state --state ESTABLISHED,RELATED -j ACCEPT
次に、ローカルホストからの接続は許可するように設定します。
$ sudo /sbin/iptables -A INPUT -p icmp -j ACCEPT
$ sudo /sbin/iptables -A INPUT -i lo -j ACCEPT
次に、ローカルネットワークからの接続はすべて許可します。
$ sudo /sbin/iptables -A INPUT -s 192.168.1.0 -j ACCEPT
あとは、お好みで必要なサービスのポートを開放します。例えば、SSH のポートを開放するには、次のコマンドを実行します。
$ sudo /sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
最後に、今まで作成した iptables のルールを保存して、iptables を再起動します。
$ sudo /etc/init.d/iptables save
$ sudo /etc/init.d/iptables restart
以上の4つの設定を行うと比較的専用サーバでセキュリティを確保することができると思います。
また、こんな設定も便利などありましたら、ぜひ教えてください。
# 2007.03.18 追記
たくさんのフィードバックありがとうございます。
フィードバックを元に、修正と追記をさせていただきます。
(1) sudo を使えるようにする
/etc/sudouser を直接そのまま編集するよりも、visudo コマンドを使うとより安全へに編集できるようになります。また、編集内容も次の内容で十分です。
$ sudo visudo
%unoh ALL = (ALL) ALL, !/bin/su
(3) root のパスワードを削除する
/etc/shadow を直接そのま編集するよりも、vipw コマンドを使った方がより安全に編集できるようになります。
$ sudo vipw
(4) iptables を設定する
次のコマンドの意味を「すでに定義されている INPUT チェインを削除します」と火書きましたが、「INPUT チェインポリシーを DROP に変更する」という意味でした。チェインポリシーを DROP に変更すると、iptables で指定されているポート以外に接続されたときには、接続を拒否するようになります。
$ sudo /sbin/iptables -P INPUT DROP
iptables を再起動するときは、init.d にあるシェルスクリプトを実行すると、service コマンドを使った方が便利です。iptables を再起動するには、次のコマンドを実行します。
$ sudo /sbin/service iptables restart
また、専用サーバを構築するときには、メンテナンスのために ssh を使うことが多いと思います。ウノウでも ssh を使って、専用サーバのメンテナンスを日々しています。
なので、今回の追記にあわせて ssh の設定も書きたいと思います。ssh の標準状態ではパスワード認証が有効になっています。パスワード認証が有効になっていると、パスフレーズの総当たり攻撃に対して弱いので公開鍵認証のみに変更します。公開鍵のみ認証にするには、ssh の設定ファイル /etc/ssh/sshd_config に次の行を追記します。
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
また、ssh のプロトコルバージョンが標準の設定では、1 と 2 ともに有効になっていますので、2 だけに変更しています。プロトコルバージョンを変更するには、/etc/sshd/sshd_config ファイルの Protocol の行を 1,2 から 2 に変更します。
あとは、ssh を再起動するだけです。ssh を再起動するときは、設定ミスがあるかもしれないので、必ずターミナルで ssh で専用サーバに接続している状態で再起動すると安心です。ssh を再起動するには、次のコマンドを実行します。ssh を再起動したあとは、別のターミナルで ssh で接続して問題がないことを確認します。
$ sudo kill -HUP `cat /var/run/sshd.pid`
最後のトピックスとして、設定ファイルを編集するときには必ずオリジナルのファイルをバックアップしておいた方がいいです。ウノウでは、設定ファイルのオリジナルのファイルは必ずバックアップしています。オリジナルのファイルをバックアップしておくと、何か設定ミスがあった場合原因を特定しやすくなります。
本エントリにいくつか間違いがあって申し訳ありませんでした。今後もウノウラボをよろしくお願いします!