カメノドットコム
Debian大好きでメインで節操ない感じ。
GMOもわりと好き。
RSS feedly

ファイアウォールの設定

鉄壁の守りとまではいかなくても、最低限サーバを守るためにファイアウォールを設定しましょう。
必要なポートだけを開放することで、格段にセキュリティは上がります。
また、この設定をしないと同じ物理サーバに格納さてレイル他のVPSユーザに迷惑がかかります。
慎重かつ確実に設定を行いましょう。

---- [PR] ----
現在契約中 : GMOクラウドのVPS : お名前.com
今後契約するかも : お名前.com VPS
--------------

iptablesをインストールする

apt-get でさっくりとインストールできます。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install iptables iptables-persistent

インストールできたら、現在の状態を確認します。

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

何も制限されていません。中からも外からも、全てのポートが開放されています。
非常に危険です。

どのような防御手段を取るのかを考えます。
中から外は全てOK。外から中は全て遮断。
例外として、SSHサーバ、WEBサーバ、メールサーバのポートを開放する、ということにします。
SSHサーバのポートは変更しているので「49152」になっています。
WEBサーバは、HTTP「80」と、HTTPS「443」を開放します。
メールサーバは、送信用に「25」「465」「587」を開放する必要があります。
受信用には「110」「995」「143」「993」を開放しますが、TLS/SSL が完了したら「110」と「143」は閉じることにします。
だいたいこんな感じでいいのではないでしょうか。

IPv6を無効化する

GMOクラウドのVPS では IPv4 のみが提供されていますので、OSレベルで IPv6 を無効化しておきます。
IP Spoofing 対策もしておきましょう。

$ sudo vi /etc/sysctl.d/disable_ipv6.conf
# IPv6 を無効にする
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
$ sudo vi /etc/sysctl.d/enable_ip_spooof_protection.conf
# IP Spoofing 対策
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

ここまで設定できたら、一旦、OSを再起動します。

$ sudo shutdown -r now

reboot を使わないのはタダの癖です。気にしないでください。

iptablesを設定する

まずはデフォルトの設定ファイルをバックアップしておきます。

$ cd /etc/iptables
$ sudo cp rules.v4 rules.v4.orig
$ sudo cp rules.v6 rules.v6.orig

まずは IPv6 でのアクセスを全て禁止します。

$ sudo vi rules.v6
#-----------------------------------------
# 2018-04-01  IPv6 は全て拒否
#-----------------------------------------
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT

本番です。IPv4 の設定を行います。

$ sudo vi rules.v4
#-----------------------------------------
# 2018-04-01  作成
#-----------------------------------------
# 中から外のみ許可
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# ループバックアドレスをもった接続を拒否
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# すでに確立されている接続は許可
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH接続ポート。sshd_config で設定したポート番号を指定
-A INPUT -p tcp -m state --state NEW --dport 49152 -j ACCEPT
# WEBサーバのポートは許可。SSL使わないなら 443 の行は不要
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# 送信メールサーバ。SMTPS も 25番 をあけておかないと外とやり取りできない(←詰まったヤツ)
-A INPUT -p tcp --dport 25 -j ACCEPT
-A INPUT -p tcp --dport 465 -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT
# 受信メールサーバ。あとで pop3d と pop3ds と IMAP は閉じて IMAPS のみに
-A INPUT -p tcp --dport 110 -j ACCEPT
-A INPUT -p tcp --dport 143 -j ACCEPT
-A INPUT -p tcp --dport 993 -j ACCEPT
-A INPUT -p tcp --dport 995 -j ACCEPT
# PINGを許可する
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# ログは「dmesg」コマンドで見てね
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# デフォルトでは全て拒否、ルールにマッチしたもののみ許可
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT

こんな感じでしょうか。中に簡単な解説も添えてあります。
新しい設定を読み込みます。

$ sudo netfilter-persistent reload

新しいルールが適用されているか確認します。

$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:49152
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:urd
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:submission
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:pop3
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imap2
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imaps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:pop3s
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

無事に新しいルールが適用されています。
SSL/TLSの設定が完了したら「tcp dpt:pop3」「tcp dpt:imap2」は閉じます。
別のSSHクライアントからSSH接続出来るか確認してみましょう。あとPINGも。

Sponsored Link