Más contenido relacionado La actualidad más candente (20) Similar a Tremaで試すFirewall (20) Tremaで試すFirewall6. FirewallとAccess Control List
• Firewall (FW)
ある特定のコンピュータネットワークとその外部との通信を
制御し、内部のコンピュータネットワークの安全を維持する
ことを目的としたソフトウェア(あるいはそのソフトウェア
を搭載したハードウェア)の技術概念
ファイアーウォール - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%83%BC%E3%82
%A6%E3%82%A9%E3%83%BC%E3%83%AB
• Access Control List (ACL)
アクセス制御リスト(アクセスせいぎょリスト、Access
Control List、ACL)とは、オブジェクト(受動体)に付属す
る許可属性のリスト。コンピュータセキュリティにおけるア
クセス制御を実現するために、誰にどのリソース(受動体)
に対するどの操作を許可するかを列挙したもの。
アクセス制御リスト - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE
%A1%E3%83%AA%E3%82%B9%E3%83%88
6
7. FirewallとAccess Control List
• パケットフィルタ型FWについて扱う場合、
ACL = パケットフィルタのルール
– 複数のエントリ(ACE: Access Control
Entry)の集合
– 特定のトラフィック(フロー)を識別する情報
+ 識別した情報に対するアクションの定義。
• アクセス制御 セキュリティ対策
– 余計な物は見せない触らせない。
7
8. ACL実例 (Cisco IOS)
ip access-list extended GI0-OUT
エントリ
deny
ip any 10.0.0.0 0.255.255.255 log
(ACE)
deny
ip any 172.16.0.0 0.15.255.255 log
deny
ip any 0.0.0.0 0.255.255.255 log
deny
ip any 127.0.0.0 0.255.255.255 log
deny
ip any 192.0.2.0 0.0.0.255 log
deny
ip any 169.254.0.0 0.0.255.255 log
deny
ip any 224.0.0.0 31.255.255.255 log
アクション
フローの
remark vpn
識別
permit udp any eq isakmp any
remark permit to 6to4
permit ip any 192.88.99.0 0.0.0.255
permit 41 any 192.88.99.0 0.0.0.255
remark permit any from inside to outside
permit icmp any any
permit ip any any reflect iptraffic timeout 300
deny
ip any any log
!
8
10. ACLしんどい
• 増え続けるエントリ
– 「謎エントリ化」問題
– 浪費される計算機資源
• ポリシと運用の破綻
– 「これ消したらどういう影響あるかわからないから、
消せないんだよね…」
– 「これ、何のために入れてあるんだっけ?」
– 「わかんねーからとりあえず突っ込んどけば?」
• 謎エントリの拡大再生産という悪循環
10
24. ツール例
• capirca - Multi-platform ACL generation system
https://code.google.com/p/capirca/
– Cisco/Juniper/iptablesのACL生成
Enterprise QoS, Tim Chung,
Google Corporate Netops
Architecture, Nanog 49,
June 15th, 2010.
http://www.nanog.org/me
etings/nanog49/presentati
ons/Tuesday/ChungEnterpriseQoS-final.pdf
24
30. ACL Parse
• ACL読める → 応用
– Syntax check
– 最適化
– 変換 (Compile)
• メタ情報記述への変換
• 他ベンダACLへの変換
– FWシミュレーション
• トポロジ構成まで
シミュレートしようとすると
ソフトウェア的なものが欲しい。
これ消したら、
どういう影響あ
るかわからない
から、消せない
んだよね…
シミュレータで
テストしろよ!
(ってやれるよう
にしたい)
30
40. Implementation
• 個人的な都合でCisco IOS ACLを対象に。
• Ruby/RaccによるParserの実装
• 目標はIOS ACL全機能の網羅
– 前にSyntaxだけは実装してみたことがあった
• とりあえずよく使う機能の実装
– Named/Numbered, Extended/Standard
– 基本的なL3/L4, ポートマッチング
40
42. Cisco IOS ACL Syntax Tree
• とても機械処理しにくいフォーマット
– だから正規表現じゃなくてparserにしたんだけど
• かつて挑戦して途中で挫折しました…
– というか無駄が多い気がするが…
Road to Cisco ACL Parser(3) - # cat /var/log/stereocat | tail -n3
http://d.hatena.ne.jp/stereocat/20110911/1315716668
42
46. 実装
• Simple Routerを改造
– 転送する前にACLとの照合
– マッチしたACLのアクション(Permit/Deny)
に応じて、そのままOutPortかDropかを指定
してやれば良い。
– 片方向(inbound)だけフィルタするモデル
46
47. FW Config
$interface = [
{
:port => 1,
:hwaddr => "00:00:00:01:00:01",
:ipaddr => "192.168.1.1",
:masklen => 24,
:filter_file => "filters.acl",
:infilter => 1
},
{
:port => 2,
:hwaddr => "00:00:00:01:00:02",
:ipaddr => "192.168.2.1",
:masklen => access-list 1 permit
24
access-list 1 deny
}
access-list 1 permit
]
access-list 1 deny
ACLファイルと
ACL名(ACL番号)
を指定してやる
192.168.1.0
192.168.1.64
192.168.1.128
192.168.1.192
0.0.0.63
0.0.0.63
0.0.0.63
0.0.0.63
47
48. Packet-in 処理(1)
def handle_ipv4( dpid, message )
if filtered?( dpid, message )
send_drop_flow_mod dpid, message
return
end
true (denied)
ならdrop actionの
フローを追加する
if should_forward?( message )
forward dpid, message
elsif message.icmpv4_echo_request?
handle_icmpv4_echo_request dpid, message
else
# noop.
転送処理は
end
Simple Routerの処理
end
そのままでOK
48
49. Packet-in 処理(2)
def srcdst_match packet_in
opts = {
:dl_type => packet_in.eth_type,
:nw_src => packet_in.ipv4_saddr.to_s,
:nw_dst => packet_in.ipv4_daddr.to_s,
}
if packet_in.tcp?
opts[ :nw_proto ] = 6
opts[ :tp_src ] = packet_in.tcp_src_port
opts[ :tp_dst ] = packet_in.tcp_dst_port
elsif packet_in.udp?
opts[ :nw_proto ] = 17
opts[ :tp_src ] = packet_in.udp_src_port
opts[ :tp_dst ] = packet_in.udp_dst_port
elsif packet_in.icmpv4?
Dropするフローは
opts[ :nw_proto ] = 1
L3/L4マッチで指定
end
(拡張ACLレベル)
Match.new opts
end
49
50. def filtered?( dpid, message )
port = message.in_port
interface = @interfaces.find_by_port( port )
infilter = interface.infilter
filtered = false # not filtered
if infilter
opts = {
:src_ip => message.ipv4_saddr.to_s,
:dst_ip => message.ipv4_daddr.to_s
}
ACL
マッチング
Config File
(略: Packet-in object からACL検索オプション情報生成)
ACLマッチ検索
ace = infilter.search_ace( opts )
if ace
# when found matched ace
ACL Actionに応じて
case ace.action
ログ出力して
when "permit"
フラグ決めて終わり。
info "packet permitted # #{ _pph(opts) }"
when "deny"
info "packet denied (explicitly) # #{ _pph(opts) }"
filtered = true
end
else
# not found matched entry
info "packet denied (implicitly) # #{ _pph(opts) }"
filtered = true
end
暗黙のdeny
end
return filtered
50
end
53. 宛先解決問題
• Sender
– パケットを生成→どこに投げるか
– L2 next hop (dst MAC)
• Sender は全部 default gateway に投げるのでL2では投げ先固
定。今回は Static に指定してarp 解決はしていない
• Receiver
– FW(DUT)は生成されたパケットをどこかに投げようとす
る
• テストケースに応じて変動するIP/MACを解決して受信しなけ
ればいけない。
• 任意の ARP Request をControllerが吸い込む
– Simple Router(FW)は1回目のパケット送信はARP解決の
ためできないので、2回(以上)繰り返してやる必要がある。
• いきなりパケット送ってる → Unknown Unicast処理させてる
53
54. 宛先解決問題
def echo_arp_request dpid, message
info "[handle_arp_request] #{dpid.to_hex}"
arp_reply = Pio::Arp::Reply.new(
:source_mac => @bridge[ @receiver_dpid ][ :src_mac ],
:destination_mac => message.arp_sha.to_s,
:sender_protocol_address => message.arp_tpa.to_s,
:target_protocol_address => message.arp_spa.to_s
)
action = SendOutPort.new( message.in_port )
packet_out dpid, arp_reply.to_binary, action
end
ARP Requestについて
全部オウム返しにした上で
Controller(Receiver)に吸い込む
54
58. See also.
• ACL Parser
– stereocat/cisco_acl_intp
https://github.com/stereocat/cisco_acl_intp
– ACLをどうにかしたい話 - # cat /var/log/stereocat | tail -n3
http://d.hatena.ne.jp/stereocat/20130929/1380457458
• Simple Firewall
– training/simple-firewall at master · stereocat/training
https://github.com/stereocat/training/tree/master/simple
-firewall
• TCP/UDPパケット生成
– simple-router + udp echo server function using Pio
https://gist.github.com/stereocat/6839659
– Trema/Pioでパケットを作ろう(1)~(3) - # cat
/var/log/stereocat | tail -n3
http://d.hatena.ne.jp/stereocat/20131005/1380977633
58
60. ACL Parser
• http://rubular.com/ みたいなフロントエンドつ
けらんないかなー
• ACL Compiler
– Cisco→Capirca
• 対応ACL機能拡張
– object-class等のACL feature網羅率の向上
– ASA系対応?
• Optimization
– 不要エントリの排除やSuggest
– フィルタの可視化ってなにかいい方法ないのか?
– フィルタテストパターンの提示
60
61. ACL/FW Simulator
• トポロジ込みのEnd-to-End filtering
simulation/test
– Simple-routerの拡張(multiple-router?)
– DSLによるネットワークトポロジ定義(trema
自体はもうやってる)
– 対話的処理(ACL変更、テスト実行)
• TCP Stateのチェック
– 全部packet-inさせるならstate-fullな動作も
DPI的な動作もやろうと思えばやれるはず。
61
62. ACL Tester
• TCP Stateのテスト
– 今のところStatelessにしてしまってる
(Simple Firewallの方も)
• テストシナリオ/テストパターン生成
– 手書きするのめんどい。
62