iptablesでもっとしっかりセキュリティを固めてみる メモ書き

こちらのページは、「CentOS7の仮想サーバー構築にチャレンジ その4」にて使用したiptablesの設定について多少解説を加えるページです。

もくじ

  • 設定の方針
  • 共通の設定
  • 個別の設定
  • 完成形

設定の方針

今回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(自分のサーバーを経由する)
の3種類に別れます。パケットの取り扱いは、
  • ACCEPT (通す)
  • DROP (相手に通知せずに捨てる)
  • REJECT (エラーメッセージを送りつけて捨てる)
  • LOG (ログを取る)
の4つになります。

[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 -m state –state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT [/VIM] …この2行は決まり文句だと思ってもいいでしょう。すでに通信しているパケットを許可するものです。個別ルールにマッチすればそちらが適用されます。

[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] 冒頭で示したこれが一応の完成形になります。以下は参考にさせていただいたサイト様の一覧です。

このブログを応援する・寄付する

当ブログでは暗号通貨による寄付を募っております。

モナゲボタン モナゲボタン

Bitcoin:

Monacoin:

Litecoin: