はじめまして!WEBサービス系企業でセキュリティ担当をしているAmiです。
サーバーやインフラを運用するにあたり、セキュリティは常に考えなければいけないポイントになってきています。 そこで今回「レンタルサーバー好き」なセキュリティエンジニアの目線で、この場をお借りし、サーバー管理者まわりのtipsやトレンドなどの情報を発信していきたいと思っています。
みなさん、サーバーの初期設定ではどんなことをしていますか?
今回は、専用サーバー/クラウドのサーバーにログインをしたら、最初にしたほうが良い設定についてまとめました。
※ 本記事ではCent OSの設定を対象にしています。
Ⅰ.rootログインの無効化
初期設定では、rootユーザーでのログインが有効になっています。
rootユーザーはそのサーバーのあらゆる設定を変更する権限を持つ最強のユーザー。
そのため、新規にログイン用のユーザーを作成し、rootでのログインはできないように設定してしまいます。
まずはuseraddコマンドで一般ユーザーを作ります。パスワードを設定するのを忘れずに。
[root@example ~]# useradd john
[root@example ~]# passwd john
ユーザー john のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
/etc/ssh/sshd_configファイルをコピーし、編集します。
[root@example ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.copy
[root@example ~]# vi /etc/ssh/sshd_config
ファイルの中ほどにある「#PermitRootLogin yes」を
「PermitRootLogin no」に書き換えて保存。
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
↓
PermitRootLogin no
以下コマンドで変更したファイルに問題がないかチェックを行い、
エラーがなければサービス再起動で設定を反映させます。
[root@example ~]# sshd -t
[root@example ~]# /etc/init.d/sshd restart
Ⅱ.SSHのポート変更
sshのポートに関しては、ファイアーウォールで特定のログイン元のみ許可しておくという設定が基本ですが、 加えて規定の22番から変更しておくとより安心です。
/etc/ssh/sshd_configファイルを編集
[root@example ~]# vi /etc/ssh/sshd_config
#Port 22
↓
Port 10022
こちらも同じく、sshサービスを再起動し、反映させます。
ファイアーウォールなどで制限を行っている場合は、
変更したポートを許可するのを忘れずに!
Ⅲ.iptablesの設定
linuxでパケットフィルタリングを行う際の基本のiptables。
設定ファイルへの記述が少し厄介に思えますが、基本の設定を入れて少しずつカスタマイズしていけばOKです。
設定ファイルは以下。
/etc/sysconfig/iptables
デフォルトルールの項目は、inputとoutputをDROPにしておきます。
*filter
:INPUT DROP [0:0]
:FORWARD DROP[0:0]
:OUTPUT ACCEPT [0:0]
あとはこんな感じ。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
COMMIT
・確立した通信を許可
・ICMP通信(ping)を許可
・自ホストからの通信を許可
・tcpの22番、80番のポートへの通信は許可
※他に使用するポートがあれば、同様に記述を追加してください。
※SSHのポート番号の変更を行ったら、ルール内の番号も忘れずに変更!
設定を保存し、iptablesを再起動すれば反映します。
[root@example ~]# /etc/init.d/iptables restart
Ⅳ.SElinux無効化
こちらはセキュリティ向上のための設定というわけではない(むしろ逆)ですが、 SElinuxは頑固なアクセス制限を行うため、サーバーの構築時にはトラブルの原因となることが多い機能です。
iptablesなどでアクセス制限はするということであれば、少なくとも初期段階では無効化しておいたほうが良いでしょう。
SElinuxの動作状況を以下のコマンドで確認します。
[root@example ~]# getenforce
Enforcing
結果が「Enforcing」であれば有効になっています。
/etc/selinux/configファイル上の記述を直接「disabled」に書き換えてサーバーを再起動すれば変更完了です。
[root@example ~]# vi /etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
Ⅴ.logwatchの設定
logwatchは1日1回サーバー内のログをチェックして出力し、メールで送信してくれるツールです。
セキュアログのログイン履歴や、サービスのエラーなど、何かあった時にメールで確認をすることができるので、シンプルながら便利なやつです。
(必ず毎日メールが来るので若干うっとうしいこともなくはない…ですが)
インストールはyumで。
[root@example ~]# yum install logwatch
logwatchの設定ファイルは/etc/logwatch/conf/logwatch.confですが、
中身を見ると以下のようになっており、
元記述が/usr/share/logwatch/default.conf/logwatch.confにあります。
[root@example ~]# cat /etc/logwatch/conf/logwatch.conf
# Local configuration options go here (defaults are in /usr/share/logwatch/default.conf/logwatch.conf)
設定を変更する場合は、元ファイルをコピーし、書き換えます。
[root@example ~]# cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
とりあえず動作させるという場合は、メールの送信先の以下設定だけ変えれば良いと思います。
MailTo = root
メール出力する場合、MTAが動作可能な状態にしておく、というところに注意してください。
送信エラーになってサーバーにたまって容量圧迫、ということも起こり得ます。
Ⅵ.テンプレート化
パブリッククラウドのサーバーならば、上記のような最低限の初期設定を行った状態のサーバーをテンプレート化し、 以降新規サーバー作成時に利用することができます。
手軽ゆえにセキュリティもおろそかになりやすいクラウドのサーバーですが、 利点を生かして、より簡単に安全に運用をしていきたいですね!