文系男子が日和るIT開発~IT知識なしで飛び込んだIT企業

文系男子だからIT企業に就職するなんて考えてもみませんでしたが、日和ながら日々くらいついています。

(ネットワークセキュリティ)CentOS 6.8でのiptablesでのアクセス制御

CentOS 6.8でiptablesを使用し、アクセス制御することで、ネットワークセキュリティを高めようと思います。

CentOS 7以上であれば、firewallが利用可能ですので、そちらを使用してください。
今回は、CentOS 6.8ですのでiptablesを使用します。

 

iptablesの読み方や実行方法の基本 

デフォルトでのiptablesの状態。

iptables -L

f:id:dreamjourney:20160816000411j:plain

 

ナンバリングを付けて見やすく。

 iptables -L -n --line-number

f:id:dreamjourney:20160816000850j:plain

iptables -L -nv --line-numbers

f:id:dreamjourney:20160816001122j:plain

 

デフォルトの設定では、INPUTのデータのnum=5が拒否”REJECT”となっています。

そのため、外部からのアクセス許可を許可する際は、num=5以下の数値で、オプション「-I」で挿入するようにiptablesを編集する。

最後尾より後(今回であればnum=5より後)にルールを追加する場合は、オプション「-A」でiptablesを編集する。

 

80番ポートへアクセス許可する設定の場合は下記のように行う。

iptables -I INPUT 5 -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

上記のコマンドにおいて、INPUTの部分をチェーンという。

組み込まれたチェーンとしては下記のようなものがある。

  • INPUT ・・・ 受信パケット [filter]
  • OUTPUT ・・・ 送信パケット [filter、nat]
  • FORWARD ・・・ フォワードするパケット [nat]
  • PREROUTING ・・・送信時に変換するチェイン [nat]
  • POSTROUTING ・・・ 受信時に変換するチェイン [nat]

「-j」パラメータでターゲットを指定します。

指定可能なターゲットとしては下記のようなものがある。

  • ACCEPT ・・・ 受信パケットを許可
  • DROP ・・・受信したパケットを破棄
  • REJECT ・・・パケットを受信拒否
  • PREROUTING ・・・ 特定のポートにリダイレクト
  • LOG ・・・ログ取得
  • MASQUERADE ・・・ 送信用IPアドレスをポート番号を変換する

「-j」パラメータ以外の他のオプションとしては、下記のようなものがある。

  • --dport [ポート番号] ・・・送信先ポート番号を指定
  • --sport [ポート番号] ・・・受信先ポート番号を指定
  • -p [プロトコル] ・・・ルールを定めるプロトコルtcpudp、icmp)を指定
  • -i [インタフェース] ・・・パケットを受信するインタフェースを指定
  • -o [インタフェース] ・・・パケットを送信するインタフェースを指定
  • -t [テーブル] ・・・テーブルを指定。テーブルは、filterやnatがある。

 

iptablesコマンドで編集するのが 手間であれば、ファイル(/etc/sysconfg/iptables)を直接viコマンドで編集してもよいです。

f:id:dreamjourney:20160816005502j:plain

 

 アクセス制御の大前提

  1. 外部からの通信はすべて拒否する。
  2. 自ホストからの通信を許可する。
  3. 外部への通信は許可する。
  4. 外部からのICMPの受信を許可する。
  5. 外部からのSSHやHTTP通信の受信を許可する

細かい点や、目的に応じて微調整といったところでしょうか。

 

1. 外部からの通信はすべて許可する

先ほどお見せしたデフォルトの設定では、
INPUTに許可設定がありましたので、全てDROPします。
また、FORWARDもDROPします。

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

2. 自ホストからの通信を許可する。

-A INPUT -i lo -j ACCEP

4. 外部からのICMP通信を許可する。

-A INPUT -p icmp -j ACCEPT

 5. 外部からのSSH通信やHTTP通信の受信を許可する

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

サーバへの攻撃を防止する目的であれば、下記のような対策も必須だろう。

データを持たないパケットの接続を破棄

-A INPUT -p tcp --tcp-flags ALL NONE -j DROP 

 

SYNflood攻撃とみなせるパケット受信を破棄

-A INPUT -p tcp ! --syn -m state --state NEW -j DROP

 

ステルススキャンと思われる接続を破棄

-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

 

確立済みの通信のアクセス許可(ポート番号に関係なく許可する)

-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 

 

上記当たりの設定を、/etc/sysconfig/iptablesに記載し、再起動すればOK。

 

INPUTやOUTPUTは *filterテーブル に記載すればよい。

FORWARDやPREROUTINGがあれば *natテーブル に記述すればよい。