Linux ディストリビューションを安全に利用するための基本。
これらはすべて基本中の基本、絶対に守るべき原則と言っても良い内容である。しかしながら企業や学校の内部等ではこれらが遵守されていないような場面も多々見受けられるため、ここに書き記しておく。
root ログインを避け、管理作業には sudo を利用する。
root ログインを避け sudo を使うようにする。最近の Linux ディストリビューションでは標準で sudo が入っていることが多い。 /etc/sudoers で以下のように sudo 利用可能なグループを定義する。
root ALL=(ALL) ALL %wheel ALL=(ALL) ALL %admin ALL=(ALL) ALL
wheel グループに属するユーザーは su を利用できる設定になっていることが多い。そこで新しく admin グループを追加し、管理者の通常利用ユーザーをそのグループに所属させるのが良いだろう。
パスワード認証を禁止して公開鍵認証のみ利用可能にする。
sudo を利用可能になったら公開鍵認証を設定した上で /etc/ssh/sshd_config で以下のようにパスワード認証を利用禁止にし sshd を再起動する。またポート番号を変更するのが望ましい (ここでは仮にポート番号を 11111 とするがこの例のまま適用しないこと) 。
PasswordAuthentication no
UsePAM no
PubkeyAuthentication yes
PermitRootLogin without-password
Port 11111
秘密鍵は各ユーザーごとに ssh-keygen -t rsa コマンドで作成する。なおこの際、平文の電子メールのようにセキュアでない媒体で秘密鍵を各利用者に配布するのは避ける。万一、平文の電子メールで秘密鍵を配布した場合、受け取った者は安全性を確保するためすぐに秘密鍵を再作成して差し替えるのが常識である。
iptables でポートを閉じる。
RHEL 互換ディストリビューションの場合 /etc/sysconfig/iptables に設定を記述すれば反映される。このファイルは root しか参照できないようにパーミッションを設定するべきである。設定後 iptables を再起動することで反映される。
:INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] :LOG_PINGDEATH - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -f -j LOG --log-prefix "[IPTABLES FRAGMENT] : " -A INPUT -f -j DROP -A INPUT -p icmp -m icmp --icmp-type 8 -j LOG_PINGDEATH -A INPUT -d 255.255.255.255 -j DROP -A INPUT -d 224.0.0.1 -j DROP -A INPUT -p tcp -m tcp --dport 113 -j REJECT --reject-with tcp-reset -A INPUT -p tcp --dport 11111 -m state --state NEW -m recent --set --name SSH -A INPUT -p tcp --dport 11111 -m state --state NEW -m recent --update --seconds 600 --hitcount 10 --rttl --name SSH -j LOG --log-prefix "SSH attack: " -A INPUT -p tcp --dport 11111 -m state --state NEW -m recent --update --seconds 600 --hitcount 10 --rttl --name SSH -j DROP -A INPUT -p tcp -m tcp --dport 11111 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A FORWARD -j DROP -A LOG_PINGDEATH -m limit --limit 1/sec --limit-burst 4 -j ACCEPT -A LOG_PINGDEATH -j LOG --log-prefix "[IPTABLES PINGDEATH] : " -A LOG_PINGDEATH -j DROP COMMIT
この例では 11111 番ポートへの総当たり攻撃を防止している (600 秒以内に 10 回以上アクセスしたらログに記録して破棄する)。また他にも各種攻撃への対策が盛り込まれている。個々の意味は iptables のマニュアルを参照すること。これをテンプレートとした上で、そのまま利用せず要件にあわせて必ずカスタマイズした上で適用する。