iptablesでもっとしっかりセキュリティを固めてみる メモ書き
投稿日:2016年09月21日
最終更新日:
もくじ
- 設定の方針
- 共通の設定
- 個別の設定
- 完成形
設定の方針
今回iptablesを設定するにあたっては、「まず全部のポートを塞いで、後から個別に開ける」方針で行きます。ここで「とりあえず全部のポートを開けて、後から個別に塞ぐ」考え方で行くと、塞ぎ忘れた穴から侵入者が堂々と入ってきます。なのでとりあえず全部塞ぐのがおすすめです。…セキュリティを多少犠牲にしてでも楽をしたい方はこちらへ。
共通の設定
というわけで、早速iptablesを組んでいきます。設定内容は、基本的に「*filter」と「COMMIT」の間に書きます。…CentOS7でiptablesを有効化する手順はCentOS7の仮想サーバー構築にチャレンジ その4を参照してください。 [VIM] *filter #この下に設定を書く :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] # INPUT,OUTPUT Basic -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP -A INPUT -p tcp -m tcp ! –tcp-flags FIN,SYN,RST,ACK SYN -m state –state NEW -j DROP -A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT -A OUTPUT -p tcp -m tcp –sport 22 -j ACCEPT -A INPUT -p tcp -m tcp –sport 80 -j ACCEPT -A OUTPUT -p tcp -m tcp –dport 80 -j ACCEPT -A INPUT -p tcp -m tcp –sport 443 -j ACCEPT -A OUTPUT -p tcp -m tcp –dport 443 -j ACCEPT -A INPUT -p udp –sport 53 -j ACCEPT -A OUTPUT -p udp –dport 53 -j ACCEPT #サーバーのIPがDHCPによる割当(家庭内LAN環境のテストサーバーなど)の場合は以下を追記する -A INPUT -p tcp -m tcp –dport 67 -j ACCEPT -A OUTPUT -p tcp -m tcp –sport 67 -j ACCEPT #この上に設定を書く COMMIT [/VIM] 今回はfilterテーブルでパケットの通過・遮断の制御を行います。設定ファイルに直接書き込む場合はこんな感じになります。 [VIM] *filter #設定内容を書き込む COMMIT [/VIM] ここにチェーンと呼ばれるルールを書き込んでいきます。チェーンは
- INPUT(自分のサーバーに入ってくる)
- OUTPUT(自分のサーバーから出て行く)
- FORWARD(自分のサーバーを経由する)
- ACCEPT (通す)
- DROP (相手に通知せずに捨てる)
- REJECT (エラーメッセージを送りつけて捨てる)
- LOG (ログを取る)
[VIM] :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] #書式 :チェーン(INPUT,OUTPUT,FORWARD) パケットの取り扱い(ACCEPT,DROP,REJECT,LOG) [適用範囲:ポート番号を指定] :INPUT DROP [0:0] [/VIM] filterテーブルしょっぱなのこの3行が、全体に対して適用するルールです。とりあえず全部塞ぐので、全部DROPします。[0:0]は適用するポート番号の範囲を指定し、今回のように[0:0]表記の場合は全ポート番号に適用されます。後から個別適用のルールで必要なポートを開けていきます。
[VIM] -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A OUTPUT -p icmp -j ACCEPT [/VIM] 次はこの部分の解説です。ここから個別にルールを適用していきます。この辺で各種オプションの解説を入れます。
- -p プロトコルを指定(tcp,udp,icmp 省略した場合は全部)
- -s パケットの送信元(IPアドレスや範囲等で指定 192.168.0.1 や 192.168.0.0/24 省略した場合は全部)
- -d パケットの宛先(指定法は -s と同じ)
- -i パケットを受信するインターフェース(eth0,eth1,lo(ローカルループバックアドレス 自分自身)など)
- -o パケットを送信するインターフェースを指定(-iと同じ)
- -j パケットの取り扱い(ACCEPT,DROP,REJECT,LOG) 最後に書かれる事多し
[VIM] -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT [/VIM] この2行は自分自身との通信を許可するものになります。INPUT(入ってくる)の時は-i(パケットを受信するインターフェース)で、OUTPUT(出て行く)の時は-o(パケットを送信するインターフェース)で、lo(自分自身)を指定しています。最後に-jパラメータで許可します。
[VIM] -A INPUT -p icmp -j ACCEPT -A OUTPUT -p icmp -j ACCEPT [/VIM] ICMPプロトコルの通信を許可します。これもまあ決まり文句といえます。
[VIM] -A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP -A INPUT -p tcp -m tcp ! –tcp-flags FIN,SYN,RST,ACK SYN -m state –state NEW -j DROP -A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP [/VIM] …この部分についてはさくらインターネットのVPSヘルプにあるものをそのまま引っ張ってきたものになります。サーバーへの攻撃対策の3行です。詳しくはiptablesの設定方法|さくらインターネット公式サポートサイトでおねがいします。
個別の設定
ここからはサーバーをどのように運用するかによって様々な設定が出てきますが、基本を押さえておけばまあどうにかなると思います。今回はSSHについて設定します。ポート番号は22番になります。自分で変更した場合はそちらに従って下さい。 [VIM] #SSHでは入ってくる通信の時に送信先(Destination)ポート22番を、出て行く通信の時に送信元(Source)ポート22番を開ける -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT -A OUTPUT -p tcp -m tcp –sport 22 -j ACCEPT #HTTP,HTTPS,DNSでは入ってくる通信の時に送信元ポート80,443,53番を、出て行く通信の時に送信先ポート80,443,53番を開ける(WEBサーバー等として運用する場合はそのための設定を別途追記) -A INPUT -p tcp -m tcp –sport 80 -j ACCEPT -A OUTPUT -p tcp -m tcp –dport 80 -j ACCEPT -A INPUT -p tcp -m tcp –sport 443 -j ACCEPT -A OUTPUT -p tcp -m tcp –dport 443 -j ACCEPT -A INPUT -p udp –sport 53 -j ACCEPT -A OUTPUT -p udp –dport 53 -j ACCEPT #サーバーのIPがDHCPによる割当(家庭内LAN環境のテストサーバーなど)の場合は以下を追記する -A INPUT -p tcp -m tcp –dport 67 -j ACCEPT -A OUTPUT -p tcp -m tcp –sport 67 -j ACCEPT [/VIM] ここで–dport,–sportについて少し触れます。–dportは送信先のポート番号を、–sportは送信元のポート番号を指定します。今回はSSHなのでどちらも22番を指定しています。53番はDNS,80番はHTTP,443番はHTTPSになります。これらはyumを使用する上で開放する必要があるポートになります。また、家庭内LAN環境でテストサーバーとして運用している場合など、サーバーのIPアドレスがDHCPで割り当てられている場合は、67番ポートも開けないとyumが使えませんでした(実際にこれで私は2時間ほど浪費しました)。
完成形
[VIM] *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] # INPUT,OUTPUT Basic -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP -A INPUT -p tcp -m tcp ! –tcp-flags FIN,SYN,RST,ACK SYN -m state –state NEW -j DROP -A INPUT -p tcp -m tcp –tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP -A INPUT -p tcp -m tcp –dport 22 -j ACCEPT -A OUTPUT -p tcp -m tcp –sport 22 -j ACCEPT -A INPUT -p tcp -m tcp –sport 80 -j ACCEPT -A OUTPUT -p tcp -m tcp –dport 80 -j ACCEPT -A INPUT -p tcp -m tcp –sport 443 -j ACCEPT -A OUTPUT -p tcp -m tcp –dport 443 -j ACCEPT -A INPUT -p udp –sport 53 -j ACCEPT -A OUTPUT -p udp –dport 53 -j ACCEPT COMMIT [/VIM] 冒頭で示したこれが一応の完成形になります。以下は参考にさせていただいたサイト様の一覧です。
- さくらのVPS を使いはじめる 3 ? iptables を設定する | アカベコマイリ
- 【CentOS7】インストール直後からiptableの設定 – Notitle
- 習うより慣れろ! iptablesテンプレート集(1):ステートフルパケットフィルタを使ったサービスの公開 (2/6) – @IT
- iptablesの設定方法|さくらインターネット公式サポートサイト
- iptables : filter テーブル / CentOS 6.5 (64-bit): “HP ML115 G5”と自作機で、できたこと
- 「さくらのVPS」CentOS の初期設定の作業のまとめ&解説(iptablesによるファイアウォール編) | 5 LOG iptables のコマンド書式