vine-users ML アーカイブ



[vine-users:065003] Re: セキュリティ修行→こう いうモデルは?

  • From: Seiichirou Babasaki <mindgear@xxxxxxxxxxxx>
  • Subject: [vine-users:065003] Re: セキュリティ修行→こう いうモデルは?
  • Date: Thu, 11 Mar 2004 20:29:31 +0900
書いてて元投稿と内容がずれはじめちゃったので件名も変えてみました。

ども、馬場崎@「卒業の季節ですね」です。

-------------------------------------------------------------
[近況]Hub 4台で構成される部所がありました。このうちC-Hubに繋がったクライアント6台中5台の接続が絶たれたり繋がったりするという障害が発生しています。クライアントOSはWin98、Me、XP(Home)と多彩です。さて、原因を特定するために何をしますか?……という、初級シスアド試験に出そうなケースに出くわしまして。忙しいときほど事件は起きるんですねぇ。
-------------------------------------------------------------


さて、自分自身を振り返りますと、比較的ネットワークに恵まれたところで他所に迷惑かけないで練習できたので、それをそのままというわけにはいかないですね。

それで、今の経験から簡単なモデルを考えてみました。
(等幅フォントでご覧下さい)
-------------------------------------------------------------
   {192.168.10.0 network}     {192.168.0.0 network}
  +---------+         +---------+         +---------+
  | マシンA |a)==X==(b| マシンB |c)==X==(d| マシンC |
  |         |         |  b ← c |         | client  |
  +---------+         +---------+         +---------+
a).eth0 192.168.10.1
b).eth0 192.168.10.254   c).eth1 192.168.0.1
d).eth0 192.168. 0.254

*Hub無しのクロスケーブル接続(Hubありならストレートケーブル)
*DNS引き無しで、全てアドレス指定の実験モデル
-------------------------------------------------------------
#もちろん、三台ものPCを用意できる贅沢な環境は少ないでしょう。
#マシンAを既存のネットワークに置き換えればPC2台で試験できます。
#(マシンCを既存のネットワークにしてはダメです)
#マシンAはPingに応答すればいいのでプリントサーバーでも可?
-------------------------------------------------------------

このモデルでマシンBをLinuxとして、設定をアレコレ変えながらの挙動を見る、というものです。
※応用で、DNSが引けた時の名前解決モデルにもなります (笑)

モデルだけでは物足りないので、典型的なケースをいくつか。


■ 実験一
IPアドレスのみ設定済みの状態で(マシンBでルーティングしていない)
-------------------------------------------------------------
   {192.168.10.0 network}     {192.168.0.0 network}
  +---------+         +---------+         +---------+
  | マシンA |a)==X==(b| マシンB |c)==X==(d| マシンC |
  |         |         | b→X←c |         | client  |
  +---------+         +---------+         +---------+
-------------------------------------------------------------
この時のマシンAからのping コマンド(実験しなくてもよいかも)
 a→b ……ok
 a→c ……見つからない
 a→d ……見つからない
この時のマシンCからのping コマンド
 d→c ……ok
 d→b ……見つからない
 d→a ……見つからない
この時のマシンBからのping コマンド
 b→a ……ok
 c→d ……エラーになるはず(条件によってokの時も)
  (b→c ……見つからない……指定できれば)

……こんな感じになるはずです。
注目したいのはマシンBからのテストでして、
「bがeth0ならば、dへのpingにもbを使おうとする」
という動きですね。エラーで正常です。
-------------------------------------------------------------
※自分の恥を晒すようですが、良くわからないでこれを通るように静的ルートを設定しちゃった事があります。大失敗。


■ 実験二
マシンBでc→bのパケットフォワードを設定(デフォルトルーティングがeth0のb)
-------------------------------------------------------------
   {192.168.10.0 network}     {192.168.0.0 network}
  +---------+         +---------+         +---------+
  | マシンA |a)==X==(b| マシンB |c)==X==(d| マシンC |
  |         |         |  b ← c |         | client  |
  +---------+         +---------+         +---------+
-------------------------------------------------------------
この時のマシンCからのping コマンド
 d→c ……ok
 d→b ……戻りを許していればok、エラーでも正常
 d→a ……戻りを許していればok、エラーになるべき
この時のマシンBからのping コマンド
 b→a ……ok
 c→d ……まだエラーのはず(bを使ってdへ行こうとするから)

……早くも曖昧になってきました。(汗)
マシン Cからの信号はマシン Bの中を通過できるようになっていますが、帰り道の設定を明確にしていないのでマシン Aとの通信は保証されません。
……だった、と思います。

そこで明確に「 192.168.0.0 ネットワークへはc(eth1 192.168.10.1)を使って通す」という静的ルーティングの設定をしてあげれば、双方向で何でも通るようになります。
……が、これでは困ります。文字通りなんでも通りますし、透過するだけではなくマシンBにもアクセスし放題です。

通過のルールを細かく設定するためにiptableなどを使うことになります。また、マシンBを保護するためにアクセスそのものを制限したり無用なサービスやデーモンを停止したりといった工夫が別途必要です。
-------------------------------------------------------------

■ 実験三
マシンBでiptableを設定し、icmpの通過を許可、コネクションの確立している
パケットを許可、出ていくものは許可、それ以外は(入ってくるものも)全て破棄に設定
(※icmpはpingが使用します)
-------------------------------------------------------------
   {192.168.10.0 network}     {192.168.0.0 network}
  +---------+         +---------+         +---------+
  | マシンA |a)==X==(b| マシンB |c)==X==(d| マシンC |
  |         |         |  b ← c |         | client  |
  +---------+         +---------+         +---------+
-------------------------------------------------------------
※IPフォワードとマスカレードも有効にしておきます。

    マシンABCの全てで、pingだけが期待するように通るはずです。

A→B はOk(同一セグメント) A→C はエラー(入れない)
B→A はOk(出ていく)       B→C もOk(静的ルート)
C→B はOk(同一セグメント) C→A もOk(パケットフォワード、戻りも許可)

一方、sshもftpもhttpも利用できなくて正常です。

-------------------------------------------------------------
ここまでが理解できていれば、あるいはこの「通さないルータ機」を設定できれば、あとは必要なサービスポートを通す設定を煮詰めていくことになります。

どんなポートを許可して、どんなポートを積極的に塞ぐべきでしょうか。

ポートについてはまず、 /etc/services ファイルにも記述があります。ネット上にもポートナンバーの検索サービスがありますし、ウィルス&ワーム関連だとTREND MICRO社等のウィルス情報を利用するという事も考えられます。
書籍もあります(二冊ほど持ってます)

また、通し方にもイロイロ考えられまして、

あ) eth0(WAN)へ出ていくものを許可する
い) eth1(LAN)から入ってくるものは許可する
う) eth0(WAN)から入ってくるのでなければ許可する
……それぞれ挙動が少しずつ違います。また、これだけでは完全ではありません。
考えてみるのもよいかと思います。 (※注目するのはマシンB自身へのアクセス)

-------------------------------------------------------------
#模範解答A……「eth0へ出ていくものを許可する」そして、「入ってくるものに対しても別途ルールを設ける」、最後に「ルールにないものを全て破棄する」と良いようです。
以前に僕自身が
    [vine-users:063516] Re: iptables の設定法について
として投稿したものよりこちらの方が無駄が少ないようです。
それと、iptableだけでルータ機を守ることはできませんから、少なくともTCP Wrapperあたりは導入しておくべきでしょう。
-------------------------------------------------------------

今回はこんなところで。


名前とかDNSとかsmb(SAMBA)とかMail(メール中継)を含めたいとなると、また別の設定が必要になりますから、一度にやらない方が良いでしょう。少なくとも、僕はそうでした。
一度にいくつもの設定を進めると、些細なミスでも気づかなくなってしまいがちです。

実用のケースは様々でしょうから「モデル」ということで話を進めてみました。
なるべく応用が効くように書いたつもりですが、いかがでしょう。


-- 


__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/
 ZON or MaruArt.  >>>  Babasaki Seiichirou (Japanese.)
 E-Mail Address 
        mindgear@xxxxxxxxxxxx or mindgear@xxxxxxxxxxxxxx
__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/__/