iptables-firewallはIPホワイトリスト、国別制限、Firewall、IDS/IPSなどの各種自動生成されるフィルタを用途ごとに自由に組み合わせてルールセットを作成し、任意のロールとして設定・運用することで厳格かつ柔軟なアクセス制御機構を実装するスクリプトです。
導入
GitHub - falsandtru/iptables-firewall: iptables rule generating and management script.
======================= PACKET FLOW EXAMPLE ======================= == config == ROLES=(SSH) SSH=(BLOCK_COUNTRY "file{1,2}|TRACK_PROWLER|DROP" LOCAL_COUNTRY FIERWALL IPF "IPS|LOG...|DROP") ... MAP=("${MAP[@]}" "INPUT -p tcp --dport 60022 -j SSH") MAP=("${MAP[@]}" "INPUT -j TRAP_PORTSCAN") MAP=("${MAP[@]}" "FORWARD -j TRAP_PORTSCAN") == apply == INTERNET ______ V ______________________________________________________ _______ INPUT | | TCP UDP ICMP | | | | TCP 60022 | TRAP_PORTSCAN ( --> TRACK_PROWLER ) --->| POLICY| | | | | | |====== | ======|===============================================| |_______| |====== V ======|===============================================| _______ Layer1 | | | | | BLOCK_COUNTRY --->| | |______________________________ V ______________________________| | | Layer2 | Rule1 | Rule101 | Rule201 | Rule202 | | | | file1 --> file2 -->TRACK_PROWLER--> DROP --->| | |______ V ______|______ V ______|______ V ______|_______________| | BLOCK | Layer3 | | | | | LOCAL_COUNTRY --->| | |______________________________ V ______________________________| | | Layer4 | | | | | FIERWALL ( --> TRACK_ATTACKER ) --->| | |______________________________ V ______________________________| | | Layer5 | | | | | IPF ( ANTI_PROWLER/ATTACKER ) --->| | |______________ V ______________________________________________| | | Layer6 | | | | | | | IDS/IPS --> LOG --> DROP --->| | | | | | | | |============== | ==============================================| |_______| |============== V ==============================================| SERVICE| | | === SSH SERVICE === | |_______________________________________________________________|
特徴
ロールベースコントロール
ロールにより適用するルールをまとめられるため、用途にあわせてルールを設定する現実の実務モデルに則した運用を手軽に実施できます。
初期設定ではGLOBAL/LOCAL/CONNECTION/SYSTEM/NETWORK/AUTH/PRIVATE/CUSTOMER/PUBLICロールが定義されています。
# TESTロールを作成 ROLES=(TEST) ... ...... # TESTロールを適用 MAP=("${MAP[@]}" "INPUT -p tcp --dport 8080 -j TEST")
マルチレイヤフィルタリング
ロールに設定するルールセットは、ホワイトリスト、国別制限、Firewall、IDS/IPSなどから選択した各種フィルタを組み合わせた順に適用していくマルチレイヤフィルタとして動作します。
# TESTロールにルールを設定 TEST=(whitelist/private LOCAL_COUNTRY FIREWALL IPF IPS ACCEPT) # 1. whitelist/private # ファイルに記述されたIPのみ通過させ、ほかは遮断する。 # # 2. LOCAL_COUNTRY # 許可した国のIPのみ通過させ、ほかは遮断する。 # # 3. FIREWALL # Firewallを適用し接続を検疫する。 # # 4. IPF # 攻撃行為または不審行為のあったIPを遮断する。 # # 5. IPS # 指定のパケットをIPSへ渡し処理を終える。 # # 6. ACCEPT # 渡されなかった残りのパケットをすべて許可し処理を終える。 #
機能
ホワイトリスト
IPを記載したファイルから記載されているIPのみを通過させるフィルタを生成し、ホワイトリストによる厳格なアクセス制限を行います。
# 1. whitelist/private # ファイルに記載されたIPのみ通過させ、ほかは遮断する。 #
国別フィルタ(特定国禁止/日本国内限定等制限)
アクセス可能な国を日本国内のみ等特定の国のみに制限、および特定の国からの全アクセスを禁止遮断します。IPと国との対応は割り当ての実施組織である地域レジストリから自動的に取得し適用されます。
# 許可 日本 LOCAL_COUNTRY_CODE="JP" # 拒否 中国|香港|マカオ|韓国|北朝鮮 BLOCK_COUNTRY_CODE="CN|HK|MO|KR|KP"
# 2. LOCAL_COUNTRY # 許可した国のIPのみ通過させ、ほかは遮断する。。 #
Firewall
各種Firewall機能を利用できます。
# 3. FIREWALL # Firewallを適用し接続を検疫する。 #
PortscanTrap
公開していないポートにアクセスを試みたIPをIPFにより遮断するIPとして追跡します。
# 4. IPF # 攻撃行為または不審行為のあったIPを遮断する。 #
IDS/IPS
IDSまたはIPSを導入している場合、これに処理を引き渡します。
# 5. IPS # 指定のパケットをIPSへ渡し処理を終える。 # # 6. ACCEPT # 渡されなかった残りのパケットをすべて許可し処理を終える。 #
運用例
iptables-firewallはサーバーを利用する際に要求されるセキュリティ機能の確保に寄与します。
ポートスキャンの追跡
iptables-firewallはさくらのVPSでテスト運用されていますが、このサーバーは管理者自身しか利用していないにもかかわらず、ユニキャストによるポートスキャンを約10分に1回、1日に100回以上受けています。
Nov 17 19:59:37 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=178.33.x.x DST=133.242.x.x LEN=44 TOS=0x00 PREC=0x00 TTL=48 ID=38796 PROTO=TCP SPT=80 DPT=28612 WINDOW=16384 RES=0x00 ACK SYN URGP=0 Nov 17 20:00:01 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=104.192.x.x DST=133.242.x.x LEN=28 TOS=0x08 PREC=0x00 TTL=234 ID=16288 PROTO=UDP SPT=40790 DPT=53413 LEN=8 Nov 17 20:07:08 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=114.38.x.x DST=133.242.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=23942 DF PROTO=TCP SPT=59270 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0 Nov 17 20:07:11 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=114.38.x.x DST=133.242.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=23943 DF PROTO=TCP SPT=59270 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0 Nov 17 20:07:17 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=114.38.x.x DST=133.242.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=23944 DF PROTO=TCP SPT=59270 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0 Nov 17 20:08:33 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=31.148.x.x DST=133.242.x.x LEN=40 TOS=0x10 PREC=0x00 TTL=245 ID=54321 PROTO=TCP SPT=46530 DPT=9064 WINDOW=65535 RES=0x00 SYN URGP=0 Nov 17 20:18:34 www kernel: [IPTABLES INVALID] : IN=eth0 OUT= MAC=xx SRC=66.150.x.x DST=133.242.x.x LEN=76 TOS=0x00 PREC=0x00 TTL=50 ID=12979 PROTO=ICMP TYPE=3 CODE=3 [SRC=133.242.x.x DST=66.150.x.x LEN=48 TOS=0x00 PREC=0x00 TTL=125 ID=27360 PROTO=UDP SPT=27005 DPT=27015 LEN=28 ] Nov 17 20:33:11 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=66.114.x.x DST=133.242.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=9599 DF PROTO=TCP SPT=3618 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0 Nov 17 20:33:17 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=66.114.x.x DST=133.242.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=50 ID=9600 DF PROTO=TCP SPT=3618 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0 Nov 17 20:35:12 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=178.33.x.x DST=133.242.x.x LEN=44 TOS=0x00 PREC=0x00 TTL=48 ID=50103 PROTO=TCP SPT=80 DPT=25596 WINDOW=16384 RES=0x00 ACK SYN URGP=0 Nov 17 20:41:09 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=5.196.x.x DST=133.242.x.x LEN=44 TOS=0x00 PREC=0x00 TTL=46 ID=30348 PROTO=TCP SPT=443 DPT=55323 WINDOW=16384 RES=0x00 ACK SYN URGP=0 Nov 17 20:43:19 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=111.249.x.x DST=133.242.x.x LEN=40 TOS=0x00 PREC=0x00 TTL=111 ID=256 DF PROTO=TCP SPT=12200 DPT=21320 WINDOW=8192 RES=0x00 SYN URGP=0 Nov 17 20:43:41 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=8.8.x.x DST=133.242.x.x LEN=44 TOS=0x00 PREC=0x00 TTL=39 ID=48886 PROTO=TCP SPT=53 DPT=51501 WINDOW=42900 RES=0x00 ACK SYN URGP=0
ポートスキャンからクラッキングへ
このような一見穏やかに見えるポートスキャンであっても、ポートを発見すると途端に秒間数回から数十回の総当たり攻撃や辞書攻撃を行いサーバーへ侵入しようとしてくるため放置すると非常に危険です。過去に8080番ポートでサーバー監視ツールを使用していた際に攻撃を受けました。
ホワイトリストの作成が困難な要件でのセキュリティ対応
サービスを少ない資本で運営している場合、こうした攻撃を避けようとSSHポートなどの重要機能へ接続可能なIPを制限しようとしてもプロバイダレベルまででしかIPの範囲を絞り込めず、社員の外出先や自宅からの接続を許可したい場合はそれすらも困難となります。
攻撃の遮断およびポートスキャンからのポート隠蔽
このような要件においても、国別フィルタで接続を日本国内に限定するとともに、ポートスキャンや攻撃を行ったIPを遮断するファイアウォールのオプション機能であるFW_INTRUDERによりポートを隠蔽することができます。また、攻撃を受けた場合でも攻撃を検知して以降の攻撃とアクセスを遮断します(※いずれも0-1023番以外のポートである必要がある)。
# e.g. # 公開していないポートへのポートスキャンといった不審行為や攻撃を検知してIPを追跡 Nov 17 20:43:19 www kernel: [IPTABLES PORTSCAN] : IN=eth0 OUT= MAC=xx SRC=111.249.x.x DST=133.242.x.x LEN=40 TOS=0x00 PREC=0x00 TTL=111 ID=256 DF PROTO=TCP SPT=12200 DPT=21320 WINDOW=8192 RES=0x00 SYN URGP=0 # 追跡中の不審なIPからの重要機能へのアクセスを遮断して公開ポートを保護・隠蔽 Nov 17 20:43:19 www kernel: [IPTABLES INTRUDER] : IN=eth0 OUT= MAC=xx SRC=111.249.x.x DST=133.242.x.x LEN=40 TOS=0x00 PREC=0x00 TTL=111 ID=256 DF PROTO=TCP SPT=12200 DPT=10022 WINDOW=8192 RES=0x00 SYN URGP=0
サーバーのネットワークセキュリティ向上に
以上のように、iptables-firewallは実用的なネットワークセキュリティの導入を容易にします。