71
OpenSolaris IP Filter さりげなく パケットフィルタリング を実現する方法 OpenSolaris Evangelist Kazuyuki Sato

Opensolaris ipfilter 20090710

Embed Size (px)

Citation preview

Page 1: Opensolaris ipfilter 20090710

OpenSolarisIP Filterさりげなくパケットフィルタリングを実現する方法

OpenSolaris Evangelist

Kazuyuki Sato

Page 2: Opensolaris ipfilter 20090710

Agenda

FirewallについてSolaris Firewalls

Global Default PolicyNetwork Services Policyログについて

まとめ

NAT参考情報

Page 3: Opensolaris ipfilter 20090710

FireWall について

Page 4: Opensolaris ipfilter 20090710

Firewallの基本的な役割

ようこそ、混沌渦巻く The Internet へホストはルータを介して別なネットワークにパケットを転送することで通信を行います

Firewallはネットワーク間のパケットを一定のルールに基づいて制御する装置

アクセス制限を適切にコントロールすることでセキュリティを高める

より安全にネットワーク接続を行うことを目的としている

Page 5: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 5

Firewallの種類

Network-Level(Packet) Firewallsパケットに含まれる情報を基に、 ruleを作成し、その ruleを基に通過 /拒否をパケットに適用し、通信を制御する

Application-Level Firewallproxyや Application gateway を利用した通信application-level での protocol (smtp, http, ftp...)制御となるため、 protocol 毎に application gatewayを用意する必要がある

Page 6: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 6

Firewallの種類

さらに、 Network-Level(Packet) Firewallsには二つの種類がある

Statefull Network-Level Firewallsセッションを監視しながらインテリジェントにコネクションを管理する方式を持つ

Stateless Network-Level Firewallsセッションを監視せず、基本的な情報のみでコネクションを管理 (protocol, source/destination address or port, message type)

Statefull Network-Level Firewallは、この機能を持っている

Page 7: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 7

Firewallの種類

Stateless Network-Level Firewallsの方式では、パケットの基本的な情報のみで管理するため、応答を含めた通過するパケットすべてのコネクションを静的に管理しなければならない

しかし、上記の条件だけでは、決めうちの処理になってしまうため、これに加え Statefull Packet Inspection機能を持つ Statefull Network-Level Firewallsが一般的に必要とされ広く利用されている

Page 8: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 8

Firewallの種類 (Statefull Network-level Firewalls)

ネットワークインターフェースを流れるパケットを、「 rule 」に従いフィルタリングする「パケットフィルタリング」機能を持つ

パケットのデータを判断し、動的にポートを開閉する仕組みを持つ (Stateful Packet Inspection)

セッション情報を保持し、不正なセッションは即座に叩き落とす

コネクションをセッションとして認識、管理しているため、戻りパケットの ruleを定義する必要がない

Page 9: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 9

Solaris Firewalls

Page 10: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 10

Solarisにおける Firewall機能

Solaris 9までは、 SunScreenと呼ばれる強力な Firewall製品が提供されていたfirewallの存在を検知できないようにする Stealth mode を持つ Statefull FirewallSolaris 10での大がかりな TCP/IP stack変更(Fire Engine)に追随できず、あえなく EOL

Solaris 10では IP Filterが統合IP Filter 1.0は 1993年にOSSとしてリリースSolarisにおいて、無償で Firewallを構築するとなると、これ一択というくらい使われている

Page 11: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 11

Solarisにおける Firewall機能

Solaris 10 からOpenSolarisに継承された IP Filter

Statefull Firewall機能を実装し、 kernel moduleとして提供

Solaris 10やOpenSolarisに搭載されるものは、Solarisに特化したエンハンスが追加

Ipv6対応 , Packet Filter Hooksによる zone対応など

OSS版に入れ替えることも可能OSS版は、 SNMP trap を送出できる予定

作者 Darren Reed氏は、 SunのエンジニアOSS 版 http://coombs.anu.edu.au/~avalon/

Page 12: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 12

IP Filterの課題

そんな素晴らしい IP Filterですが・・・IP Filterの設定はシンプルだが、ネットワークセキュリティやパケットフィルタリングを理解する必要がある

もっと、簡単に使う (設定する )ことができないものか・・・

Page 13: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 13

そこで、 Solaris host-based firewall

Nevada b109にて追加された新機能PSARC 2008/580 Solaris host-based firewallhttp://arc.opensolaris.org/caselog/PSARC/2008/580

ruleを、より簡単に設定する方法を提供SMFのサービスに IP Filterの設定を統合

SMFサービス毎に block/passの設定を持たせるサービス毎に利用するポート番号を基に ruleを自動生成

OpenSolaris 2009.06 (b111ベース )で利用可能に

Page 14: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 14

そして、設定をよりシームレスに

IP Filterを設定するためのプロパティが追加svc://network/ipfilter:default

各種サービスを提供する svc://FMRI

svccfgコマンドで firewallを制御可能に 基本となるポリシーは

svc://network/ipfilter:defaultで定義

個別のポリシーは、各種サービスの FMRI で定義

ポート番号などを知らなくともサービス名で制御可能

Page 15: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 15

svc://network/ipfilter:defaultfirewall_config_default/policy

svccfg Tips:

プロパティの値を空 (empty)にしたい場合は、# svccfg -s FMRI delpropvalue hoge/hoge 現在の値を実行してみよう

Page 16: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 16

policyについて

ポリシーは、二段階で制御されるGlobal Default Policyでは基本となる policyを設定

Network Services Policyでは、サービスの policy を設定し、そのポートに関するGlobal Default Policyを上書きする

この事を踏まえて ruleは作成される

Global Default Policy

Network Services Policy

svc://network/ipfilter:defaultで決定される policy

各サービスの svc://FMRIで決定される policy

強い(上書き )

基本となる policy

Page 17: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 17

本日、覚えて帰ってくださいね!firewall_config_default/policyfirewall_config_default/apply_tofirewall_config_default/open_potsfirewall_config_default/exceptions

これらの設定は、Global Default Policy と呼ばれます。

Global Default Policy

Page 18: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 18

svc://network/ipfilter:default

「 firewall_config_default 」 プロパティ NEW!まず、大まかなポリシーを決定します来るものは叩き落とすか・・・受け入れるか・・・

最初に下記の要素が重要です

policyパケットフィルタリングのポリシーを設定

“allow” or “deny” or “none"

apply_to条件を適用させる要素を設定

host, subnet, ippol, interface

policyの設定により適用条件が変わる

Page 19: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 19

firewall_config_default/policy

firewall_config_default/policyに設定可能なpolicy

“none" policy mode (firewall off)アクセス制御は行わない。

全てのパケットの通過を許可

“deny" policy mode (firewall on)incoming packetをすべて受け入れる

ただし、 apply_toに設定されたものは、 block対象になる

“allow" policy mode (firewall on)incoming packetはすべて拒否する

ただし apply_toに設定されたものは、 pass対象になる

Page 20: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 20

firewall_config_default/policy = allow

有効にする すべての incoming packet を遮断するが、指定された source address(後

述 )からのアクセスを許可する状態となる

# svccfg -s network/ipfilter:default setprop \firewall_config_default/policy = allow

# svcam refresh ipfilter

OpenSolarishost

blockincoming

outgoing

passhttp

ssh

ftp

offにするには、 noneを指定

Page 21: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 21

allowで生成される rule

生成される default rule すべての incoming packet を遮断するが、指定された source addressから

のアクセスを許可する状態するため、下記 ruleが自動生成される

OpenSolarishost

blockin

outpass

http

sshftp

# Non-service programs rules# Global Default rulespass out log quick all keep stateblock in log all

log採取

など、全てのpacket

(all)

Page 22: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 22

ちょっと ruleを覗いてみましょう

ruleは、次の情報で構成されるaction

packetの pass(許可 )または block(拒否 )を定義

directionpacketの方向を定義

packetpacketを判定するための filtering ruleの定義

passblock

outin

log quick keep statelog all

action direction packet

default ruleを例に

Page 23: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 23

ruleの動作

ruleの動作1. 通信を ruleと比較 (directionと packet)

2. マッチした場合、 ruleに指定された actionを記憶

3. マッチする前までに記憶していた actionはすべて破棄

4.ruleの終わりに到達するか、マッチした rule に "quick" keywordが含まれる場合は、この actionを実行し、以後のマッチング処理は行われずに終了

5. ruleにマッチしなければ packetを通過させ終了

この繰り返しにより、パケットフィルタリングを実現している

passblock

action direction packetoutin

log quick keep statelog all

実行順序

Page 24: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 24

ruleが間違っていると・・・

svc://network/ipfilter:defaultがmaintenance modeになるので注意サービス側の設定を間違うと、サービスとipfilterがmaintenance modeになります。refresh後は、 svcs -xvで確認

Page 25: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 25

ruleは /usr/tmp/ipfディレクトリに生成

ruleは動的に作成される/usr/tmp/ipf ディレクトリに生成

ipf.confipf_ovr.conf svc_* (サービス毎の定義ファイル )

このディレクトリは消してはいけません。ipfilterの disable/enableで再生成されます

refreshや enableにて再生成直接、これらのファイルを修正しても反映されない

修正が入り onnv b120 以降は /var/run/ipfに変更になります!

Page 26: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 26

svc://network/ipfilter:defaultfirewall_config_default/apply_to

Page 27: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 27

firewall_config_default/apply_to

firewall_config_default/apply_toに設定可能な構成要素

host (host[6]:IPaddress)ホストの IP アドレスを直接指定 ex. host:192.168.0.1

subnet (network[6]:IP/netmask)network address を指定 ex. network:192.168.0.0/24

ippool (pool[6]:pool number)ippool を利用した指定 ex. pool:77

interface (if:interface_name)network interface を指定 ex. if:e1000g0

※6をつけると IPv6の情報となります

Page 28: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 28

firewall_config_default/apply_to

firewall_config_default/apply_toに設定された要素は、 firewall_config_default/policyの設定で、条件が変わる事に注意 (大事なことなので、何度も書きます !)

“deny" policy mode incoming packetをすべて受け入れるただし、 apply_toに設定されたものは、 block対象になる

“allow" policy mode incoming packetはすべて拒否するただし apply_toに設定されたものは、 pass対象になる

Page 29: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 29

firewall_config_default/apply_to

firewall_config_default/policy = allow設定時、特定の networkからの packetは通過させる

# svccfg -s network/ipfilter:default setprop \firewall_config_default/policy = allow

# svccfg -s network/ipfilter:default setprop \firewall_config_default/apply_to = network:192.168.99.0/24

# svcadm refresh ipfilter

192.168.99.0/24の networkからのアクセスは無条件で通過

下記の ruleが生成されるpass out log quick all keep statepass in log quick from 192.168.99.0/24 to anyblock in log all

Page 30: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 30

firewall_config_default/apply_to

firewall_config_default/policy =deny設定時、特定の networkからの packetは拒否する

# svccfg -s network/ipfilter:default setprop \firewall_config_default/policy = deny

# svccfg -s network/ipfilter:default setprop \firewall_config_default/apply_to = network:192.168.99.0/24

# svcadm refresh ipfilter

192.168.99.0/24の networkからのアクセスは無条件で拒否

下記の ruleが生成されるpass out log quick all keep stateblock in log quick from 192.168.99.0/24 to any

※ denyは incoming packetを全て受け入れるため、 block in log allの ruleは生成されない

Page 31: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 31

svc://network/ipfilter:defaultfirewall_config_default/open_ports

svccfg Tips:

プロパティに値を複数登録したい場合は、# svccfg -s FMRI addpropvalue hoge/hoge 追加する値を実行してみよう

Page 32: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 32

firewall_config_default/open_ports

ruleに依存せず、任意の portをオープンfirewall_config_default/open_portsにオープンするポートを指定 (複数指定可能 )

DHCP(tcp/68)と ssh(tcp/22)をオープンに# svccfg -s ipfilter:default addpropvalue firewall_config_default/open_ports tcp:22# svccfg -s ipfilter:default addpropvalue firewall_config_default/open_ports udp:68# svccfg -s ipfilter:default listprop firewall_config_default/open_portsfirewall_config_default/open_ports astring "" "tcp:22" "udp:68" "udp:546"# svcadm refresh ipfilter

pass in log quick proto tcp from any to any port = 22pass in log quick proto udp from any to any port = 68pass out log quick all keep stateblock in log all

生成される rule

Page 33: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 33

svc://network/ipfilter:defaultfirewall_config_default/exceptions

Page 34: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 34

firewall_config_default/exceptions

policyに依存する例外を指定可能firewall_config_default/exceptionsに例外とする要素を指定

値は apply_toと同様の値となる (複数指定可能 )

policy = deny 時、 192.168.7.0/24の network addressを持つnetworkと 192.168.99.100を持つホストからのパケットを通過# svccfg -s ipfilter:default setprop firewall_config_default/policy = deny# svccfg -s ipfilter:default addpropvalue \

firewall_config_default/exceptions "network:192.168.7.0/24"# svccfg -s ipfilter:default addpropvalue \

firewall_config_default/exceptions = "host:192.168.99.100"# svcadm refresh ipfilter

pass in log quick from 192.168.99.100 to anypass in log quick from 192.168.7.0/24 to anypass out log quick all keep state

生成される rulepolicy = allow時は、 exceptionsに登録されたものは blockになります。使いどころがないのかなぁと。。。

Page 35: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 35

Global Default Policyまとめ

firewall_default_config/policyにて allowまたは denyの policyを選択allow/denyの挙動を把握しつつ apply_toにて調整

policyに依存したくない portは、 open_portsに登録する

このように基本となる policyを設定する

Page 36: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 36

Network Service Policy

Page 37: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 37

大事なことなので 2回目

Global Default Policy

Network Services Policy

svc://network/ipfilter:defaultで決定される基本となる policy

各サービスの svc://FMRIで決定される policy

強い(上書き )

ポリシーは、二段階で制御されるGlobal Default Policyでは基本となる policyを設定

Network Services Policyでは、サービスの policy を設定し、そのポートに関するGlobal Default Policyを上書きする

この事を踏まえて ruleは作成される

Page 38: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 38

Network Services PolicySMFの各サービス (svc://FMRI)にfirewall_config/policyプロパティが追加基本は、 ipfilter:defaultの設定を引き継ぐ、「 use_global 」が設定される優先順位が、 global default Policyより高いため、サービス側で個別に policyを設定した場合は、サービス側の ruleが最初に評価される

※FMRI = fault management resource identifier

Page 39: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 39

Network Services Policynetwork/comsat:defaultnetwork/finger:defaultnetwork/ftp:defaultxmlnetwork/routing/rdisc:defaultnetwork/routing/route:defaultnetwork/talk:defaultnetwork/login:ekloginnetwork/login:kloginnetwork/login:rlogin network/rexec:defaultnetwork/shell:defaultnetwork/shell:kshellnetwork/telnet:defaultnetwork/nfs/rquota:defaultnetwork/nfs/server:defaultnetwork/ipfilter:defaultnetwork/smtp:sendmailnetwork/ntp:defaultnetwork/dns/multicast:defaultnetwork/dhcp-server:defaultnetwork/ssl/proxynetwork/smb/server:defaultnetwork/ssh:default

network/echo:dgramnetwork/echo:streamnetwork/discard:dgramnetwork/discard:streamnetwork/time:dgramnetwork/time:streamnetwork/daytime:dgramnetwork/daytime:streamnetwork/rpc/bind:defaultnetwork/rpc/mdcomm:defaultnetwork/rpc/meta:defaultnetwork/rpc/metamed:defaultnetwork/rpc/metamh:defaultnetwork/rpc/rex:defaultnetwork/rpc/nisplus:defaultnetwork/rpc/bootparams:defaultnetwork/rpc/rstat:defaultnetwork/rpc/rusers:defaultnetwork/rpc/spray:defaultnetwork/rpc/wall:defaultapplication/print/server:defaultapplication/print/rfc1179:defaultapplication/print/ipp-listener:defaultsystem/idmap:defaultsystem/system-log:default

application/management/seaport:default application/management/sma:default application/management/snmpdx application/management/wbem:default application/management/webmin:default network/dns/server:default network/http:squid network/http:lighttpd14 network/ssl/stunnel:default system/webconsole:console x11/xvnc-inetd:default x11/x11-server

network/nis/client:defaultnetwork/smb/client:defaultnetwork/nfs/cbd:defaultnetwork/nfs/nlockmgr:defaultnetwork/nfs/status:default

Ready!

Page 40: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 40

本日、覚えて帰ってくださいね!firewall_config/policyfirewall_config/apply_to

これらの設定は、Network Services Policyと呼ばれます。

Network Services Policy

Page 41: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 41

各サービスの svc://FMRI

「 firewall_config 」 プロパティ NEW!svc://network/ipfilter:defaultで設定した global default Policyと同一の設定内容

policyパケットフィルタリングのポリシーを設定

“allow” or “deny” or “none"

apply_to条件を適用させる要素を設定

host, subnet, ippol, interface

policyの設定により適用条件が変わる

唯一異なる点は、 global default Policyより優先順位が高いという点

Page 42: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 42

firewall_config/policy

firewall_config_default/policy = allow設定時、特定の networkからの ssh packetは通過させる

# svccfg -s network/ipfilter:default setprop \firewall_config_default/policy = allow

# svccfg -s ssh setprop firewall_config/policy = allow# svccfg -s ssh setprop firewall_config/apply_to = network:192.168.99.0/24 # svcadm refresh ssh# svcadm refresh ipfilter

192.168.99.0/24の networkからのアクセスは sshのみ通過

下記の ruleが生成される

[/usr/tmp/svc_network_ssh_default.ipf]pass in log quick proto tcp from 192.168.99.0/24 to any port = 22 flags S keep state keep fragsblock in log quick proto tcp from any to any port = 22 flags S keep state keep frags[/usr/tmp/ipf.conf]pass out log quick all keep stateblock in log all

Page 43: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 43

Network Services Policyのまとめ

Nework Services Policyは、Global Default Policy 全部を上書きするものではない

Global Default Policyにて設定される policyを踏まえつつ

特定のポート (サービスが利用するポート )についてのみ上書きにより policyを変更する

でも、やっぱり、 ruleは自分で設定したい・・・

Page 44: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 44

"Custom" policyfirewall_config_default/customfirewall_config_default/custom_policy_file

それならば・・・

Page 45: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 45

もっとカスタマイズしたい!

# svccfg -s ipfilter:default setprop \firewall_config_default/policy = astring: "custom"

# svccfg -s ipfilter:default setprop \firewall_config_default/custom_policy_file = astring: "/etc/ipf/ipf.conf"

# svcadm refresh ipfilter

ruleは自分でキメル!従来どおり /etc/ipf/ipf.confにコツコツと ruleを積み重ねてゆく設定方法

設定方法 今日の話はなかったことに。。。

policyに customを設定

custom_policy_fileに設定したファイル名に ruleを記述することが可能に

/usr/tmp/ipf/ipf.confは、 custom_policy_fileに設定したファイル名へのリンクになるため、 SMFプロパティでの設定は機能しなくなります

難易度 UP!

Page 46: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 46

ログについて

ipfstat, ipmon, logging

Page 47: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 47

ipfstatで統計情報を表示

引数なしで統計情報を出力# ipfstatbad packets: in 0 out 0 IPv6 packets: in 0 out 0 input packets: blocked 6213 passed 480 nomatch 2 counted 0 short 0output packets: blocked 0 passed 431 nomatch 4 counted 0 short 0 input packets logged: blocked 6202 passed 478output packets logged: blocked 0 passed 427 packets logged: input 0 output 0 log failures: input 0 output 0fragment state(in): kept 0 lost 0 not fragmented 0fragment state(out): kept 0 lost 0 not fragmented 0packet state(in): kept 12 lost 0packet state(out): kept 8 lost 4ICMP replies: 0 TCP RSTs sent: 0Invalid source(in): 0Result cache hits(in): 0 (out): 0IN Pullups succeeded: 61 failed: 0OUT Pullups succeeded: 10 failed: 0Fastroute successes: 0 failures: 0TCP cksum fails(in): 0 (out): 0IPF Ticks: 63771Packet log flags set: (0)

none

Page 48: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 48

ipfstatを top, prstat風に

ipfstat -tでテーブル情報を表示 macbook - IP Filter: v4.1.9 - state top 12:31:23

Src: 0.0.0.0, Dest: 0.0.0.0, Proto: any, Sorted by: # bytes

Source IP Destination IP ST PR #pkts #bytes ttl129.158.22.60,51967 66.249.89.104,80 4/4 tcp 379 159194 109:03:41129.158.23.204,51875 128.237.157.136,6667 4/4 tcp 1782 95336 119:59:54129.158.23.204,64847 66.249.89.104,80 4/4 tcp 205 77480 119:59:09129.158.23.204,45222 192.18.19.180,993 4/4 tcp 1434 73694 119:58:39129.158.22.60,35174 66.249.89.99,80 4/4 tcp 245 66065 109:03:41129.158.22.60,33009 209.85.201.111,993 4/4 tcp 1106 64383 109:04:12129.158.23.204,38735 66.249.89.104,80 4/4 tcp 183 56408 119:59:09129.158.23.204,38719 209.85.147.109,993 4/4 tcp 894 46424 119:58:40129.158.22.60,62938 192.18.19.180,993 4/4 tcp 634 38145 109:04:12129.158.22.60,59366 209.85.201.111,993 4/4 tcp 373 34628 109:02:39129.158.22.60,52826 209.85.201.111,993 4/4 tcp 523 34577 109:04:12129.158.23.204,36820 66.249.89.147,80 4/4 tcp 75 34152 119:56:13129.158.23.204,36290 209.85.147.109,993 4/4 tcp 390 25064 119:57:44

Page 49: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 49

filtering ruleの確認

現在の filtering rule を確認 ( ipfstat -i )# ipfstat -ipass in log quick proto tcp from 192.168.99.254/32 to any port = ftp flags S/FSRPAU keep state keep fragsblock in log quick proto tcp from any to any port = ftp flags S/FSRPAU keep state keep fragspass in log quick proto tcp from 192.168.99.254/32 to any port = ftp-data flags S/FSRPAU keep state keep fragsblock in log quick proto tcp from any to any port = ftp-data flags S/FSRPAU keep state keep fragspass in log quick proto icmp from any to any icmp-type routersolpass in log quick proto icmp from any to any icmp-type routeradpass in log quick proto tcp from any to any port = sshpass in log quick proto udp from any to any port = bootpcpass in log quick proto udp from any to any port = dhcpv6-clientblock in log all

現在の incoming filtering rule を確認 ( ipfstat -ni)# ipfstat -ni @1 pass in log quick proto tcp from 192.168.99.254/32 to any port = ftp flags S/FSRPAU keep state keep frags@2 block in log quick proto tcp from any to any port = ftp flags S/FSRPAU keep state keep frags@3 pass in log quick proto tcp from 192.168.99.254/32 to any port = ftp-data flags S/FSRPAU keep state keep frags@4 block in log quick proto tcp from any to any port = ftp-data flags S/FSRPAU keep state keep frags@5 pass in log quick proto icmp from any to any icmp-type routersol@6 pass in log quick proto icmp from any to any icmp-type routerad@7 pass in log quick proto tcp from any to any port = ssh@8 pass in log quick proto udp from any to any port = bootpc@9 pass in log quick proto udp from any to any port = dhcpv6-client@10 block in log all # ipfstat -no

@1 pass out log quick all keep state

現在の outgoing filtering rule を確認 ( ipfstat -no)

Page 50: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 50

ipmonでログ内容を表示

ログ表示(リアルタイム@ の後ろにある 「 p 」 or 「 b 」で actionを判断p = passb = block

# ipmon06/07/2009 17:54:28.584603 zonevnic100 @0:5 b 192.168.99.254,41792 -> 192.168.99.100,21 PR tcp len 20 52 -S IN NAT06/07/2009 17:54:38.734900 zonevnic100 @0:5 b 192.168.99.254,41792 -> 192.168.99.100,21 PR tcp len 20 52 -S IN NAT06/07/2009 17:56:48.699310 zonevnic100 @0:5 b 192.168.99.254 -> 192.168.99.100 PR icmp len 20 84 icmp echo/0 IN06/07/2009 17:56:49.694910 zonevnic100 @0:5 b 192.168.99.254 -> 192.168.99.100 PR icmp len 20 84 icmp echo/0 IN06/07/2009 17:56:50.694942 zonevnic100 @0:5 b 192.168.99.254 -> 192.168.99.100 PR icmp len 20 84 icmp echo/0 IN06/07/2009 17:56:51.694922 zonevnic100 @0:5 b 192.168.99.254 -> 192.168.99.100 PR icmp len 20 84 icmp echo/0 IN06/07/2009 17:57:34.554894 zonevnic100 @0:1 p 192.168.99.254,35076 -> 192.168.99.100,22 PR tcp len 20 40 -A K-S K-F IN06/07/2009 17:57:37.561499 zonevnic100 @0:1 p 192.168.99.254,35076 -> 192.168.99.100,22 PR tcp len 20 120 -AP K-S K-F IN06/07/2009 17:57:37.584836 zonevnic100 @0:1 p 192.168.99.100,22 -> 192.168.99.254,35076 PR tcp len 20 136 -AP K-S K-F OUT06/07/2009 17:57:37.584972 zonevnic100 @0:1 p 192.168.99.254,35076 -> 192.168.99.100,22 PR tcp len 20 136 -AP K-S K-F IN06/07/2009 17:57:37.586107 zonevnic100 @0:1 p 192.168.99.100,22 -> 192.168.99.254,35076 PR tcp len 20 104 -AP K-S K-F OUT06/07/2009 17:57:37.654883 zonevnic100 @0:1 p 192.168.99.254,35076 -> 192.168.99.100,22 PR tcp len 20 40 -A K-S K-F IN

Page 51: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 51

ファイルにログを採取

syslogを利用してファイル出力可能local0.debug - debug 用 full dump

local0.warning - blockを記録

local0.info - pass,blockを記録

/etc/syslog.confに下記を設定空の logfileを /var/log/に touchコマンドで作成

local0.error /var/log/ipf_error.loglocal0.warning /var/log/ipf_warn.loglocal0.notice /var/log/ipf_notice.loglocal0.info /var/log/ipf_info.log※facilityと file名の間は、スペースではなくタブで

# svcadm refresh system-log

ipmonで出力される logと同じものが記録

Page 52: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 52

まとめ

global default Policyにて policyを決定基本的には、 policyを allowに設定し、 incoming packetは全て block

そして、必要なサービスについては Network Services Policyにて個別に policyを定義Casual Useを目指した実装のため、細かなruleを作成したい場合は、 Custom Policyにて設定する必要がある

Page 53: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 53

まとめ

この機能が実装されたことにより、各 SMFのmanifestに firewall_config property groupが追加

また、特殊な処理が必要なサービスでは、 SMF methodに create_ipf_rules() functionが追加

ipfilter:default firewall_config_default/policy に allowが設定されるとこの functionを持つmethodから ruleが /usr/tmp/ipf/ 配下に作成され有効となる。

そのため、manifestを自作している場合は、property groupの追加やmethodでの対応が必要になる場合がある

Page 54: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 54

NAT(Network Address Translation)

Page 55: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 55

NAT(Network Address Translation)

外部に送出するパケットの発信元 IP アドレス と宛先 IP アドレスを書き換えることで、プライ

ベートアドレスのホストにおいても通信を可能とする技術

Ipv4アドレスの枯渇問題に貢献しているIP Filterの NAT機能は、パケットフィルタリング機能と切り離されているため、個別に設定する必要がある

Page 56: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 56

/etc/ipf/ipnat.conf

/etc/ipnat.confに、mapping ruleを記述し、下記の要素で構成される

map

interface-name

変換ルール

たとえば、 192.168.99.0/24の network adressを持つホストからの通信を 変換対象とする。その際、利用される ineterface は nge0 とする

map nge0 192.168.99.0/24 -> 0/32 proxy port ftp ftp/tcpmap nge0 192.168.99.0/24 -> 0/32 portmap tcp/udp auto map nge0 192.168.99.0/24 -> 0/32

0/32は、魔法の言葉

nge0に割り当てられている IP adressを利用して通信をおこなう設定となるため変換用の IP addressを指定する必要がない

Page 57: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 57

ipnat -l で変換テーブルを表示

$ ipnat -lList of active MAP/Redirect filters:rdr * 0.0.0.0/0 port 21 -> 0.0.0.0/32 port 21 tcp proxy ftpmap nge0 192.168.99.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcpmap nge0 192.168.99.0/24 -> 0.0.0.0/32 portmap tcp/udp automap nge0 192.168.99.0/24 -> 0.0.0.0/32

List of active sessions:MAP 192.168.99.100 57578 <- -> 129.158.22.60 26346 [218.44.192.178 22]

Page 58: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 58

Firewallの次は、 IDS/IPSを

Firewallは万能ではありませんruleに従い通過したパケットの中に悪意のあるパケットが潜んでいる可能性も。。。自動改札機のようなもの

侵入検知システムと組み合わせることで、より堅牢なシステムを構築可能

IDS(Intrusion Detection System)IPS(intrusion prevention/protection system)Snort: http://www.snort.org/

Page 59: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 59

参考資料

PSARC 2008/580 Solaris host-based firewallhttp://arc.opensolaris.org/caselog/PSARC/2008/580

System Administration Guide: IP Serviceshttp://docs.sun.com/app/docs/doc/819-3000?l=ja> Chapter 24 Solaris IP Filter (Overview)

http://docs.sun.com/app/docs/doc/819-0380?l=ja> 第 25 章 Solaris IP フィルタ (概要)

IPFilter Homepage

http://coombs.anu.edu.au/~avalon/

Site Administration Course – フィルタリング

http://www.wakhok.ac.jp/~kanayama/summer/02/site/node96.html

Page 60: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 60

参考 : IP Filterを構成するファイル

コマンド (/usr/sbin)ipf

ipfs

ipfstat

ipmon

ipnat

ippool

/etc/ipfipnat.conf, ippool.conf, ipf.con (カスタム定義ファイル )

SAMPLEファイル/usr/share/ipfilter/example

補助コマンド/usr/lib/servinfo

kernel module/usr/kernel/drv/ipf

/usr/kernel/drv/amd64/ipf

/usr/kernel/drv/sparcv9/ipf

Package

SUNWipfr

SUNWipfu

SUNWipfh

online manual

svc.ipfd

Page 61: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 61

参考情報

DHCPクライアントとして構成されている場合は、自動的に port 68, 546を通過させる ruleが作成されるpass in log quick from any to any port = 68 # bootpcpass in log quick from any to any port = 546 # dhcpv6-client

/sbin/netstrategyコマンドで判別しているがwifiなどは対象外となるため、 Default Global Policyの open_portsで対応しておくのもあり

pass in log quick from any to any port = 68 # bootpcpass in log quick from any to any port = 546 # dhcpv6-client

# /sbin/netstrategyzfs nge0 dhcp #dhcpを keyに DHCPクライアントと認識

pass in log quick from any to any port = 68 # bootpcpass in log quick from any to any port = 546 # dhcpv6-client

Page 62: Opensolaris ipfilter 20090710

OpenSolaris Evangelist

Kazuyuki Sato

ありがとうございました。

OpenSolarisIP Filterさりげなくパケットフィルタリングを実現する方法

Page 63: Opensolaris ipfilter 20090710

おまけ

Page 64: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 64

routerを作成してみる

or

non-global zone

VirtualBox

The INTERNET

※イメージです

nge0vboxnic254

vboxstub0

vboxnic0

vboxnic0

router

Page 65: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 65

仮想 networkを作成

crossbowで仮想 network環境を構築etherstub(仮想 Switch)を作成

$ dladm create-etherstub vboxstub0

zoneまたは VBoxに割り当てる vnicを作成dladm create-vnic -l vboxstub0 -m 2:8:20:xx:xx:f5 vboxnic0MAC addrは固定にしておくと何かと吉

global側に割り当てる vnicを作成dladm create-vnic -l vboxstub0 vnicnic254

Page 66: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 66

各 interfaceの設定

各 network interfaceの割り当て IP addressvboxnic254 192.168.99.254/24

# ifconfig vboxnic254 192.168.99.254 netmask 255.255.255.0 broadcast + up

vboxnic0 192.168.99.1/24

znon-global zoneまたは VBoxに割り当てられる IP

non-global zone または VBox側で設定

nge0 は、適当

Internet と通信するため、すでの IP address が割り当てられている前提とする

routerの設定# routeadm -e ipv4-forwarding# routeadm -e ipv4-routing# routeadm -u

$ routeadm 構成 現在の 現在の オプション 構成 システム状態--------------------------------------------------------------- IPv4 ルーティング enabled enabled IPv6 ルーティング disabled disabled IPv4 転送 enabled enabled IPv6 転送 disabled disabled

Page 67: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 67

routerを作成してみる

or

non-global zone

VirtualBox

The INTERNET

出来上がったもの※イメージです

nge0vboxnic254

vboxstub0

vboxnic0

vboxnic0

router

Page 68: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 68

NATの設定

/etc/ipf/ipnat.confの設定map nge0 192.168.99.0/24 -> 0/32 proxy port ftp ftp/tcpmap nge0 192.168.99.0/24 -> 0/32 portmap tcp/udp auto map nge0 192.168.99.0/24 -> 0/32

※nge0 は利用する nic名に変更

NATの有効化# svcadm enable ipfilter# ipnat -lList of active MAP/Redirect filters:rdr * 0.0.0.0/0 port 21 -> 0.0.0.0/32 port 21 tcp proxy ftpmap nge0 192.168.99.0/24 -> 0.0.0.0/32 proxy port ftp ftp/tcpmap nge0 192.168.99.0/24 -> 0.0.0.0/32 portmap tcp/udp automap nge0 192.168.99.0/24 -> 0.0.0.0/32

Page 69: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 69

non-global zoneの作成

non-global zoneの作成# zonecfg -z testzone testzone: そのような構成済みゾーンはありません'create' を使用して、新しいゾーンの構成を開始してください。zonecfg:testzone> createzonecfg:testzone> set zonepath=/rpool/testzonezonecfg:testzone> set ip-type=exclusivezonecfg:testzone> set autoboot=truezonecfg:testzone> add netzonecfg:testzone:net> set physical=zonevnic110zonecfg:testzone:net> endzonecfg:testzone> verifyzonecfg:testzone> commitzonecfg:testzone>

# zoneadm -z testzone install # zoneadm -z testzone boot# zlogin -C testzone testzoneに割り当てる IPは 192.168.99.100

gateway は、 192.168.99.254DNSを利用できるよう /etc/resolv.confおよび/etc/nsswitch.confの設定も忘れずに

Page 70: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 70

routerを作成してみる

or

non-global zone

VirtualBox

The INTERNET

出来上がったもの※イメージです

nge0vboxnic254

vboxstub0

vboxnic0

vboxnic0

router

192.168.99.254

192.168.99.1/24

192.168.99.1/24

NAT

Page 71: Opensolaris ipfilter 20090710

OpenSolaris IP Filter pg 71

完成

non-global zoneから適当にアクセスしてみてください

vboxnic254は、再起動で消えてしまうので必要ならば /etc/hostname.vboxnic254の設定をしてください

testzoneで ipfilterの練習をしてみるのが安全はしょっりすぎて、情報が抜けている可能性もありますがご容赦を。。。