- 2014年9月6日
- セキュリティについて , モリイですけど
OSSインストール時に変更すべき、7つのセキュリティ設定項目①(転載)
7月にマイナビニュースに寄稿した記事、「OSSインストール時に変更すべき、7つのセキュリティ設定項目」の評判が良かったので、こちらにも転載しておきます。
WordPressのセキュリティ対策は、WordPressそのものの脆弱性のみならず、サーバーやミドルウェアに対しても行うべき、という考え方から、このような記事を寄稿させていただきました。
こちらの記事も長いので、2回ほどに分割して掲載したいと思います。
こんにちは。皆様に安全・安心・快適なインターネットセキュリティ環境を提供すべく昼夜問わず活動中のモリイです。
突然ですが、皆さまはオープンソース・ソフトウェアを扱う機会はありますか? マイナビニュースの読者であることを考えると、各所で用いている方も多いのではないでしょうか。
しかし、オープンソース・ソフトウェアは基本的に「自己責任」で利用するものであるため、知識がない状態で使うことはリスクを伴います。特にシステムのセキュリティにおいてはそれが顕著です。
例えばデフォルトインストールを実行すると、必要のないパッケージやサービスが混入している場合があります。それらのパッケージの中には、脆弱性を含んでいたり、あるいはシステム稼働ポリシー上のセキュリティの観点から望ましくないものが存在していたりすることがあり、そのままの設定では危険です。
そこで本記事では、オープンソース・ソフトウェア(Linuxおよび同梱ソフトウェア)をインストールする際に留意すべき7つの設定について解説します。いずれもセキュリティリスクを軽減するうえで有効ですので、ぜひ頭に入れておいてください。
なお、以下では、オープンソース・ソフトウェアの例としてCentOS 6、およびそこにデフォルトで取り込まれているソフトウェアを取り上げます。ただし、Scientific Linux、Red Hat Enterprise Linuxなど、他のディストリビューションにも応用可能ですので参考になさってください。
[1] バージョンの確認
最初の確認項目はバージョンです。
ごく当たり前のことですが、セキュリティを保つためには、OSが提供する最新版へアップデートし続けてください。
CentOS 6 の2014年7月14日現在の最新版は下のとおりです。
- Kernel : 2.6.32-431.20.3.el6
- Apache : 2.2.15-30.sl6
- PHP : 5.3.3-27.el6_5
- MySQL : 5.1.73-3.el6_5
※ nginxはOS標準ではないため、本稿では解説の対象外としています。nginxをインストールする際は、nginx更新のリポジトリを使います。
CentOS 6のPHPやMySQLは、ベースバージョンがだいぶ古くなっていますので、新しいバージョンを入れたい場合は、Software Collectionsのものを入れてください。
注意しなければいけないのは、ソースからコンパイルするのは最終手段だということです。ソースから入れるということは、それ以後は手動で最新版へ更新し続けなければならないということですので、よほどのことがない限り行わない方が良いでしょう。
Software Collections だと2014年7月14日現在の最新版は下のとおりです。
- PHP : php54-php-5.4.16-7.el6
- MySQL : mysql55-mysql-5.5.32-2.el6
自動更新を有効にするなら 「yum-cron」 を入れてください。コマンドは下のとおりです。
yum install yum-cron
chkconfig yum-cron on
service yum-cron start
yum install yum-cron
chkconfig yum-cron on
service yum-cron start
[2] OSの設定
OSの設定においては、脆弱性リスク低減とパフォーマンス維持のために、不要なサービスを停止しましょう。
まずは以下のコマンドで稼働中のサービス一覧を出力します。
# chkconfig --list
本コマンドを実行すると一覧で0:から6: までのRunlevel で稼働しているサービスが出力されます。
下記は出力サンプルです。Runlevel「3:on」のサービスがネットワーク有のマルチユーザーモードで稼働中のサービスとなります。
[root@localhost ~]# chkconfig --list
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
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
iscsi 0:off 1:off 2:off 3:on 4:on 5:on 6:off
iscsid 0:off 1:off 2:off 3:on 4:on 5:on 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rdisc 0:off 1:off 2:off 3:off 4:off 5:off 6:off
restorecond 0:off 1:off 2:off 3:off 4:off 5:off 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
saslauthd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
要件次第ですが、サービスを停止する場合の例を以下に記します。
- FTPサーバを出力する場合chkconfig –list vsftpd
- FTPサーバを使用しない場合chkconfig vsftpd off
- iSCSIイニシエータを使用しない場合chkconfig iscsid off
offにしたものは、次回のOS起動時から反映されます。動作しているサービスをすぐに停止するなら「service サービス名 stop」を実行してください。
なお、FTPサーバを使用したい場合は、以下のようなコマンドになります。
chkconfig vsftpd on
[3] FWの設定
Firewallの設定に関しては、まず基本として、不要なポートを開けないことが重要です。さらに、攻撃される機会を減らすため、SSHなどの接続元IPやネットワークが限定できるものは限定します。
また、「よく判らないからFW機能を無効にする」というのはおすすめしません。なぜなら、FWを無効にすると、デフォルトで動いているサービスで、かつポートをListenしているものがあると、そこへ誰でもアクセスできでしまいます。すなわち、悪意を持つ攻撃者に攻撃できる機会を与えてしまうことになります。
- 設定ファイル : /etc/sysconfig/iptables
以下では、最低限設定したほうが良いと思うものを挙げておきます。
まず、デフォルトでは以下のように22番だけどこからでも接続できる状態で開いています。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
この行を接続元IPやネットワークを指定して制限するように修正します。
たとえば、IP 192.168.1.100/32とネットワーク 10.0.0.0/24からのみ許可するなら以下のようになります
-A INPUT -s 192.168.1.100/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
HTTP、HTTPS だけ開けるなら上記の行の下に下記を追加します。
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
修正・追加を行った後、以下のコマンドで設定を反映します。
iptables-restore < /etc/sysconfig/iptables
注意してほしいのは、「service iptables restart」で反映しようとすると、「/etc/sysconfig/iptables」に誤って無効な設定を書いてしまい、設定エラーがあった際、フルオープン状態でiptablesが起動してしまいます。言うまでもなく、とても危険です。
一方、「iptables-restore」なら設定エラーがあると、エラーになって反映されず、以前の設定内容のまま iptables が動き続けるので安全です。