cloudy and rain

UNIXやLINUX、時事放談など気になったことを無作為に書きつらねています。 The topic which becomes matter of concern of UNIX and LINUX and society is written on world wide.

Wednesday, September 12, 2007

IDSを考える。基本はルーターだろろうか?

実際のところ、自分でネットワークを組むことにしたら、結構苦労したのは例のごとく一般的な解説や、ドキュメントしかないということだった。結論から言うと、あんまり例がない方法らしい。

というか、通常のネットワークでこうした構成もすることナシに、ルーターを作るのは馬鹿げている。

IDSの設置は非常に頭を悩ました。それこそ個人でネットワークタップでも借金して購入する勢いだったが・・。

今回実践したのは、外部にVPNを利用したルーターが遠隔地にあり、それをクライアントから通信するのにルーターを外部向けと内部の2つを物理的に配置、内部ルーターに固定IPを付与、WEBサーバーはプライベートアドレスを固定、ルーターのリクエストのみ応答。外部向けのルーターからのパケットをあえてリピーターハブを挟むことで中間に監視システムを設置。内部ルーターはアクセスログを記録。

トラフィックの関係でいかほどの速度が出るのだろうか?一時はそこら辺の凡庸ルーターをブリッジで使用することも考えたが、固定IPを使わず、固定ネットワークの親サーバーにグローバルIPがあるわけで、そうするといかに下らないゴミパケットを振り落とすかにある。ポートを開くのはなるべく一カ所だけにしておくのは良いとしても、内部のLANで制限を厳しくすればIDSは意味を為さないからだ。

ココでいう利点はウェブサーバーが外部に直接繋がってはいないこと。帯域が分散しているので負荷が軽い。無駄なトラフィックが生じるが内部ルーターが吸収。要は総てココで最終的に破棄。ウェブサーバーには要らないパケットは届かない。というか届いたログを確実に捉えることにある。実際の運営の中では更に改良は必要だが。

安全上詳しい構成はココでは解説しない。しかし想像は容易いと思う。

最初にやるべき事は、内部ルーターの設定。それもファイアーウォールは後回しでも良い。それは既に外部向けのルーターの仕事だからだ。(今のところ)そこで、安めのたいしたスペックでもないPCをルーターとする。

構成からしてファイアーウォールから設定を考えてはダメだ。確実に繋がる事を考える。
まず最初に手をつけたのはrc.conf。2つNICを挿してあるので、IPを設定する。しかしこのルーターはそもそもグローバルIPを持っていない。内部で変換しているのはWEBサーバーのプライベートアドレスを、ルーターのプライベートアドレスに変換しているだけである。普通の設定ではWANには出て行けない。

しかしココでもそれは後回しだ。まずはWEBサーバーとのコネクションを確立させよう。一方のNICはデフォルトゲートウェイに外部向けルーターのアドレスをあてる。そしてもう一つはデフォルトゲートウェイにこのNICのアドレスを当てるわけだ。rc.confはとりあえずgateway_enable="YES"だけである。

加えるのは
gateway_enable="YES"
defaultruter="外部ルーターアドレス"
ipconfig="1枚目のNICのアドレスとサブネットマスク"
ipconfig="2枚目のNICのアドレスとサブネットマスク"
inetd_enable="YES"

まずはこれだけ。

注意して欲しいのはgeteway_enable="YES"としたところでフォワードなどはしない。ということ。
内部のルーティングは結局設定しなければならない。
内部向けのルーターがどれをあてにすればいいかを書いたに過ぎないからだ。機能が有効になっただけで、実際のルーティングは定義が必要というわけ。

まず2枚目のNICの行き先は1枚目のNICだ。そこで "-net 二枚目NICのアドレス 1枚目のNICのアドレス"としてフォワードさせる。設定はこれだけではないので、仮にコレをsetとして定義しておこう。俗に言う静的ルーティングですね。(staticを何で”静的”と訳すんだろうね。どっちかっていうと”厳格”とか”制約”じゃないかな)

static_routes="set1 set2"
route_set1="default"
route_set2="-net 二枚目NICのアドレス 1枚目のNICのアドレス"

上記の設定でも間違いはないような気がするが、実はコレではダメ。
なんとも面倒くさい事に、インターフェイスも設定しなくてはならない。
そこで次のようになる。

static_routes="set1 set2 set3"
route_set1="default"
route_set2="-net 基準となるアドレス 割り当てるアドレス"
route_set3="-net 二枚目NICのアドレス 1枚目のNICのアドレス"


そこでココでもアドレス最後の一桁は省略できる。というか0.1とか明示しないのが普通だ。実際ルータ自身はインターフェイス以外IPアドレスを持つはずではないし、基点となるルータに向けてデフォルトゲートウェイがある。となると内部に普通のIPでいうクラスC以下を明示すると、基点がそこでおかしな事になる。プライベートアドレスは通常親子関係を崩すべきではないので、で、000.000.000までにしないといけない。なにせ通常プロバイダがレンタルするルーターは大抵下が0.1である。255だから別に良いじゃないかとかではなくてプライベートでも使わない方がいい。(これが割と平気で無視して解説してあるサイトが多いんだよね。)アドレス変換の絡みで実際は無理だなって判ると思うんだけど・・。

実際はこんな感じ。

したがって下記の内容をrc.confに追記する。

gateway_enable="YES"
defaultruter="外部ルーターアドレス"
ipconfig="1枚目のNICのアドレスとサブネットマスク"
ipconfig="2枚目のNICのアドレスとサブネットマスク"
inetd_enable="YES"
static_routes="set1 set2 set3"
route_set1="default"
route_set2="-net 基準となるアドレス 割り当てるアドレス"
route_set3="-net 二枚目NICのアドレス 1枚目のNICのアドレス"

結局全部書かないといけない。

だがこれで本当に安心してはいけない。実はコレに実際サーバーを繋げても外部にはパケットは出て行けない。
理由はこのルーターが内部にあるということ。従ってドコにもDNSのありかがわからない。PINGはこのルーターに対しては通るが、外部からだと全く通らない。応答に対して答えるが、直接このルーターに繋げてもDHCPではないし、プライベートアドレスを再びプライベートアドレスに変換すること自体おかしい。内部からのパケットか、外部からなのかを判別できないからだ。

そこで利用するのがリピーターハブである。トラフィックを一度ルーターの外から入るようにするワケだ。
こうすることで直接外部向けのルーターに繋がっているのはこのルーターのみになる。パケットは総てのインターフェイスに問い合わせ、ルーターは出所を知ることが出来る。わかりにくいだろうが、要はネットワークの基点は外部向けルーターである事をルーター自身がパケットで知る必要がある。ココがUDPならば苦労はないところだ。試しにルーターの外部向けケーブルを外すと、ココに直接繋いだサーバーからこのルータには、上記の設定でもPIGは通らなくなる。

この構成はTCPだと苦労することがわかった。

外部向けのルーターにはパケットフィルタをこの内部向けルーターに施す。これでパケットは一本化出来る。このリピーターにIDSをつければ特に苦労なくキャプチャが出来る。サーバーに向けた攻撃はまんまIDSに入ってくることになる。

更にこの内部ルーターはトラフィックを制御するチューニングをする。しかし本丸はここからなんですよね。


それは次回。



無料カウンター

Powered by ScribeFire.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home