8. 補遺

8.1. サーバ、ポート、パケット

ネットワークのいくつかの概念を、 特にそれらがどのようにセキュリティに潜在的な影響を与えるのかを、 技術的にならないように手短かに見てみましょう。 ネットワークについてそんなに多くを知る必要はなくても、 どのようにものごとが働いているかの一般的なアイデアを知ることは、 ファイアーウォールやその他の問題を理解する助けになるでしょう。

もうお気づきになっているかもしれませんが、 Linux は非常にネットワーク指向なオペレーティングシステムです。 多くのことが一つのタイプの、またはそのほかの"サーバ"、 例えば、X サーバ、フォントサーバ、プリントサーバ、 等に接続することによって行われます。

サーバは"サーヴィス"を提供し、 そのサーヴィスは様々な能力を、 ローカルシステムと、潜在的には他のリモートシステムの両面に提供します。 一般的には、同じサーバが両方の機能を提供しています。 それぞれの場面の背後で静かに働いているサーバもありますし、 また他のサーバはその性質として、もっとインタラクティブに働いています。 我々は何かを印刷する必要があるときに、 プリントサーバの存在に気づくだけかも知れませんが、 それを実際に使おうが使うまいが (もちろん使うことが可能であると仮定してですが)、 それはそこで動いていて、耳をすませていて、接続要求を待っているのです。 典型的な Linux インストールでは本当に沢山のタイプのサーバが 使えるようになっているでしょう。 デフォルトのインストールはしばしば、 これらのいくつかを"オン"にしてしまう、 つまり走らせてしまいます。

ですから、常時、本当のネットワークに接続していないとしても、 やはり、言わば"ネットワーク環境にある"のです。 例えば、馴染み深いローカルな X サーバをとりましょう。 これは単に GUI インターフェースを提供するだけのものと考えられがち かもしれませんが、これはある点においてのみ正しいだけです。 それはクライアントのアプリケーションに"サーヴィスを提供する" ことでこれを行っていて、つまり実際にサーバなのです。 X Window はネットワーク越しにリモートクライアントに サーヴィスを提供することもできます。 インターネットのような大きなネットワーク越しでさえ。 おそらく実際にはそんなことを望んでいないとしても ;-)

そして、そうです、あなたがファイアーウォールを走らせておらず、 または、代わりの手段もとっておらず、インターネットに接続しているとしたら、 それは誰かが、いえ、誰でも、あなたの X サーバに接続してくる 可能性が高いということなのです。 X11 はデフォルトでは 6000 番のTCP "ポート"で 耳をすませています。 この原則は他のほとんどのサーバにも同様に適用できます。 つまり、接続を制限するか避けるために何か手が打たれていない限り、 誰もが簡単に接続できるのです。

ここで議論している Linux やインターネットでの TCP/IP (Transmission Control Protocol/Internet Protocol) ネットワークでは、 全ての接続されたコンピュータが一意な "IP アドレス" を持っています。電話番号のように考えればいいでしょう。 各人が一つの電話番号を持っていて、 そして、他の誰かに電話をかけるためにはその人の電話番号を知る必要があり、 その電話番号をダイアルするわけです。 電話番号が機能するには、番号はそのシステムで一意でなければなりません。 IP アドレスは一般的にドットで分けられた四つの数字で、 例えば 152.19.254.81 のように記述されています。

この種のネットワーク上で、サーバは "listen している(聞いている、耳をすませている)" などと言われます。 この意味するところは、それらが"ポート"を開いていて、 そのポートに入ってくる接続を待っているということです。 接続は、X サーバが典型的な場合であるように、 ローカルなものかもしれませんし、 リモート、つまり"どこかにある" 他のコンピュータからのものかもしれません。 ですから、サーバは入ってくる接続に対して、 特定のポートで"耳をすませている"のです。 ほとんどのサーバはデフォルトのポートをもっています。 例えば、web サーバは 80 番のポートで、X11 は 6000 番です。 一般的なポートとそれらが提供するサーヴィスのリストについては、 /etc/services ファイルを見てください。

"ポート" は実際にはカーネルのネットワーキングスタックの中の一つのアドレスであり、 TCP と他のプロトコルが接続を制御し、 コンピュータ間のデータ交換をするために用いられる方法の一つなのです。 全体では 65,536 の TCP と UDP ポートが使えますが、 普通は常時これらの中の比較的少数のものが使われています。 これらは 1024 未満の"特権のある"ポートと、 1024 以上の"特権のない"ポートの二つに分けられています。 ほとんどのサーバは特権のあるポートを使います。

唯一つのサーバだけが一度に一つのポートに耳をすませているか、 または"結びつけ"られています。 サーバはその一つのポートを通じて複数の接続を開くことができますが。 コンピュータは他のコンピュータにこれらの"ポート" の接続を通して話しかけるのです。 一つのコンピュータは他のコンピュータの一つの"ポート" に接続を開き、そしてそれら各自のポートの間に確立された接続を通じて データを交換することができるのです。

電話の喩えに戻りましょう。話を少し拡げて、 複雑な電話システムを持つ大きな組織を呼び出すことを考えましょう。 その組織はたくさんの"部署"を持っています。 セールス課、出荷課、請求課、入荷課、 カスタマーサービス課、研究開発課、などなど。 各課はそれぞれの"内線"番号を持っています。 つまり、出荷課は内線 21 番、セールス課は内線 80 番、などです。 この喩えでは、その代表番号が IP アドレスで、 各部署の内線番号がポート番号ということになります。 呼び出す時には、その"部署"の番号は常に同じです。 そして一般的には、同時にかかってくる多くの電話を扱うことが可能です。

データ自身は"パケット"の中に含まれています。 パケットとはデータの小さなかたまりで、 一般的には 1500 バイト以下です。 パケットはデータを運ぶだけではなく、 接続を制御し組織化するために用いられます。 パケットには異なるタイプがあります。 あるものは接続を制御するために特別に用いられ、 またあるパケットはその積荷としてデータを運びます。 もしたくさんのデータがあれば、それは複数のパケットに分割されます。 実際ほとんどがこの場合です。そしてこれらのパケットは一時に一つずつが送られ、 到着したところで"組み立て直し"されるのです。 例えば、一つの web ページが送信されるときは たくさんの、おそらく数百か数千ものパケットに分けられます。 これらの全てがあっという間に、見えないところで起こっているのです。

以下の netstat の出力からの一行の引用で、 二つのコンピュータの間の典型的な接続を見ることができます:


 tcp    30    0 169.254.179.139:1359    18.29.1.67:21      CLOSE_WAIT

 

興味深い部分は四番目と五番目のコラムの IP アドレスとポート番号です。 ポート番号はコロンの右にある数字です。 コロンの左側が各コンピュータの IP アドレスになります。 四番目のコラムはローカルアドレス、つまり接続のこちら側の端です。 この場合、169.254.179.139 が、 プロバイダによって割り当てられた私の IP アドレスです。 それが 18.29.1.67 (これは rpmfind.net のアドレスです)上の 21 番ポート(FTP)に接続されています。 これは rpmfind.net からの FTP ダウンロードの直後のものです。 私が 21 番ポート上の FTP サーバと接続している間に、 私の FTP クライアントによって用いられている私側のポート番号は 1359 です。 この番号はランダムに"特権のない"ポートから割り当てられ、 双方向(2-way)"対話"のこちら側の端点として使われます。 データは両方向に移動します: こちら側:1359 番ポート <->あちら側:21番ポート、というように。 FTP プロトコルは実際はこれよりも少しばかり複雑ですが、 ここではより細かい説明に入るのはやめておきましょう。 CLOSE_WAIT はこの時点での接続の TCP 状態です。 これで結局、接続は両方の端で完全に閉じられ、 netstat は何も示さなくなります。

接続のこちら側で用いている"非特権"ポートは 一時的なもので、ローカルに走っているサーバには関係しません。 それは接続が終了したときに、カーネルによって閉じられます。 これは"耳をすませている"サーバによって 開き続けられているポートとは全く違うものです。 これらのポートは永続的なもので、 リモート接続が終了した後もずっと"開いて"います。

さて、上の例を用いてまとめてみましょう。 我々はサーバ(rpmfind.net)にクライアント(私)を接続し、 その接続は両端のそれぞれのポートによって定義され制御されます。 データはパケットによって送られ制御されます。 サーバは"特権"ポート(つまり、1024 未満の番号のポート) を用いて、ポートを開き接続のために耳をすませています。 私のクライアントによって用いられている私の側の端の "非特権"ポートは一時的なもので、 接続が持続している間だけ開いていて、 接続の他端のサーバのポートへの応答だけを行います。 一般的に言って、このタイプのポートは攻撃や侵入の弱点にはなりません。 サーバのポートはそれが開き続けているがゆえに危険なのです。 FTP サーバの管理者はサーバが安全であるように、 適切な警戒をしている必要があります。 他のインターネット接続、例えば web サーバやメイルサーバのような接続は、 サーバのポート番号は違いますが、上の例と同じ様に働いています。 SMTP メイルサーバは 25 番ポートを用いますし、 web サーバは典型的には 80 番を使います。 他のよく用いられているポート番号やそのサーヴィスについては、 ポートの章を参照してください。

ポートについてのポイントをもう一つ: ポートはそこに耳をすませている何かがあるときに、 アクセス可能であるだけです。 もしそこで耳をすませているサーヴィスやデーモンがいて、 入ってくる接続要求に応えるよう待ち受けていないならば、 誰もポートを開くように強制することはできません。 閉じているポートはまったく安全なのです。

クライアントとサーバの間の違いについての最後のポイント。 上の例では netstatLISTENER の箇所に telnetftp などの項目がありませんでした。 言い換えれば、このようなサーバはローカルに走っていないのです。 誰か他の telnet または ftp サーバに接続するために、 telnetftp のサーバデーモンを走らせる必要はありません。 これらは接続しようとする他の人たちに対して、 サーヴィスを提供するためにあるのです。 ほとんどの場合、本当にそうしたい人は少ないでしょう。 サーバを走らせていなくても、 telnetftp のクライアントソフトウェアを使用するのに、 何の問題もないのです。

8.2. ポート

通常良く見られ、用いられているポート、 通常それに付随しているサーヴィス名とその危険について、 簡単に見てみましょう。 全てのポートはなんらかの危険をともなっています。 単に、その内のいくつかは、歴史的に他のものより 多くの攻撃を受けてきたというだけのことです。 以下でそれらがどのように評価されるかを見ますが、 必ずしもそれぞれのサーヴィスが安全かそうでないか で解釈するとは限りません。

1番から19番と、それらに結びついたプロトコルの多くは古臭くて、 おそらくそのどれも現代のシステムでは必要ないでしょう。 もしあなたがそれらが何なのかどれも知らないなら、確実に必要ありません。 7番ポートの echo サーヴィスを 通常の ping プログラムと混同してはいけません。 これら全てをオフのままにしておいてください。

20番ポート(FTP-DATA)。"アクティブな" FTP 接続は 二つのポートを使います:21 番ポートは制御用ポートで、 20 番ポートはデータが通るために用いられます。 受動的な FTP は全く 20 番ポートを用いません。 リスクは小さいですが、以下を見てください。

21 番ポート(FTP サーバポート、すなわちファイル転送プロトコル)。 システム間でファイルを転送するための、非常に確立されたプロトコルです。 大変危険が大きく、ナンバーワンの攻撃ターゲットかもしれません。

22 番ポート(SSH, Secure Shell, または時に PCAnywhere プロトコル)。 危険は低いか中程度。(もちろん、いわゆる"安全な" サーヴィスに対してさえ攻撃はあります)

23 番ポート(Telnet サーバ)。LAN での使用のみに。 安全でない環境においては、 代わりに ssh を用いてください。危険は中程度。

25 番(SMTP, Simple Mail Transfer Protocol, またはメイルサーバポート) はメイルを外に送るためと、メイルをある場所から他のところへ 転送するために用いられます。危険は中程度。 これは長い間、酷い攻撃にさらされてきましたが、 最近改善されてきています。

37 番ポート(time サーヴィス)。これは組み込みの inetd time サーヴィスです。 危険度は低。LAN での使用のみに。

53 番ポート(DNS, Domain Name Server ポート)。 ネームサーバはこのポートで耳をすませ、ホスト名を IP アドレスに 解決するための問い合わせに応えます。危険度は高。

67 番(UDP)ポート(BOOTP, DHCP のサーバポート)。危険度は低。 もし LAN で DHCP を用いるなら、 これをインターネットにさらす必要はありません。

68 番(UDP)ポート(BOOTP または DHCP のクライアントポート)。危険度は低。

69 番ポート(tfpt, Trivial File Transfer Protcol)。 極めて危険。本当に、本当に必要なら、LAN のみで使ってください。

79 番ポート(finger, システムとログインしているユーザの情報を提供するために用いられる)。 クラックの標的としては危険度は低いが、あまりに多くの情報を流すため、 走らせるべきではない。

80 番ポート(WWW または HTTP 標準 web サーバポート)。 インターネットでもっとも通常に用いられるサーヴィス。危険度は低い。

98 番ポート(Linuxconf web アクセス管理ポート)。 もし、本当に必要ならば、LAN のみで。

110 番ポート (POP3 つまり Post Office Protocol, メイルサーバポート)。 POP メイルでは、ユーザがリモートシステムからメイルを取り出します。 危険度は低。

111 番ポート(sunrpc, Sun Remote Procudure Call, または portmapper ポート)。 NFS (Network File System), NIS (Network Information Service), そして様々の関係サーヴィスに用いられます。 危険そうに聞こえますし、実際危険度は高です。 LAN の使用のみで。クラッカーたちのお気に入りの標的です。

113 番ポート(identd または auth サーバポート)。 古いスタイルのサーヴィス(SMTP や IRC のような)で、 接続を許可するために用いられることがあり、時に必要です。 おそらくほとんどの場合では必要ではなく、 危険度は低いですが、攻撃者にあまりに多くのシステム情報を 与えてしまう可能性があります。

119 番ポート(nntp またはニュースサーバポート)。危険度は低。

123 番ポート(高い精度が必要な time サーバで同期をするための Network Time プロトコル)。 危険度は低いですが、おそらくほとんどのユーザには必要でないでしょう。 システムクロックを更新するには、 rdate を用いるのがより簡単で安全です。 そして、LAN システムを同期するためには time サーヴィス にビルドされた inetd を使うという 選択もあるでしょう。

137 から139 番ポート(NetBios (SMB) サーヴィス)。 ほとんどの場合、Windows 関係です。 Linux では危険度は低いですが、LAN での使用のみにしてください。 137 番への攻撃は非常に良く見られます。 多くは無害ではありますがたくさんのノイズを生成することで、 非難されがちな Redmond 産プロトコルです。

143 番ポート(IMAP, Interim Mail Access Protocol)。 これもまた、メイル受信プロトコル。危険度は低から中。

161 番ポート(SNMP, Simple Network Management Protocol)。 ルータやスイッチが統計や重大なサインをモニタするために もっとも普通に用いられます。ほとんどの場合には必要でなく、 危険度も低いです。

177 番ポート(XDMCP, X サーバにリモート接続するための X Display Management Control Protocol)。 危険度は低いですが、LAN での使用のみにすることをお勧めします。

443 番ポート(HTTPS, 広く用いられている安全な HTTP (WWW) プロトコル)。 危険度は低。

465 番ポート(SSL 経由のSMTP (secure mail server protocol) )。 危険度は低。

512 番(TCP)ポート(netstatでは exec と表示されますが、実際、 その適切な呼び方はリモートでの実行のための rexec です。) 危険そうに聞こえるでしょうし、実際危険です。 危険度は高く、どんな場合でも LAN での使用のみにしてください。

512 番(UDP)ポート(biff, メイル通知プロトコル)。 危険度は低。LAN のみで。

513 番ポート(login, 実際 rlogin つまり リモートログイン)。 いつもログインする時に用いている標準の /bin/login とは何の関係もありません。 これは危険そうに聞こえるでしょうし、実際危険です。 危険度は高、本当に必要なときにだけ LAN のみで用いてください。

514 番(TCP)ポート(shell がその別名で、 netstat ではそう示されます。 実際、rsh"Remote Shell" のための アプリケーションです。) すべての "r" コマンドたちと同様に、 古き良き、紳士的だった時代への先祖返りです。 まったく安全でなく、危険度は高。 どんな場合にも LAN での使用のみにしてください。

514 番(UDP)ポート(syslog デーモンのポートで、 リモートログイン目的のためにのみ用いられる)。 平均的なユーザには必要ありません。おそらく危険度は低いでしょうが、 本当に必要な時にでも絶対に LAN 使用で。

515 番ポート(lp つまりプリントサーバポート)。 高リスク。もちろん LAN のみで。 世界の反対側にいる誰かはあなたのプリンタを本来の目的で使いはしません!

587 番ポート(MSA, つまり"投函"、メイル投函エージェント (Mail Submission Agent)プロトコル)。 ほとんどの MTA (メイルサーバ) によってサポートされている新しいメイル運用プロトコル。 危険度は低。

631 番ポート(CUPS (プリントデーモン) web マネージメントポート)。 LAN のみの使用で。危険度は低。

635 番ポート(mountd, NFS の一部)。LAN のみの使用で。

901 番ポート(SWAT, Samba Web 管理ツールポート)。 LAN のみの使用で。

993 番ポート(SSL 経由のIMAP, 安全な IMAP メイルサーヴィス)。 危険度は非常に低い。

995 番ポート(SSL 経由の POP, 安全な POP メイルサーヴィス)。 危険度は非常に低い。

1024 番ポート(これは最初の"非特権"ポートで、 要求があったアプリケーションに対しカーネルによって動的に割り当てられる)。 これはほとんど何にでもなれます。上のポートらの記述に同じ。

1080 番ポート(Socks Proxy サーバ)。クラッカーのお気に入りの標的です。

1243 番ポート(SubSeven Trojan)。Windows のみの問題です。

1433 番ポート(MS SQL サーバポート)。 時に標的になります。Linux には適用されません.

2049 番ポート(nfsd, つまり Network File Service Daemon ポート)。 危険度は高。LAN だけで使用することを勧めます。

3128 番ポート(squid proxy サーバポート)。 危険度は低いですが、ほとんどの場合は LAN での使用のみにすべきです。

3306 番ポート(MySQL サーバポート)危険度は低いですが、 ほとんどの場合 LAN での使用のみにすべきです。

5432 番ポート(PostgreSQL サーバポート)LAN のみで。比較的低リスク。

5631 番(TCP), 5632 番(UDP)ポート(PCAnywhere ポート)。 Windows のみ。PCAnywhere は大変"ノイズの多い" ものになりえますし、広い範囲のアドレスにブロードキャストします。

6000 番ポート(リモート接続のための X11 TCP ポート)。 危険度は低から中程度ですが、やはり、LAN での使用のみにすべきです。 実際、X は複数のディスプレイと各ディスプレイ毎に自身のポートを 持つことをサポートしているので、 これは 6000 番から 6009 番のポートも含む可能性があります。 ssh の X11 フォワーディングは 6010 番からポートを使い始めます。

6346 番ポート(gnutella)。

6667 番ポート(ircd, つまり Internet Relay Chat Daemon)。

6699 番ポート(napster)。

7100-7101 番ポート(フォントサーバにこれらのポートを使うものがあります)。 危険度は低いですが、LAN での使用のみで。

8000 番と 8080 番ポート(通常 web キャッシュとプロキシのサーバポート)。 LAN のみ。

10000 番ポート(webmin, つまり web ベースのシステム管理ユーティリティ)。 この点では危険度は低。

27374 番ポート(SubSeven, つまり Windows のみの Trojan で 使用されます)。1243 番ポートもそうです。

31337 番ポート(Back Orifice, つまり、また別の良く見られる Windows のみの Trojan で使われます)。

さらに多くのサーヴィスと対応するポート番号は /etc/services で見ることができます。 また、"公式の"リストは http://www.iana.org/assignments/port-numbers にあります。

これらと他のポートへのプローブが何を意味しているかについては、 Robert Graham による素晴らしい解析が以下にあります: http://www.linuxsecurity.com/resource_files/firewalls/firewall-seen.html これは非常に良い文献です。

ここでのもう一つのポイントは、 これらが標準のポート指定だということです。 どのサーヴィスも特定のポートで走っていると言える法則はありません。 通常は標準ポートを使っていますが、常にそうであるとは限りません。

自分のファイアーウォールのログに これらのタイプのポートが見つかったからと言って、 突然大慌てする必要はないということを覚えておいてください。 前述のステップ1から3に従って、 ファイアーウォールが正しく働いていることを確認していれば、 まずは安全です。 この通信の多くは"流れ弾"かも知れません、 つまりインターネットの背景ノイズか、どこかのクライアントかルータの設定ミス、 ノイズの多い Windows 関連ソフトから来たものかも知れないのです。

8.3. Netstat チュートリアル

8.3.1. 概観

netstat はネットワークの現在の状態を 見るのに非常に便利なユーティリティです。 つまり、どんなサーバが入ってくる接続に耳をすませているか、 どのインターフェースに耳をすませているか、 こちらに接続しているのは誰か、こちらから接続しているのは誰か、などです。 たくさんあるコマンドラインオプションのいくつかについては man ページに目を通してください。 ここでは、比較的少数のオプションだけを説明します。

一例として、仮想的ホスト big cat 上の TCP と UDP 両方について、 耳をすませているサーバとアクティブな接続の全てをチェックしてみましょう。 big cat は自宅のデスクトップマシンで、 この例では DSL インターネット接続しています。 bigcat は二枚のイーサネットカードを挿していて、 一つはプロバイダへの外部接続に、 一つはアドレス 192.168.1.1 の小さな LAN に用いられています。

   
$ netstat -tua
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:printer               *:*                     LISTEN     
tcp        0      0 bigcat:8000             *:*                     LISTEN     
tcp        0      0 *:time                  *:*                     LISTEN     
tcp        0      0 *:x11                   *:*                     LISTEN
tcp        0      0 *:http                  *:*                     LISTEN     
tcp        0      0 bigcat:domain           *:*                     LISTEN     
tcp        0      0 bigcat:domain           *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
tcp        0      0 *:631                   *:*                     LISTEN     
tcp        0      0 *:smtp                  *:*                     LISTEN     
tcp        0      1 dsl-78-199-139.s:1174   64.152.100.93:nntp      SYN_SENT   
tcp        0      1 dsl-78-199-139.s:1175   64.152.100.93:nntp      SYN_SENT   
tcp        0      1 dsl-78-199-139.s:1173   64.152.100.93:nntp      SYN_SENT   
tcp        0      0 dsl-78-199-139.s:1172   207.153.203.114:http    ESTABLISHED
tcp        1      0 dsl-78-199-139.s:1199   www.xodiax.com:http     CLOSE_WAIT 
tcp        0      0 dsl-78-199-139.sd:http  63.236.92.144:34197     TIME_WAIT
tcp      400      0 bigcat:1152             bigcat:8000             CLOSE_WAIT 
tcp     6648      0 bigcat:1162             bigcat:8000             CLOSE_WAIT 
tcp      553      0 bigcat:1164             bigcat:8000             CLOSE_WAIT 
udp        0      0 *:32768                 *:*                                
udp        0      0 bigcat:domain           *:*                                
udp        0      0 bigcat:domain           *:*                                
udp        0      0 *:631                   *:*                               

 

おそらくこの出力はあなた自身のシステムについてのものと ずいぶんと違った見かけをしているかもしれません。 "Local Address""Foreign Address" の欄の間の記述の違いと、 それぞれが対応するポート番号(可能な時はそのサーヴィス名) がコロンの後にどのように書かれているかに注意してください。 "Local Address" は接続の我々の側の端点です。 一番右の欄に LISTEN と書かれている最初のグループは このシステムでいま走っているサーヴィスです。 これらは bigcat の背後で走っていて、入ってくる接続に "耳をすませている"サーバです。 ですから、それらは開いたポートを持ち、 そこで"耳をすませて"います。 これらの接続はローカルシステムから(つまり bigcat 自身から) 入ってきたのかも知れませんし、 またはリモートシステムからのものかもしれません。 これは非常に重要な情報です! この下の他のものはこのシステムから他のシステムへ確立されている接続です。 それぞれの接続は最後の欄にキーワードで示されているように、 様々な状態にあります。最後にある最後の欄にキーワードが示されていない ものは UDP 接続に対応するサーバたちです。 UDP は TCP とは全く異なるプロトコルですが、 ある種のプライオリティの低いネットワーク通信で用いられています。

ここで、"サーヴィス名"への変換をさせないために、 "-n" フラッグをつけて同じことをしてみると、 実際に以下のようにポート番号を見ることができます:


$ netstat -taun
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address      State
tcp        0      0 0.0.0.0:515             0.0.0.0:*            LISTEN     
tcp        0      0 127.0.0.1:8000          0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:37              0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:6000            0.0.0.0:*            LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*            LISTEN     
tcp        0      0 192.168.1.1:53          0.0.0.0:*            LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:631             0.0.0.0:*            LISTEN     
tcp        0      0 0.0.0.0:25              0.0.0.0:*            LISTEN     
tcp        0      1 169.254.179.139:1174    64.152.100.93:119    SYN_SENT   
tcp        0      1 169.254.179.139:1175    64.152.100.93:119    SYN_SENT   
tcp        0      1 169.254.179.139:1173    64.152.100.93:119    SYN_SENT   
tcp        0      0 169.254.179.139:1172    207.153.203.114:80   ESTABLISHED
tcp        1      0 169.254.179.139:1199    216.26.129.136:80    CLOSE_WAIT 
tcp        0      0 169.254.179.139:80      63.236.92.144:34197  TIME_WAIT 
tcp      400      0 127.0.0.1:1152          127.0.0.1:8000       CLOSE_WAIT 
tcp     6648      0 127.0.0.1:1162          127.0.0.1:8000       CLOSE_WAIT 
tcp      553      0 127.0.0.1:1164          127.0.0.1:8000       CLOSE_WAIT 
udp        0      0 0.0.0.0:32768           0.0.0.0:*                    
udp        0      0 192.168.1.1:53          0.0.0.0:*                      
udp        0      0 127.0.0.1:53            0.0.0.0:*                     
udp        0      0 0.0.0.0:631             0.0.0.0:*          
   
 

この最初の数行を詳しく見て見ましょう。一行目は、


 tcp        0      0 0.0.0.0:515            0.0.0.0:*          LISTEN     

 

"Local Address"0.0.0.0 で、 使用可能な全てのインターフェースを意味しています。 ローカルポート番号は 515 番、つまり標準のプリントサーバポートで、 通常は lpd デーモンによって使われています。 通常のサーヴィス名と対応するポートは /etc/services ファイルで見ることができます。

これが全てのインターフェースの上で耳をすませているという事実は重大です。 この場合では、それは lo (localhost ローカルホスト)、 eth0 と eth1 です。プリンタ接続はこれらのインターフェースの どれを通して使用することもできます。 このシステムのユーザが PPP で接続するのなら、 プリントデーモンはそのインターフェース (ppp0) で耳をすませる ことになるでしょう。 "Foreign Address" もまた 0.0.0.0 で、"どこからでも"を意味します。

また、 このサーバは全てのインターフェース上で耳をすませるように、 カーネルに依頼してはいますが、 入ってくる接続をフィルタリングするファイアーウォールが 働いているかどうかについては、 netstat 出力には何も表示されていないという事実は、 ここで注意しておく価値があるでしょう。 この点においては、 それについて単に何も言うことができないということです。 明らかに、ある種のサーバにとっては、 接続をフィルタリングすることは非常に望ましいことです。 例えば、LAN の外にいる誰も、 あなたのプリントサーバポートに接続しようとする 理由は全くないでしょう。

二行目は少し違います:


 tcp        0      0 127.0.0.1:8000         0.0.0.0:*          LISTEN     

 

今度は "Local Address" はローカルホストのアドレス 127.0.0.1 になっています。 これはこのマシンへのローカル接続だけが許可されているということで、 大変重要な事実です。 つまり、bigcat だけが bigcat の 8000 番(TCP) ポートに 接続することができます。 セキュリティ上の意味は明白でしょう。 全てのサーバがこの種の制限を可能にする設定オプションを持っている わけではありません。しかし、 それを持つものについては非常に有効な機能です。 この例での 8000 番ポートは web プロキシ Junkbuster が使っています。

次の三つのエントリでは、また全ての可能なインターフェースの上で 耳をすませるように戻っています:


 tcp        0      0 0.0.0.0:37             0.0.0.0:*           LISTEN     
 tcp        0      0 0.0.0.0:6000           0.0.0.0:*           LISTEN
 tcp        0      0 0.0.0.0:80             0.0.0.0:*           LISTEN     

 

/etc/services を見ると、 37 番ポートは "time" サーヴィスで、 つまりこのサーバは time サーバであることがわかります。 6000 番ポートは X11 で、 80 番ポートは Apache のような HTTP サーバの標準ポートです。 ここでは実際普通でないことは何もなく、 これらは全て Linux ですぐに使用可能になっているサーヴィスです。

上の最初の二つは絶対に、 他の誰かに接続してもらいたい種類のサーヴィスではありません。 これらは外部からの接続を全て拒否するように ファイアーウォールで保護されるべきです。 上と同様に、この出力からは、 何かのファイアーウォールが働いているかどうか、 ましてやそれがいかに効果的に設定されているかどうかについては、 何も言えません。

80 番ポートの web サーバ自身は 大きなセキュリティ上のリスクではありません。 HTTP はしばしば全ての訪問者に開かれているプロトコルです。 例えば、自分自身のホームページのホストになりたいならば、 Apache などを使うことになるでしょう。 これをファイアーウォールでオフにして、 イントラネットの一部として我々の LAN クライアントだけが 使えるように設定することも可能です。 また、 web サーバを走らせることを正当化する理由が何もないなら、 もちろん完全に使用不可能にしておくべきでしょう。

次の二つの行は興味深いものです:


 tcp        0      0 192.168.1.1:53         0.0.0.0:*           LISTEN     
 tcp        0      0 127.0.0.1:53           0.0.0.0:*           LISTEN     

 

再び、"Local Address"0.0.0.0 ではないことに注意しましょう。これは結構なことです! 今度のポート番号は 53 番、つまり named のような ネイムサーバによって用いられる DNS ポートです。 しかし、このネイムサーバデーモンは lo インターフェース(localhost)、 bigcat を LAN に接続しているインターフェースで 耳をすませているだけだということがわかります。 ですから、カーネルは localhost から、つまり LAN からの接続のみを 許可しています。外部から可能な接続は 53 番ポートには全くありません。 これはいかに個別のアプリケーションを安全に設定できるかを示す 良い例です。この場合では、DNS 要求を扱うための対応をする本当の ネイムサーバなら世界に向けて 53 番ポートを開く必要があるでしょうから、 ここで見ているものはおそらくキャッシング DNS サーバなのです。 外部にまで開くなら、 これは一つのセキュリティ上のリスクで、特別な対応が必要です。

最後の三つは LISTENER、 つまりポートで耳をすませているエントリです:


 tcp        0      0 0.0.0.0:22             0.0.0.0:*           LISTEN     
 tcp        0      0 0.0.0.0:631            0.0.0.0:*           LISTEN     
 tcp        0      0 0.0.0.0:25             0.0.0.0:*           LISTEN     

 

これらはまた全ての可能なインターフェース上で耳をすませています。 22 番ポートは sshd つまり、 Secure Shell サーバデーモンです。これは良い兆候です! 最初の例の出力を見るに、631 番ポートのサーヴィスは名前を持っていません。 これはここで何か普通でないことが起きている証拠かもしれません。 (この謎についての答えは次の章を見てください。) そして最後に、25 番ポート、つまり SMTP メイルデーモンの標準ポートです。 ほとんどの Linux インストールではおそらく SMTP デーモンが走っているでしょうから、 これは必ずしも異常なことではありません。 でも、本当に SMTP デーモンが必要でしょうか?

次のグループは確立された接続です。我々の目的には、 最後のコラムで示されている接続の状態はそれほど重要ではありません。 これは man ページで詳しく説明されています。


 tcp        0      1 169.254.179.139:1174    64.152.100.93:119    SYN_SENT   
 tcp        0      1 169.254.179.139:1175    64.152.100.93:119    SYN_SENT    
 tcp        0      1 169.254.179.139:1173    64.152.100.93:119    SYN_SENT   
 tcp        0      0 169.254.179.139:1172    207.153.203.114:80   ESTABLISHED
 tcp        1      0 169.254.179.139:1199    216.26.129.136:80    CLOSE_WAIT 
 tcp        0      0 169.254.179.139:80      63.236.92.144:34197  TIME_WAIT 
 tcp      400      0 127.0.0.1:1152          127.0.0.1:8000       CLOSE_WAIT 
 tcp     6648      0 127.0.0.1:1162          127.0.0.1:8000       CLOSE_WAIT 
 tcp      553      0 127.0.0.1:1164          127.0.0.1:8000       CLOSE_WAIT 

 

ここには全部で 9 つの接続があります。 最初の三つは 119 番ポート(標準の NNTP ニュースポート) でリモートのホストへ接続している外部インターフェースです。 ここでは同じニュースサーバへの三つの接続があります。 これは同じ一つのニュースサーバに多重の接続を開こうとしていますから、 明らかに、このアプリケーションはマルチスレッド化されています。 次の二つのエントリは 5 番目のコラムにコロンの後に 80 番ポートと 示されているように、リモートの web サーバに接続しています。 おそらくほとんどの場合には非常に良く見られるものでしょう。 しかし、そのすぐ一つ後の行ではこの逆に、 4 番目のコラムに 80 番ポートがあります。 つまりこれは誰かが、その外部、インターネット側のインターフェースを 通して bigcat の web サーバに接続しているのです。 最後の三つのエントリはすべてローカルホストからローカルホストへの接続です。 つまり、自分自身に接続しているのです。 8000 番ポートが bigcat の web プロキシであったことを思い返せば分るように、 これはローカルに走っているプロキシに接続している web ブラウザです。 プロキシはそれ自身の外部接続を開きますが、 その接続がおそらく 4 行目と 5 行目で起こっていることでしょう。

netstat-t-u オプションの両方をつけたので、 TCP と UDP の両方の耳をすませているサーバが表示されています。 最後の数行は UDP のものです:


 udp        0      0 0.0.0.0:32768          0.0.0.0:*                    
 udp        0      0 192.168.1.1:53         0.0.0.0:*                      
 udp        0      0 127.0.0.1:53           0.0.0.0:*                     
 udp        0      0 0.0.0.0:631            0.0.0.0:*          

 

最後の三つのエントリは上の議論で見慣れたポートを持っています。 これらのサーバは TCP と UDP の両方の接続に耳をすませているのでした。 この場合は同じサーバが、異なる二つのプロトコルを使っているのです。 ローカルポート 32768 番を使っている最初の一つは初顔ですが、 /etc/services の中にはサーヴィス名はありません。 ですから、一見は、これは疑うべきもので、我々の好奇心を刺激します。 この説明については次の章を見てください。

この仮想的な状況からどんな結論が得られるでしょうか? ほとんどの場合について、 これらは Linux において非常にノーマルに見えるネットワークサーヴィス と接続です。 ここでは過度に多くのサーバが走っているようには見えませんが、 これら全てのサーバが本当に必要なのかそうでないか知らなければ、 それには大した意味はありません。 これらのどれも効果的にファイアーウォールで守られているかどうか、 netstat は何も教えてくれないのでした。 ですから、これら全部がどれくらい安全なのか、 何も言うことはできません。またここでは、 すべての耳をすませているサーバたちが その持ち主によって本当に必要とされているのかどうか、 まったくわかりません。 それはインストールの状況によって幅広く変わってしまうことだからです。 例えば、bigcat にはプリンタを接続してあるのでしょうか? おそらくそうでしょう、でなければ、これは全く必要のないリスクです。

8.3.2. ポートとプロセス所有者

上の章では bigcat のネットワークで何が起こっているかについて たくさんのことを学びました。しかし、そこでは学んだことでは、 何がその特定のサーヴィスをスタートさせたのか分りません。 今度はそれを調べましょう。 つまり、我々は特定のサーヴィスを停止したいと思っているのですが、 それは上の出力からは明らかなことではないのです。

-p オプションを使うと、最後のコラムに、 そのプロセスの PID とそのプロセスを開始したプログラム名が 表示されます。再び TCP サーヴィスのリストを見てみましょう (今度はスペースの関係上、最初の三つのコラムは省略してあります)。 利用できる情報を全て得るために、 root としてこれを実行する必要があります。


# netstat -tap
Active Internet connections (servers and established)
  Local Address           Foreign Address      State       PID/Program name
  *:printer               *:*                  LISTEN       988/inetd
  bigcat:8000             *:*                  LISTEN       1064/junkbuster
  *:time                  *:*                  LISTEN       988/inetd
  *:x11                   *:*                  LISTEN       1462/X
  *:http                  *:*                  LISTEN       1078/httpd
  bigcat:domain           *:*                  LISTEN       956/named
  bigcat:domain           *:*                  LISTEN       956/named
  *:ssh                   *:*                  LISTEN       972/sshd
  *:631                   *:*                  LISTEN       1315/cupsd
  *:smtp                  *:*                  LISTEN       1051/master

 

これらの中には既に顔なじみのものもあります。 しかし今回は、515 番ポートのプリンタデーモンが "988" 番の PID で inetd を通して開始されたこともわかります。 inetd は特別な状況です。 inetd はしばしば "スーパーサーバ" と呼ばれますが、それはその主な役割がサブデーモンを 産み出すことだからです。 最初の行を見ると、inetd は プリンタサーヴィスのために 515 番ポートで耳をすませています。 このポートに接続がやってくると、inetd が これを途中で捕まえて、適切なデーモン、 つまりこの場合にはプリントデーモンを生成するのです。 inetd がこれをどう扱うかの設定は、 典型的な場合では /etc/inetd.conf でなされます。 ですから、もし恒常的に inetd に制御されている サーバを停止したいならば、inetd (または xinetd)の設定を詳しく調べなければなりません。 また上の time サーバも同様に inetd 経由で開始されています。この事実は、これら二つのサーヴィスをさらに tcpwrapper (上のステップ3で説明しました) で守ることができることも意味しています。 これはシステムサーヴィスを制御するのに inetd を用いる利点の一つです。

上の章では 631 番ポートのサーヴィスについては確信がもてませんでしたね。 と言うのも、それが標準的なサーヴィス名を持っていなかったからで、 それはおそらく、何かしら普通でないか、 常道に外れていることを意味しているからです。 しかし、今やそれが cupsd によって 所有されていることを知ることができました。 これは Linux で使用可能なプリントサーバの一つです。 これがたまたまプリンタサーヴィスを制御するための web インターフェースになっているのです。 cupsd がすることは実際、 他のプリントサーバとほとんど変わりません。

上の最後のエントリは bigcat の SMTP メイルサーバです。 しばしば、これは多くのディストリビューションで sendmail になっています。 しかし、この場合はそうではありません。 このコマンドは "master" で、 危険ではないものと思われます。 プログラム名がわかれば、locatefind といったツールでファイルシステムを 探しに行くことができるでしょうし、 それが見つかれば、どのパッケージに属しているかも 見分けることができます。 しかし、今や PID を知っているのですから、 以下のように ps コマンドで、 何か助けが得られるかどうか試すことができます:


 $ /bin/ps ax |grep 1051 |grep -v grep
  1051 ?        S        0:24 /usr/libexec/postfix/master

 

ここでは近道をするために ps コマンドを grep と合わせて使っています。 このファイルは postfix に属しているようです。 これは実際 sendmail と同等のメイルサーバのパッケージです 。

ps--forest フラッグ (省略形は -f )とともに使うと、 どのプロセスが親プロセスか子プロセスかまた別のものなのか 決定するのに便利です。以下はその一例です(編集してあります):


 $ /bin/ps -axf
  956 ?        S      0:00 named -u named
  957 ?        S      0:00  \_ named -u named
  958 ?        S      0:46      \_ named -u named
  959 ?        S      0:47      \_ named -u named
  960 ?        S      0:00      \_ named -u named
  961 ?        S      0:11      \_ named -u named
 1051 ?        S      0:30 /usr/libexec/postfix/master
 1703 ?        S      0:00  \_ tlsmgr -l -t fifo -u -c
 1704 ?        S      0:00  \_ qmgr -l -t fifo -u -c
 1955 ?        S      0:00  \_ pickup -l -t fifo -c
 1863 ?        S      0:00  \_ trivial-rewrite -n rewrite -t unix -u -c
 2043 ?        S      0:00  \_ cleanup -t unix -u -c
 2049 ?        S      0:00  \_ local -t unix
 2062 ?        S      0:00  \_ smtpd -n smtp -t inet -u -c

 

ここで二、三注意があります。 今までに馴染みになったデーモンが二つあります: namedpostfix (smtpd) です。 両方ともサブプロセスとして生成されたものです。 named の場合には、見えているものはスレッドで、 常に生成されている様々なサブプロセスです。 Postfix も生成されたサブプロセスですが、 "スレッド"としてではありません。 各サブプロセスはそれ自身の特定の仕事を持っています。 子プロセスは親プロセスに依存しているということは 注意しておく価値があるでしょう。 ですから、親 PID を殺すと、その結果、全ての子プロセスが殺されます。

もしこのどれも何の光も投げかけてくれないなら、 さらに locate を使ってみる手もあるでしょう:


 $ locate /master
 /etc/postfix/master.cf
 /var/spool/postfix/pid/master.pid
 /usr/libexec/postfix/master
 /usr/share/vim/syntax/master.vim
 /usr/share/vim/vim60z/syntax/master.vim
 /usr/share/doc/postfix-20010202/html/master.8.html
 /usr/share/doc/postfix-20010202/master.cf
 /usr/share/man/man8/master.8.gz

 

find コマンドはおそらくもっとも自由度の高い ファイルを探すユーティリティですが、 locate がするようにデータベースを使わないので、 ずっと遅いです:


 $ find / -name master         
 /usr/libexec/postfix/master

 

もし lsof がインストールされていれば、 誰がプロセスやポートを所有しているか見つけるのに便利な また一つのコマンドです:


 # lsof -i :631       
 COMMAND  PID  USER    FD   TYPE DEVICE SIZE NODE NAME
 cupsd   1315  root    0u   IPv4   3734       TCP *:631 (LISTEN)

 

これは再び、cupsd プリントデーモンが 631 番ポートの所有者であることを教えてくれています。 同じことを、違った方法で得たわけです。 これを得るまたもう一つの方法は fuser で、 これもインストールされているはずです:


 # fuser -v -n tcp 631

                      USER        PID  ACCESS  COMMAND
 631/tcp              root       1315  f....   cupsd

 

fuserlsof コマンドの文法については man ページを参照してください。

サーヴィスが開始される場所を探すまた別の場所は、 init.d ディレクトリで、 これは(SysVinit システムについては) 実際 init スクリプトが住んでいる場所です。 ls -l /etc/init.d/ のようなことをすれば、このリストが得られるはずです。 netstat が用意してくれるように、 必ずしも正確に"プログラム名"と一致しないかも知れないのですが、 しばしば、 スクリプトの名前自身がどのサーヴィスを開始させるのかのヒントになります。 または、grep コマンドを用いて、 ファイルの中身を探してパターンマッチさせることもできます。 rpc.statd が開始された場所を探す必要があって、 この名前ではどのスクリプトかわからない?では…


 # grep rpc.statd /etc/init.d/*
 /etc/init.d/nfslock: [ -x /sbin/rpc.statd ] || exit 0
 /etc/init.d/nfslock:    daemon rpc.statd
 /etc/init.d/nfslock:    killproc rpc.statd
 /etc/init.d/nfslock:    status rpc.statd
 /etc/init.d/nfslock:    /sbin/pidof rpc.statd >/dev/null 2>&1; STATD="$?"

 

この全部の情報が実際必要なわけではありませんが、 少なくとも今や正確にどのスクリプトがこれを開始させているのかわかりました。 全てのサーヴィスがこのように開始されるのではないということも 覚えておいてください。 inetdxinetd 経由で開始されることもあります。

/proc ファイルシステムも今走っているプロセスに ついて知りたいことの全てを持っています。 各プロセスについてさらなる情報を見つけるために、 これに問い合わせることもできます。 あるプロセスを開始したコマンドへのフルパスを知りたい? それならこうです。


 # ls -l /proc/1315/exe
 lrwxrwxrwx  1 root  root   0 July 4 19:41 /proc/1315/exe -> /usr/sbin/cupsd

 

最後に、UDP に耳をすませているサーヴィスについて 一つ二つ述べて終わることにしましょう。 32768 番ポートで変なことがあったことを思い出してください。 それはサーヴィス名を持っていないのでした。


 # netstat -aup
 Active Internet connections (servers and established)
  Local Address           Foreign Address         State       PID/Program name   
   *:32768                 *:*                                 956/named           
   bigcat:domain           *:*                                 956/named           
   bigcat:domain           *:*                                 956/named           
   *:631                   *:*                                 1315/cupsd          

 

今や -p フラッグで "PID/ プログラム名"オプションを含めることによって、 これも named つまりネイムサーバデーモンに 属していることがわかります。 BIND の最新のバージョンは あるタイプの通信については非特権ポートを使います。 この場合には、これは BIND 9.x です。 ですから、ここでは本当の危険はないのです。 ここではこの非特権ポートはnamed が名前とアドレス を参照するために他のネイムサーバに話しかけるのに使われていて、 ファイアーウォールでこれを防ぐべきではないのです。

つまり我々のこの仮想的な状況においては、 大きな驚きは何もなかったということです。

もし全ての試みが失敗して、ある開いたポートについて プロセスの所有者が見つけられなかった場合には、 それがある種の RPC (Remote Procedure Call) サーヴィスかも知れない と疑ってください。 これらは何のロジックも一貫性もなくランダムに 割り当てられたポートを使っており、 典型的には portmap デーモンによって制御されています。 ある場合には、これらは netstatlsof コマンドでプロセス所有者を知ることができます。 portmap を止めてみて、 その不思議なサーヴィスがいなくなるかどうか見てみましょう。 またあなたは RPC サーヴィスが走っているかもしれないこと (このために portmap が走っているはずです) を見るために、 rpcinfo -p localhost コマンドを使うこともできます。

Warning

もしあなたが既に侵入されているかもしれないと疑っているのでしたら、 netstatps の出力を 信じないでください。 他のシステム要素もそうですが、 既にこれらも改竄されてしまっていて、 その出力が信用できなくなっている可能性が充分にあります。

8.4. 攻撃と脅威

この章では、 あちこちでよく見かけられる脅威とテクニックについて簡単に紹介して、 いくらかの見通しを与えましょう。

法人の世界や、政府機関や、 広く注目されているインターネットサイトでは、 典型的な自宅でのデスクトップユーザよりも、 はるかに広く難しい脅威に注意せねばなりません。 誰かが他の誰かのコンピュータに侵入しようとする理由はたくさんあります。 それは単にスリルが目的かもしれませんが、 悪意のある理由は他にいくらでもありえるでしょう。 彼らは単に他の誰かを攻撃するための足がかりを得たいだけかもしれません。 これは非常によくある動機の一つです。

我々のほとんどにとって、もっともよくある"攻撃"は 既に乗っ取られているシステムからのものです。 インターネットは既に侵入されてしまったコンピュータにあふれていて、 主人の命令をまるでゾンビのように盲目的に実行中です。 それらは巨大なアドレス範囲に渡ってスキャンし、 そこで各個別の IP アドレスを検査するようにプログラミングされています。 一つ以上の開いたポートを探しあて、 チャンスがあれば既知の弱点を検査します。これは、 非常に非人格的で、非常に方法論的で、しかも非常に効果的です。 我々は皆このような自動化されたスキャンロボットの通り道にいるのです。 我々が今行っているのは、 システムを守り r00t されることを避けるためのステップを取り、 システムに対する彼らの対応を失敗させるためなのです。

これらのスキャンは接続したときに示される ログインバナーを見るためにしているのではありません。 それはあなたがいくらか不明瞭なオペレーティングシステムを 走らせているかのように偽るように、 あなたの /etc/issue.net を変更するといった ちょっとしたことをするのです。 彼らは耳をすませているポートを見つけると、 そのシステムがどんな指示を与えようがかまわずに、 そのポートに対してあてはまる全ての攻撃を試してみるでしょう。 もしそれがうまくいけば、彼らは入ってきますし、 もし駄目なら、別の標的に移動するわけです。

8.4.1. ポートスキャンとプローブ

"スキャン""プローブ(調査)" という言葉は何度も問題になってきますから、 まずこれらの言葉の定義から始めましょう。 "プローブ"とは、 ある与えられたポートが開いているか閉じているか、 そしてそのポートで何が耳をすませているかを、 テストすることを意味します。 "スキャン"とは、 一つまたはそれ以上のシステム上で複数のポートを "プローブする"ことです。 または複数のシステム上の特定のポートかもしれません。 ですから、例えば、自分のシステム上の全てのポートを "スキャンする"とか、 またはクラッカーが 111 番ポートを開いているのは誰かを知るために 216.78.*.* アドレスを"スキャンしている"、 などと言うのです。

black hat (黒帽子、悪者ハッカー)たち は与えられたシステム上でどんなサーヴィスが 走っているかについての情報をスキャンしプローブすることができ、 これによってどんな攻撃を試してみるべきかを知ります。 彼らはどんなオペレーティングシステムが走っているか、 そのカーネルのバージョンは何か、について答えることさえ、 さらには、もっと多くの情報を得ることも可能かも知れません。 一方では、"ワーム(worm)"は自動化されていて、 盲目的にスキャンし、一般的には開いているポート、 つまり弱い犠牲者を探しているだけです。 それらはクラッカーがするかも知れないような "学習"は全くしようとしません。

"スキャン""プローブ"の間の区別は しばしば曖昧です。 両方とも誰が、何のために、行うのかに依存して、 良い意味にも悪い意味にも使われます。 例えば、ファイアーウォールの設定がうまく行っているか知るために、 あなたが友達にあなた自身をスキャンしてもらうよう頼むかも知れません。 これは nmap のようなスキャン用ツールの 合法的な使用ということになります。 しかし、あなたの知らない誰かが同じことをしたらどうでしょう? 彼らの目的は何でしょう?もしそれがあなたのプロバイダならば、 サーヴィス契約書の条項を守らせようとしているのかも知れません。 または、誰かが遊んでいるだけで、 そこに誰が"出てくるか"見ているだけかもしれません。 しかし、もっとありそうなのは、 それがこのような善意の意図を持っていない誰かか何かであることです。

全範囲のポートのスキャン (同じ一台のマシン上の多くのポートをプローブすること) は自宅でのネットワークについてはそれほどよくある脅威では ないようです。 しかし確かに、多くのシステムに対して特定のポートをスキャンすることは、 非常に、非常に、よく起こっていることです。

8.4.2. ルートキット (rootkit)

"ルートキット(rootkit)" とはスクリプトキディ (既成のスクリプト使いの悪がきども、新米クラッカー) の道具箱として提供されているものです。 侵入がうまく成功したとき、しばしば最初になされることは、 このような"ルートキット"をダウンロードし、 インストールすることなのです。

ルートキットは典型的には ls, ps, netstat, login などの基本的なシステムコマンドを置き換えます。 パスワードを加えたり、密かにデーモンをスタートしたり、 ログを変更したりするかもしれませんし、 確実に一つ以上のバックドア(裏口)を開くでしょう。 隠されたバックドアによって、攻撃者は入りたいときにいつでも 簡単に入ってこれるようになります。 そしてしばしばそのシステムの弱点自身が直されることさえあります。 というのも、新たな"所有者"がそのシステムの全てを 自分のものにするためです。 全体のプロセスはスクリプト化されていますので、 この乗っ取りは非常に素早くなされます。 これらの信頼を失ったシステムの正規の所有者は 一般的には何が起こっているかわからないでしょうが、 餌食になっているのは彼らなのです。 うまく設計されたルートキットは発見するのが非常に難しいものです。

8.4.3. ワームとゾンビ

"ワーム"とは自己複製する攻撃プログラムです。 ワームはシステムに感染すると、典型的な活動としては、 同じシステムの弱点を通して自分自身をばらまこうとします。 さまざまな"ワーム"が常に、 インターネットのアドレス空間全体にのたくっていて、 その行くところに自分自身をばらまいていきます。

しかし、ゾンビの背後のどこかには、それをあやつっているものがいます。 誰かがワームを立ち上げ、侵入がうまくいった後でワームがそれを報せるのです。 そして、システムがどのように使われているかを知るわけです。

これらの多くは Linux システムで、 数ある弱点を通して感染しようと他の Linux システムを探しています。 しかしほとんどのオペレーティングシステムはこの脅威をわけあっています。 ひとたび脆弱なシステムが発見されると、 その実際の侵入と乗っ取りは非常に素早いので、 その事実の後でそれと知ることは困難かもしれません。 侵入者が最初にすることは(それが人間であれ"ワーム"であれ)、 その侵入の形跡を隠そうとすることです。 "ルートキット"がダウンロードされてインストールされます。 この流行はケーブルモデムや DSL が広まったことで悪化しています。 インターネットへの常時接続は急速に広がっており、 しばしばこれらがより大きなサイトと同じようには充分安全ではないため、 このような脅威に対して豊かな土壌を提供してしまっているのです。

これは不吉な話に聞こえますが、 二、三の簡単な注意で効果的に防ぐことができます。 たくさんの易しい餌食があちこちにいるのに、 わざわざあなたのシステムに侵入するために 多大な努力を費やすでしょうか? 本気で非常に難しいことに挑戦するインセンティブはありません。 単にスキャンして、見て、試して、駄目なら次へ行く。 世の中にはスキャンする IP が常にまだいくらでもあるのです。 もしあなたのファイアーウォールが効果的にこの種のことを防いでいれば、 あなたにはまったく脅威にはなりません。 気楽に構えて、過剰反応しないようにしましょう。

これらのワームは"無理やりに"入ってくることはできない、 ということは注意しておく価値があるでしょう。 ワームには開いていてアクセス可能なポートが必要で、 かつ、既に知られている弱点が必要です。 上の始めの章での"Iptables の今週のログ要約" を思い出してもらえれば、 その多くはこのタイプのスキャンの結果だったかもしれません。 あなたがこの HOWTO で示したステップに従っていれば、 あなたは充分に安全です。これは充分簡単に逸らせることができます。

8.4.4. スクリプトキディたち

"スクリプトキディ"とは"クラッカー" ワナビー(なりたがり屋)で、 彼または彼女自身の攻撃をするのに充分な知識はないけれども、 その代わりに他の誰かが開発した"スクリプト"や攻撃 を使う連中のことです。 "ワーム"のように、彼らは易しい餌食を探していて、 ワームと同様に、知られている弱点を持った特定のポートを探すために、 広い範囲に渡ってアドレスをスキャンするかもしれません。 しばしば、実際のスキャンは既に乗っ取ったシステムから行われます。 というのも、そうすれば彼ら自身にまで跡を辿るのが難しくなるからです。

スクリプトキディは自分が使う既製品のトリックを入れた鞄を持っていて、 そこには様々なオペレーティングシステムの"ルートキット" の兵器庫が含まれています。 攻撃しやすい犠牲者を見つけることは、 充分な時間とプローブするための充分に広いアドレス空間が与えられれば、 それほど難しいことではありません。 その動機はごちゃまぜの鞄と同様です。単なるいたずら、 web サイトの攻撃、クレジットカード番号を盗む、 最近流行の"Denial of Service(サーヴィス拒否)"攻撃 (以下を参照のこと)など。 彼らはトロフィーのようにゾンビを集め、 目的が何であれそれを達成するために用いるのです。

再び、ここでのキーポイントは彼らが"スクリプト"を使い、 易しい餌食を探しているということです。 ワームの脅威と同様に、機能を果たしているファイアーウォールと、 二、三の基本的な用心があれば、ここでのどんな脅威も充分に逸らすことが できるはずです。今や、あなたはこの厄介から比較的安全であるはずです。

8.4.6. 標的を定めた攻撃

ワームと広い範囲に渡るアドレスのスキャンは、非個人的なものです。 それらは単に脆弱なシステムを探しているだけだからです。 それがトップシークレットの政府機関であろうが、 あなたのお母さんのウィンドウズマシンであろうと、何の違いもありません。 しかし、ある特定のシステムやネットワークに侵入することに 多大な努力を費やす"黒帽子たち"(悪者たち)もいるのです。 特定のシステムやネットワークに侵入するための熟考された決断があるところから、 我々はそれを"標的を定めた"攻撃と呼ぶことにしましょう。

この場合には、攻撃者は中にもぐりこむための裂け目を見つけるまで、 または諦めるまで、そのシステムの弱点を探し、 おそらく多くの異なる種類の手を試してみるでしょう。 これは防衛するのがより難しい相手です。 攻撃者は武装しており、危険で、いわば犠牲者をつけ狙っているのです。

繰り返しますが、このシナリオは典型的な自宅のシステムについては、 めったにありそうにないことです。 一般的には、もっと大きな獲物がある時に、 小さな魚に時間と努力を使うインセンティブが単にないからです。 標的になるかもしれない人々についての、 最善の防御は我々が既に議論してきた方法の多くを含んでいます。 注意深くあることが何よりも重要なことです。 良いログの取り方を学び、 IDS (Intrusion Detection System, 侵入検知システム)を使うべきでしょう。 さらに、BUGTRAQ のようなセキュリティ関係のメイリングリストの 一つ以上を購読し、そして、もちろん、これらの警告を毎日読んで、 適切な対応をとるべきです。

8.4.7. サーヴィス拒否攻撃(Denial fo Service DoS)

"DoS" とはまた別のタイプの攻撃で、 その目的は、 目標のシステムやネットワークがその機能を正常に果たせなくなるように、 混乱させ、トラフィック量で圧倒することです。 DoS には様々な形がありえますが、 インターネット上ではこれはしばしば、 大量のパケットを送りつけ、効果的に接続を不可能にすることで、 犠牲者の帯域、または TCP/IP スタックを圧倒してしまうことを意味します。 ここで言っているのは、一秒間に膨大の数のパケットということで、 ある場合には数千ということもありえるでしょう。 さらに、ひょっとしたら、 目標はサーバをクラッシュさせることかもしれません。

この攻撃は自宅ユーザよりも、企業や、 広く注目されているサイトをターゲットにすることの方が、 よりありそうなことです。 そしてこのテクニックに屈服するのを食い止めることは 極めて難しいことになりえます。 そしてそのためには、一般的には、 その標的に到達する前にその流れを止めるか、または最小化するために、 その源と標的の間のネットワークの協力が必要になります。 ひとたび、それらが目標に届いてしまえば、 完全にそれらを無視する良い方法はありません。

"DDoS" (Distributed Denial of Service), つまり分散されたサーヴィス拒否攻撃は、 その効果を最大化するために複数の源を使うものです。 これもまた、直接ホームユーザを標的にすることはありそうにないでしょう。 これらは"クラッカー"またはスクリプトキディによって "所有されている""奴隷たち(slaves)"で、 目を覚まされると犠牲者に襲いかかるのです。 この攻撃にはたくさんのコンピュータがまきこまれるかもしれません。

もしあなたがホームユーザで、動的な IP アドレスを使っていれば、 あなたがその標的になったときには、 新しい IP を得るために接続を切って再接続することが、 効果的な対処法かもしれません。おそらく。

8.5. リンク集

さらなる読み物へのリファレンスを以下に挙げます。 あなたが使っているディストリビューションのサイト、 セキュリティページ、ftp ダウンロードサイトは挙げられていませんので、 自分で見つける必要があります。 そしてそれらを必ずブックマークしてください!

8.6. テキストファイルの編集

By Bill Staehle

全ての世界は一つのファイルです。

ファイルには非常に様々なタイプがありますが、 ここでは無理に二つのかなり広い族に分けてみます:


  ここでまさにあなたが読んでいるテキストファイルと、
 それとは異なるものであるバイナリファイル。
    

バイナリファイルはマシンが読むもので、 テキストファイルは人間によって容易に編集でき、 一般的には人間が読むものです。 しかし、テキストファイルはマシンにも読むことが可能で、 実際しばしばそうしています。 その例は設定ファイルやスクリプト群ということになるでしょう。

*nix では様々に異なったテキストエディタが使用可能です。 二、三のものは全てのシステムにあります。 '/bin/ed' と '/bin/vi' はそうでしょう。 'vi' はたいていの場合、ライセンスの問題によって 'vim' のようなクローンになっています。 'vi' と 'ed' の問題点は、それらは恐ろしくユーザーに優しくない、 ということです。 また一つのよくみられるエディタは 'emacs' ですが、 常にデフォルトでインストールされているとは限りません。 これはより多くの機能と能力を持っていますが、 これも同様に学ぶのが易しくありません。

「ユーザに優しい」エディタとしては、 'mcedit' と 'pico' は始めるのに良い選択です。 これらはしばしば *nix に慣れていない人たちにとっては、 他のものよりずっと易しいものです。

最初に学ぶべきことは、いかに編集のセッションを終了するか、 いかにファイルの変更を保存するか、 そして折り返すべきでない長い一行の折り返しを避けるにはどうするか (ラップ、つまり行の折り返しの問題)でしょう。

'vi' エディタ

'vi' は Unix の世界では最も普通のテキストエディタの一つで、 ほとんど全ての *nix システム上に見られます。 実際は、ライセンスの問題によって、Linux システム上の'/bin/vi' は常に 'elvis' や 'nvi', 'vim' といった「クローン」です (他にもあります)。これらのクローンはオリジナルの 'vi' とまったく同様にふるまいますが、 たいていの場合は追加機能があり、 使えなくもないようになっています。

'vi' がそんなに恐ろしい代物なら、 どうしてそれを学ぶ必要があるのでしょうか? 二つの理由があります。 まず第一に、前述のように、 それはほとんど確実にインストールされていることが保証されていて、 他の(もっとユーザに優しい)エディタはデフォルトでインストールされて いるとは限らないからです。 第二の理由は、 その「コマンド」の多くが他のアプリケーションでも働くことです (例えば man ページを見るためにも用いられている 'less' のような)。 'less' を使っているときに、うっかり 'v' のキーを押してしまうと、 ほとんどの実装では 'vi' がスタートしてしまいます。

'vi' には二つのモードがあります。 一つは「コマンドモード」で、 キーボード入力はコマンドとして解釈されます。 もう一つのモードは「挿入モード」で、 ほとんど全てのキーボード入力は挿入するテキストとして解釈されます。

==> 'vi' を強制終了する方法 1. コンピュータがビープ音を鳴らすか、 スクリーンがフラッシュするまで、 <esc> キーを三回押します。 2. :q! <Enter> とキー入力する。

つまり、コロン、文字の Q, そしてエクスクラメーションマーク、 最後にエンター(改行)キーです。

'vi' コマンドは以下のようになっています。 これらは全て「コマンドモード」内で使います。

a    カーソルの後から挿入モードに入る。
A    現在いる行の終わりで挿入モードに入る。
i    カーソルの前で挿入モードに入る。
o    現在いる行の「下に」新しい行を開き挿入モードに入る。
O    現在いる行の「上に」新しい行を開き挿入モードに入る。
h    カーソルを一文字分、左に移動する。
l    カーソルを一文字分、右に移動する。
j    カーソルを一行分、下に移動する。
k    カーソルを一行分、上に移動する。
/ほにゃらら    そのテキストの前方で、次に文字列「ほにゃらら」が現れた箇所
               にカーソルを移動する。
?ほにゃらら    そのテキストをさかのぼって、次に文字列「ほにゃらら」が現れた箇所
               にカーソルを移動する。
n    前回のサーチを繰り返す(同じことをするのに「ほにゃらら」抜きで、
     ? または / )。
u    最後に行った変更を取り消す。
^B    ウィンドウ一つ後ろにスクロール。
^F    ウィンドウ一つ前にスクロール。
^U    ウィンドウ半分スクロールアップ。
^D    ウィンドウ半分スクロールダウン。

:w    ファイルに保存。
:wq   ファイルに保存して、終了。
:q    終了。
:q!   保存せずに終了。

<esc>   挿入モードを終えてコマンドモードに。

    

注意:四つの「矢印」キーは「コマンドモード」でも「挿入モード」 でもほとんど常に使えます。

'ed' エディタ

'ed' エディタはラインエディタです。 アプリケーションにはこれを必要とするものがあるとは言え、 全ての *nix コンピュータ上で使えることが仮想的に 保証されているという事実以上には、 これには社会的にはまったく値打ちのある機能がありません。 1975 年以来こいつを置き換えようとたくさん、 たくさんのものが提供されています。

'ed' の強制終了

1. それ自身で一行のピリオドをタイプし、 <Enter> を押す。 これでコマンドモードに入るか、 もしあなたが既にコマンドモードにいたとすれば一行のテキストを印字します。 2. q をタイプし、<Enter> を押す。 ファイルに何の変更もなかったなら、この動作で 'ed' を抜け出ます。 もし '?' と表示されたなら、これはファイルに変更があったことを意味し、 'ed' が変更を保存するかどうかあなたに尋ねているのです。 q を押して<Enter> として、 この二回目であなたが本当に終了したいということが確認されます。

'pico' エディタ

'pico' はワシントン大学(アメリカ合衆国) で開発された Pine メイル/ニュース パッケージに含まれています。 これは非常にユーザに優しいエディタですが、 一つ小さな短所があります。 'pico' は一行が(普通)74 文字を超えた時に、 黙って改行文字を挿入して行を折り返してしまいます。 これはメイルやニュース記事やメモをとる分には結構なことですが、 システムファイルを作る時にはしばしば致命的な問題になります。 この問題の解決策は簡単です。プログラムを呼び出すときに、 以下のように -w オプションをつけましょう:

pico -w file_2_edit

'pico' はとてもユーザに優しいので、これ以上の説明は必要ありません。 それは実際、とても、簡単です(必要なコマンドはスクリーンの下にあります)。 さらなるヘルプ機能もあります。 'pico' はほとんど全てのディストリビューションで使用可能ですが、 デフォルトでインストールされていないかもしれません。

==> 'pico' の強制終了

<Ctrl> キーを押しながら文字 x を押してください。 もしファイルに変更がされていないなら、これで 'pico' を終了します。 もし変更がされていれば、それを保存するかどうか訊ねられます。 n を押して終了してください。

'mcedit' エディタ

'mcedit' は Unix ライクなシステムのための完全な機能を持つ ビジュアルシェルプログラム、Midnight Comander shell program に含まれています。 これはコマンドラインから直接アクセスできますし (mcedit file_2_edit), また 'mc' の一部としても使えます (矢印キーを使って編集するファイルを選択し、 F4 キーを押します)。

'mcedit' はおそらく最も直感的に使えるエディタで、 拡張ヘルプもついています。「コマンド」は F* キーで操作します。 Midnight Commander はほとんど全てのディストリビューションで使用可能ですが、 デフォルトでインストールされていないかもしれません。

==> 'mcedit' の強制終了

F10 キーを押します。ファイルに変更がなされていなければ、 これで 'mcedit' を終了します。もし変更がなされていれば、 この動作をキャンセルするかどうか訊ねてきます。 n を押して終了します。

8.7. nmap

nmap のスキャンがどのようなものか 二、三の簡単な例をみてみましょう。 ここでの目的は我々のファイアーウォールとシステムの完全さを 検証するためにどのように nmap を 使うかを紹介することです。 nmap には 我々に必要のないその他の使い方もあります。 あなたがその所有者から許可を得ていない限り、 あなた自身のものではないシステム上で nmap を絶対に使わないで下さい。 これは誰のサーヴィス契約の違反でもありませんが、 この種のことは、 ほとんどの人々には敵意があると取られるでしょう。

既に見たように、nmap は洗練された ポートスキャン用ツールです。それは、 ホストが"そこに"あるかどうか、 どのポートが開いてる可能性があるのかを調べようとします。 他には、それらのポートがどんな状態にあるのかも。 nmap は複雑なコマンドラインを持ち、 色々なタイプの"スキャン"が可能です。 詳細については man ページをみてください。

まず二、三注意をしておきましょう。 もし portsentry を使っているなら、 それを停止してください。 これはスキャンがどこから来ようが、その向かう経路を落としてしまいます。 すべてのログ取得も停止しておいた方がよいかもしれません。 そうでなければ、少なくとも、多くのスキャンをするときには、 おびただしいログを受け取ることになることに気をつけてください。

単純な、"ローカルホスト"のデフォルトスキャン:


 # nmap localhost

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Interesting ports on bigcat (127.0.0.1):
 (The 1507 ports scanned but not shown below are in state: closed)

 Port       State       Service
 22/tcp     open        ssh                     
 25/tcp     open        smtp                    
 37/tcp     open        time                    
 53/tcp     open        domain                  
 80/tcp     open        http                    
 3000/tcp   open        ppp                     

 Nmap run completed -- 1 IP address (1 host up) scanned in 2 seconds

 

この文書のほとんどに既に目を通している方には、 今やこれらのサーヴィスが見慣れたものになっていることでしょう。 これらの中には今までの他の例で見てきたものと同じポートがあります。 このスキャンで注意すべきことは、 スキャンは 1500 個強の"興味ある"ポート に対し行われただけである(全てのポートに対してではない)ということです。 これ以上のスキャンがしたければ、そうした設定も可能です (man ページを参照してください)。 それに、TCP ポートのみしかスキャンされていません。 これも望めば、それ以外のスキャンも設定可能です。 これは netstat が全ての開いたポートを、 耳をすませていようがいまいが表示するのとは異なって、 "耳をすませている"サーヴィスだけをピックアップします。 ここでの最後の 3000 番となっている"開いた"ポートは、 "PPP" であると認識されています。 間違いです!これはこのポート番号について /etc/services ファイルに含まれている情報に基づいて nmap が学習した結果の推測に 過ぎないからです。 実際、この場合それは ntop (network traffic monitor)です。 このようにサーヴィス名は多少割り引いて解釈してください。 nmap が本当にそのポートが何なのかを知る方法は 存在しないのです。 サーヴィス名にポート番号をマッチさせることは時に危険です。 多くは標準のポート番号を持っていますが、 同じポート番号を使うべきだということではありません。

この文書の全ての netstat の例においては、 我々は開いたポートを二つのクラスに分けていました: 耳をすませているサーバと、我々が接続を希望した他のリモートホスト (例えば、どこかにある web サーバ)と接続が確立しているものです。 nmap は最初のグループしか見ません、 つまり耳をすませているサーバだけです! 我々をリモートサーバに繋げているポートは不可視で、 ゆえに、危険ではないのです。 これらのポートはその接続一つについて"プライベート" なものなので、接続が終了した時に閉じられます。

ですから、ここで開いたポートと閉じたポートを持っているわけです。 充分に単純で、何がこの bigcat 上で走っているかについて、 なかなか良い情報を与えてくれています。 しかし、それは必ずしもこのシステムが外部の世界からどう見えているかを 示しているわけではありません。と言うのも、 これはローカルホストからスキャンされていることであって、 何のファイアーウォールもまた他のアクセス制御の仕組みの影響も 受けていないからです。

もう少し強力なスキャンをしてみましょう。 今度は、全てのポート、TCP も UDP も、をチェックします。


 # nmap -sT -sU -p 1-65535 localhost

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Interesting ports on bigcat (127.0.0.1):
 (The 131050 ports scanned but not shown below are in state: closed)

 Port       State       Service
 22/tcp     open        ssh                     
 25/tcp     open        smtp                    
 37/tcp     open        time                    
 53/tcp     open        domain                  
 53/udp     open        domain                  
 80/tcp     open        http                    
 3000/tcp   open        ppp                     
 8000/tcp   open        unknown                 
 32768/udp  open        unknown                 

 Nmap run completed -- 1 IP address (1 host up) scanned in 385 seconds

 

今度はただ"興味ある"ポートだけではなく、 全てのポートを調べています。 このプロセスで新たに二つのものがピックアップされました。 我々は以前に既にこれらを netstat を用いて 見たので、我々はこれらが何であるかを知っています。 それは 8000/tcp ポート上の Junkbuster ウェブプロキシと、32768/udp ポート上の named です。 これには前の場合よりもっと、もっと長い時間がかかりますが、 全てのポートを調べるための唯一の方法です。

これで bigcat の上でどのポートが開いているかについて なかなか良い情報を得られました。 ここではローカルホストからローカルホストをスキャンしていますから、 全てのポートが可視です。 我々は依然として外の世界から我々がどう見えているのかはわかりません。 ここで、同じ LAN 内の他のホストに ssh 接続してみて、またスキャンしてみます。


 # nmap bigcat

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Interesting ports on bigcat (192.168.1.1):
 (The 1520 ports scanned but not shown below are in state: closed)

 Port       State       Service
 22/tcp     open        ssh
 3000/tcp   open        ppp

 Nmap run completed -- 1 IP address (1 host up) scanned in 1 second

 

ここでは強調のために iptables のルールに手を加えていることを白状します。 このスキャンではただ二つのポートが見えています。 他の全ては"閉じて(closed)"います。 これが nmap の報告でした。 もう一度やってみましょう:


 # nmap bigcat

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 Note: Host seems down. If it is really up, but blocking our ping probes, try -P0
 
 Nmap run completed -- 1 IP address (0 hosts up) scanned in 30 seconds

 

おっと、今度は私が仕事をしている間に、 ICMP (ping) をブロックしてしまったようです。 もう一回:


 # nmap -P0 bigcat

 Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
 All 1523 scanned ports on bigcat (192.168.1.1) are: filtered
 
 Nmap run completed -- 1 IP address (1 host up) scanned in 1643 seconds

 

これです。いかに長い時間がかかっているかに注意してください。 ポートは今、"閉じて"いる代わりに、 "フィルター"をかけられていることに注意してください。 "nmap" はどうやってこれを知るのでしょう? "閉じている(closed)"という言葉が意味するのは bigcat が"ここには何も走っていませんよ"、 とパケットを送り返してきた、ということで、 つまり、ポートが閉ざされている、ということになります。 この最後の例では、iptables の規則は ICMP (ping) を許可せず、全ての入ってくるパケットを "落とす(DROP)"ように変更されていました。 言い換えれば、まったく何の返事もありません。 たとえ何の返事もないとしても、 nmap は依然としてホストがそこにあることは知っている のですから、ここには微妙な差があります。 ここでの一つの教訓は、もしあなたがスキャンを遅くさせたいなら、 パケットを"DROP" (または "DENY") すればよいと言うことです。 これによって、各ポートの検証において、 リモート接続が TCP タイムアウトすることになります。 結局、スキャンがこのような結果を示しているなら、 うまく期待通りの動作をしている、つまり、 あなたのファイアーウォールが自分の仕事を果たしているのです。

UDP についての短い注意: nmap は実際には、 もしフィルターされていれば、 これらのポートの状態を判定することはできません。 この場合おそらく、"開いた"状態であるという 間違った情報を受け取るでしょう。 これは UDP が接続のないプロトコルであることに関係しています。 もし nmap が何の返答も得なければ (例えば、 "DROP" のために)、 パケットが目標に届いたのだと仮定して、 その結果そのポートは"開いている"と報告するでしょう。 これは nmap としては"正常な"動きです。

外部の世界からシステムがどう見えているかをシミュレートするために、 LAN の設定でファイアーウォールをいじってみることができます。 もしあなたが充分賢くて、自分が何をしているかをちゃんとわかっていて、 とんだへまをしでかさなければ、 おそらくシステムの状態をかなり想像できるでしょう。 しかしやはり、もし可能なら実際に外部からチェックをしてもらう方法を 探すのがベストの方法ではあります。 この場合もプロバイダの運用ルールを破っていないことを確認してください。 同じプロバイダを使っている友達がいますか?

8.8. Sysctl のオプション

"sysctl" のオプションは /proc ファイルシステムを通して設定できるカーネルパラメータです。 これらはランタイム時に動的に調整することができます。 典型的にはこれらのオプションは "0" にセットされていればオフで、 "1" のときはオンです。

これらのいくつかはセキュリティ実装を持ってます (だからこのテーマを今あつかっているわけですが ;-))。 ここでは関連性があると思われるものをリストアップするだけにします。 自由にカットアンドペーストして、 ファイアーウォールのスクリプトや、 ブート時に起動される他のファイル(/etc/rc.local のような)に使ってください。 または、各ディストリビューションが これを設定する独自の方法を用意しているかもしれません。 これらの意味については /usr/src/linux/Documentation/sysctl/README ファイルとカーネル文書ディレクトリのその他のファイルを 読めば知ることができます。


#!/bin/sh
# 
# Configure kernel sysctl run-time options. 
# kernel sysctl ランタイムオプション設定
###################################################################

# Anti-spoofing blocks
# アンチ・スプーフィングがブロック
for i in /proc/sys/net/ipv4/conf/*/rp_filter; 
do
 echo 1 > $i
done

# Ensure source routing is OFF
# ソースルーティングをオフに
for i in /proc/sys/net/ipv4/conf/*/accept_source_route;
 do
  echo 0 > $i
 done

# Ensure TCP SYN cookies protection is enabled
# TCP SYN クッキープロテクションを可能に
[ -e /proc/sys/net/ipv4/tcp_syncookies ] &&\
 echo 1 > /proc/sys/net/ipv4/tcp_syncookies 

# Ensure ICMP redirects are disabled
# ICMP リダイレクトを不可能に
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; 
 do
  echo 0 > $i
 done

# Ensure oddball addresses are logged
# おかしなアドレスはログを取る
[ -e /proc/sys/net/ipv4/conf/all/log_martians ] &&\
 echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

[ -e /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ] &&\
 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

[ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] &&\
 echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

## Optional from here on down, depending on your situation. ############
# ここから下はシステムに応じたオプション。
#
# Ensure ip-forwarding is enabled if
# we want to do forwarding or masquerading.
# フォワーディングかマスカレーディングをするなら ip-forwarding を可能に。
[ -e /proc/sys/net/ipv4/ip_forward ] &&\
 echo 1 > /proc/sys/net/ipv4/ip_forward

# On if your IP is dynamic (or you don't know).
# IP が動的である(またはどうか知らない)時はオン。
[ -e /proc/sys/net/ipv4/ip_dynaddr ] &&\
 echo 1 > /proc/sys/net/ipv4/ip_dynaddr        

# eof

 

8.9. セキュアな代替物

この章では潜在的にセキュアでない方法に対して、 安全な代替物を手短に紹介します。 クライアントとサーバ両方のごたまぜになっています。

8.10. ipchains と iptables 再び

この章では ipchainsiptables にできることの いくつかをもう少し詳しく見てみます。 これらは基本的には上のステップ3で見たものと同じスクリプトですが、 いくらかさらに進んだ設定オプションが追加されています。 "マスカレーディング""ポートフォワーディング"、 あるユーザに限定したサーヴィスへのアクセス許可、 そのほか二、三の機能が提供されています。 それらの説明についてはコメント文を読んでください。

8.10.1. ipchains II


#!/bin/sh
#
# ipchains.sh
#
# An example of a simple ipchains configuration. This script 
# can enable 'masquerading' and will open user definable ports.
# 単純な ipchains 設定の例。このスクリプトは「マスカレーディング」
# が可能で、ユーザ定義ポートを開く。
###################################################################
# Begin variable declarations and user configuration options ######
# 変数宣言とユーザ設定オプション
# Set the location of ipchains (default).
# ipchains (デフォルト)の場所を設定。
IPCHAINS=/sbin/ipchains

# Local Interfaces
# ローカルインターフェース
# This is the WAN interface, that is our link to the outside world.
# これは WAN インターフェース、外の世界に我々をつなげる。
# For pppd and pppoe users.
# pppd と pppoe ユーザのため。
# WAN_IFACE="ppp0"
WAN_IFACE="eth0"
#
# Local Area Network (LAN) interface.
# ローカルエリアネットワーク(LAN)インターフェース
#LAN_IFACE="eth0"
LAN_IFACE="eth1"

# Our private LAN address(es), for masquerading.
# 我々のプライベート LAN アドレス(たち)、マスカレーディングのための。
LAN_NET="192.168.1.0/24"

# For static IP, set it here! 
# スタティック IP のため。ここで設定せよ!
#WAN_IP="1.2.3.4"

# Set a list of public server port numbers here...not too many!
# These will be open to the world, so use caution. The example is
# sshd, and HTTP (www). Any services included here should be the
# latest version available from your vendor. Comment out to disable
# all PUBLIC services.
# ここでパブリックサーバのポート番号のリストを設定。多すぎないように!
# これらは世界に向けて開かれるので、要注意。この例は sshd, HTTP(www).
# ここのどのサーヴィスもヴェンダの最新バージョンにすべき。
# 全てのパブリックサーヴィスを不可能にするためにはコメントアウトせよ。
#PUBLIC_PORTS="22 80 443"
PUBLIC_PORTS="22"

# If we want to do port forwarding, this is the host 
# that will be forwarded to.
# もしポートフォワーディングしたいなら、これがフォワードされる先のホスト
#FORWARD_HOST="192.168.1.3"

# A list of ports that are to be forwarded. 
# フォワードされるべきポートのリスト
#FORWARD_PORTS="25  80"

# If you get your public IP address via DHCP, set this.
# もし DHCP を通じてパブリックな IP アドレスを設定するなら、ここで。
DHCP_SERVER=66.21.184.66

# If you need identd for a mail server, set this.
# メイルサーバのために identd が必要ならここで。
MAIL_SERVER=

# A list of unwelcome hosts or nets. These will be denied access 
# to everything, even our 'PUBLIC' services. Provide your own list.
# 望まぬ客のホストとネットのリスト。これらは全てへのアクセス、
# 我々のパブリックサーヴィスさえも、拒否される
# 自分自身のリストを用意せよ。
#BLACKLIST="11.22.33.44 55.66.77.88"

# A list of "trusted" hosts and/or nets. These will have access to 
# ALL protocols, and ALL open ports. Be selective here.
# 「信用できる」ホストと/またはネットのリスト。これらは全ての
# プロトコルと全ての開いたポートにアクセスできる。
# これは精選して。
#TRUSTED="1.2.3.4/8  5.6.7.8"

## end user configuration options #################################
## エンドユーザ設定オプション
###################################################################

# The high ports used mostly for connections we initiate and return
# traffic.
# トラフィックを初期化、返信のための接続に主に用いられる
# 高番号ポート。
LOCAL_PORTS=`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f1`:\
`cat /proc/sys/net/ipv4/ip_local_port_range |cut -f2`

# Any and all addresses from anywhere.
# 任意の場所からの全てのアドレス
ANYWHERE="0/0"

# Start building chains and rules #################################
# チェインと規則の設定の始まり
# Let's start clean and flush all chains to an empty state.
# まず全てのチェインを空の状態に。
$IPCHAINS -F  

# Set the default policies of the built-in chains. If no match for any 
# of the rules below, these will be the defaults that ipchains uses.
# 組み込みのチェインのデフォルトポリシーを設定。以下のルールのどれにも
# 一致しなければ、これらが ipchains の使うデフォルトになる。
$IPCHAINS -P forward DENY
$IPCHAINS -P output ACCEPT
$IPCHAINS -P input DENY 

# Accept localhost/loopback traffic.
# localhost/loopback トラフィックを受け入れる。
$IPCHAINS -A input -i lo -j ACCEPT

# Get our dynamic IP now from the Inet interface. WAN_IP will be our
# IP address we are protecting from the outside world. Put this
# here, so default policy gets set, even if interface is not up
# yet.
# ここで Inet インターフェースから我々のダイナミック IP を取得。
# WAN_IP は外の世界から我々が守る IP アドレスになる。
# インターフェースがまだ立ち上がっていなくても、ここにおいているので、
# デフォルトのポリシーが準備される。
[ -z "$WAN_IP" ] &&\
  WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \  -f 1`

# Bail out with error message if no IP available! Default policy is 
# already set, so all is not lost here.
# どの IP も可能でないならエラーメッセージとともに抜け出る。
# デフォルトポリシーは既に設定されているので、すべてがここで
# 失われるわけではない。
[ -z "$WAN_IP" ] && echo "$WAN_IFACE not configured, aborting." && exit 1

WAN_MASK=`ifconfig $WAN_IFACE | grep Mask | cut -d : -f 4`
WAN_NET="$WAN_IP/$WAN_MASK"

## Reserved IPs:
# 予約 IP:
# We should never see these private addresses coming in from outside 
# to our external interface.
# 外部から我々の外部インターフェースへ、これらのプライベートアドレスが
# 入ってくることは決してあるべきではない。
$IPCHAINS -A input -l -i $WAN_IFACE -s 10.0.0.0/8     -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 172.16.0.0/12  -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 192.168.0.0/16 -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 127.0.0.0/8    -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 169.254.0.0/16 -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 224.0.0.0/4    -j DENY
$IPCHAINS -A input -l -i $WAN_IFACE -s 240.0.0.0/5    -j DENY
# Bogus routing
# 偽もののルーティング
$IPCHAINS -A input -l -s 255.255.255.255 -d $ANYWHERE -j DENY

## LAN access and masquerading
# LAN アクセスとマスカレーディング
#
# Allow connections from our own LAN's private IP addresses via the LAN
# interface and set up forwarding for masqueraders if we have a LAN_NET
# defined above. 
# LAN インターフェスを通じての、我々自身の LAN のプライベート IP アドレス
# からの接続を許可し、上で LAN_NET が定義されていればマスカレーダーの
# フォワーディングを設定する。
if [ -n "$LAN_NET" ]; then 
 echo 1 > /proc/sys/net/ipv4/ip_forward
 $IPCHAINS -A input  -i $LAN_IFACE  -j ACCEPT
 $IPCHAINS -A forward -s $LAN_NET -d $LAN_NET -j ACCEPT
 $IPCHAINS -A forward  -s $LAN_NET -d ! $LAN_NET -j MASQ
fi

## Blacklist hosts/nets
# ブラックリスト hosts/nets
#
# Get the blacklisted hosts/nets out of the way, before we start opening 
# up any services. These will have no access to us at all, and will be
# logged.
# ブラックリストにのったホスト/ネットを、どのサーヴィスも開かれ
# る前に閉め出す。これらはまったく我々にアクセスを持たず、
# ログをとられる。
for i in $BLACKLIST; do
 $IPCHAINS -A input -l -s $i -j DENY
done

## Trusted hosts/nets
# 信用できるホスト/ネット
#
# This is our trusted host list. These have access to everything.
# 信用するホストのリスト。これらは全てへのアクセス権を持つ。
for i in $TRUSTED; do
 $IPCHAINS -A input -s $i -j ACCEPT
done

# Port Forwarding
# ポートフォワーディング
#
# Which ports get forwarded to which host. This is one to one 
# port mapping (ie 80 -> 80) in this case.
# NOTE: ipmasqadm is a separate package from ipchains and needs 
# to be installed also. Check first!
# どのポートがどのホストへフォワードされるか。これはこの場合
# 一対一のマッピング(つまり、80 から 80 へ)。
# 注意: ipmasqadm は ipchains とは別のパッケージで、これも
# インストールする必要がある。まずチェックすること。
[ -n "$FORWARD_HOST" ] && ipmasqadm portfw -f &&\
 for i in $FORWARD_PORTS; do
   ipmasqadm portfw -a -P tcp -L $WAN_IP $i -R $FORWARD_HOST $i
 done

## Open, but Restricted Access ports/services
# 開いた、しかし制限されたアクセスのポート/サーヴィス
#
# Allow DHCP server (their port 67) to client (to our port 68) UDP traffic
# from outside source.
# 外部ソースからクライアントの(我々の68番ポートへの)UDP トラフィック
# へ DHCP サーバ(67番ポート)を許可する。
[ -n "$DHCP_SERVER" ] &&\
 $IPCHAINS -A input -p udp -s $DHCP_SERVER 67 -d $ANYWHERE 68 -j ACCEPT 

# Allow 'identd' (to our TCP port 113) from mail server only.
# メイルサーバのみから(我々の TCP 113 番ポートへの)'identd' を許可
[ -n "$MAIL_SERVER" ] &&\
 $IPCHAINS -A input -p tcp -s $MAIL_SERVER  -d $WAN_IP 113 -j ACCEPT 

# Open up PUBLIC server ports here (available to the world):
# ここで PUBLIC サーバポートを開く(世界へ繋げるため):
for i in $PUBLIC_PORTS; do
 $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $i -j ACCEPT 
done

# So I can check my home POP3 mailbox from work. Also, so I can ssh 
# in to home system. Only allow connections from my workplace's
# various IPs. Everything else is blocked.
# こうしておけば仕事場から自宅の POP3 メイルボックスをチェックできる。
# また、自宅システムへ ssh で入ることもできる。仕事場のさまざまな
# IP アドレスからの接続を許可するだけ。他は全てブロックされる。
$IPCHAINS -A input -p tcp -s 255.10.9.8/29 -d $WAN_IP 110 -j ACCEPT 

# Uncomment to allow ftp data back (active ftp). Not required for 'passive'
# ftp connections.
# ftp データバック(アクティブ ftp)を許可するときはコメントアウトを外す。
# パッシブ ftp 接続については必要ない。
#$IPCHAINS -A input -p tcp -s $ANYWHERE 20 -d $WAN_IP $LOCAL_PORTS -y -j ACCEPT

# Accept non-SYN TCP, and UDP connections to LOCAL_PORTS. These are
# the high, unprivileged ports (1024 to 4999 by default). This will
# allow return connection traffic for connections that we initiate
# to outside sources. TCP connections are opened with 'SYN' packets.
# We have already opened those services that need to accept SYNs
# for, so other SYNs are excluded here for everything else.
# LOCAL_PORTS への非 SYN TCP と UDP 接続を受け入れる。これらは
# 番号の高い非特権ポート(デフォルトでは 1024 から 4999番)。
# これは外部のソースへ初期化する接続のための返信接続トラフィックを
# 許可する。TCP 接続は 'SYN' パケットとともに開かれている。
# SYN を受け入れる必要のあるそれらのサーヴィスは既に開いているので、
# 他の SYN はそれ以外の全てについてここで拒絶する。
$IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS ! -y -j ACCEPT 

# We can't be so selective with UDP since that protocol does not know 
# about SYNs.
# UDP は SYN について知らないので、それほど選択的にできない。
$IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP $LOCAL_PORTS -j ACCEPT 

# Allow access to the masquerading ports conditionally. Masquerading
# uses it's own port range -- on 2.2 kernels ONLY! 2.4 kernels, do not 
# use these ports, so comment out!
# 場合によってはマスカレードしているポートへの接続を許可する。
# マスカレーディングは自身のポート範囲を用いる(2.2 カーネルのみで!)。
# 2.4 カーネルはこれらのポートを使わないので、コメントアウトするように!
[ -n "$LAN_NET" ] &&\
 $IPCHAINS -A input -p tcp -s $ANYWHERE -d $WAN_IP 61000: ! -y -j ACCEPT &&\
 $IPCHAINS -A input -p udp -s $ANYWHERE -d $WAN_IP 61000: -j ACCEPT

## ICMP (ping)
#
# ICMP rules, allow the bare essential types of ICMP only. Ping
# request is blocked, ie we won't respond to someone else's pings,
# but can still ping out. 
# ICMP の規則、ICMP のむき出しの本質的なタイプだけを許可。
# Ping 要求はブロックされる。つまり、他の誰かの ping には答えないが、
# 自分は ping out することができる。
$IPCHAINS -A input  -p icmp  --icmp-type echo-reply \
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT
$IPCHAINS -A input  -p icmp  --icmp-type destination-unreachable \
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT
$IPCHAINS -A input  -p icmp  --icmp-type time-exceeded \
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT

#######################################################################
# Set the catchall, default rule to DENY, and log it all. All other
# traffic not allowed by the rules above, winds up here, where it is
# blocked and logged. This is the default policy for this chain
# anyway, so we are just adding the logging ability here with '-l'.
# Outgoing traffic is allowed as the default policy for the 'output'
# chain. There are no restrictions on that.
# なんでも箱をおき(デフォルトルールは DENY)、その全てのログをとる。
# 上のルールで許可されていない他の全てのトラフィックを、ここで
# 始末をつけ、ブロックしログをとる。これはこのチェインについての
# デフォルトのポリシーだから、ここでは '-l' でログ能力を追加するのみ。
# 外に向かうトラフィックは 'output' チェインについてのデフォルト
# ポリシーとして許可されている。これについては何の制限もおかない。
$IPCHAINS -A input -l -j DENY

echo "Ipchains firewall is up `date`."

##-- eof ipchains.sh

 

8.10.2. iptables II


#!/bin/sh
#
# iptables.sh
#
# An example of a simple iptables configuration. This script 
# can enable 'masquerading' and will open user definable ports.
# 単純な ipchains 設定の例。このスクリプトは「マスカレーディング」
# が可能で、ユーザ定義ポートを開く。
###################################################################
# Begin variable declarations and user configuration options ######
#  変数宣言とユーザ設定オプション
# Set the location of iptables (default).
# ipchains (デフォルト)の場所を設定。
IPTABLES=/sbin/iptables

# Local Interfaces
# ローカルインターフェース
# This is the WAN interface that is our link to the outside world.
# これは WAN インターフェース、外の世界に我々をつなげる。
# For pppd and pppoe users.
# pppd と pppoe ユーザのため。

# WAN_IFACE="ppp0"
WAN_IFACE="eth0"
#
# Local Area Network (LAN) interface.
# ローカルエリアネットワーク(LAN)インターフェース
#LAN_IFACE="eth0"
LAN_IFACE="eth1"

# Our private LAN address(es), for masquerading.
# 我々のプライベート LAN アドレス(たち)、マスカレーディングのための。
LAN_NET="192.168.1.0/24"

# For static IP, set it here! 
# スタティック IP のため。ここで設定せよ!
#WAN_IP="1.2.3.4"

# Set a list of public server port numbers here...not too many!
# These will be open to the world, so use caution. The example is
# sshd, and HTTP (www). Any services included here should be the
# latest version available from your vendor. Comment out to disable
# all Public services. Do not put any ports to be forwarded here,
# this only direct access.
# ここでパブリックサーバのポート番号のリストを設定。多すぎないように!
# これらは世界に向けて開かれるので、要注意。この例は sshd, HTTP(www).
# ここのどのサーヴィスもヴェンダの最新バージョンにすべき。
# 全てのパブリックサーヴィスを不可能にするためにはコメントアウトせよ。
# フォワードされるポートはどれもここにおかないこと、これは直接の
# アクセスのみ。
#PUBLIC_PORTS="22 80 443"
PUBLIC_PORTS="22"

# If we want to do port forwarding, this is the host 
# that will be forwarded to.
# もしポートフォワーディングしたいなら、これがフォワードされる先のホスト。
#FORWARD_HOST="192.168.1.3"

# A list of ports that are to be forwarded. 
# フォワードされるべきポートのリスト
#FORWARD_PORTS="25  80"

# If you get your public IP address via DHCP, set this.
# もし DHCP を通じてパブリックな IP アドレスを設定するなら、ここで。
DHCP_SERVER=66.21.184.66

# If you need identd for a mail server, set this.
# メイルサーバのために identd が必要ならここで。
MAIL_SERVER=

# A list of unwelcome hosts or nets. These will be denied access 
# to everything, even our 'Public' services. Provide your own list.
# 望まぬ客のホストとネットのリスト。これらは全てへのアクセス、
# 我々のパブリックサーヴィスさえも、拒否される
# 自分自身のリストを用意せよ。
#BLACKLIST="11.22.33.44 55.66.77.88"

# A list of "trusted" hosts and/or nets. These will have access to 
# ALL protocols, and ALL open ports. Be selective here.
# 「信用できる」ホストと/またはネットのリスト。これらは全ての
# プロトコルと全ての開いたポートにアクセスできる。
# これは精選して。
#TRUSTED="1.2.3.4/8  5.6.7.8"

## end user configuration options #################################
## エンドユーザ設定オプション
###################################################################

# Any and all addresses from anywhere.
# 任意の場所からの全てのアドレス
ANYWHERE="0/0"

# These modules may need to be loaded:
# これらのモジュールを読み込む必要があるかも。
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

# Start building chains and rules #################################
## チェインと規則の設定の始まり
# Let's start clean and flush all chains to an empty state.
# まず全てのチェインを空の状態に。
$IPTABLES -F
$IPTABLES -X


# Set the default policies of the built-in chains. If no match for any 
# of the rules below, these will be the defaults that IPTABLES uses.
# 組み込みのチェインのデフォルトポリシーを設定。以下のルールのどれにも
# 一致しなければ、これらが IPTABLES の使うデフォルトになる。
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P INPUT DROP 

# Accept localhost/loopback traffic.
# localhost/loopback トラフィックを受け入れる。
$IPTABLES -A INPUT -i lo -j ACCEPT

# Get our dynamic IP now from the Inet interface. WAN_IP will be the
# address we are protecting from outside addresses.
# ここで Inet インターフェースから我々のダイナミック IP を取得。
# WAN_IP は外の世界から我々が守る IP アドレスになる。
[ -z "$WAN_IP" ] &&\
  WAN_IP=`ifconfig $WAN_IFACE |grep inet |cut -d : -f 2 |cut -d \  -f 1`

# Bail out with error message if no IP available! Default policy is 
# already set, so all is not lost here.
# どの IP も可能でないならエラーメッセージとともに抜け出る。
# デフォルトポリシーは既に設定されているので、すべてがここで
# 失われるわけではない。
[ -z "$WAN_IP" ] && echo "$WAN_IFACE not configured, aborting." && exit 1

WAN_MASK=`ifconfig $WAN_IFACE |grep Mask |cut -d : -f 4`
WAN_NET="$WAN_IP/$WAN_MASK"

## Reserved IPs:
# 予約 IP:
# We should never see these private addresses coming in from outside 
# to our external interface.
# 外部から我々の外部インターフェースへ、これらのプライベートアドレスが
# 入ってくることは決してあるべきではない。
$IPTABLES -A INPUT -i $WAN_IFACE -s 10.0.0.0/8      -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 172.16.0.0/12   -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 192.168.0.0/16  -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 127.0.0.0/8     -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 169.254.0.0/16  -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 224.0.0.0/4     -j DROP
$IPTABLES -A INPUT -i $WAN_IFACE -s 240.0.0.0/5     -j DROP
# Bogus routing
# 偽もののルーティング
$IPTABLES -A INPUT -s 255.255.255.255 -d $ANYWHERE -j DROP

# Unclean
$IPTABLES -A INPUT -i $WAN_IFACE -m unclean -m limit \
  	--limit 15/minute -j LOG --log-prefix "Unclean: "
$IPTABLES -A INPUT -i $WAN_IFACE -m unclean -j DROP

## LAN access and masquerading
#LAN アクセスとマスカレーディング
# Allow connections from our own LAN's private IP addresses via the LAN
# interface and set up forwarding for masqueraders if we have a LAN_NET
# defined above.
# LAN インターフェスを通じての、我々自身の LAN のプライベート IP アドレス
# からの接続を許可し、上で LAN_NET が定義されていればマスカレーダーの
# フォワーディングを設定する。
if [ -n "$LAN_NET" ]; then 
 echo 1 > /proc/sys/net/ipv4/ip_forward
 $IPTABLES -A INPUT -i $LAN_IFACE  -j ACCEPT
# $IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_NET -d $LAN_NET  -j ACCEPT  
 $IPTABLES -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IFACE -j MASQUERADE
fi

## Blacklist
# ブラックリスト
# Get the blacklisted hosts/nets out of the way, before we start opening 
# up any services. These will have no access to us at all, and will 
# be logged.
# ブラックリストにのったホスト/ネットを、どのサーヴィスも開かれ
# る前に閉め出す。これらはまったく我々にアクセスを持たず、
# ログをとられる。
for i in $BLACKLIST; do
 $IPTABLES -A INPUT -s $i -m limit --limit 5/minute \
   -j LOG --log-prefix "Blacklisted: "
 $IPTABLES -A INPUT -s $i -j DROP
done

## Trusted hosts/nets
#信用できるホスト/ネット
# This is our trusted host list. These have access to everything.
# 信用するホストのリスト。これらは全てへのアクセス権を持つ。
for i in $TRUSTED; do
 $IPTABLES -A INPUT -s $i -j ACCEPT
done

# Port Forwarding
#ポートフォワーディング
# Which ports get forwarded to which host. This is one to one 
# port mapping (ie 80 -> 80) in this case.
# どのポートがどのホストへフォワードされるか。これはこの場合
# 一対一のマッピング(つまり、80 から 80 へ)。
[ -n "$FORWARD_HOST" ] &&\
 for i in $FORWARD_PORTS; do
   $IPTABLES -A FORWARD -p tcp -s $ANYWHERE -d $FORWARD_HOST \
     --dport $i -j ACCEPT
   $IPTABLES -t nat -A PREROUTING -p tcp -d $WAN_IP --dport $i \
     -j DNAT --to $FORWARD_HOST:$i
 done

## Open, but Restricted Access ports
#開いた、しかし制限されたアクセスのポート/サーヴィス
# Allow DHCP server (their port 67) to client (to our port 68) UDP
# traffic from outside source.
# 外部ソースからクライアントの(我々の68番ポートへの)UDP トラフィック
# へ DHCP サーバ(67番ポート)を許可する。
[ -n "$DHCP_SERVER" ] &&\
 $IPTABLES -A INPUT -p udp -s $DHCP_SERVER --sport 67 \
   -d $ANYWHERE --dport 68 -j ACCEPT 

# Allow 'identd' (to our TCP port 113) from mail server only.
# メイルサーバのみから(我々の TCP 113 番ポートへの)'identd' を許可
[ -n "$MAIL_SERVER" ] &&\
 $IPTABLES -A INPUT -p tcp -s $MAIL_SERVER  -d $WAN_IP --dport 113 -j ACCEPT 

# Open up Public server ports here (available to the world):
# ここで PUBLIC サーバポートを開く(世界へ繋げるため):
for i in $PUBLIC_PORTS; do
 $IPTABLES -A INPUT -p tcp -s $ANYWHERE -d $WAN_IP --dport $i -j ACCEPT 
done

# So I can check my home POP3 mailbox from work. Also, so I can ssh 
# in to home system. Only allow connections from my workplace's
# various IPs. Everything else is blocked.
# これによって仕事場から自宅の POP3 メイルボックスをチェックできる。
# また、自宅システムへ ssh で入ることもできる。仕事場のさまざまな
# IP アドレスからの接続を許可するだけ。他は全てブロックされる。
$IPTABLES -A INPUT -p tcp -s 255.10.9.8/29 -d $WAN_IP --dport 110 -j ACCEPT 

## ICMP (ping)
#
# ICMP rules, allow the bare essential types of ICMP only. Ping
# request is blocked, ie we won't respond to someone else's pings,
# but can still ping out.
# ICMP の規則、ICMP のむき出しの本質的なタイプだけを許可。
# Ping 要求はブロックされる。つまり、他の誰かの ping には答えないが、
# 自分は ping out することができる。
$IPTABLES -A INPUT  -p icmp  --icmp-type echo-reply \
   -s $ANYWHERE -d $WAN_IP -j ACCEPT
$IPTABLES -A INPUT  -p icmp  --icmp-type destination-unreachable \
   -s $ANYWHERE -d $WAN_IP -j ACCEPT
$IPTABLES -A INPUT  -p icmp  --icmp-type time-exceeded \
   -s $ANYWHERE -d $WAN_IP -j ACCEPT

# Identd Reject
# Identd 拒否
#
# Special rule to reject (with rst) any identd/auth/port 113
# connections. This will speed up some services that ask for this,
# but don't require it. Be careful, some servers may require this
# one (IRC for instance).
# 全ての identd/auth/port 113 接続を (rst と)拒否する特別規則。
# これを要求するが必要とはしないサーヴィスをスピードアップする。
# 要注意、これを必要とするサーヴィス(IRC など)もある。
#$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

###################################################################
# Build a custom chain here, and set the default to DROP. All
# other traffic not allowed by the rules above, ultimately will
# wind up here, where it is blocked and logged, unless it passes
# our stateful rules for ESTABLISHED and RELATED connections. Let
# connection tracking do most of the worrying! We add the logging
# ability here with the '-j LOG' target. Outgoing traffic is
# allowed as that is the default policy for the 'output' chain.
# There are no restrictions placed on that in this script.
# ここであつらえのチェインを構築し、DROP へのデフォルトを設定。
# 上の規則で許可されない他のトラフィックは全て、最終的にここで
# 始末をつけ、ESTABLISHED と RELATED 接続についてのステイトフル規則
# をパスしていない限り、ブロックしログをとる。接続追跡機能に心配事の
# ほとんどをやらせましょう!ここでは '-j LOG' ターゲットでログ機能を
# 追加する。外に向かうトラフィックは 'output' チェインについての
# デフォルトポリシーなので許可されている。このスクリプトでは
# 何の制限もおかない。

# New chain...
# 新しいチェイン
$IPTABLES -N DEFAULT
# Use the 'state' module to allow only certain connections based 
# on their 'state'.
# その 'state' に基づいてある種の接続を許可するために
# 'state' モジュールを使う。
$IPTABLES -A DEFAULT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A DEFAULT -m state --state NEW -i ! $WAN_IFACE -j ACCEPT
# Enable logging for anything that gets this far.
# これが成功したものは全てログをとる。
$IPTABLES -A DEFAULT -j LOG -m limit --limit 30/minute --log-prefix "Dropping: "
# Now drop it, if it has gotten here.
# ここでつかまれば、今ドロップ。
$IPTABLES -A DEFAULT -j DROP

# This is the 'bottom line' so to speak. Everything winds up
# here, where we bounce it to our custom built 'DEFAULT' chain
# that we defined just above. This is for both the FORWARD and 
# INPUT chains. 
# これがいわば、「結論」。全てをここで始末をつけ、まさに上で
# 定義したあつらえで作った 'DEFAULT' チェインに押し込める。
# これは FORWARD と INPUT チェインの両方のため。
$IPTABLES -A FORWARD -j DEFAULT
$IPTABLES -A INPUT   -j DEFAULT

echo "Iptables firewall is up `date`."

##-- eof iptables.sh
 
 

8.10.3. まとめ

最重要ポイントを簡単におさらいしてみましょう…

我々はホストに基づいたアクセス制御の規則: "ブラックリストにあがるもの""信用できるもの" の二つについての規則を加えました。 そして様々な種類のサーヴィスとポートに基づいたアクセス規則を 示しました。 たとえば、bigcat の POP3 サーバへのアクセス許可に非常に強い制限をおき、 仕事場からだけ接続できるようにしました。 また、プロバイダの DHCP サーバについても非常に狭い規則だけを許しました。 この規則は、外部の一つの IP アドレスの一つのポートに 我々のポートの一つだけに、UDP プロトコルを通してのみ、 接続を許可するものでした。 これは非常に限定されたルールです! これらのポートやアドレスに対して他のどんな通信も許可する 理由はないのですから、限定されてあるべきなのです。 我々の目標は、 自分たちの特定の状況での必要最小限の通信だけに制限すること であったことを思い出してください。

ですから、上で述べた少数の例外だけをおいて、 それ以外の bigcat 上の全てのサーヴィスについては、 外部からの接続を、実際上、完全にブロックするべきです。 これでも bigcat 上で何の問題もなく動作していますが、 今や、パケットフィルタリングのファイアーウォールの 背後に守られて安全かつ堅牢に動いているのです。 あなた自身の場合も同様に、 このカテゴリーに入るその他のサーヴィスを動かしているかもしれません。

上の例では、小さな自宅内のネットワークも持っていましたが、 これらの通信をブロックするための対策は取りませんでした。 ですから、この LAN 内では bigcat 上で走っている全てのサーヴィスに アクセスできます。 そしてそれはさらに"マスカレード"されていて、 "フォワード"されたチェインを使うことで、 インターネットへのアクセスを持っています(別の HOWTO 参照)。 そして LAN はファイアーウォールの背後にあるのですから、 やはりファイアーウォールによって守られています。 我々は bigcat から出ていく通信については、 なんら制限の規則をおきませんでした。 状況によっては、これはよい考えでしょう。

もちろん、これは単なる仮想的な一例でした。 あなた個人の状況は確実に異なるものでしょうし、 いくらかの変更や、上の規則にいくつか追加することも必要となるでしょう。 たとえば、あなたのプロバイダが DHCP を使っていないならば (多くは使っていません)、上の規則は意味をなしません。 PPP は異なった働きをしますから、 そのような規則は必要ありません。

この例でのようにサーバを走らせることが、 必ず"安全"な方法であるとは思わないで下さい。 (a) 本当に必要でない限り、 (b) 最新の安全なバージョンを走らせていない限り、 そして、 (c) これらのサーヴィスに影響を与えるだろう セキュリティ関連の情報に常に遅れないようにし続けていない限り、 この方法を行うべきではありません。 ここでも警戒と注意が我々の責任に含まれるのです。

8.10.4. iptables mini-me

最小限の状況でいかに簡潔に iptables を 設定するか示すために、以下をあげましょう。 これは Netfilter team の Rusty's Really Quick Guide To Packet Filtering からの引用です。

"ほとんどの人は単にインターネットへの PPP 接続一つを 持っているだけで、誰にも自分のネットワークやファイアーウォールに 入ってきてもらいたくない:"


 ## Insert connection-tracking modules (not needed if built into kernel).
 ## 接続追跡モジュールを挿入(カーネル組み込みなら不要)。 
 insmod ip_conntrack
 insmod ip_conntrack_ftp

 ## Create chain which blocks new connections, except if coming from inside.
 ## 内側から来るもの以外、新しい接続をブロックするチェインを作成。
 iptables -N block
 iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
 iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
 iptables -A block -j DROP

 ## Jump to that chain from INPUT and FORWARD chains.
 ## INPUT と FORWARD チェインからそのチェインへジャンプ。
 iptables -A INPUT -j block
 iptables -A FORWARD -j block

 

この単純なスクリプトは我々が初期化した全ての外向きの接続 つまり、すべての NEW 接続を許可します (ACCEPT のデフォルトのポリシーは変更されていないので)。 そして、これらについて"ESTABLISHED""RELATED" された全ての通信も許可します。 さらに、WAN 側のインターフェース、ppp0, から入ってきたのではない全ての接続も許可されます。 これは lo か、または eth1 のような LAN インターフェースでしょう。 ですから我々がしたいことは何であれ全て可能ですが、 インターネットからの、望まぬ、中に入ってくる接続試行は全て許可しません。 何一つ。

また、このスクリプトはあつらえのチェインの作成例を示してもいます。 ここでは "block" と定義されていて、 INPUT と FORWARD チェインの両方に用いられています。