CentOS で行なっておきたいセキュリティ設定
はじめに
Linux のセキュリティ設定ってなかなかまとまったものがないので、いろんなサイトを参考にしながら設定をまとめてみました。想定はWeb サーバーで、使用している Linux は CentOS 6.2 です。
設定内容は以下のようになります。
- リモートからの root ログインを無効にする
- 公開鍵暗号方式を使用した SSH ログイン設定
- iptables 設定
- SSH ポート番号の変更
- 不要なサービスを停止
- ログ監視設定
- ファイル改ざん検知ツール設定
- ウィルス対策ソフト設定
- Apache の設定
- 全パッケージのアップデート
リモートからの root ログインを無効にする
リモートからメンテナンスできるユーザーを追加して、wheel グループに追加。
# useradd hogehoge
# passwd hoghoge# usermod –G wheel hogehoge
wheel グループのメンバーのみ root になれるように設定。
# vim /etc/pam.d/su
以下の行のコメントを外して保存。
auth required pam_wheel.so use_uid
su コマンドで、wheel グループのみ root になれるように設定。
# vim /etc/login.defs
以下の設定を追加して保存。
SU_WHEEL_ONLY yes
wheel グループのユーザーのみ sudo コマンドを実行できるように設定。visudo は /etc/sudoers を安全に編集するためのコマンドで、vi と同じように使用できる。
# visudo
以下の行のコメントを外して保存。
%wheel ALL=(ALL) ALL
sudo 実行時にパスワード入力を求められないようにするには、以下の行のコメントを外して保存。設定時には本当にその運用でよいか要検討。
%wheel ALL=(ALL) NOPASSWD: ALL
root での ssh ログインを禁止するように設定。
# vim /etc/ssh/sshd_config
PermitRootLogin を以下のように設定して保存。
PermitRootLogin no
sshd を再起動して設定を有効にする。
# /etc/init.d/sshd restart
公開鍵暗号方式を使用した SSH ログイン設定
内容が長いので別エントリーにしました。
iptables 設定
iptables によってソフトウェア的に Firewall を実現できる。不要なポートは開けないことが重要。下記コマンドで iptables の設定を確認。
# /sbin/iptables -L --line-number
ssh 以外のサービスは外部からの通信が止められていることを確認。
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)
num target prot opt source destination
ここでは、HTTP と HTTPS の通信を許可。
# /sbin/iptables -I INPUT 5 -p tcp --dport http -j ACCEPT #HTTP
# /sbin/iptables -I INPUT 5 -p tcp --dport https -j ACCEPT #HTTPS
設定内容を確認。
# /sbin/iptables -L --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 ACCEPT tcp -- anywhere anywhere tcp dpt:https
6 ACCEPT tcp -- anywhere anywhere tcp dpt:http
7 REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)
num target prot opt source destination
設定を保存。
# /sbin/service iptables save
設定が保存できたか確認。
# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Mar 18 19:09:59 2012
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [51:5844]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Mar 18 19:09:59 2012
OK。
SSH ポート番号の変更
企業によっては SSH のポート番号を 22 しか許さない場合もあるだろうし、Firewall で SSH へのアクセスが制限されることもあるだろうから、これはオプション。ただ、ポート番号を変更すれば攻撃を受ける頻度が減る。
設定の前に、必ず iptables に変更後のポート番号でアクセスできるように設定しておくこと。そうしないとログインできなくなってしまう。
SSH の設定ファイルを編集。
# vim /etc/ssh/sshd_config
SSH のポート番号はデフォルトで 22 だが、WELL KNOWN PORT NUMBERS(0~1023番)以外のポート番号であれば何でもよい。ここでは区切りよく 10000 としてみる。
sshd_config の以下の行がコメントアウトされているので、コメントを外しポート番号を 10000 に変更して保存。
Port 10000
SSH のサービスを再起動。
# /etc/init.d/sshd restart
不要なサービスを停止
IPv6 を無効にする
IPv6 は IPv4 の DMZ では不要なことと、不具合が起きることがあるようなので無効にする。ネットワーク環境によっては要検討。
# vim /etc/modprobe.d/disable-ipv6.conf
以下の行を追加して保存する。
options ipv6 disable=1
OS を再起動して設定を反映する。
不要なサービスを停止
IPv6 を無効にしているため不要なサービスを停止。最小構成でインストールされているためか、停止するサービスが少なかった(CentOS で不要なサービスについてはこちらを参照)。
# /etc/init.d/ip6tables stop
# chkconfig ip6tables off
また、以下のコマンドを実行して起動時に実行するサービスを確認(Run Level が3のとき)。
# chkconfig --list | grep "3:on"
実行結果。
auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
lvm2-monitor 0:off 1:on 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off
Web サーバーでは、通常メールサービスは利用しないので postfix は無効にする。以下のようにサービスを無効にする。他に不要なサービスあったら無効にする。
# /etc/init.d/postfix stop
# chkconfig postfix off
ログ監視設定
ログ監視ツールとして logwatch をインストールすると、1日一回ログの内容を整形して root にメールを送ってくれる。安全な運用にはログ監視は重要。
logwatch のインストールは下記コマンドを実行。
# yum –y install logwatch
下記コマンドを実行して正しく動作しているか確認。
# /usr/sbin/logwatch --print
ファイル改ざん検知ツール設定
Linux のファイル改ざん検知ツールとしては Tripwire が有名だが、現在は商用プロダクトとなったため、ここでは AIDE というオープンソースのファイル改ざんツールを導入。
AIDE のインストール。
# yum –y install aide
AIDE の初期データベースの作成。
# aide -i
DBができていることを確認。
# ll -h /var/lib/aide/
合計 1.8M
-rw-------. 1 root root 1.8M 3月 18 19:35 2012 aide.db.new.gz
DB の名前変更。
# cd /var/lib/aide
# cp aide.db.new.gz aide.db.gz
AIDE のチェック実行。
# aide -C
デフォルトだと、AIDE はかなり広範囲にチェックを行うので、結果が煩わしい場合は aide.conf の設定を見直す。
AIDE はこのままではスケジュールで実行されないため、以下のサイトのスクリプトを利用してスケジュール実行できるようにする。
上記設定が完了すると、スケジュール実行された結果は以下のログに出力されるようになる。
- /var/log/aide/aide.log – AIDE ログ
- /var/log/aide/error.log – エラーログ
ウィルス対策ソフト設定
Web サーバーにウィルス対策ソフトを導入するべきかは意見が分かれるところだが、保険的な対策も含めて導入することがよいと思われる。ここでは、オープンソースのウィルス対策ソフトである Clam AntiVirus を導入する。
EPEL リポジトリ導入
Clam AntiVirus を yum でインストールするために、以下のサイトを参考に EPEL リポジトリを導入する。
EPEL リポジトリを利用する場合は、以下のようにコマンドを実行する。
yum --enablerepo=epel install パッケージ名
Clam AntiVirus 導入
Clam AntiVirus をインストール。
# yum –y --enablerepo=epel install clamd
あとは、以下の記事を参考に設定を行う。
これで毎日定期的にウィルススキャンが行われ、ウィルスを検知した場合に root にメールが送られてくるようになる。
Apache の設定
Apache でもいくつか設定を行う。
# vim /etc/httpd/conf/httpd.conf
以下の設定を行う。
# レスポンスヘッダにVersion等を表示しない
ServerTokens ProductOnly# エラーページにApacheの情報を付けない
ServerSignature Off# Trace メソッドを無効にする
TraceEnable Off
ディレクトリリスティングを禁止する。Options の Indexes を削除するのだが、複数記述されているので注意。デフォルトでは以下の2箇所に Indexes の記述があった。
<Directory "/var/www/icons">
Options MultiViews FollowSymLinks
</Directory><Directory "/var/www/html">
Options FollowSymLinks
</Directory>
クリックジャッキングの対策を追加する。フレーム内にページを表示させない場合は DENY を、同じサイトであればフレーム内の表示を許す場合は SAMEORIGIN を指定する。詳しくは Mozilla の記事を参照。
Header always append X-Frame-Options DENY
設定を保存後、Apache を再起動する。
# /etc/init.d/httpd restart
全パッケージのアップデート
最後に以下のコマンドを実行して、全パッケージを最新の状態にする。
# yum –y update
後は脆弱性が発見された時、または定期的にパッケージのアップデートを行う。
更新履歴
・2012/04/05
クリックジャッキングの対策を追加。
・2012/03/22
Apache の設定追加、不要なサービスの停止方法追加、sudo コマンドに追記。
・2012/03/20
色々な方のご意見をいただき、内容をアップデートしました。貴重なご意見ありがとうございました。
参考サイト
- VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定 : dogmap.jp
- これぐらいやっとけ ~Linuxサーバのセキュリティ設定~ - nabeの雑記帳
- root になれるユーザの限定
- CentOS 5 : IPv6 サーバでない場合は IPv6 を無効にする « poohSec
- 不要なサービスの停止 | CentOSサーバー構築マニュアル
- OSSはアルミニウムの翼で飛ぶ: RHEL セキュリティ: ファイル監視による侵入検知 AIDE
- Amazon EC2でIDS(侵入検知システム)を導入する – AIDE – | Classmethod.dev()
- AIDE(Advanced Intrusion Detection Environment) - Get crazy
- アンチウィルスソフト導入(Clam AntiVirus) - CentOSで自宅サーバー構築
- KENMARI-PC » CentOS6.0にEPELリポジトリを追加
- ディレクトリ非表示の意味をもう一度見つめ直す - @IT
- The X-Frame-Options response header - MDN
コメント