レンタルサーバ + Webシステム開発 = E-business

■レンタルサーバご利用参考資料
サーバご利用の参考にJF Project によるJF (Japanese FAQ)を掲載しています。

Linux JF(Japanese FAQ)Project.
JF は, Linux に関する解説文書・FAQ などを作成・収集・配布するプロジェクトです.

グリーンネット・トップページへ戻る


一覧に戻る
Security Quick-Start HOWTO for Linux

Hal Burgiss

     hal@foobox.net
    

原啓介 - 日本語訳

kahara@mars.dti.ne.jp

v. 1.2, 2002-07-21

Revision History                                                       
Revision v. 1.2             2002-07-21         Revised by: hb          
A few small additions, and fix the usual broken links.                 
Revision v. 1.1             2002-02-06         Revised by: hb          
A few fixes, some additions and many touch-ups from the original.      
Revision v. 1.0             2001-11-07         Revised by: hb          
Initial Release.                                                       

この文書は Linux を侵入者から守るための基本的なステップを説明するもので
す。特にその最初の手引きになることを目指しています。 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

Table of Contents
1. Introduction
   
    1.1. どうして私が?
    1.2. コピーライト(著作権)
    1.3. 謝辞
    1.4. 免責事項
    1.5. 新しいバージョンと変更ログ
    1.6. フィードバック
   
2. はじめに
   
    2.1. 理想的な設定
    2.2. 始める前に
   
3. ステップ1:本当に必要なのはどのサーヴィスか?
   
    3.1. システム検査
    3.2. 危険地帯(または r00t m3 pl34s3)
    3.3. サーヴィスの停止
    3.4. 例外事項
    3.5. ステップ1のまとめと結論
   
4. ステップ2:アップデート作業
   
    4.1. ステップ2のまとめと結論
   
5. ステップ3:ファイアーウォールとアクセスポリシーの設定
   
    5.1. 戦略
    5.2. パケットフィルター― ipchains と iptables
    5.3. Tcpwrappers (libwrap)
    5.4. PortSentry
    5.5. プロキシ
    5.6. 個別のアプリケーション
    5.7. 検証
    5.8. ログ
    5.9. 始まりの場所
    5.10. ステップ3のまとめと結論
   
6. 不正侵入の発見
   
    6.1. 侵入発見システム(Intrusion Detection System, IDS)
    6.2. もうハックされてる?
    6.3. 信頼を失ったシステムの復旧
   
7. 一般的な Tips
8. 補遺
   
    8.1. サーバ、ポート、パケット
    8.2. ポート
    8.3. Netstat チュートリアル
    8.4. 攻撃と脅威
    8.5. リンク集
    8.6. テキストファイルの編集
    8.7. nmap
    8.8. Sysctl のオプション
    8.9. セキュアな代替物
    8.10. ipchains と iptables 再び
   
9. 日本語版謝辞

1. Introduction

1.1. どうして私が?

この文書を読んだ方が良いのはどんな人でしょうか。そして、ごく普通の
Linux ユーザーも、セキュリティの問題を気にかけておいた方が良いのは何故
でしょうか。まだ Linux 初心者だったり、 Linux システムをインターネット
のような大きなネットワークに繋げる時の基本的なセキュリティの問題に慣れ
ていない人に、この文書を読んでもらいたいと思っています。 "セキュリティ"
の問題はたくさんの側面を持つ幅広い課題であり、他の文書、本やウェッブの
いろいろなサイトにあるものなどでは、はるかに詳細に広くこの問題を扱って
います。一方、この文書は Linux に関係するその最も基本的な概念を手ほどき
するもので、ほんの最初の一歩に過ぎません。 

  Jul 15 04:24:13 から Jul 22 04:06:00間のiptables週間ログ報告
ブロックされた接続試行:

目的ポートに拒否された tcp パケット

port                 count
111                  19
53                   12
21                   9
515                  9
27374                8
443                  6
1080                 2
1138                 1

目的ポートに拒否された udp パケット

port                 count
137                  34
22                   1

    

上の表は現実のもので、ある一週間の我が家のLAN の、まさに今ログにあらわ
れているデータです。上の多くは特に Linux システムをターゲットにしたもの
のようです。標的にされた"目的"ポートの多くはよく知られている Linux や
Unix のサーヴィスで用いられているものだし、あなたのシステムではその全部
がインストールされているかも知れず、それどころかその全部が動いてさえい
るかも知れません。 

ここでの焦点は全ての Linux ユーザー、つまり、デュアルブートのホームユー
ザーにも、大きな商用サイトにも共通の脅威です。そこで、ちょっとの、比較
的素早くできる簡単なステップを踏むことで、 Linux が動いている典型的な自
宅のデスクトップや小さなオフィスのシステムなどを、それなりに安全なもの
にして外部の脅威のほとんどから守りましょう。たとえ、より大きな、または
より複雑な環境の Linux システムに対応することになっても、この文書はなか
なか参考になるでしょうし、その後、さらにそれぞれ固有の状況に応じたもの
を読んで、知識を得ることもできます。実際、この文書は、おそらく全ての人
に役立つだろうと思っています。 

この文書では、読者が Linux, ネットワーク、TCP/IP, そして Linux のような
サーバーオペレーティングシステムを動かすためのより詳細な点については、
ほとんど知らないものと仮定します。また、この文書の目的から、全てのロー
カルユーザーを"信用できる"ユーザーであると仮定し、物理的な、またはロー
カルなネットワークのセキュリティの問題の詳細については全く議論しません
。そのような場合でも、やはり、この文章を続けて読むことを強くお勧めしま
す。 

この探求を導く原則は以下の通りです。

 ・ 魔弾、つまり一発で怪物を倒せる魔法などありません。一つの手段で我々
    を守ることはできません。そんなに単純なことではないのです。
   
 ・ セキュリティとは継続が必要なプロセスであって、達成される目標ではあ
    りません。
   
 ・ 100パーセント安全なプログラム、パッケージ、ディストリビューションと
    いったものはありません。危険の程度の大小があるだけです。
   
そこで取るべきステップは以下のようになります:

 ・ ステップ1:不必要なサーヴィスは全て停止し、場合によってはアンイン
    ストールする。
   
 ・ ステップ2:インストールされているどのサーヴィスについても、最新の
    安全なバージョンにアップデートされパッチをあてられているか確認し、
    ―しかも、それを続けること。どのサーバーアプリケーションも食い物に
    される可能性を持っていて、その幾つかはまだ見つかっていないだけであ
    る。
   
 ・ ステップ3:ファイアーウォールか他の制限ポリシー、またはその両方を
    実装することで、外部からの接続を制限する。目標は個々の状況が何であ
    れ、必要最小限のトラフィックのみを許可することである。
   
 ・ 意識すること。自分のシステムを知り、いかにそれを適切に維持し安全に
    守るかを知ること。新たな弱点は常に見つけられ、悪用されている。今日
    の安全なシステムも明日には、まだ見つかっていない弱点を持っているか
    もしれない。
   
もしこの文書全体を読む時間がないなら、このステップ1、2、3に集中して
ください。この3つがこの問題の本質です。補遺にサポート情報が沢山ありま
す。これらは役に立つかも知れませんが、全ての読者に必要な情報というわけ
ではないかも知れません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.2. コピーライト(著作権)

Security-Quickstart HOWTO for Linux

Copyright 2001 Hal Burgiss.

この文書はフリーです。すなわち、 Free Software Foundation によって出版
された GNU 一般公用許諾書 (GNU General Public License) (バージョン 2
またはそれ以降の任意のバージョンでも)の規定の下で、これを再配布するこ
と、および(または)、改変することが可能です。

この文書は役に立つことを期待して配布されていますが、「何の保証もありま
せん」、つまり、そこから派生する「市場性」または「特定目的適合性」につ
いての保証もありません。詳しくは GNU 一般公用許諾書 (GNU General Public
License) を参照してください。

GNU GPL 文書はhttp://www.gnu.org/copyleft/gpl.htmlで手に入れることがで
きます。 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.3. 謝辞

この文書の作成を助けていただいた以下の方々に感謝します。

 ・ Bill Staehle には、アイデア、編集、励まし、提案など、全ての面で何か
    しら助けてもらった。その多くはこの文書に含まれている。 Bill は大い
    に、この文書の内容について助けになってくれた。
   
 ・ 何かと手助けしてくれたほかの方々: Dave Wreski, Ian Jones, Jacco de
    Leeuw, Indulis Bernsteins に感謝する。
   
 ・ Linux とセキュリティについて学べる偉大な場所、
    comp.os.linux.security への数々の投稿者に感謝する。
   
 ・ iptables と接続追跡、システムを守るために役立つ最先端のツールについ
    ての、 The Netfilter Development チームの仕事に感謝する。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.4. 免責事項

著者はこの文書の内容について何ら責任を負いません。この文書内の概念や実
例、その他の内容については読者自身の責任において使用してください。これ
は新しい文書ですので、間違いや不正確な部分があるかもしれません。ほとん
どないと思いますが、訂正や提案を歓迎します。

この文書は新人ユーザに、自分のシステムをインターネットに接続している時
に、そのシステムを安全に守るための出発点を示そうとしているものです。こ
の文書の内容が必ずしも、究極的に安全で、何の心配もない、計算機環境を作
るものだと主張するつもりは、全くないということを理解してください。セキ
ュリティは複雑な問題です。この文書は経験の浅いユーザが注意すべき最も基
本的な問題の一部を考えるものに過ぎません。

読者にはセキュリティに関するほかの文書や記事を読むことを勧めます。そし
て、発展するにしたがって、セキュリティの最新事情に遅れないようにしてく
ださい。セキュリティは一つの達成目標ではなくて、継続するプロセスなので
す。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.5. 新しいバージョンと変更ログ

現在の公式バージョンはつねに http://www.linuxdoc.org/HOWTO/
Security-Quickstart-HOWTO/ で見つけられます。プレリリースバージョンは 
http://feenix.burgiss.net/ldp/quickstart/ にあります。

PDF, PS, 一つのファイルにまとまった HTML など、他の形式のファイルは、
Linux Documentation Howto のインデックスページ: http://tldp.org/
docs.html#howto で見つけられるかもしれません。

変更ログ

Version 1.2: ファイアーウォールスクリプトの例の説明、「もうハックされて
る?」の章に少し追加。 Zonealarm 型のアプリケーションについての注意。ス
クリプトキディ達による "chattr" の使用についてさらに、そしてこれをどう
チェックするか。その他の小さな追加と説明。

Version 1.1: 様々な訂正、拡充とたくさんのほとんどは小さな追加。たくさん
ありすぎてリストには出来ません。ええ、正しい "Red Hat" のつづりも覚えま
したとも ;-)

Version1.0: これはこの文書の最初のリリースです。コメントを歓迎します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

1.6. フィードバック

この文書についてのどんなコメントでも全て大いに歓迎します。訂正や提案を
投稿する前にバージョンが最新であることを確認してください!これらは
宛にメイルで送れます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

2. はじめに

各論に入る前に、そもそもなぜ、セキュリティに注意を払う必要があるのか、
という問題に簡単に答えてみましょう。

商用サイトやオンライン銀行、または扱いに注意を要する文書を持つような政
府機関がセキュリティに関心を持つ理由は容易に理解できます。しかし、ごく
普通のユーザーについてはどうでしょう?どうして自宅のデスクトップで
Linux を使っているユーザーが、セキュリティについて心配すべきなのでしょ
うか?

インターネットに接続している誰もが標的なのです。これは平明、かつ単純な
ことです。時間を限ったダイアルアップ接続をしているのか、常時接続をして
いるのかは、後者はより大きな標的になるとは言うものの、些細な違いに過ぎ
ません。同様に、より大きなサイトはより大きな標的になりますが、だからと
言って小規模ユーザー達が例外になるわけではありません。なぜなら、"小規模
ユーザー"は技術がより低いかも知れず、その分、簡単な獲物になりやすいかも
知れないのです。

まさにその簡単な獲物を探しているような輩が常にあちこちにいるのです。も
しあなたが望まない接続試行の記録を始めたならば、このことにすぐ気付くこ
とでしょう。疑いもなく、これらの試行の多くは悪意の動機を持ち、アタッカ
ー(攻撃者)たちは、時には、クラックの目標として Linux box を探している
のです。地球の反対側にいる誰かが、私のプリンターを本当に借りたがってい
ると思いますか?

では、彼らは何を求めているのでしょうか?しばしば、彼らは単にあなたのコ
ンピューター、IPアドレス、または帯域が欲しいだけかも知れません。その場
合には、彼らは他の目標を攻撃するために、または、ひょっとしたら、犯罪を
犯すためか盗みをするためにあなたを利用し、その背後に自分の正体を隠すの
です。これは全く非常にありふれたシナリオです。注目されやすい商用サイト
はもっと直接的に標的とされ、より大きな問題を抱えていますが、我々は皆、
この種の共通の脅威に向かい合っているのです。

リーズナブルな二、三の準備をしておけば、 Linux は非常に安全になり得ます
し、全て使用可能なツールを用いて、すばらしく楽しくパワフルなインターネ
ット接続も、サーバーになることも、可能です。ほとんどの侵入の成功は無知
と不注意の結果なのです。

結論は―

 ・ 自分自身のシステムをコントロールしたいですか、したくないですか?
   
 ・ 知らないうちに犯罪行為の片棒を担ぎたいですか?
   
 ・ 他の誰かに利用されたいですか?
   
 ・ インターネット接続を失うリスクにさらされたいですか?
   
 ・ システムを復旧するためのうんざりするような作業に時間を費やすはめに
    なりたいですか?
   
 ・ システム上のデータを失う危険を冒したいですか?
   
これらは全て現実的な可能性です。あなたが適切な準備を取らない限り。

┌──────────────────────────────────┐
│                              Warning                               │
├──────────────────────────────────┤
│もしあなたが既に侵入されてしまっているか、または、そう疑っていること│
│が理由でこの文書を読んでいるのならば、頼りにする情報を得るためのシス│
│テムユーティリティは全て信用することができません。そして、以下の章に│
│書かれている提案は、システムを復旧するための助けにはならないでしょう│
│。まっすぐにもうハックされている?の章に飛んで、まずそこを読んでくだ│
│さい。                                                              │
└──────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

2.1. 理想的な設定

理想的には、ファイヤーウォールとルーターとして一台専用のコンピュータが
あるのが望ましいでしょう。これはベアボーン、つまり、必要なサーヴィスと
コンポーネントだけのインストールで、サーバ類は一切動かさないものです。
システムの残りの部分はこの専用ルーター/ファイアーウォールシステムを経由
して接続します。もし公けに接続可能なサーバ(ウェブ、メイルなど)が欲し
い場合には、これらは "DMZ" (De-militarized Zone 非武装地帯)の中におく
べきしょう。このルーター/ファイアーウォールは、外部から DMZ で動いてい
るどのサーヴィスへの接続要求についても、これらの要求を"フォーワード"す
ることよって接続を許可しますが、他の内部ネットワークの残り(LAN と呼ばれ
ている)とは切り離されています。これによって、それ以外の内部ネットワーク
を孤立させ、比較的安全にしておくことができます。これで、 "危険地帯"は
DMZ に制限されます。

しかし、誰もがこの種のルータ/ファイアーウォール専用にするためのハードウ
ェアを持っているわけではありません。これには最低でも二台のコンピュータ
が必要でしょう。もし公けに利用可能なサーバを何か動かしたいなら(いきな
り最初からは良い考えとは言えませんが)、三台になります。または、まった
くの Linux 初心者だと、どうしたらよいのかまだ十分に分かっていないかも知
れません。そこで、もしこの理想的な設定が出来ないなら、次善の策をとるこ
とになります。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

2.2. 始める前に

実際の設定の章に入る前に、二つの注意点を。

まず第一に、Linux の興味深い側面の一つとして Caldera, Red Hat, SuSE,
Debian と言ったディストリビューションの差異があります。これらは全て
"Linux" であり、共通の特徴を持っていますが、デフォルトでインストールさ
れるかも知れないユーティリティ群にはいくらかの差が確かに存在します。同
様に、ほとんどの Linux のディストリビューションはそのシステムの自前の設
定ツールを持っているでしょう。そして Linux においては、「猫の皮を剥ぐに
は常に一つより沢山の方法がある」のです。しかし、我々の議論の目的におい
ては、出来る限り一般的なツール群で説明するべきでしょう。残念ながら、GUI
ツールはこの種の文書で使うことはできません。我々はほとんどの場合におい
て、テキストベースのコマンドラインツールを使うことになるでしょう。もし
、ディストリビューションのユーティリティに親しんでいる方なら、適切な場
所でそれらにおきかえても構いません。しかし、そうでないなら、上のような
ツール群や適切な代用物を学ぶべきでしょう。

続くいくつかの章は、読めばそこで勧めている手続きを実際に実行できるよう
に書かれています。この文書は、タイトルにあるように "Quick Start" なんで
すから!

準備のために、以下の設定で必要になるものを挙げます:

 ・ テキストエディタ。色々なものが使えます。もしあなたがファイルマネー
    ジャーアプリケーションを使うなら、組み込みのエディタが含まれている
    でしょう。これも結構です。 pico と mcedit の二つは、あなたが既にお
    気に入りのエディタを持っていないなら、なかなか使いやすいエディタで
    す。補遺にテキストエディタへの手っ取り早い解説がありますので、あな
    たが仕事に取りかかる上で助けになるかもしれません。システムの設定フ
    ァイルを編集する前には、常にバックアップコピーを取っておくようにす
    ると良いでしょう。
   
 ・ 非 GUI エディタやコマンドを使うには、ターミナルウィンドウを開く必要
    があります。 xterm, rxvt, gnome-terminal などは全て使えますし、その
    他のものでもかまいません。
   
 ・ 各ブートで動いているサーヴィスを停止するための、各ディストリビュー
    ションでの方法を良く知るべきですし、またそれらがどうやってパッケー
    ジ(rpm, deb など)をインストールし、そしてアンインストールするのか
    も知らなくてはいけません。そして自分のシステムのリリースのアップデ
    ート版をどこで見つけることができるかも。この情報はそのリリース文書
    の中か、またはベンダのウェブサイトで見つけられます。
   
この文書では例として、仮に "bigcat" というホストネームを持つシステムを
用いて説明することにします。 Bigcat は最新かつ最高の Linux ディストリビ
ューションが走っている、真新しくインストールしたばかりのデスクトップマ
シンです。 Bigcat は常時、直接にインターネット接続しています。あなたの
インストールがそんなに"真新しく"なくても、ここで思いとどまらないで下さ
い。遅くとも、せぬには勝る、です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3. ステップ1:本当に必要なのはどのサーヴィスか?

この章では、新しくインストールした我々のシステムで、どのサーヴィスが動
いているかを見て、どれが本当に必要なものかを決め、それ以外のものを切り
捨てましょう。どのようにサーバと TCP 接続が働いているかに詳しくない方は
、まず補遺のサーバとポートについての章を読むと良いでしょう。また 
netstat ユーティリティに馴染みがないなら、あらかじめその簡単な概説を読
むと良いでしょう。さらに補遺にはポートについての章と、それに対応するサ
ーヴィスの章がありますので、参考になるかもしれません。

ここでの目的は可能な限り多くのサーヴィスを停止することです。もし、その
全部を停止できるなら、または少なくとも外部に接続しているものを止められ
るなら、大変に結構なことです。以下に手引きにする簡単なルールを挙げまし
ょう:

 ・ 外部からアクセス可能であるようなサーヴィスが一つも走っていなくても
    、十分完全なインターネット接続を持つことは完璧に可能です。可能であ
    るだけでなく、多くの場合それが望ましくもあります。ここでの原則は、
    そもそも開いていないポートを通って首尾よく侵入することは決して出来
    ないということです。なぜなら、開いていなければ、どのサーバもそこで
    listen して(耳をすませて)いないからです。サーバなし、開いているポ
    ートなし、弱点もなし、です。すくなくとも外部からの接続に関してはそ
    うです。
   
 ・ もしあなたがあるサーヴィスを認識していないとすると、本当にはそれを
    必要としていない可能性はかなりあります。そう仮定して、それを停止し
    てしまうことにしましょう。これは危険に聞こえるかもしれませんが、頼
    るに足るなかなか良いルールです。
   
 ・ いくつかのサーヴィスはそもそも、インターネット上を走らせるように設
    計されていません。もしあなたがそれを本当に必要なものだと決定したと
    しても。これらについては危険だと旗を立てておいて、後の章で取り組む
    ことにしますので、それらが本当に必要なサーヴィスで、他に良い代替策
    がない場合には、そちらを見てください。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.1. システム検査

それで、結局このシステムでは実際に何が走っているのでしょうか?動いてい
るに"違いない"ものや、または、"そう思っている"ものが実際に動いているか
どうか、何もかも当然のことだと思うのはやめましょう。

残念ながら、標準の Linux インストールといったものは存在しません。可能な
サーヴィスには幅広いバラエティがあり、各ディストリビューションにはそれ
ぞれのインストールオプションが伴っていて、前もってそのリストを準備する
ことは不可能です。最善のことは、動いている全てのサーヴィスを数え上げる
方法を示し、正しい普遍的な方向へ導くことです。

さあ、xterm を開いて、 su でルートになりましょう。行が折り返されないよ
うにウィンドウを広げる必要があるでしょう。コマンド、netstat -tap |grep
LISTEN を使ってください。これによって、LISTEN というキーワードが示され
ている全ての現在動作中のサーバが、各サーヴィスをスタートさせた "PID" と
"プログラム名" とともに、リストアップされます:

┌─────────────────────────────────────────┐
│# netstat -tap |grep LISTEN                                                       │
│  *:exec               *:*        LISTEN    988/inetd                             │
│  *:login              *:*        LISTEN    988/inetd                             │
│  *:shell              *:*        LISTEN    988/inetd                             │
│  *:printer            *:*        LISTEN    988/inetd                             │
│  *: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                              │
│  *:auth               *:*        LISTEN    388/in.identd                         │
│  *:telnet             *:*        LISTEN    988/inetd                             │
│  *:finger             *:*        LISTEN    988/inetd                             │
│  *:sunrpc             *:*        LISTEN    1290/portmap                          │
│  *:ftp                *:*        LISTEN    988/inetd                             │
│  *:smtp               *:*        LISTEN    1738/sendmail: accepting connections  │
│  *:1694               *:*        LISTEN    1319/rpc.mountd                       │
│  *:netbios-ssn        *:*        LISTEN    422/smbd                              │
│                                                                                  │
│                                                                                  │
└─────────────────────────────────────────┘

上では、はじめの三つのコラムは見やすいように省いてあることに注意してく
ださい。もしあなたが得たリストが上の例と同じくらい長いものなら、これか
ら少なからぬ仕事が待ち構えていますよ!これに近い数のサーバが実際に動い
ている必要があることは、まったくありそうにないことですから。

上の例はたくさんのシステム設定のほんの一つの例に過ぎない、ということに
注意してください。あなたの場合にはずいぶんと違ったものであるかも知れま
せん。

このどれも何のことやら分らない?補遺のnetstat のチュートリアルを読んで
、その働きを理解してくれていることと思いますが、上に挙げた例で各サーバ
が何なのか、何をするものかを、正確に理解することは、この文書の範囲に含
まれません。もし、そのサーヴィスが実際に重要なものならば、個々のシステ
ムについての文書(例えば、インストールガイドや、 man ページなど)を調べ
なければならないでしょう。例えば、"exec", "login", "shell" は重要そうに
見えますか?もちろんそうです。しかし、これらは実際はその見かけ通りのも
のではありません。実のところ、それらは rexec, rlogin, rsh といった"r"
コマンド、つまりリモート用のコマンドです。これらは古臭くて、不必要で、
実際のところ、インターネットにさらしていると非常に危険です。

何が必要で何が必要でないか、そして何を捨てて何をこの bigcat においてお
くかについて簡単な仮説を二、三、用意しておきましょう。 bigcat はデスク
トップで走らせていますから、もちろん X11 は残す必要があります。もし
bigcat が何かのサーバ専門に使われていたなら、 X11 は不要だったでしょう
。もし物理的につながったプリンタがあるなら、プリンタ (lp) デーモンは残
すべきです。そうでないなら要りません。プリントサーバは無害そうに見えま
すが、ポートを開いたままに出来るので、やはり潜在的なターゲットになりま
す。もし他のホストから bigcat の中にログインする予定があるなら、 sshd
(セキュアシェルデーモン)が必要でしょう。我々の LAN に Microsoft のホ
ストがあるならば、 Samba が欲しいかもしれません。でしたら、smbd は残さ
なくてはいけませんが、そうでなければ全く不必要です。この例ではその他の
ものは全部、(選択するのは自由ですが、)通常の機能のシステムなら不必要
で、おそらく切り捨てるべきでしょう。あなたが認識していないものがある?
あやふやなものがある?それは切りましょう!

結論:bigcat はプリンタがつながっているデスクトップマシンですから、
"x11" と "printer" が必要になるでしょう。 bigcat は MS ホストとともに
LAN 上にあって、ファイルを共有したり、それらから印刷したりしますから、
"netbios-ssn" (smbd) が必要です。また他のマシンからログインできるように
、 "ssh" も必要です。この特定の場合においては、その他のものは全て不必要
です。

これが心配ですか?そうなら、自分が行った変更を書き留めておくか、または
、コマンド: netstat -tap |grep LISTEN > ~/services.lstを使って、 
netstat から得たサーバのリストを保存しておくのがよいでしょう。このコマ
ンドで将来に参照するためのリストが "services.lst" の名前でホームディレ
クトリに保存されます。

ここで残すことに決めたものも、そもそも安全なものだとは言えません。単に
、これらが必要であろう、というだけです。ですから、ファイアーウォールや
(以下にあるような)他の方法を通して、これらを扱わなければいけません。

上の例の中の telnet と ftp デーモンはサーバであり、 "リスナー"(ポート
で耳をすませているもの)だということは、注意しておく価値があるでしょう
。これらはあなたのマシンに入ってくる接続を受け付けます。あなたが単に 
ftp または telnet クライアントを使うためには、これらは必要ないし、望ん
でもいないことです。例えば、あなたは単に ftp クライアントを用いて、 FTP
サイトからファイルをダウンロードすることができます。あなたの側で ftp サ
ーバを走らせる必要はまったくありませんし、深刻なセキュリティ上の問題を
持つことになります。

個々の事情によっては、上で得た結論に例外を設けた方が良いこともあるでし
ょう。後の章を参照してください。 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.2. 危険地帯(または r00t m3 pl34s3)

以下はインターネット上で走らせるべきでないサーヴィスのリストです。これ
らは動かないようにしておくか(以下を見てください)、アンインストールし
てください。または、もし本当にこれらのサーヴィスをローカルで走らせたい
なら、それらが最新のパッチを当てたバージョンであり、かつ、効果的にファ
イアーウォールで守られていることを確認してください。そして、今のところ
ファイアーウォールを持っていないというなら、ファイアーウォールが立ち上
がって適切に動いていることが検証されるまで、それらのサーヴィスを止めて
おいてください。これらはその性質からして潜在的に危険であり、クラッカー
の一番の標的になります。

 ・ NFS (Network File System ネットワークファイルシステム)と、 nfsd,
    lockd, mountd, statd, portmapper などの、その関連サーヴィス。 NFS
    はネットワークを経由してファイルシステムを共有する標準の Unix サー
    ヴィスです。LAN で用いるには素晴らしいシステムですが、インターネッ
    ト上では危険です。そして、スタンドアローンのシステムではまったく不
    要なものです。
   
 ・ rpc.* サーヴィス、リモートプロシージャ Call.*, など。典型的なのは
    NFS と NIS に関係したもの(上を参照)です。
   
 ・ プリンタサーヴィス(lpd)
   
 ・ いわゆる r* サーヴィス("remote" つまり、Remote SHell の r ):
    rsh, rlogin, rexec, rcp など。不必要で、安全でなく、潜在的に危険で
    、もしこれらの機能が必要なときにはより良いユーティリティがあります
    。 ssh はこれらのコマンドに出来ることは何でも出来るでしょうし、しか
    もはるかに健全な方法でできます。興味があるならそれぞれの man ページ
    を見てください。これらは多分、 "r" 抜きで netstat 出力に示されてい
    るでしょう:例えば、rlogin は単に "login" など。
   
 ・ telnet サーバ。もはやこれを用いる理由はありません。代わりに sshd を
    使ってください。
   
 ・ ftp サーバ。ほとんどのシステムには、 scp や、http 経由などの(以下
    を参照のこと)、ファイルを交換するためのより良い、もっと安全な方法
    があります。 ftp は専用の ftp サーバを走らせていて、ちゃんとその面
    倒を見る時間とスキルのある人にとってだけ適切なプロトコルです。そう
    でなければ、潜在的に大きなトラブルの原因になります。
   
 ・ BIND (named), DNS パッケージ。いくらか手をかければ、これは大きなリ
    スクなしに使えますが、多くの場合には必要のないものですし、それをど
    う使うにせよ特別な扱いが要求されます。例外の章と、個別のアプリケー
    ションの特別な扱い方を参照してください。
   
 ・ メイル配送エージェント、つまり "MTA" (sendmail, exim, postfix,
    qmail)。一台のコンピュータ上のインストールではほとんどの場合、これ
    らが本当に必要になることはないでしょう。あなたが、インターネットホ
    ストから(指定された MX box として)直接にメイルを受け取るのではな
    く、プロバイダの POP サーバを使うのなら必要ありません。 LAN 上の他
    のホストから直接メイルを受け取っているのならば、必要かもしれません
    が、最初はこれを動かさない方が安全です。後に、ファイアーウォールと
    アクセスポリシーが設定されてから、ローカルインターフェース上で動か
    すことができますから。
   
以上は必ずしも完全なリストではありません。ただ、デフォルトの Linux イン
ストールでは時々、最初から動いているサーヴィスとして良く見られるものだ
ということです。そして逆に言えば、このリストに出ていない他のサーヴィス
がもとより安全なものだということでもありません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.3. サーヴィスの停止

次のステップは我々の「殺しのリスト」に挙がっている各サーバがどこで開始
されたのかを調べることです。これが netstat の出力から明らかでないならば
、最後のコラムの "Program name" か "PID" の情報から、ps, find, grep, 
locate などのコマンドを使ってさらなる情報を得てください。この例が補遺の
netstat チュートリアルのプロセスの所有者の章に挙げられています。もしサ
ーヴィス名かポート番号が馴染みのないものなら、そのシステムの /etc/
services ファイルに簡単な解説があります。

今、我々は自分のシステムを壊しつつあって、覆水盆に返らずなどということ
にならないか、と心配しているのではないですか?もしそうなら、こうしてみ
てください:つまり、"危険地帯"で上のリストに挙がった全てを停止し、そし
てしばらくの間システムを走らせてみます。大丈夫ですか?上で不必要だと判
断したものたちの一つを止めてみましょう。それでしばらくシステムを走らせ
てみます。この手続きを最小の状態になるまで繰り返します。これがうまくい
けば、この変更を採用してそのまま保ちましょう。(以下を参照してください
。)

究極の目的は今そのサーヴィスを停止することではなくて、それが恒常的に停
止されていることをはっきりさせることです!ですから、あなたがここでどの
ようなステップをとったにせよ、次にリブートした後には必ず確認してくださ
い。

システムのサーヴィスは様々の場所で色々な方法で開始されます。その最も普
通の方法を見てみましょう。あなたのシステムもおそらくそのように動いてい
るだろうと思います。ほとんどのディストリビューションにおいて、システム
のサーヴィスは典型的には "init" スクリプト、または inetd (またはその代
替物である xinetd)のどちらかによって開始されます。(init スクリプトの
置かれている場所はディストリビューションによって、様々かもしれません。
)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.3.1. init サーヴィスを停止する

init サーヴィスは典型的には、ブートプロセス、またはランレベルの切り替え
時に自動的に開始されます。どのサーヴィスをどのランレベルで開始し、停止
するかを決定するためには、シンボリックリンクを使う方法があります。スク
リプト自身は /etc/init.d/ の中(または、 /etc/rc.d/init.d/ の中かもしれ
ません)に置かれているはずです。この init の方式は Red Hat, SuSE,
Mandrake, Debian, COnectiva などほとんどの Linux で用いられています。
Slackware は注意すべき例外の一つです!(最近のバージョンではこのオプシ
ョンを持っていますが。)典型的には Slackware ではシステムサーヴィスは一
つのファイル /etc/rc.d/rc.inet2 で全て設定されます。

以下のようにすれば、このスクリプトのリストを得ることができます。

┌──────────────────────────────────┐
│  # ls -l /etc/init.d/ | less                                       │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

または各ディストリビューションで用意されている、このためのツールを使っ
てください。

(非常に一般的な SysV init スタイルのシステムでは)走っているサーヴィス
を今、止めるには、 root になって以下のようにします:

┌──────────────────────────────────┐
│ # /etc/init.d/<$SERVICE_NAME> stop                                 │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

ここで "$SERVICE_NAME" はその init スクリプトの名前で、常にではありませ
んが、しばしばそのサーヴィスの名前そのものと同じです。これはほとんどの
ディストリビューション上で使える手です。古い Red Hat バージョンでは代わ
りに /etc/rc.d/init.d/ がパスになっているかもしれません。

これはこの特定のサーヴィスを今、停止することができるだけで、追加的なス
テップをとらなければ、次のリブート時、またはランレベル変更時には再スタ
ートしてしまいます。ですから、init 型のサーヴィスについては、この作業は
実際二段階のプロセスということになります。

各ディストリビューションでは、様々なランレベルでどのサーヴィスを開始さ
せるかを制御するためのユーティリティが使えるようになっているでしょう。
Debian に基づいたシステムではこのための update-rc.d がありますし、 Red
Hat に基づいたシステムでは chkconfig があります。これらのツールに慣れ親
しんでいるなら、今それを使って、次のリブートの後に再チェックしてくださ
い。これらのツールに慣れていないのでしたら、 man ページを見て今、勉強し
ましょう!これは知っていなくてはならないものです。 Debian では次のよう
にします(以下で、$SERVICE_NAME は init スクリプトの名前です):

┌──────────────────────────────────┐
│                                                                    │
│  # update-rc.d -f $SERVICE_NAME remove                             │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

Red Hat では:

┌──────────────────────────────────┐
│                                                                    │
│ # chkconfig $SERVICE_NAME off                                      │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

もしあるサーヴィスが必要でないことがわかっているなら、また一つの手段は
そのパッケージをアンインストールしてしまうことです。これはなかなか良い
、間違いのない方法で、恒常的に停止できます。またこの方法は、インストー
ルされているすべてのパッケージをアップデートして最新のものに保ち続ける
(ステップ2)、という潜在的な問題を解決してくれてもいます。 RPM や DEB
といったパッケージ管理システムを使えば、気が変わったときにパッケージを
再インストールするのもとても簡単です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.3.2. inetd

inetd はサブデーモンを生むために使われるので、 "スーパーデーモン" と呼
ばれます。 inetd 自身は一般に init スクリプト経由で開始され、設定ファイ
ル /etc/inetd.conf で可能になっているサーヴィスによって決まる様々なポー
トに "耳をすませる"ことになります。ここで挙げられているどのサーヴィスも
inetd に制御されます。同様に、"プログラム名"の後の最後のコラムに
"inetd" と書かれている netstat 出力の中の listen している(つまり、耳を
すませている)サーバは皆、 inetd によって開始されることになります。これ
らのサーヴィスを停止するためには、 inetd の設定を調整する必要があるでし
ょう。 xinetd は inetd のの拡張された代替物ですが、設定方法は異なります
(以下の次の章を見てください)。

以下は典型的な inetd.conf からの抜粋です。行の最初に "#" がついているサ
ーヴィスは "コメントアウト"されていて、 inetd には無視されるので、結果
として無効にされます。

┌─────────────────────────────────────┐
│#                                                                         │
│# inetd.conf  This file describes the services that will be available     │
│#    through the INETD TCP/IP super server.  To re-configure              │
│#    the running INETD process, edit this file, then send the             │
│#    INETD process a SIGHUP signal.                                       │
│#                                                                         │
│# Version:  @(#)/etc/inetd.conf  3.10  05/27/93                           │
│#                                                                         │
│# Authors:  Original taken from BSD UNIX 4.3/TAHOE.                       │
│#    Fred N. van Kempen,                      │
│#                                                                         │
│# Modified for Debian Linux by Ian A. Murdock  │
│#                                                                         │
│# Echo, discard, daytime, and chargen are used primarily for testing.     │
│#                                                                         │
│# To re-read this file after changes, just do a 'killall -HUP inetd'      │
│#                                                                         │
│#echo  stream  tcp  nowait  root  internal                                │
│#echo  dgram  udp   wait    root  internal                                │
│#discard  stream  tcp  nowait  root  internal                             │
│#discard  dgram  udp   wait    root  internal                             │
│#daytime  stream tcp   nowait  root  internal                             │
│#daytime  dgram  udp   wait    root  internal                             │
│#chargen  stream tcp   nowait  root  internal                             │
│#chargen  dgram  udp   wait    root  internal                             │
│time  stream    tcp   nowait  root  internal                              │
│#                                                                         │
│# These are standard services.                                            │
│#                                                                         │
│#ftp     stream  tcp   nowait  root  /usr/sbin/tcpd  in.ftpd -l -a        │
│#telnet  stream  tcp   nowait  root  /usr/sbin/tcpd  in.telnetd           │
│#                                                                         │
│# Shell, login, exec, comsat and talk are BSD protocols.                  │
│#                                                                         │
│#shell  stream  tcp  nowait  root  /usr/sbin/tcpd  in.rshd                │
│#login  stream  tcp  nowait  root  /usr/sbin/tcpd  in.rlogind             │
│#exec   stream  tcp  nowait  root  /usr/sbin/tcpd  in.rexecd              │
│#comsat dgram   udp  wait    root  /usr/sbin/tcpd  in.comsat              │
│#talk   dgram   udp  wait    root  /usr/sbin/tcpd  in.talkd               │
│#ntalk  dgram   udp  wait    root  /usr/sbin/tcpd  in.ntalkd              │
│#dtalk  stream  tcp  wait    nobody /usr/sbin/tcpd in.dtalkd              │
│#                                                                         │
│# Pop and imap mail services et al                                        │
│#                                                                         │
│#pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop2d           │
│pop-3    stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d           │
│#imap    stream  tcp     nowait  root    /usr/sbin/tcpd  imapd            │
│#                                                                         │
│# The Internet UUCP service.                                              │
│#                                                                         │
│#uucp  stream tcp nowait uucp /usr/sbin/tcpd  /usr/lib/uucp/uucico -l     │
│#                                                                         │
│                                                                          │
│                                                                    │
│                                                                          │
│                                                                          │
└─────────────────────────────────────┘

上の例では二つのサーヴィス、 time と pop3 が可能になっています。これら
を無効にするには、テキストエディタでこのファイルを開いて、この二つのサ
ーヴィスを "#" でコメントアウトし、ファイルを保存して、(ルートとして)
inetd を再スタートするだけです:

┌──────────────────────────────────┐
│  # /etc/init.d/inetd restart                                       │
│                                                                    │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

エラーがないかログを調べて、 netstat を再び走らせ、全てがうまく行ってい
るか確かめてください。

同じ情報を手っ取り早く得るには、以下のように grep を使います。

┌──────────────────────────────────┐
│ $ grep  -v '^#' /etc/inetd.conf                                    │
│ time     stream  tcp     nowait  root  internal                    │
│ pop-3    stream  tcp     nowait  root  /usr/sbin/tcpd  ipop3d      │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

またしても、それが何だか知らないものが出てきましたか?でしたら、十中八
九あなたはそれを使っていないので、無効化すべきです。

init サーヴィスの設定とは違って、これは後まで続く変更なので、必要なのは
このステップ一回だけです。

あちこちに広がっている一つの神話を暴露しましょう: /etc/services ファイ
ルから項目をコメントアウトしたり削除したりすることで、サーヴィスを無効
化すべきではありません。これはある場合には、望んだ効果が得られるかもし
れませんが、正しい方法ではなく、他のシステムユーティリティの通常の操作
を邪魔することになるかもしれません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.3.3. xinetd

xinetd は拡張された機能を持つ inetd の代替物です。これは本質的に inetd
と同じ目的を果たしますが、設定が異なります。設定は /etc/xinetd.conf フ
ァイルか、 /etc/xinetd.d/ ディレクトリの個別のファイルで行うことができ
ます。 xinetd サーヴィスの停止は、対応する設定箇所かファイルを削除する
ことで可能です。または、テキストエディタを用いて、単に適当なサーヴィス
について disable = yes と設定することでも可能です。このとき、xinetd は
再スタートする必要があります。構文と設定オプションについては man xinetd
と man xinetd.conf を見てください。以下はxinetd の設定例です:

┌─────────────────────────────────────┐
│ # default: on                                                            │
│ # description: The wu-ftpd FTP server serves FTP connections. It uses \  │
│ #       normal, unencrypted usernames and passwords for authentication.  │
│ service ftp                                                              │
│ {                                                                        │
│        disable                 = no                                      │
│        socket_type             = stream                                  │
│        wait                    = no                                      │
│        user                    = root                                    │
│        server                  = /usr/sbin/in.ftpd                       │
│        server_args             = -l -a                                   │
│        log_on_success          += DURATION USERID                        │
│        log_on_failure          += USERID                                 │
│        nice                    = 10                                      │
│ }                                                                        │
│                                                                          │
│                                                                          │
└─────────────────────────────────────┘

以下のように、動作しているサーヴィスのリストを簡単に得ることができます
。

┌──────────────────────────────────┐
│ $ grep disable /etc/xinetd.d/* |grep no                            │
│ /etc/xinetd.d/finger:   disable = no                               │
│ /etc/xinetd.d/rexec:    disable = no                               │
│ /etc/xinetd.d/rlogin:   disable = no                               │
│ /etc/xinetd.d/rsh:      disable = no                               │
│ /etc/xinetd.d/telnet:   disable = no                               │
│ /etc/xinetd.d/wu-ftpd:  disable = no                               │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

ここで、上の出力にはいくつか赤信号が点いています。圧倒的多数のシステム
では、上のどれも悪影響なしに停止できます。確かかって?そのサーヴィスを
停止して試してみてください。不必要なサーヴィスを無効化して、xinetd を再
スタートさせてください。

┌──────────────────────────────────┐
│  # /etc/init.d/xinetd restart                                      │
│                                                                    │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.3.4. 全部失敗したときには

もしあなたがサーヴィスを停止する"正しい" 方法を見つけられないとしても、
または、開始されているあるサーヴィスがどうやってどこで開始されたのかわ
からないとしても、大丈夫。そのプロセスを"殺す"ことができます。これを行
うには、PID(プロセスI.D.)を知る必要があります。これは ps, top, fuser
といったコマンド、または他のシステムユーティリティを使って見つけること
ができます。 top と ps については、最初のコラムに出ている数字がこれです
。例については、補遺のポートとプロセスオーナーを見てください。

例(ルート権限で):

┌──────────────────────────────────┐
│ # kill 1163                                                        │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

そして、そのプロセスが消えていることを確認するために、もう一度 top か 
ps を走らせてください。

┌──────────────────────────────────┐
│ # kill -KILL 1163                                                  │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

この二番目に出ている "KILL" に注意してください。この命令は、そのプロセ
スを所有しているユーザか、またはルートのどちらかによって、実行されなけ
ればなりません。さて、このプロセスがどこからどうやって開始されたか調べ
にいきましょう ;-)

/proc ファイルシステムは各プロセスについてのさらなる情報を見つけ出すた
めに用いることもできます。 PID を使って、謎のプロセスへのパスを見つける
ことができます。

┌──────────────────────────────────┐
│ $ /bin/ps ax|grep tcpgate                                          │
│  921 ?   S    0:00        tcpgate                                  │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

┌─────────────────────────────────────────┐
│ # ls -l /proc/921/exe                                                            │
│ lrwxrwxrwx 1 root  root  0 July 21 12:11 /proc/921/exe -> /usr/local/bin/tcpgate │
│                                                                                  │
│                                                                                  │
└─────────────────────────────────────────┘

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.4. 例外事項

上では、全ての不必要なサーヴィスを停止する基準を用いましたが、時にそれ
はそんなに明白なことではありません。そして、時折、ある人の設定で要求さ
れていることは、他の人にとってのものと異なるかも知れません。このような
カテゴリーに入る二、三の一般的なサーヴィスを見てみましょう。

再び、我々の目安となるのは、必要としていないものはそもそも走らせない、
という単純なルールです。もしそれらのどれも必要としていないなら、ファイ
ヤーウォールのルールや他の仕組み(以下を見てください)によるこの種の制
限ポリシーを運営するにあたって、一番に停止するべき候補です。

 ・ identd - これはかなり年季の入ったプロトコルで、しばしばデフォルトで
    インストールされ走っています。これはサーバにつながっている者につい
    ての最小限の情報を得るためのものです。しかし、これは多くの場合、必
    要ではありません。では、どこで必要になるでしょうか?ほとんどの IRC
    サーバはこれを必要とします。多くのメイルサーバもこれを使っています
    が、実際は必要ありません。それ抜きでのメイル設定を試してみてくださ
    い。もし、identd が問題になるなら、その理由はサーバがメイルを送った
    り受け取ったりする前にタイムアウトすることでしょう。ですから、メイ
    ルはそれ抜きでもちゃんと動くはずですが、動作は遅くなるかもしれませ
    ん。二、三の ftp サーバはそれを必要とします。しかし、ほとんどのもの
    では要りません。
   
    もし、identd が必要ならば、以下のように、報せる情報を大いに減らして
    くれる設定オプションがあります:
   
    ┌────────────────────────────┐
    │                                                        │
    │    /usr/sbin/in.identd in.identd -l -e -o -n -N        │
    │                                                        │
    │                                                        │
    └────────────────────────────┘
   
    -o フラッグは identd に、その上で走っているOS のタイプを示さず、そ
    のかわりに常に "OTHER" を返すよう伝えます。 -e フラッグは identd に
    、 "NO-USER" や "INVALID-PORT" エラーの代わりに常に "UNKNOWN-ERROR"
    を返すよう伝えます。もしあなたがユーザ名を秘密にしておきたいなら、
    -n フラッグは identd に、ユーザ名の代わりに常にユーザ番号を返すよう
    に伝えます。 -N フラッグは identd に、デーモンがユーザ名を返そうと
    しているそのユーザのホームディレクトリにある .noident をチェックさ
    せます。そのファイルが存在すれば、デーモンは普通に "USERID" の代わ
    りに "HIDDEN-USER" エラーを返します。
   
 ・ メイルサーバ(sendmail, qmail などのようなMTA)−しばしば sendmail
    のような完全な機能を持つメイルサーバがデフォルトでインストールされ
    ています。これが実際に必要になるのは、ドメインのホストをしていて、
    直接に入ってくるメイルを受け取るときだけです。あるいは、LAN 上でメ
    イルを交換するときですが、この場合にはインターネットにさらす必要は
    ありませんし、安全にファイアーウォールで守ることができます。プロバ
    イダへの POP メイルアクセスのためには、よく行われている設定ではあり
    ますが、メイルサーバを必要としません。この代わりの手段の一つは、ロ
    ーカルな配送エージェントを -m オプションで指定して fetchmail に POP
    メイルを取りに行かせることです:例えば、fetchmail -m procmail は
    sendmail デーモンが全く走っていなくてもちゃんと働きます。 sendmail
    は走らせておくと便利なものではありますが、ここでのポイントは、それ
    は多くの場合は必要ではなく、停止させるか、またはファイアーウォール
    で安全に守ることが出来る、ということなのです。
   
 ・ BIND (named) −これはしばしばデフォルトでインストールされていますが
    、実際に必要になるのは、あるドメインの、オーソライズされたネームサ
    ーバを運用するときだけです。もしあなたがこれが何を意味しているのか
    よくわからないなら、これは絶対に不要です。おそらく、BIND はインター
    ネット上で一番狙われているターゲットでしょう。 BIND は、 "キャッシ
    ング" オンリーモードでしばしば用いられていて、これは大変便利ですが
    、インターネットに完全にさらす必要はありません。つまり、それは適用
    を制限するか、ファイアーウォールで守るべきです。以下の個別のアプリ
    ケーションの特別な運用法の箇所を参照してください。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

3.5. ステップ1のまとめと結論

この章では、システム上でどんなサーヴィスが走っているかを同定する方法を
学び、どれが必要なサーヴィスかを決めるためのポイントをいくつか紹介しま
した。さらに、そのサーヴィスがどこで開始されたのかを見つけ、それらを停
止する方法を学びました。もしこれがよく分っていないようなら、今が上を読
み返す良いチャンスです。

望むらくは、あなたは上で示したステップを既にとってくれていることでしょ
う。その結果を netstat で再度テストして、望みの結果が達成されていること
、そして、本当に必要なサーヴィスだけが走っていることを確認してください
。

次回のリブート時、パッケージを更新した時(新しい設定がそっと忍び込んで
いないことを確認するためです)、そしてシステムがアップグレードされた時
や新たにインストールされた時は常に、このようなチェックをすることをお勧
めします。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4. ステップ2:アップデート作業

確かに、この章は上の章に比べて、短く、単純で、直接的なものではあります
すが、上の章と同じくらい重要です。

新たなインストールの後にまず最初にすべきことは、ディストリビューション
のアップデート情報とセキュリティの注意をチェックして、すべてのパッチを
あてることです。たった一年古いだけじゃないか、ですって?それは実際長い
期間だし、安全のためには充分新しいとは言えません。たった数ヶ月、または
たった数週間ですって?とにかくチェックしてください。一日か二日?それで
も後悔するよりはいいでしょう。セキュリティ関係のアップデートが、開発の
プレリリースフェイズとリリースサイクルの間にリリースされていることは、
非常にありうることです。もしこの作業ができないというなら、できるまで公
けにアクセス可能な公開サーヴィスは全て停止してください。

Linux のディストリビューションは静的なものではありません。必要に応じて
、新しい、パッチをあてられたパッケージにアップデートされています。アッ
プデート作業はオリジナルのインストールと全く同じ程度に重要です。いいえ
、それらはフィックス(修復)である分、より重要でさえあります。時に、こ
れらのアップデートはバグ・フィックスですが、もっとしばしば起こるのは、
新たにセキュリティホールが見つかったための、セキュリティ・フィックスで
ある場合です。このような"穴(セキュリティホール)" はクラッカーのコミュ
ニティにただちに知られます。そして彼らはすばやくそれらを大きく広げ利用
してしまうはずです。一旦、セキュリティホールが知られたら、それを通して
侵入することは極めて簡単なことで、それを探す者が沢山現れるでしょう。そ
して Linux 開発者たちは同じくらい素早くフィックスします。時には、セキュ
リティホールが知られたまさにその日に!

インストールされた全てのパッケージを最新のものに保つことは、安全なシス
テムを維持する上で最も重要なステップの一つです。使用しているものだけで
はなく、インストールされた全てのパッケージを最新に保つべきであることは
、いくら強調しても十分ではありません。もしこれが面倒ならば、使わないパ
ッケージを全てアンインストールすることを考えてください。実際、どうあれ
、これは良い考えです。

しかし、この最新情報をどこで手に入れられるのでしょう。最新のセキュリテ
ィニュースを掲示しているウェブサイトはたくさんあります。また、このトピ
ックを扱っているメイリングリストもたくさんあります。実際、たいていの場
合、システムの各ベンダ自身が、弱点とそのフィックス法を発表するためのリ
ストを公開しているでしょう。これはリリースを最新のものに保ち続ける素晴
らしい方法で、強くお勧めします。 http://linuxsecurity.com は Linux 限定
の情報についての良いサイトです。また週間のニュースレターも以下で手に入
ります: http://www.linuxsecurity.com/general/newsletter.html.

また、多くのディストリビューションでは、 ftp 経由で自動的にインストール
したパッケージを更新してくれるユーティリティを用意しています。これは通
常業務として cron ジョブで走らせることも可能で、もしインターネットアク
セスが可能なら最も楽なやり方でしょう。

これは一度きりで終わるプロセスではありません -- ずっと続けていくもので
す。最新に保つことが大事なのです。ですからセキュリティ報告に常に注目し
ていてください。そして各ベンダのセキュリティメイリングリストを今日から
購読してください!もしあなたがモデム、DSL や、その他の常時接続の手段を
持っているなら、これを熱心に行わないことに弁解はありえません。どのディ
ストリビューションでもこれは充分に簡単なんですから!

最後の注意:新しいパッケージをインストールした時には常に、新しい設定、
または改定された設定も同時にインストールされた可能性があります。つまり
、このパッケージがある種のサーバであれば、アップデートの結果として動き
出してしまっているかもしれないということです。これは酷い作法ですが、実
際ありえます。ですから、アップデートかシステム変更の後にはいつでも、確
実にnetstat か同等のものを走らせて、システムが望むようになっていること
を確認しましょう。実際、このような変更がなくても、定期的に確認してくだ
さい。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

4.1. ステップ2のまとめと結論

これは単純なことです:あなたの Linux システムが最新のものであることを確
認してください。アップデートされたパッケージが入手可能か、各ベンダのペ
ージをチェックしましょう。古いリリース版を走らせておくこと自体には何の
不都合もありませんが、そのパッケージは初期リリース以降に各ベンダが提供
したものに従ってアップデートされていなければなりません。少なくとも各ベ
ンダがサポートを続けている限り、そのリリースとアップデートは提供され続
けています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5. ステップ3:ファイアーウォールとアクセスポリシーの設定

さて、"ファイアーウォール"とは何でしょう?これは漠然とした用語で、我々
と外の世界との間の保護バリアーとして働くものなら何でも意味しています。
これは専用のシステムを指す時もあるでしょうし、これを機能として果たす特
定のアプリケーションのことかもしれません。または、様々なハードウェアと
ソフトウェアを含む要素の組み合わせということもあるでしょう。ファイアー
ウォールは与えられたシステムへの情報の出入りについて、何を許可するかを
定義する"ルール"から成っています。では、Linux で簡単に使えるその構成要
素をいくつかを見てみましょう。そして、どのようにして適正に安全なファイ
アーウォール戦略を実現するかを見てみましょう。

上のステップ1では、必要でないサーヴィスを全て停止しました。上の例では
、走らせておく必要があるものはわずかでした。この章では、次のステップに
進み、どれを表の世界に開いておくか、何らかの方法で制限することができる
のはどれかを決定します。もし全てをブロックできれば大変結構なことですが
、これは多くの場合、現実的ではありません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.1. 戦略

ここでの目的は、固有の状況が何であれ、そのために必要最小限だけを許可す
るように、接続と通信を制限することです。ある場合には、外から入ってくる
全ての"新たな"接続試行をブロックしたいということもありえます。例えば、X
を走らせたいが、誰も外からはそれにアクセスしようとは思っていないならば
、外部からの接続を完全にブロックすることになるでしょう。他の状況では、
外から入ってくる接続を信用できる出所のものだけに制限したいかもしれませ
ん。制限が強いほど、より良いと言えます。例えば、外から我々のシステムに 
ssh で入りたいのですが、実際のところ我々は自分たちの仕事場からしかこの
接続をしないとします。それなら、sshd 接続を仕事場のアドレスの範囲からの
ものに制限しておくことになるでしょう。このための方法は色々ありますが、
一番普通のやり方を見てみましょう。

また、我々は、ファイアーウォールを一つのアプリケーションに限定しようと
は思っていません。 "層になった"、つまり、深さに応じた多重の防御のアプロ
ーチをとるのに悪いことは何もありません。前線の防御はパケットフィルタリ
ング、 ipchains か iptables (以下を参照してください)のどちらかになる
でしょう。さらに、ファイアーウォールを補強するための、追加的なツールや
メカニズムを利用することができます。

いくつか簡単な例を紹介しましょう。単純な方針として、デフォルトのポリシ
ーは全てを拒否し、必要なものだけを開くことにします。この問題は込み入っ
た複雑なものになりえますから、可能な限り単純に保ち、最も基本的なコンセ
プトのいくつかに集中することを心がけましょう。このトピックについてのよ
り進んだ内容については、リンクの章を参照してください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.2. パケットフィルター― ipchains と iptables

(ipchains のような) "パケットフィルタ"は個々のパケットを見て、その内
容に基づいて判断をすることができ、様々な目的に使うことができます。一つ
のよくある目的はファイアーウォールの設置です。

Linux で普通のパケットフィルタは ipchains で、これは 2.2 カーネルで標準
になっています。 iptables もそうですが、これはより最近の 2.4 カーネルで
使えるようになっています。 iptables はさらに進んだパケットフィルタの能
力を持ち、 2.4 カーネルを走らせているなら誰にでもお勧めです。しかし、ど
ちらも今の目的には充分に効果的です。 ipfwadm は 2.0 カーネルのための同
様のユーティリティですが、ここでは議論しません。

もし自分の ipchains または iptables ファイアーウォールの規則の設定が少
し厄介に思えるようでしたら、この過程を自動化できるさまざまなサイトがあ
ります。リンクの章を参照してください。また、そこで挙げられている例を出
発点として用いることができるかもしれません。また、ディストリビューショ
ンによっては、ファイアーウォールのスクリプトを生成してくれるようなユー
ティリティが含まれているかもしれません。これはまずまずの働きをしてくれ
ますが、このようなツールは非常に単純な二、三の規則を設定する以上のこと
は滅多にしてくれませんので、適切な文法と様々なメカニズムがどのように働
くかを知ることをお勧めします。

    Note: 以下に様々な例が挙げられています。これらはここで議論したいく
    つかの概念を示すための実例として挙げたものです。これはあなた自身の
    スクリプトを書くための出発点としても役立つことと思いますが、全ての
    場合を含んでいるわけではないことに注意してください。そのスクリプト
    がどのように働くかを自分自身で理解するように強く勧めたいと思います
    。これによって、自分自身の状況にぴったりとあうスクリプトを作れるよ
    うになるでしょう。
   
    例に挙げたスクリプトは単に一つのインターフェース(インターネットに
    接続されたもの)への内側への接続を防御するだけのものです。これは多
    くの自宅ユーザの状況には充分なものかも知れませんが、逆に言えば、こ
    れは全ての状況に妥当なわけではありません。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.2.1. ipchains

ipchains は 2.2 または 2.4 カーネルで用いることができます。ipchains が
働いている時は、このシステムを通って行く全てのパケットがチェックされま
す。パケットはそれらがどこを出発して、どこに行くかによって、異なる"チェ
イン(鎖)"を通って移動します。 "チェイン"を規則の集まりと考えてくださ
い。より進んだ設定においては、我々は自分自身用にあつらえたチェインを定
義することになるでしょう。デフォルトで組み込み済みの三つのチェインは、
入ってくるトラフィック input, 出て行くトラフィック output, そしてあるイ
ンターフェースから別のどこかへフォワードされる(典型的には"マスカレーデ
ィング"に用いられます)トラフィック forward です。チェインはシステムに
出入りする通信の流れの制御をするために、様々な方法で操作することができ
ます。規則は望みの結果を達成するために自分の判断で付け加えることもでき
ます。

全ての"チェイン"の終端は"ターゲット"です。ターゲットはコマンドに -j オ
プションをつけて特定します。ターゲットはパケットの運命を決めるもので、
その特定のチェインを本質的に終わらせるものです。最も普通に見られるター
ゲットは、以下のようにほとんどその名前から意味がわかります: ACCEPT,
DENY, REJECT, そして MASQ です。 MASQ は"IPマスカレーディング"のための
ものです。 DENY と REJECT はそのやり方は違いますが、本質的には同じこと
をします。では、このどちらがいいでしょうか?これには山ほど議論があると
ころなのですが、この文書の範囲を超える他のファクターに依存します。我々
の目的にはどちらでも充分でしょう。

ipchains は非常に柔軟な設定ができます。ポート(またはポートレンジ)、イ
ンターフェース、行き先のアドレス、出発アドレスを他の様々なオプション同
様に特定することができます。これらは man ページで充分詳しく説明されてい
ますので、ここでは詳細に立ち入らないことにしましょう。

インターネットから我々のシステムに入ってくる通信は、 input のチェインを
通して入ってきます。これこそ我々が出来る限り制限する必要があるものです
。

以下は仮想的なシステムのための短いスクリプトの例です。このスクリプトが
何をするかはコメント文で説明されています。 "#" で始まっている行は全てコ
メント文です。 ipchains の規則は一般にシェルスクリプトに取り込まれ、フ
ァイアーウォールのロジックの設定を助けるためにシェル変数を用います。

#!/bin/sh                                                                       
#                                                                               
# ipchains.sh                                                                   
#                                                                               
# An example of a simple ipchains configuration.                                
# 単純な ipchains 設定例                                                        
#                                                                               
# This script allows ALL outbound traffic, and denies                           
# ALL inbound connection attempts from the outside.                             
# このスクリプトは全ての外へのトラフィックを許可し、                            
# 全ての中への接続試行を拒否します。                                            
#                                                                               
###################################################################             
# Begin variable declarations and user configuration options ######             
# 変数の宣言とユーザ設定オプションの始まり                                      
#                                                                               
IPCHAINS=/sbin/ipchains                                                         
# 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"                                                                
                                                                                
## 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"                                                                  
                                                                                
# 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 アドレスになる。                     
# ここでこれをおいておくと、もしインターフェースがまだ用意されてなくても、      
# デフォルトのポリシーがセットされる。                                          
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       
                                                                                
# 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.            
# 非-SYN TCP を受け入れ、LOCAL_PORTS への UDP 接続を受け入れる。                
# これらは高い番号で、割り当てのないポート(デフォルトでは1024から4999)。       
# これは我々が外部のソースへ通信を始める時の接続の、                            
# 返答の接続通信を許可する。                                                    
# TCP 接続は '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        
                                                                                
## 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 を出すことはできる。                                                     
$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                                                            
                                                                                
                                                                                

上のスクリプトを使うには、実行可能ファイルになっていなければなりません
(つまり、chmod +x ipchains.sh で、実行可能にします)。そして、root 権
限で走らせてチェインをつくり、ファイアーウォールをつくるわけです。

この例で行ったことをまとめると、まず始めに頭の部分でいくつかのシェル変
数を設定します。これはこのスクリプトの後の部分で用いられます。そして、
全ての内向きの通信とフォワードの通信を拒否し、外向きの通信は全て許可す
るというデフォルトのルール(ipchain はこれらを "policies(ポリシー)"
と呼びます)を設定します。 bigcat が外部のアドレスへの通信の初期化を行
う接続の返答を受け取るために、高い番号を持つ、割り当てされていないポー
トにいくつか穴を開けなければなりません。例えば、もし誰かのウェブサーバ
に接続するならば、 HTML データにはこちらに戻って来てもらいたいわけです
。同じことが他のネットワーク通信にもあてはまります。さらに ICMP プロト
コルの二、三の特定のタイプを許可します(ほとんどは依然ブロックされてい
ますが)。また設定したルールを破るような、つまり何をしているのか分らな
いような内向きの通信は、すべてログを取ります。ここでは IP アドレスを用
いているだけであって、どんな種類のホスト名も使っていないことに注意して
ください。これは、このファイアーウォールが、 DNS の失敗があるような場合
でさえ、 DNS スプーフィングの類のごまかしを避けて、正しく動作するように
です。

文法の完全な説明については ipchains の man ページを参照してください。こ
こで用いた重要なものは以下のものです:

    -A input: "input" チェインに規則を追加する。デフォルトのチェインは 
    input, output, forward.                                            
   
    -p udp: このルールは "UDP" "プロトコル" だけに適用。 -p オプション 
    は tcp, udp または icmp プロトコルに用いることが出来る。           
   
    -i $WAN_IFACE: このルールは特定のインターフェースのみに適用され、参
    照された(input, output または output)チェイン全てに適用される。  
   
    -s  [port]: このルールは出発点のアドレスが指定されてい 
    るときにのみ適用される。オプションとしてすぐ後にポート番号(例えば 
    22番)、またはポート番号の範囲、例えば 1023:4999 を持つことが出来る
    。                                                                 
   
    -d  [port]: このルールは到着点のアドレスが指定されてい 
    るときにのみ適用される。また、ポート番号またはポート番号の範囲を含 
    めることが可能。                                                   
   
    -l : このオプションのルールにヒットする任意のパケットのログを取る(
    小文字の"L")。                                                    
   
    -j ACCEPT: "ACCEPT" "ターゲット" にジャンプする。これは効果的にこの
    チェインを終了させ、この特定のパケットの最終的な運命、この例では   
    "ACCEPT" すること、を決定する。同じことが DENY のような他の -j ター
    ゲットについても言える。                                           
   
概して、コマンドラインオプションが置かれる順序は重要ではありませんが、
チェインの名前(例えば、 input)は一番最初にこなくてはなりません。

ステップ1で我々が netstat を走らせた時に、他のものの中に X とプリント
サーバがあったことを思い出してください。我々は、制限された方法を用いて
でさえ、これらをインターネットにさらしたくありません。これらは未だ何の
問題もなく bigcat 上で走っていますが、いまや ipchains に基づいたファイ
アーウォールの背後に守られて、安全かつ正常に働いているのです。あなたの
システムには、同じくこのカテゴリーに入る他のサーヴィスもあるかもしれま
せんね。

上の例は極度に単純化されたオール・オア・ナッシングの方針でした。つまり
、自分自身の外向きの通信は全て許可し(これは必ずしも良いアイデアではあ
りませんが)、外側から入ってくる全ての接続試行をブロックしました。これ
は一つのインターフェースを守っているだけで、実際にはさらにそのインター
フェースの内側を守っているだけです。しかし、あなたが自分のシステム用に
うまく働かせるには、もう少し詳細なチューニングが必要となることもあるで
しょう。さらに進んだ規則を知るには、補遺を参照してください。さらに 
http://tldp.org/HOWTO/IPCHAINS-HOWTO.html (JF日本語版:http://
www.linux.or.jp/JF/JFdocs/IPCHAINS-HOWTO.html)を読むと良いでしょう。

ファイアーウォールに変更を加えた時はいつでも、その整合性を確認するべき
です。設定したルールが意図したように動いていることを確認するための一つ
の方法は、 ipchains がどのようにスクリプトを解釈しているかを見ることで
す。これには xterm をぐんと大きく開いて、以下のコマンドをたたいてくださ
い:

┌──────────────────────────────────┐
│ # ipchains -L -n -v | less                                         │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

この出力はチェインによってグループ分けされています。さらに、あなたは自
分自身をスキャンする方法も知らねばなりません。(以下の検証の章を参照し
てください)。そして自分のログから目を離さず、目指しているものがブロッ
クされていることを確認してください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.2.2. iptables

iptables は Linux 用の次世代型のパケットフィルターで、2.4 カーネルを必
要とします。これは ipchains にできることなら何でもできますが、注意する
価値のある拡張機能をたくさん持っています。文法は多くの面で ipchains に
似ています。詳しくは man ページを参照してください。

最も記す価値がある拡張機能は"コネクション・トラッキング" (接続追跡)で
しょう。これは"ステイトフル・インスペクション" (ステイトフルな検査)と
いう名前でも知られています。これは iptables に各パケットの状態のさらに
豊富な知識を与えるものです。そのパケットが TCP パケットと UDP パケット
のどちらであるかや、 SYN か ACK フラッグのどちらがセットされているかだ
けではなく、それが存在している接続の一部であるかどうかや、存在している
接続と何か関係しているかどうかまで知ることができます。ファイアーウォー
ルの設定との関係は明白でしょう。

結論として、厳しいファイアーウォールを設定するには、 ipchains を用いる
より、 iptables の方が簡単です。ですから、これがお勧めの方法です。

以下は上に挙げたものと同じスクリプトを iptables 用に書き換えたものです
:

#!/bin/sh                                                                       
#                                                                               
# iptables.sh                                                                   
#                                                                               
# An example of a simple iptables configuration.                                
# iptables 設定のシンプルな例                                                   
#                                                                               
# This script allows ALL outbound traffic, and denies                           
# ALL inbound connection attempts from the Internet interface only.             
# このスクリプトは全ての外向きの通信を許可し、                                  
# 全ての内側への接続試行を拒否します。                                          
###################################################################             
# Begin variable declarations and user configuration options ######             
# 変数宣言とユーザ設定オプションの開始。                                        
#                                                                               
IPTABLES=/sbin/iptables                                                         
# Local Interfaces                                                              
# ローカルインターフェース                                                      
# This is the WAN interface that is our link to the outside world.              
# これは外の世界へ我々をつなげている WAN インターフェース。                     
# For pppd and pppoe users.                                                     
# ppd と pppoe ユーザのため。                                                   
# WAN_IFACE="ppp0"                                                              
WAN_IFACE="eth0"                                                                
#                                                                               
                                                                                
## end user configuration options #################################             
## エンドユーザ設定オプション                                                   
###################################################################             
                                                                                
# Any and all addresses from anywhere.                                          
# 任意の場所からの任意の全てのアドレス                                          
ANYWHERE="0/0"                                                                  
                                                                                
# This module may need to be loaded:                                            
# このモジュールはロードする必要があるかも知れない                              
modprobe ip_conntrack_ftp                                                       
                                                                                
# Start building chains and rules #################################             
# チェインと規則の作成の開始                                                    
# Let's start clean and flush all chains to an empty state.                     
# 全てのチェインを空の状態に初期化                                              
$IPTABLES -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 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                                              
                                                                                
## 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 を出すことは可能。                                         
$IPTABLES -A INPUT  -p icmp  --icmp-type echo-reply \                           
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT                                         
$IPTABLES -A INPUT  -p icmp  --icmp-type destination-unreachable \              
   -s $ANYWHERE -i $WAN_IFACE -j ACCEPT                                         
$IPTABLES -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 '-j               
# LOG'. Outgoing traffic is allowed as the default policy for the               
# 'output' chain. There are no restrictions on that.                            
# なんでも箱をおき(デフォルトルールは DENY)、全てのログをとる。               
# 上のルールで許可されない他の全ての通信は、ここで引き上げ、                    
# ブロックされてログが取られる。とにかく、これはこのチェインの                  
# デフォルトのポリシーなので、ここで'-l' オプションでログ能力を付け加えるだけ。 
# 外へ出て行く通信は 'output' チェインのデフォルトポリシーとして許可する。      
# これについては何の制限もおかない。                                            
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT               
$IPTABLES -A INPUT -m state --state NEW -i ! $WAN_IFACE -j ACCEPT               
$IPTABLES -A INPUT -j LOG -m limit --limit 30/minute --log-prefix "Dropping: "  
                                                                                
echo "Iptables firewall is up `date`."                                          
                                                                                
##-- eof iptables.sh                                                            
                                                                                
                                                                                

同じスクリプトのロジックをここで用いているので、これは、前の ipchains
スクリプトとほぼ同じことを行います。文法的にはわずかに差がありますが。
チェインの名前の変化がある場合に気をつけてください(例えば、INPUT と
input など)。ログを取ることについても扱いが異なります。今度は自分自身
の"ターゲット"を持ち (-j LOG)、さらに柔軟になっています。

同様にきわめて根本的な違いもいくつかありますが、それはそんなに明らかな
ものではないかもしれません。この章でのipchains スクリプトの以下の部分を
思い出してください:

# 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       
                                                                               
                                                                               

我々は内側に入ってくる望まぬ接続を出来る限り制限するために、 ipchains
によって、ここで輪くぐりの曲芸をしました。実際、少々不調和です。

以上の部分はiptables 版のスクリプトからは抜けています。この場合はコネク
ション・トラッキング(接続追跡)がこれをうまく扱ってくれるため不要で、
結局なくても同じなのです。これは iptables の"ステイトフルネス" のおかげ
です。それは各パケットについて、 ipchains よりも多くのことを知っている
のです。例えば、これはパケットが"新しい"接続の一部なのか、既に"確立した
"接続か、また"関連した"接続の一部なのかを知っているのです。これがいわゆ
る、コネクション・トラッキングにおける "ステイトフル・インスペクション"
です。

iptables には、ここでは触れなかった機能がまだまだたくさんあります。ネッ
トフィルタープロジェクトと iptables についてのさらなる読み物としては、
http://netfilter.samba.org を参照してください。また、より進んだルールの
設定については、補遺を参照してください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.3. Tcpwrappers (libwrap)

tcpwrappers は上の ipchains や iptables とほぼ同じ望みの結果をもたらし
てくれますが、その働く仕組みは全く違います。実際、tcpwrappers は接続試
行に割り込んで、その設定ファイルを調べ、要求を受け入れるか拒否するかを
決定するのです。 tcpwrappers は、 iptables と ipchains のようにソケット
のレベルで制御するのではなく、アプリケーションのレベルでアクセスを制御
します。これは非常に効果的ですので、多くの Linux システムで標準のコンポ
ーネントになっています。

tcpwrappers は設定ファイルの /etc/hosts.allow と /etc/hosts.deny からな
り、その機能自体は libwrap ライブラリで提供されます。

tcpwrappers はまず、 /etc/hosts.allow ファイルでアクセスが許可されてい
るかどうかを調べて、許可されていればそのアクセスを認めます。もし /etc/
hosts.allow ファイルになければ、 /etc/hosts.deny ファイルでアクセスが許
可されていないかどうかを調べて、もし許可されていないなら、そのアクセス
を拒否します。それ以外の場合は、アクセスを許可します。この仕組みからし
て、/etc/hosts.deny ファイルには ALL: ALL という一行のみを書くべきです
。これによって、アクセスは /etc/hosts.allow ファイルにエントリーされて
いるものだけが許可されるはずで、ここには特定のサーヴィスを、これにアク
セスすることが許される特定のホストのアドレスとともに書きます。ここでホ
スト名を用いることもできますが、ホスト名を使用すると、名前のなりすまし
というわずかな危険性が残ります。

tcpwrappers は普通、 inetd (または xinetd) を経由して開始されるサーヴィ
スを守るために使われます。しかし、 libwrap をサポートするようにコンパイ
ルされたプログラムも、同じく tcpwrappers に守ってもらうことができます。
ただ全てのプログラムがlibwrap サポートのもとビルドされていると仮定して
はいけません。実際、そうでないからです。事実、ほとんどのものはそうでは
ないでしょう。ですから、我々はここでは、 inetd 経由で開始されたサーヴィ
スを守るという例にだけ用いることにしましょう。そして、非(x)inetd サーヴ
ィスを守ることについては、我々のパケットフィルタリングのファイアーウォ
ールか、または他の仕組みに頼ることにしましょう。

以下は典型的な inetd.conf ファイルから一部抜き出したものです:

┌──────────────────────────────────┐
│ # Pop and imap mail services et al                                 │
│ #                                                                  │
│ #pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd ipop2d     │
│ #pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd ipop3d     │
│ #imap    stream  tcp     nowait  root    /usr/sbin/tcpd imapd      │
│ #                                                                  │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

最後から二番目のコラムが tcpwrappers デーモン、つまり/usr/sbin/tcpd で
す。デーモンのすぐ後ろにあるのが、防御されているもので、この場合には、
POP と IMAP メイルサーバです。ディストリビューションによっては、既にこ
の部分が最初から用意されているかもしれません。 libwrap ライブラリによっ
て、 tcpwrapper で組み込みサポートされている二、三のアプリケーションに
ついては、上のようにデーモンを指定する必要はありません。

ここでもまた同じ原則を使います:つまり、デフォルトのポリシーとして、全
てを拒否し、必要最小限の通信だけを許可するために穴を開けます。

さて、ここでテキストエディタの出番です。 su で root になり、 /etc/
hosts.deny ファイルを開きましょう。もしそのファイルが存在しないようなら
、作ってください。これはただのプレーンなテキストファイルです。そこに以
下のように書きます:

┌──────────────────────────────────┐
│ ALL: ALL                                                           │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

もしそれが既にあれば、結構。もしなければ、これを書き込んで、保存し、フ
ァイルを閉じてください。簡単ですね。 "ALL" は tcpwrapper が理解してくれ
るキーワードの一つです。そのフォーマットは $SERVICE_NAME : $WHO の形で
すので、ここで全てのサーヴィスへの全ての接続を拒否していることになりま
す。少なくとも、 tcpwrappers を使っている全てのサーヴィスについてはそう
です。これが主に inetd サーヴィスであることを思い出してください。これら
のファイルの文法についての詳細は man 5 hosts_access を参照してください
。ここの "5" に注意してください!

さて今度は、出来る限り制限した、必要なサーヴィスだけを開きましょう。以
下は簡単な一つの例です:

┌──────────────────────────────────┐
│ ALL: 127.0.0.1                                                     │
│ sshd,ipop3d: 192.168.1.                                            │
│ sshd: .myworkplace.com, hostess.mymomshouse.com                    │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

最初の行は全ての "localhost" 接続を許可しています。これは必要でしょう。
次の行は、我々の仮想的な自宅内 LANのプライベートアドレスの範囲である
192.168.1. から始まるIP アドレスからの sshd と ipop3d サーヴィスへの接
続を許可します。後に "." が続いていることに注意してください。これは重要
です。三行目は .myworkplace.com と続く任意のホストから、我々の sshd デ
ーモンへの接続だけを許可します。今度は、前に "." が来ていることに注意し
てください。それから、一つのホストである hostess.mymomshouse.com も許可
しています。結果、localhost と我々の全ての LAN 接続は、 bigcat 上の全て
の tcpwrapper で守られたサーヴィスへの接続が許可されています。しかし、
外部から bigcat 上の sshd を使うことができるのは、我々の仕事場のアドレ
スからとお母さんの家からだけです。他の全ては /etc/hosts.deny ファイルの
デフォルトポリシーによって拒否されます。

上の .myworkplace.com や 192.168.1. のようなワイルドカードのタイプは
ipchains や iptables や、この問題についての他の Linux アプリケーション
ではサポートされていません。また、 tcpwrappers は IP アドレスのかわりに
ホスト名を使うことができ、これはある場合にはとても便利です。これは
ipchains と iptables では使えません。

自分で作った tcpwrappers 設定は、同梱の tcpdchk ユーティリティでチェッ
クすることができます(man ページを見てください)。今度は、これは xinetd
と一緒には働かないこと、この場合には含まれもしないかもしれないことに注
意してください。

tcpwrappers と ipchains のようなパケットフィルタリングのファイアーウォ
ールの両方を使うことには何も問題はありません。実際、このような "多層化
された"アプローチを用いることをお勧めします。これはうっかり設定ミスをし
たときの防御にもなります。この場合、それぞれの接続が、まずパケットフィ
ルタによってチェックされ、次に tcpwrapper でチェックされます。

忘れずにシステム設定ファイルを編集する前にそのコピーをバックアップし、
デーモンを再スタートさせて、エラーメッセージのログをチェックしてくださ
い。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.3.1. xinetd

既に述べたように、 xinetd  は拡張された inetd で
す。これはほぼ同じ機能を果たしますが、いくつかの注目すべき拡張を持って
います。一つは tcpwrappers のサポートが可能になり、 tcpd へのあらわな参
照が不要であることです。これは /etc/hosts.allow と /etc/hosts.deny が自
動的に有効になることを意味します。でも、必ずしもそうとは限りませんので
、少しテストをして、ログを眺めてみて、 tcpwrappers サポートが自動的かど
うかチェックしてください。

xinetd の他の拡張機能には、耳をすませる IP アドレスを指定すること(これ
はアクセス制御の非常に有効な方法です)、内側への接続の割合と同時接続の
総数を制限すること、一日の特定の時間にサーヴィスを制限することなどがあ
ります。 xinetd と xinetd.conf についての、より詳しい情報については man
ページを参照してください。

しかし文法はまったく異なります。以下は /etc/xinetd.d/tftp からの一例で
す:

┌──────────────────────────────────┐
│ service tftp                                                       │
│ {                                                                  │
│        socket_type     = dgram                                     │
│        bind            = 192.168.1.1                               │
│        instances       = 2                                         │
│        protocol        = udp                                       │
│        wait            = yes                                       │
│        user            = nobody                                    │
│        only_from       = 192.168.1.0                               │
│        server          = /usr/sbin/in.tftpd                        │
│        server_args     = /tftpboot                                 │
│        disable         = no                                        │
│ }                                                                  │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

bind の記述に注意してください。ここではプライベートの LAN インターフェ
ースに耳をすませているだけ、または、 "binding" している(結び付けられて
いる)だけです。外側のポートは開いてさえいないので、外側への接続は全く
なされません。そして 192.168.1.0 と LAN からの接続だけを許可します。
xinetd の目的のためには、これは "192.168.1" から始まる全ての IP アドレ
スを示しています。文法が inetd と異なることに注意してください。この場合
の server 項目の記述は tftp デーモン、in.tftpd です。またここでも、
libwrap/tcpwrappers サポートが xinetd に組み込みコンパイルされているこ
とを仮定しています。デーモンを走らせている user 項目は "nobody" になり
ます。そうです、 "nobody" と呼ばれるユーザアカウントがあるのです。。こ
れは可能ならば、この種のデーモンを非ルートユーザとして走らせる賢い方法
です。最後に、 disable の項目はサーヴィスをオン、またはオフにする
xinetd の方法で、この場合には "on" になっています。これはここでの一例と
してオンになっているだけです。安全でないなら、 tftp を公けのサーバとし
て走らせては「いけません」。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.4. PortSentry

portsentry  はこれまで
議論した他のツールとはまったく異なる働きをします。 portsentry はその名
の通りのことをします、つまり、ポートを守ってくれるのです。 portsentry
は /etc/portsentry/portsentry.conf ファイルで設定します。

上で議論した他のアプリケーションとは違って、これは実際に自分自身がポー
トで耳をすませるサーバになることによって、この仕事をします。これは罠を
しかけるのに似ています。 portsentry が走っている間、 root として
netstat -taup を走らせると、 portsentry が設定されているポートが何であ
れ、その LISTENER として portsentry が示されます。もし、portsentry が接
続試行を感知すると、それを完全にブロックします。そして次の段階に進んで
、それ以上の通信を全て停止するために、そのホストへの経路をブロックしま
す。代わりに、ipchains や iptables を完全にそのホストをブロックするため
に用いることができます。そういうわけでこれは、ある範囲にわたるポートス
キャンをやめさせる素晴らしいツールになるのです。

しかし portsentry は接続を許可するかどうかについては自由が限られていて
、オールオアナッシングで全部許すか全部拒否するかです。無視したい特定の
IPアドレスを /etc/portsentry/portsentry.ignore ファイルで定義できますが
、個々のポートに対して選択的なアクセスを許可することは出来ません。その
理由は、同時に特定の一つのポートに結び付けられるのは唯一つのサーバだけ
だからで、この場合には portsentry 自身ということになります。ですから、
スタンドアローンのファイアーウォールとしては有用性が限られます。しかし
、ファイアーウォール全体の戦略の一部としては、そう、とても有用なのです
。ほとんどの場合、これは防御の最前線に使うべきではなく、他のツールと結
びつけて使うべきでしょう。

どんな時に portsentry が便利に使えるかのアドバイス:

 ・ 防御の二番目の層として、 ipchains や iptables の背後で使う。パケッ
    トフィルタリングがまずパケットを捕まえることになるので、次に
    portsentry に入ってきたものは、それが何であろうが設定ミスであること
    になります。 inetd サーヴィスと一緒に使わないように。これは働きませ
    ん。この二つはぶつかりあってしまいますから。
   
 ・ 全範囲のポートスキャンをキャッチする方法として。パケットフィルター
    に一つか二つの小さな穴を開けて、 portsentry にこれらを捕まえ、随時
    対応させます。
   
 ・ 外にさらされた公開サーバは全くないという絶対の確信があり、誰が何に
    繋ごうとしているのか知りたいだけのとき。しかし、 portsentry が守っ
    ているものについて、こうだろう、とは何も勝手に仮定しないでください
    。デフォルトでは、それは全てのポートを見ているわけではなく、非常に
    よく外から探られることがあるいくつかのポートを開いたままにしている
    ことさえありえます。ですから、状況に応じて正しく設定されていること
    を確認してください。そして、まず、あなたの設定がテストされ証明され
    ていること、何も外部にさらされていないことを確認してください。
   
結局、結論としては、パケットフィルターの方が良いファイアーウォールを作
るために役立つということです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.5. プロキシ

辞書によれば、"proxy(プロキシ)" という言葉は、他の人の代わりに行動す
る権限または力と定義されています。これはソフトウェアのプロキシについて
もなかなか良い説明になっています。プロキシは通信経路の中間物です。例え
ば、我々が "squid" (http://www.squid-cache.org/) のような Web プロキシ
を用いていたとすれば、 Web サイトを閲覧する度に、実際のところは、我々が
ローカルに走らせている squid サーバに接続しているのです。そして、squid
はこの要求を最終点の、本当の目的場所にリレーします。そして次に squid は
Web ページをリレーしてこちらに返してくれるのです。つまりプロキシは仲立
ちです。 "ファイアーウォール" のように、 "プロキシ" は他の特定のアプリ
ケーションや、プロキシ・アプリケーションを走らせている専用サーバも参照
できます。

プロキシは様々な仕事を果たしてくれますが、その全てがセキュリティに深く
関係しているわけではありません。しかし、プロキシは通信の仲介であるため
に、アクセス制御のポリシーを実施してファイアーウォールを通る直接の接続
を制限し、プロキシの背後にあるネットワークが外部のインターネットからど
のように見えるかを制御する格好の場所になるのです。これによって、プロキ
シはファイアーウォール全体戦略の一部として、強力な候補になります。そし
て、事実、時にパケットフィルタリングのファイアーウォールの代わりに用い
られることもあります。多くのユーザが同じファイアーウォールに背後にいる
ような場合には、おそらくプロキシに基づいたファイアーウォールの方がより
合理的でしょう。しかし、一般の自宅でのシステムにおいては、あまり優先順
位は高くないかもしれません。

プロキシを設定し管理することは時に複雑で、この文書の範囲を超えています
。ファイアーウォールとプロキシサーバの HOWTO http://tldp.org/HOWTO/
Firewall-HOWTO.html  (JF
日本語訳 )にプロ
キシファイアーウォールを設定する例が載っています。 squid の使い方は 
http://squid-docs.sourceforge.net/latest/html/book1.htm で議論されてい
ます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.6. 個別のアプリケーション

サーバの中にはそれ自身のアクセス制御機能を持っているものもあります。自
分が走らせているサーバアプリケーションのそれぞれについて、これをチェッ
クすべきでしょう。この章では、二、三のよくあるものについてだけ見ること
にします。 man ページやアプリケーション個別の文書などが役立ちます。これ
は自分のファイアーウォールに自信を持っていてもいなくても、行うべきこと
です。再びここでも、防御の多層化が常にベストなのです。

 ・ BIND : ネームサーバの機能を果たす非常にありふれたパッケージです。そ
    のデーモン自体は "named" です。これは、外部の世界に対して、一つ以上
    のドメインについてのDNS 参照を提供しているなら、インターネットに完
    全にさらす必要があります。もしこれが何を意味するのかあなたによくわ
    からないなら、それを表にさらす必要がないか、そうすべきでないかのど
    ちらかです。ほとんどの人はこの場合にあたるでしょう。実際、これは非
    常にありふれたクラックのターゲットです。
   
    しかし、これはキャッシングオンリーモードでインストールされているか
    もしれませんし、この場合は便利に使うことができます。このときはイン
    ターネットに対して完全にさらす必要がありません。 /etc/named.conf フ
    ァイルを編集して、それが"聞いている"インターフェースを制限してくだ
    さい(以下は例の一つです):
   
    ┌────────────────────────────┐
    │                                                        │
    │ options {                                              │
    │   directory "/var/named";                              │
    │   listen-on { 127.0.0.1; 192.168.1.1; };               │
    │   version "N/A";                                       │
    │ };                                                     │
    │                                                        │
    │                                                        │
    └────────────────────────────┘
   
    "listen-on" の記述は、 DNS 要求に対して named が耳を開く場所を制限
    しています。この例では、localhost と bigcat の LAN インターフェース
    のみを聞きます。残りの世界については全くポートを開きません。それは
    単にそこにないのです。変更してから、 named を再スタートさせてくださ
    い。
   
 ・ X11 は -nolisten tcp コマンドラインオプションを用いることで、TCP 接
    続を許可しないようにさせることができます。 startx を使っているなら
    、 ~/.bashrc ファイル、またはシステム全体のファイル /etc/bashrc に
    、テキストエディタを使って alias startx="startx -- -nolisten tcp"
    と書くことで、これを自動的に行うことが出来ます。 xdm (または gdm,
    kdm などのようなそのバリエーション)を使っているなら、このオプション
    は /etc/X11/xdm/Xservers (またはそのコンパチ)によって:0 local /
    usr/bin/X11/X -nolisten tcp と指定されることになります。実際、gdm
    は /etc/X11/gdm/gdm.conf ファイルを使います。
   
    ブート時に自動的に X をスタートさせるために xdm (またはそのコンパ
    チブル)を使っているなら、 /etc/inittab ファイルを xdm -udpPort 0
    のように変更して、さらなる接続制限をすることができます。これは典型
    的には /etc/inittab ファイルの一番下のあたりにあります。
   
 ・ sendmail の最近のバージョンは、特定のアドレスのみを聞くように設定で
    きます。
   
    ┌────────────────────────────┐
    │ # SMTP daemon options                                  │
    │ O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA │
    │                                                        │
    │                                                        │
    └────────────────────────────┘
   
    上の抜粋は/etc/sendmail.cf ファイルからです。変更はテキストエディタ
    で注意深く行わねばなりません。 sendmail.mc ディレクティヴは以下のよ
    うになります:
   
    ┌──────────────────────────────────────┐
    │                                                                            │
    │ dnl This changes sendmail to only listen on the loopback device 127.0.0.1  │
    │ dnl and not on any other network devices.                                  │
    │ DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')                       │
    │                                                                            │
    │                                                                            │
    └──────────────────────────────────────┘
   
    場合によっては、既にあるものを編集するよりも、新しい sendmail.cf を
    作りたいこともあるでしょう。他のメイルサーバデーモンも大抵、同様の
    設定オプションを持っています。関連の文書をチェックしてみてください
    。
   
 ・ SAMBA の接続は以下のように smb.conf で制限することができます:
   
    ┌────────────────────────────┐
    │ bind interfaces = true                                 │
    │ interfaces = 192.168.1. 127.                           │
    │ hosts allow = 192.168.1. 127.                          │
    │                                                        │
    │                                                        │
    └────────────────────────────┘
   
    これで localhost (127.0.0.1) とローカルな LAN のアドレスの範囲のみ
    、接続を開き、許可することになります。必要に応じて LAN アドレスを調
    整してください。
   
 ・ CUPS プリントデーモンは、接続のために「聞く」場所を教えてやることが
    できます。 /etc/cups/cupsd.conf に以下のように追加してください:
   
    ┌────────────────────────────┐
    │ Listen 192.168.1.1:631                                 │
    │                                                        │
    │                                                        │
    └────────────────────────────┘
   
    これで特定のアドレスとポート番号のポートだけを開くようになります。
   
 ・ xinetd はデーモンに対して、その "bind" 設定の方向にあわせて、特定の
    アドレスだけを聞くようにさせることができます。例えば、内部 LAN イン
    ターフェースアドレスなどです。このことや他の文法については man
    xinetd.conf で man ページを参照してください。他にも色々の制御の仕組
    みがあります。
   
これまでと同様に、システムに変更を加えたら常に、まず設定ファイルをバッ
クアップした後で、そのデーモンを再スタートさせ、当該のログを見てエラー
メッセージをチェックしてください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.7. 検証

ファイアーウォール設定の最後のステップは、あなたの目指した通りのことが
行われているか検証することです。あなたのシステム設定に些細な変更を加え
たときでさえ、常にこの検証をすることが賢明でしょう。

さて、どうやってこれをしましょう。あなたにできることは色々あります。

ipchains と iptables のようなパケットフィルターについては、我々の規則、
チェイン、そして関連した動作の全てを iptables -nvL | less によってリス
トアップすることができます(必要に応じて ipchains におきかえてください
)。 xterm を出来る限り広く開いて、長い行が折り曲げられないようにしまし
ょう。

これで設定したチェインが、望んだ通りのことをしているかどうか、ある程度
分るはずです。普段行いそうなオンラインの作業、例えば、Web ページを開く
とか、メイルを送受信することなどを、試してみるべきです。これは、もちろ
んのことですが、 tcpwrapper や portsentry については何の情報も与えてく
れません。 tcpwrapper の設定を検証するには(xinetd を除いて)、 tcpdchk
を用いることができます。

そして次は、自分自身をスキャンしましょう。 nmap がそのスキャンのための
ツールで、各ディストリビューションを通して手に入るでしょうし、 http://
www.insecure.org/nmap/nmap_download.html からも手に入ります。 nmap は非
常に自由度が高く、本質的には"ポート調査ツール"です。言い換えれば、これ
は他のものの中から開いているポートを探します。詳しくは nmap の man ペー
ジを参照してください。

自分自身に対して nmap を走らせると(例えば、nmap localhost など)、開い
ているポートで、ただし、ローカルに可視的であるもの、を教えてくれるはず
です。いまファイアーウォールがうまくいっていれば、これは外部から見えて
いるものとは全く違います。ですから、自分自身をスキャンしたら、次に信用
できる友達か、サイト(リンクを見てください)を見つけ、外部からスキャン
してもらってください。ただしポートスキャンがプロバイダのサービス規約に
違反していないか確認してください。趣旨は立派であっても、それは許可され
ていないことかも知れません。外部からのスキャンは外の世界から自分のシス
テムがどのように見えているかを知る最良の方法です。これはファイアーウォ
ールがどのように働いているかを教えてくれます。 nmap の使い方の例につい
ては補遺の nmap の章を参照してください。

警告を一つ:プロバイダの中にはいくつかのポートをフィルターしているもの
があり、その場合には、どのように自分のファイアーウォールが働いているか
、確実には知ることができないでしょう。逆に言えば、その場合は web やプロ
キシによって、あるポートが開いているように見せかけているのです。スキャ
ンするものは 80 番ポートの web プロキシを見て、あなたのシステム上の開い
たポートとして誤って報告してしまうかも知れません。

また一つの選択はポートの全範囲のテストを提供している web サイトを見つけ
ることです。 http://www.hackerwhacker.com がそのようなサイトの一つです
。このようなサイトのどれでも、単に比較的少数のよく知られたポートをスキ
ャンするだけではないことを確認して、使用してください。

ファイアーウォールの変更やシステムのアップグレード、また新たなインスト
ールをするたびに、そしてシステムのどんな重要コンポーネントが変更された
時にも、この手続きを繰り返してください。

また、拒否された全ての通信のログを取れるようにするべきでしょう。少なく
とも、一時的には。と言うのも、一旦、ファイアーウォールが目指したとおり
に動いていることを確認したら、そして、もしログがとても手に負えないほど
圧倒的な量なら、ログを取るのを停止したくなるかもしれませんから。

全く portsentry に頼っているなら、その文書を読んでください。設定によっ
ては、それはスキャナーへの経路を落としてしまうか、または同じことをする
ipchains/iptables のルールを適用するかのどちらかでしょう。また、それは
特定のポートに"耳をすませて"いますから、これら全てのポートは"開いている
"と示されます。この場合は偽の警報です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.8. ログ

Linux はたくさんのログをとります。普通は複数のファイルにとります。これ
らログに記録されているもの全てについて、良いものなのか悪いものなのか、
またはどうでもよいものなのかは、常に明白なわけではありません。ファイア
ーウォールはそれぞれかなりの量のログを作成しがちです。もちろん、"悪いも
の"だけを止めたいのですが、他の無害な通信も当然ながら同様に捕まえてしま
います。インターネットはたくさんの背景ノイズにあふれているのです。

多くの場合、入ってくるパケットの目的を知ることはほとんど不可能です。侵
入の試みなのか、間違ったプロトコルなのか、それとも IP アドレスのミスタ
イプかも知れません。結論は行き先ポート、出発したポート、プロトコル、そ
のほかの変数などの因子に基づいて導かれます。しかし、ファイアーウォール
のログの解釈については、経験が何よりです。それは多くの場合、経験に基づ
いた「アート」の領域なのです。

それでは、我々は本当にログをとる必要があるのでしょうか?そしてどれくら
いたくさんログをとるべきなのでしょうか?ログをとることの利点は、ファイ
アーウォールが実際に機能を果たしていることがわかることです。我々がログ
の内容のほとんどを理解できないとしても、それが"何事かを"しているのだ、
ということは知ることができます。そして、もし必要が生じれば、そのログを
掘り起こして、問題になっているデータを見つけることができるでしょう。

一方では、ログをとることは、もしそれがあまりに過剰で、適切なデータを見
つけることができないほどなら悪ですし、ハードディスクを一杯にしてしまう
ようなら、なおさらです。または、過剰反応のあまり、全ての最新エントリー
が全て襲撃の証拠ととってしまうことも良くありません。正しいバランス感覚
でログを見ることは素晴らしい利益になりますが、それはその定義からしてほ
とんどの場合、新米ユーザに欠けている能力でもあります。また、ひとたびフ
ァイアーウォールが検証されたなら、しかも莫大なログに混乱して見当を失っ
ているならば、自宅のデスクトップユーザはログをとることを可能な限り少な
くとどめたいと思うことでしょう。より大きな責任のある人はログをとるべき
で、異質な情報をフィルターにかけて、ログから適切なデータを見つけ出すた
めの方法を探さねばなりません。

ログのデータをどこで探せばよいのか、確かでないですか?これはあなたのデ
ィストリビューションが様々なデーモンとsyslogd をどう設定したかに依存し
て多くの場所がありえます。ほとんどのログは /var/log/* に取られています
。 ls -l /var/log/ として、このディレクトリを調べてみてください。そして
、そのサイズとタイムスタンプから判断して、もっとも頻繁に変化しているロ
グはどれか見てみましょう。また、デフォルトのログを置く場所はどこか知る
ために、 /etc/syslog.conf を見てください。 /var/log/messages ファイルを
最初に探すのがよいでしょう。

portsentry と tcpwrapper では一定量のログをとり、それは調整できません。
xinetd では、ログの拡張機能をオンにすることができます。一方、ipchains
と iptables では、何のログを取るかについて、非常に柔軟性があります。

ipchains では -l オプションを任意のルールに追加できます。 iptables では
-j LOG ターゲットを用います。これには、それ自身の別の代用のルールが必要
です。 iptables はもう少し進んでいて、ログを取るエントリーをカスタマイ
ズしたり、制限を見積もることもできます。man ページを参照してください。
おそらく、ブロックされた通信により興味を持っているでしょうから、 DENY
と REJECT のルールに限ってログを取ることになるでしょう。

あなたが何のログを、どれくらい取るか、そしてそのログをどうするか、は個
々の判断になります。そしておそらく、ログをうまく扱えるようになるには、
いくらかの試行錯誤が必要になるでしょう。以下のような、検査ツールと解析
ツールは非常に助けになります:

ログをモニターしてくれ、必要な時に教えてくれるツール。これらをうまく使
うには、いくらか設定の試行錯誤が必要になるでしょう:

 ・ ipchains と iptables のための素晴らしいログエントリー解析ツールとし
    て、次の Manfred Bartz のものがあります: http://www.logi.cc/linux/
    NetfilterLogAnalyzer.php3. ログの内容が結局のところ、何を意味してい
    るのか分かります。
   
 ・ LogSentry (前の logcheck) は、 http://www.psionic.org/products/
    logsentry.html から手に入ります。これは portsentry と同じグループに
    よるものです。 LogSentry は柔軟な設定のできる、万能のログモニタリン
    グツールで、複数のログを扱えます。
   
 ・ http://freshmeat.net/projects/firelogd/ は、Ian Jones によるファイ
    アーウォールのログデーモンで、 iptables かipchains のログデータを監
    視して、警報を送るように設計されています。
   
 ・ http://freshmeat.net/projects/fwlogwatch/ は Boris Wesslowski によ
    るもので、同様のアイデアですが、より多くのログ形式をサポートしてい
    ます。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.9. 始まりの場所

ファイアーウォールのスクリプトがどこから開始されるのか、間単に見てみま
しょう。

portsentry は他のシステムサーヴィスと同様に、 init プロセスとして走らせ
ることができます。これがいつ行われるかはそれほど重要ではありません。
tcpwrapper は inetd か xinetd によって自動的に呼び出されるので、これも
心配はありません。

しかし、パケットフィルタリングのスクリプトは、どこかで開始させる必要が
あります。そして、多くのスクリプトは、そのローカルな IP アドレスを用い
る仕組みを持っています。これはそのスクリプトを、そのインターフェースが
立ち上がって IP アドレスが割り当てられた後で、スタートしなければならな
いことを意味しています。理想的には、これはインターフェースが立ち上がっ
た直後であるべきです。ですから、これはインターネットに接続している方法
に依存します。また、PPP や DHCP のように、割り当てが動的だったり、再接
続の毎に異なる IP になるかもしれないプロトコルについては、適切なデーモ
ンによってそのスクリプトを走らせるのが最善です。

PPP については、多分 /etc/ppp/ip-up ファイルがあることでしょう。これは
接続、再接続の度に実行されます。ファイアーウォールスクリプトへのフルパ
ス名をここに書いてください。正しい場所については個別のドキュメントもチ
ェックしてください。 Debian は /etc/ppp/ip-up.d/ にあるファイル群を使っ
ていますので、そこにスクリプト自身を置くか、またはシムリンクしてくださ
い。 Red Hat はユーザが定義したローカルな PPP 設定については /etc/ppp/
ip-up.local を用います。

DHCP は、そのクライアントに依存します。 dhcpcd は、 IP の割り当てが得ら
れたり更新される時はいつでも、 /etc/dhcpcd/dhcpcd-.exe (例え
ば dhcpcd-eth0.exe)を実行します。ですから、ここがファイアーウォールスク
リプトへの参照を置く場所になります。 pumpについては、そのメインの設定フ
ァイルは /etc/pump.conf です。 Pump は、新たな IP の割り当てが得られる
か更新されるといつでも、以下のように、その"スクリプト"ステートメントで
定義された全てのスクリプトを走らせます:

 script /usr/local/bin/ipchains.sh                                     
                                                                       
                                                                       

もしあなたが固定のIP アドレスを持っている場合(つまり、IP アドレスが決
して変更されない場合)には、その場所はそれほど重要でありませんが、その
インターフェースが立ち上がる前にすべきです。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

5.10. ステップ3のまとめと結論

この章では、"ファイアーウォール"を構成するのに用いられる様々なコンポー
ネント(構成要素)について見ました。そしてファイアーウォールは、何かの
特定のアプリケーションやコンポーネントであると同時に、一つの戦略であり
、コンポーネントの組み合わせであるということを学びました。全てではあり
ませんがほとんどの Linux システムで、最も普通に用いられるアプリケーショ
ンについて見ましたが、これらに限るものではありません。

結局、この章は多くの情報を一度に要約したものであって、読者の全員にその
全てを理解してもらいたいものです。また出発点として用いることが出来れば
、とも思っており、同様に、より進んだ内容へのリファレンスになることも期
待しています。パケットフィルターによるファイアーウォールの例も、出発点
として用いることができます。単に、テキストエディタでカットアンドペース
トして、ファイルに適切な名前を書き入れ、 chmod +x として実行可能ファイ
ルにして使えます。変数をいくつか、少し編集する必要があるかもしれません
。また自分用のスクリプトを作るために用いることのできるサイトやユーティ
リティについてはリンクの章を参照してください。これで面倒な仕事を省ける
かもしれません。

ここまでで我々はステップ1,2,3を果たしました。ここまでのところで、
あなたは既に基本的な手段を設定し、ネットワークに潜む雑多かつ様々な脅威
からシステムを守っていることと思います。まだ上に挙げたどのステップも遂
げていないなら、ここが中断するのによい場所ですから、上に戻ってそうして
ください。一番重要なステップは既に上で挙げた部分なのです。

二、三の短い結論…

"iptables, ipchains, tcpwrapper, また portsentry の中で、どれがベストで
しょうか?" 手短かに答えれば、 iptables が他のものよりも多くのことがで
きます。ですから、2.4 カーネルを用いているなら、 iptables を使ってくだ
さい。そして、2.2 カーネルならば ipchains です。でも、本当の詳しい答は
、 "それは単に、あなたが何をしているか、対象は何かによる" ということに
なります。すみません。他のツールはそれぞれに与えられた情況によって利点
があり、また、どれも正しい状況で使えば効果的になりえます。

"これら全てのパッケージが必要でしょうか?" いいえ。しかし、一つのアプロ
ーチよりも、多くを組み合わせて下さい。そして、上の全ての勧めにしたがっ
てください。 iptables 自体良いものですが、その他の手段をいくつか組み合
わせると、もっと強くなります。安全を確保するのに、一つだけの方法に頼ら
ないでください。 "何層にもなった"防御が常にベストです。安全な管理の実際
がそうであるように。世界で最高の iptables スクリプトもパズルの単なる一
つのピースに過ぎず、システムの他の弱点を隠すために用いるべきではありま
せん。

"私は小さな家庭内 LAN を持っていますが、各コンピュータ上にファイアーウ
ォールをおく必要がありますか?" いいえ。LAN ゲートウェイに適切に設定さ
れたファイアーウォールがありさえすれば、必要ありません。望まない通信は
そこで食い止められるはずです。そしてこれが望んだ通りに働いている限り、
LAN 内には望まぬ通信は存在しないはずです。しかし、同じ理由で、各コンピ
ュータ上にファイアーウォールをおいても、何も悪くはないことも確かです。
より大きな LAN で、色々なプラットフォームが混じっていたり、信用できない
ユーザがいたりする場合には、そうした方が良いと言えるでしょう。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6. 不正侵入の発見

この章は、いかにして早期に前兆に気づくか、いかにして事実の後に警戒態勢
をとるか、そしていかにして侵入の企てからシステムをクリーンな状態に復旧
するか、を扱います。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6.1. 侵入発見システム(Intrusion Detection System, IDS)

侵入発見システム(Intrusion Detection Systems, IDS) はファイアーウォール
を通り過ぎて何かが起こったかもしれないとき、それを捕まえるよう設計され
ています。また、進行中の能動的な侵入の企てを捕まえるようにも、または事
件の後に成功した侵入を発見するようにも設計されています。後の場合には、
いかなる被害を避けるにも遅過ぎますが、少なくとも早期に問題に気づくこと
が出来ます。 IDS には二つの基本的なタイプがあります。それは、ネットワー
クを保護するものと、個別のホストを保護するものです。

ホストに基づく IDS は、ファイルシステムの変更をモニタするユーティリティ
によってなされます。変更されるべきでないシステムファイルが、自分が変更
したのではないのに、何らかの方法で変更されていたとすると、それは何かま
ずいことが起こった証拠と言えます。誰かが中に入り、root 権限を得て、おそ
らくシステムのどこかに変更を加えているのでしょう。これは通常、侵入後の
一番最初になされることです。これで、侵入者はバックドアを通って帰ってこ
られるし、さらに他の誰かへの攻撃を始めることができます。どの場合も、侵
入者はシステムに対しファイルを変更するか、付け加える必要があります。

ここでは tripwire (http://www.tripwire.org) のようなツールが役割を果た
します。このようなツールはファイルシステムの様々な側面をモニタし、それ
らを蓄積しておいたデータベースと比較します。そしていかなる変更が発見さ
れても、警告を報せるように設定できます。このようなツールは"クリーンであ
る"(侵入されていない)ことが分かっているシステムにだけインストールすべ
きです。

自宅のデスクトップマシンと家庭内 LAN においては、これはおそらくセキュリ
ティの全体戦略において絶対不可欠な部分というわけではないでしょう。しか
し、心の平安を与えてくれますし、存在意義があることは確かです。ですから
優先順位としては、これにとりかかる前に、まず上のステップ1,2,3を果
たしたことを確認して、うまくいってることを確かめてください。

RPM ユーザは、 rpm -Va で大体同じ結果が得られます。これは全てのパッケー
ジを調べてくれますが、全く同じ機能を持っているわけではありません。例え
ば、それはほとんどのディレクトリでは、新しいファイルが追加されても気づ
きません。また、拡張属性が変更されたファイルも検出しません(例えば、
chattr +i, man chattr と man lsattr で参照のこと)。これをうまく使うに
は、クリーンインストールの後で行わねばなりませんし、どんなパッケージが
アップグレード、または追加されても、その度に行う必要があります:

┌──────────────────────────────────┐
│                                                                    │
│ # rpm -Va > /root/system.checked                                   │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

このようにして、後で比較できるように、システムのスナップショットを保管
しておくのです。

Debian ユーザには類似したツール debsums があります。

┌──────────────────────────────────┐
│                                                                    │
│ # debsums -s > /root/system.checked                                │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

また別のアイデアには、 chkrootkit (http://www.chkrootkit.org/) を毎週の
cron ジョブとして走らせるという方法があります。これは通常の "rootkit"
(侵入した偽ルートがインストールするツール群)を検出します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6.2. もうハックされてる?

あなたがここを読んでいるのは、システムに何か"おかしな"ところがあるのに
気づいて、誰かに侵入されたのではないかと疑っているからかも知れませんね
。以下が手がかりになるはずです。

典型的な侵入者が最初に行うことは、 "rootkit" のインストールです。インタ
ーネット上ではたくさんの rootkit のパッケージが手に入ります。 rootkit
は本質的にはスクリプト、またはスクリプトの組み合わせで、侵入者がシステ
ムをコントロール下におき、うまく身を隠すために、手早くシステムを変更す
るのに使うためのものです。侵入者は、通常のシステムユーティリティの改竄
バイナリをインストールすることと、ログファイルを書き変えることで、これ
を行います。または、同様の結果が得られる特別なカーネルモジュールを使い
ます。ですから、ls のような普通のコマンドが、侵入者がファイルを保存して
いる場所を表示しないように、変更されているかも知れないのです。なんて賢
いのでしょう!

うまく設計された rootkit は極めて効果的です。そのシステムの上の何一つ、
正しい答えを返してくれるか本当には信用できなくなります。何もかもです!
しかし時に、その変化が狙い通りほども滑らかではなく、何事かが正しくない
というヒントを与えてくれます。以下は危険信号かも知れない兆候のいくつか
です:

 ・ login コマンドのふるまいがおかしい。または誰も login できない。また
    は root だけが login できる。ふるまいのおかしな login コマンドは全
    て疑うべきです。パスワード追加、変更についておかしな所があるのも同
    様です。
   
    他のシステムコマンド(例えば、 top や ps)がおかしいのも同様に疑う
    べき要因です。
   
 ・ システムユーティリティの動作が通常より遅くなっている、使い難い、ま
    たは、おかしな、予期せぬ結果を示す。変更を加えられるかもしれない普
    通のユーティリティは、 ls, find, who, w, last, netstat, login, ps, 
    top などです。もちろんこれらに限りません!
   
 ・ "..." や ".. "(ドット、ドット、空白)と名づけられたファイルやディ
    レクトリ。この場合はかなり怪しいです。 "r00t-なになに" のようなハッ
    カーぽい名前のファイル。
   
 ・ 説明できない帯域の使用や接続。スクリプトキディたちは IRC が大好きで
    すから、このような接続は赤信号とすべきです。
   
 ・ ログが完全に失われている、または大きな部分が欠損している。または 
    syslog のふるまいに突然の変化がある。
   
 ・ 謎の開いたポート、またはプロセス。
   
 ・ 削除することも move することもできないファイル。 rootkit の中にはフ
    ァイルを"不変"にする、または変更不可能にするために chattr コマンド
    を使うものがあります。この種の変更は、 ls や rpm -V では示されない
    ので、そのファイルは一見は正常に見えます。これをくつがえすにはどう
    すればよいか、 chattr と lsattr のman ページを参照してください。そ
    して、ここでお手上げになったシステムを復旧するための次の章を見てく
    ださい。
   
    これはますますありふれたのスクリプトキディのトリックになってきてい
    ます。実際、疑わしいシステム上で走らせる手っ取り早い手は(root にな
    って)次のようにします;
   
    ┌────────────────────────────┐
    │  /usr/bin/lsattr `echo $PATH | tr ':' ' '` | grep i--  │
    │                                                        │
    └────────────────────────────┘
   
    これで root の PATH にある全ての"不変な"ファイルを見つけてくれます
    。標準的なディストリビューションでファイルをこの状態で出荷している
    ものはありませんので、これはほぼ確実にトラブルの徴候です。もし、上
    のコマンドがどんなものであっても何かのファイルを表示したら、(以下
    を参照して)システムを完全に復帰させる計画をたててください。手っ取
    り早く健全性をチェックするには次のようにします:
   
    ┌──────────────────────────────┐
    │  # chattr +i /bin/ps                                       │
    │  # /usr/bin/lsattr `echo $PATH | tr ':' ' '` | grep "i--"  │
    │    ---i---------- /bin/ps                                  │
    │  # chattr -i /bin/ps                                       │
    │                                                            │
    └──────────────────────────────┘
   
    これは単に、lsattr が完全にあてにならないと言うところまでは、システ
    ムが変更を加えられてはいないということを確認しているだけです。三行
    目がまさにその注目すべき箇所です。
   
 ・ "sniffer"(トラフィック聴取、解析ツールの類)の兆候。例えば、"無差
    別"モードになったインターフェースのログメッセージ。
   
 ・ /etc/inetd.conf, rc.local, rc.sysint, /etc/passwd への変更。特に、
    追加。 cat か tail を使って、これらのファイルを見てみましょう。追加
    は最後の行に付け加えられていることが多いでしょう。しかし、このよう
    な変化はどのシステムツールからも"見えない" かもしれないことを忘れな
    いで下さい。
   
時に、侵入者はそれほど賢くなく、 root の .bash_history のことを忘れたり
、ログの内容を消去するのを忘れたり、または奇妙な、使い残しのファイルを
/tmp に残していたりすることさえあります。ですから、これらを常にチェック
しましょう。それらが正しいと必ずしも期待しないように。しばしば、これら
の使い残しのファイルやログエントリーは、明白にスクリプトキディぽい名前
になっているでしょう。例えば、"r00t.sh" など。

tcpdump (http://www.tcpdump.org) のようなパケットスニファ(sniffer)は招
かれざる通信を見つけ出すのに有用かもしれません。しかし、スニファの出力
を解釈することは、おそらく平均的な新人ユーザのレベルを超えているでしょ
う。 snort (http://www.snort.org) と ethereal (http://www.ethereal.com)
も有用です。 Ethereal は GUI を備えています。

既に述べたように、信頼できないシステムは疑いもなく、システムバイナリを
変更されてしまっているでしょうし、そのシステムのユーティリティの出力を
信頼すべきでないでしょう。そのシステムの何も、あなたに真実を全て伝えて
くれると信用することはできません。個別のパッケージを再インストールする
ことは、助けになるかも知れないし、ならないかも知れません。と言うのも、
悪さをしているのは、システムライブラリやカーネルモジュールかも知れない
からです。ここでのポイントは、どのコンポーネントに変更が加えられたか、
絶対的に確実に知る方法は存在しないということです。

RPM ユーザは全てのパッケージの整合性を確認するために、 rpm -Va |less を
使うことができます。しかし、ここでも再び、rpm 自身が変更を加えられてい
ないという保証はないし、 RPM が依存しているシステムコンポーネントがいじ
られてしまっているかも知れないのです。

もしシステムに pstree コマンドがあるなら、これを標準的な ps コマンドの
代わりに使ってみてください。時々、スクリプトキディ(スクリプト使いの悪
餓鬼、新米クラッカーたち)はこのことを忘れているので。しかし、これも正
しいという保証はありません。

また、/proc ファイルシステムを使って、以下のように調べてみることもでき
ます。これには、現在走っているプロセスについてカーネルが知っていること
の全てが含まれています:

┌──────────────────────────────────┐
│                                                                    │
│ # cat /proc/*/stat | awk '{print $1,$2}'                           │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

これは全てのプロセスと PID 番号(邪悪なカーネルモジュールがこれを隠して
いないと仮定しての話ですが)のリストを作ってくれます。

また別の方法は http://www.chkrootkit.org サイトを訪ねて、rootkit キャッ
チャーをダウンロードして、それに調べさせてみることでしょう。

この問題にまつわる興味深い議論の場が、 http://www.fish.com/security/ で
見つかると思います。そこには、適切にも"検視官の道具箱" (The Coroner's
Toolkit, TCT) と呼ばれているツールもあります。

侵入から復旧するためのステップについては以下を読んでください。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

6.3. 信頼を失ったシステムの復旧

さて、あなたは侵入を確認し、誰か他の人が root アクセスを持っていること
がわかりました。しかも、システムに一つ以上の隠されたバックドア(裏口)
が作られている可能性も極めて高い。あなたはコントロールを失ってしまいま
した。どうやってこれを掃除し、コントロールを取り戻せばよいでしょう。

これを手っ取り早く行うには、完全な再インストールしか確かな方法はありま
せん。全ての変更されたファイルと残されているかもしれないバックドアを確
実に見つけ出す方法はありません。信頼を失ったシステムを取り繕おうとする
ことは、間違ったセキュリティ意識であって、しかも実際、既に悪い状況にあ
るシステムをさらに悪化させる可能性があります。

以下の順番に従って、段階を踏んでいきましょう:

 ・ プラグを抜いて、マシンをネットワークから切断しましょう。あなたは望
    まぬ犯罪の片棒を担がされているかもしれず、既に自分がされてしまった
    ことを今、他人に対して行っている最中かもしれないのです。
   
 ・ システムを回復させるために使える時間と必要性に依存しますが、穴を再
    び繋ぎ、また侵入者が帰ってくるのを避けるために、出来る限りの時間を
    かけて、攻撃者がどのようにして侵入し何がされたのかを調査することは
    利益になります。想像されるように、これは時間のかかる作業になりえま
    すし、常に実行できるわけではありません。しかも、この作業には典型的
    なユーザが持っているよりも、高度な熟練が必要となるかもしれません。
   
 ・ 大事なデータのバックアップをとりましょう。システムファイルをバック
    アップに含めないこと。 inetd.conf のようなシステム設定ファイルもで
    す。バックアップするのは、個人的なデータファイルのみに限ってくださ
    い。バックドアやその他の穴を開けられるかも知れないものまでバックア
    ップして、復活させたくはないでしょう。
   
 ・ 最初から再インストールし、残り物が隠れていないことを確実にするため
    にもインストールの際には、ドライブを再フォーマットしましょう(mke2fs
    )。実際のところ、特に、これから解析を行うために信頼を失ったデータを
    保存しておきたい場合には、ドライブごと入れ替えるのは悪くないアイデ
    アです。
   
 ・ バックアップしたデータを戻します。クリーンなインストールの後が、
    tripwire (http://www.tripewire.org ) など
    の IDS (侵入発見システム Intrusion Detection System) をインストール
    する一番良いタイミングです。
   
 ・ そのディストリビューションの全ての最新のアップデートファイルを適用
    し、パッチをあてます。セキュリティ関係の情報を集めるためにベンダの
    web サイトをチェックしてください。
   
 ・ システムが不必要なサーヴィスを走らせていないか再チェックしましょう
    。ファイアーウォールとアクセスポリシーを再検査し、全ての穴を厳しく
    締めつけてください。新しいパスワードを使ってください。盗まれている
    ことは非常にありそうなことですから。
   
 ・ システムを再接続します ;-)
   
この時点では、オンラインで手に入る rootkit 駆除ツールを使うことはお勧め
できません。それらはほとんどの場合にはうまく働いてくれるでしょうが、繰
り返しますが、万事オーケーで、侵入の全ての形跡が去ったと、どうやって絶
対の確信が持てるというのでしょう。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

7. 一般的な Tips

この章は、より安全で信頼できるシステムやネットワークを維持するための一
般的なコンセプトを手短に紹介します。コンピュータシステムはその周りの環
境の変化に連れて、日々変わって行くものですから、ここでは、"維持する"と
いうことを強調したいと思います。既に述べたように、あるシステムを安全に
するような、一つの方法といったものは存在しません。それにはあまりに多く
の変数があるのです。セキュリティとは特定の製品やアプリケーションやポリ
シーに頼ることではなく、問題へのアプローチ、またはその態度のことなので
す。

 ・ 遠隔からの root ログインを許可しないこと。これは /etc/securetty の
    ような設定ファイルで制御できるでしょう。 "pts" から始まっている全て
    の行を削除してください。これは大きなセキュリティホールです。
   
 ・ そもそも、root としてログインしないで下さい。以上。必要があればユー
    ザアカウントでログインして、 su で root になってください。ログイン
    が遠隔からであっても、ローカルであってもです。または sudo を用いて
    ください。これはルート特権で個別のコマンドを走らせることができます
    。(各ベンダから sudo パッケージを手に入れられるはずです)これは慣
    れるのに少々かかりますが、ことを行う上での正しい方法です。また、最
    も安全な方法でもあります。そして、時がたつにつれ、ますます、より自
    然な方法に思えてくることでしょう。
   
    誰かがまさに今、こう言っているのが聞こえますよ。 "でも本当に面倒く
    さいじゃないか、僕は root なんだし、それにこれは僕のシステムなんだ
    から"、と。よろしい、しかし root は特別なアカウントであり、通常のユ
    ーザアカウントとして使われるように意図されていないものです。 root
    は全てのものへの、ハードウェアデバイスにさえ、アクセス権を持ってい
    ます。システムは root を"信用している"のです。システムは root が何
    をしているのかを知っているのだ、と信じます。もしあなたが間違いをし
    たら、システムはそう意図したのだと仮定し、命令の通りにするよう全力
    を尽くすでしょう…例え、そのシステムを破壊せよ、という命令だったと
    しても。
   
    例えば、root として X をスタートさせ、 Netscape を開き、 web サイト
    を訪れたとしましょう。その web ページは酷い振る舞いをする java スク
    リプトを含んでいたとすれば、その酷い java スクリプトが、あなたが"正
    しい"方法でおこなった時よりも、あなたのシステムに対して、もっと深い
    アクセス権を持つ、ということが充分考えられます。
   
 ・ パスワードのことを真剣に考えてください。それらを誰にも渡してはいけ
    ません。全てのものに同じパスワードを使わないこと。 root パスワード
    を他のものに使わないこと(もちろん root のパスワードを除いて!)。
    あなたのシステムのパスワードを使って、絶対にオンラインでサインアッ
    プや登録をしないこと。パスワードは大文字と小文字を混ぜたアルファベ
    ット、数字、かつ(または)記号の組み合わせにし、充分な長さ(8文字以
    上)を持つものにすべきです。 "cat" や "dog" のように簡単に推測され
    る、いわゆる"辞書"単語を用いないこと。名前や日付やホスト名のような
    個人的な情報を使わないこと。パスワードをどこにも書かず、頭に記憶す
    ること。
   
    より安全な"シャドウ"パスワードを使いましょう。これは今や、全ての最
    近の Linux ディストリビューションでデフォルトになっているはずです。
    もし /etc/shadow ファイルがあるなら、既に使えるようになっています。
    pwconv と grpconv コマンドがあるなら、パスワードファイルとグループ
    ファイルをシャドウフォーマットに変換できます。
   
 ・ インターネットのような信頼できないネットワークを通じて、テキストそ
    のままのログインを要求するようなプログラムを使うのは避けましょう。 
    telnet が一番の例です。 ssh がずっと良い方法です。もし SSL (Secure
    Socket Layer) のサポートがあれば、それを使いましょう。例えば、あな
    たのプロバイダは SSL 経由の POP や IMAP メイルを提供していますか?
    最近のディストリビューションでは openssl 
    を含んでいますし、多くの Linux アプリケーションは、 SSL がサポート
    されている所ではそれを使うことができます。
   
 ・ リソースに制限をおきましょう。このためには色々な方法があります。お
    そらく、この必要性は与えられたシステムにアクセスしているユーザ数に
    応じて増加するでしょう。このような制限をおいておけば、ディスク容量
    オーバーのような予期された災害を防げるだけでなく、アプリケーション
    やプロセスの予期せぬ誤動作に対する防御にもなります。 quota コマンド
    (man quota) はディスクスペースに制限を置くのに使えます。 bash は 
    ulimit コマンド(man ulimit または man bash) を含んでいて、ユーザ毎
    に応じて様々な機能を制限できます。
   
    また、ここでは長くは議論しませんが、 PAM (Pluggable Authentication
    Modules) は様々なシステムの機能やリソースを制御するための非常に洗練
    されたアプローチを提供しています。手始めに man pam を参照してくださ
    い。 PAM は /etc/pam.conf か /etc/pam.d/* ファイルによって設定され
    ます。また、 /etc/security/* の中のファイル、 /etc/security/
    limits.conf などで、様々な適当な制限をおくことができます。 PAM につ
    いて詳しく見ることはこの文書の範囲を超えますので、詳しくは
    User-Authentication HOWTO (http://tldp.org/HOWTO/
    User-Authentication-HOWTO/index.html)を参照してください。(JF版
    http://www.linux.or.jp/JF/JFdocs/User-Authentication-HOWTO.txt)
   
 ・ 誰かきちんとした知識のある人が root へのメイルを受け取っていること
    を確認しましょう。これは "alias" を使ってできます。典型的なメイルサ
    ーバでは、これが定義される場所は /etc/aliases ファイルです。もし必
    要ならば、他のマシンのアカウントにしても構いません:
   
    ┌────────────────────────────┐
    │                                                        │
    │ # Person who should get root's mail.  This alias       │
    │ # must exist.                                          │
    │ # CHANGE THIS LINE to an account of a HUMAN            │
    │ # root メイルを受け取るべきひと。                      │
    │ # このエイリアスは必要です。                           │
    │ # この行を人間のアカウントへ変更してください。         │
    │ root:           hal@bigcat                             │
    │                                                        │
    │                                                        │
    └────────────────────────────┘
   
    その後で、 newaliases (か、同じ働きをするもの)を走らせるのを忘れ
    ないように。
   
 ・ ソフトウェアを手に入れる場所に注意してください。信用できる情報源を
    用いましょう。あなたはまったくの他人をどれくらい信用しますか?特定
    のパッケージを探しているなら、まず各ベンダをチェックしてください。
    おそらく、とにかくここがそのシステムにとって最良でしょう。または、
    そのパッケージのプロジェクトのオリジナルサイトも同様に良いでしょう
    。生のソースコードから(または tarball か src.rpm から)インストー
    ルすることで、少なくとも自分自身でそのコードをチェックすることがで
    きます。実際はそれが理解できないとしても ;-) これは Linux ソフトウ
    ェアサイトで広く拡がっている問題に見えないかもしれませんが、ある人
    にとってはコードにほんの数行を付け加えて、無害に見えるバイナリを、
    システムに裏ドアを開ける "トロイの木馬"に変えてしまうことは、極めて
    簡単なことなのです。そうなったら、大変なことです。
   
 ・ 誰かがシステムをスキャンして調べている、または誰かがシステムに侵入
    しようとしているようだ、としましょう。報復しないでください。源のIP
    アドレスは信頼できないシステムかも知れないし、その持ち主が既に犠牲
    者なのかもしれません。または自分が何かのサービス規約を破っていて、
    自身のプロバイダとトラブルを起こしているのかもしれません。この場合
    、最も良い対処法は、ログを源の IP のプロバイダか、所有者の苦情係に
    送ることです。これはしばしば "abuse@someisp.com" のようなアドレスで
    す。ただし、まともに相手をしてもらえると期待しないように。一般的に
    言えば、実際の侵入が実行されない限り、このような行動は法律的には犯
    罪ではありません。さらに言えば、犯罪であったとしても、重大な損害が
    (大金とか)示されない限り、法的に訴えることは無理でしょう。
   
 ・ Red Hat と Mandrake と Debian のユーザは "Bastille Hardening
    System" (http://www.bastille-linux.org/) を使うことができます。これ
    は Red Hat と Mandrake のシステムセキュリティを "強化"する多目的シ
    ステムで、一からファイアーウォールのスクリプトを構成し、 PAM やその
    他の色々のものを設定するためのGUI インターフェースを持っています。
    Debian のサポートは新しいものです。
   
 ・ ケーブルモデムか DSL を通じて、インターネットへ常時接続しているとし
    ましょう。しかし、それを常に使っているでしょうか?または常にそれが
    必要ですか? "唯一の真にセキュアなシステムは、ネットワークから切断
    されたシステムだ"、と昔から言われています。これは確かに一つの選択で
    しょう。ですから、インターフェースを落とすか停止する制御デーモン (
    dhcpcd, pppoed など) を使ってください。または、普段のスケジュールや
    使用法にしたがって接続を切ったり繋いだりする cron ジョブを設定する
    ことも考えられます。
   
 ・ しばしば"ファイアーウォール"として宣伝されているケーブルルータまた
    は DSL ルータはどうでしょう?安い値段のユニットはほとんど NAT
    (Network Address Translation) に等しいもので、ファイアーウォールと
    して、それを通じてポートのための穴を開ける能力を持っています。 NAT
    自体は NAT ゲイトウェイの背後のシステムをかなりの程度には安全に保っ
    てくれますが、これは非常に初歩的なファイアーウォール以外のなにもの
    も与えてくれません。そして、穴が開いているならば、それはまだ脅威に
    さらされているのです。また、傷を作らないためには、ルータのファーム
    ウェアや実装に依存することになります。このようなルータの背後でいく
    つか追加的な防御をするのが、賢い方法でしょう。
   
 ・ ワイアレスのネットワークカードやハブはどうでしょう?製造元がなんと
    言おうが、安全ではありません。これらの接続はインターネット接続と全
    く同じものと扱ってください。 ssh のような安全なプロトコルだけを用い
    ましょう。たとえそれが単に、ある LAN ボックスからもう一つのものへの
    接続でも。
   
 ・ もしある特定のサーヴィスを走らせる必要があると分かったら、そしてそ
    れを使うのは自分だけであるか、比較的少数の人数のためのものなら、標
    準的でないポート番号を使いましょう。ほとんどのサーバデーモンはこれ
    をサポートしています。例えば、sshd はデフォルトでは 22 番ポートを使
    います。ワームやスクリプトキディはみなこれを期待して、その番号を探
    します。ですから、別のポート番号で走らせましょう! sshd の man ペー
    ジを参照してください。
   
 ・ アプリケーションによってインターネット接続をブロックするファイアー
    ウォール(例えば、ウィンドウズ王国から来た ZoneAlarm など)はどうで
    しょう?これらは主に、 MS OS にあまりにありふれたものとなったヴィリ
    ー、つまりコンピュータウィルスとトロイの木馬の過剰症に対応するよう
    に設計されているものです。これは Linux にとっては実際、問題ではあり
    ません。ですから、Linux 上では、今のところこのようなアプリケーショ
    ンは存在しないのです。そして、誰かがそれを実装する手間をかける充分
    な需要もあるようには思えません。Linux 上にはより良いファイアーウォ
    ールがあります。この文書の他の提案にしたがって行けばよいのです。
   
 ・ 最後に、自分自身のシステムを知りましょう。もしあなたが Linux の新米
    ユーザだというなら、使ったことのないものを既に良く知っているはずが
    ないのだ、という事実に向かい合いましょう。理解しましょう。そして、
    学習のプロセスの中で、ものごとを、最も易しいやり方ではなくて、正し
    いやり方で行う方法を学びましょう。ものごとを"正しい方法で"行うこと
    の背後には、何十年もの歴史があるのです。これは時間という試験をくぐ
    り抜けてきています。今これが不必要で面倒なことのように見えるとして
    も、やがてはこれに意味があることがわかるでしょう。
   
    走らせているサーヴィスが何であろうと、それに親しみましょう。そして
    、もし何かがおかしくなるときには、これらのサーヴィスがシステム全体
    の健康に対して持つかもしれない関連性に親しみましょう。できる限りの
    ものを読み、質問しましょう。 "単にそれができるから"、という理由や、
    インストーラがそうしたから、という理由で、何かをサーヴィスとして走
    らせてはいけません。明らかに、誰も始めから経験を積んだシステム管理
    者であることはできません。しかし、自分のシステムについて充分に学ぶ
    ために努力し、システムをコントロール下におくことができます。これは
    *nix を MS システムから区別する特徴の一つです。つまり、MS システム
    では決して完全なコントロールをすることはできませんが、 *nix では可
    能です。逆に言えば、何か悪いことが起こった時、しばしば自分以外の誰
    も責めることができないのです。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

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 番を使います。他のよく
用いられているポート番号やそのサーヴィスについては、ポートの章を参照し
てください。

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

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

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" で、危険ではないものと
思われます。プログラム名がわかれば、locate や find といったツールでファ
イルシステムを探しに行くことができるでしょうし、それが見つかれば、どの
パッケージに属しているかも見分けることができます。しかし、今や 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              │
│                                                                        │
│                                                                        │
└────────────────────────────────────┘

ここで二、三注意があります。今までに馴染みになったデーモンが二つありま
す: named と postfix (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                │
│                                                                    │
│                                                                    │
└──────────────────────────────────┘

fuser と lsof コマンドの文法については 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="$?"  │
│                                                                            │
│                                                                            │
└──────────────────────────────────────┘

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

/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 デーモ
ンによって制御されています。ある場合には、これらは netstat や lsof コマ
ンドでプロセス所有者を知ることができます。 portmap を止めてみて、その不
思議なサーヴィスがいなくなるかどうか見てみましょう。またあなたは RPC サ
ーヴィスが走っているかもしれないこと(このために portmap が走っているは
ずです)を見るために、 rpcinfo -p localhost コマンドを使うこともできま
す。

┌──────────────────────────────────┐
│                              Warning                               │
├──────────────────────────────────┤
│もしあなたが既に侵入されているかもしれないと疑っているのでしたら、  │
│netstat や ps の出力を信じないでください。他のシステム要素もそうです│
│が、既にこれらも改竄されてしまっていて、その出力が信用できなくなって│
│いる可能性が充分にあります。                                        │
└──────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

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.5. IP のなりすまし

IP アドレスをごまかすことはどれくらい易しいことでしょうか?適切なツール
があれば、非常に簡単なことなのです。これはどれくらいの脅威になるでしょ
う?実際は、ほとんどに場合にはそれほど大きな脅威ではなく、脅威として過
大に宣伝されています。

TCP/IP が働く方法として、各パケットはその出発点とあて先の IP アドレスの
両方を運んでいます。それに対する返答の通信は全て、この情報に基づいてい
ます。ですから、IP のなりすましによって、だましたパケットを送り出した攻
撃者に対しては、何の有用な情報も決して帰ってこないことになります。その
通信はなりすましている IP アドレスが指し示す場所がどこであろうと、そこ
に向かって帰っていきます。攻撃者のところには結局何も戻ってきません。

しかし、これは標的にするシステムについて何かを知ることが重要でない場合
、 "DoS" 攻撃(以下を参照)の可能性を確かに持っています。そして同様に、
ある種のいたずらにも使われるかもしれません。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

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.4.8. Brute Force (力まかせ、虱つぶし攻撃)

"Brute force(力まかせ、しらみつぶし)"攻撃は攻撃者が知られている同じ弱
点に対し繰り返し試行をおこないます。破壊槌のように。古典的な例は、何者
かが telnet サーバにアクセスするために、単にパスワードを次々に投げつけ
ることで、いつかはその一つがうまく行くだろうと期待するものでしょう。ま
たはサーバがクラッシュすることを期待するのかもしれません。これはそれほ
ど想像力を必要としませんし、自宅のシステムに対して通常用いられる作戦で
はありません。

ところで、これは遠隔からの root ログインを許可することに反対する、一つ
の良い論点を与えてもいます。 root アカウントは全てのシステムで存在しま
す。おそらくこのような性質を持つアカウントはこれだけでしょう。あなたは
潜在的な攻撃者に、ログイン名とパスワードの両方を推測させたいでしょうが
、もし root にリモートログインが許されていれば、攻撃者はパスワードだけ
を推測すればよいことになってしまいます!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

8.4.9. ウィルス

これは心配することのないものです。ウィルスは主に Microsoft ユーザの問題
に思えます。多くの理由によって、ウィルスは Linux ユーザにとって大きな脅
威にはなりません。これからも常にそうだとは言えませんが、現在 Microsoft
システムを悩ませているウィルス被害の爆発的な拡大は Linux (または Unix
)ベースのシステムには拡がらないはずです。実際、この現象を可能にしてい
る様々な方法は、 Linux 上では有効ではありません。ですからウィルス防御ソ
フトウェアを我々の武器庫に入れることはお勧めしません。少なくとも Linux
のみのネットワークである間は。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

8.5. リンク集

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

 ・ 他の関連文書は Linux ドキュメントプロジェクトで見つけられます:
   
    Security HOWTO: http://tldp.org/HOWTO/Security-HOWTO.html  (JF日本語版http://           
    www.linux.or.jp/JF/JFdocs/Security-HOWTO.html)                    
   
    Firewall HOWTO: http://tldp.org/HOWTO/Firewall-HOWTO.html (JF日本 
    語版http://www.linux.or.jp/JF/JFdocs/Firewall-HOWTO.html)         
   
    Ipchains HOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html  (JF日本語版http://           
    www.linux.or.jp/JF/JFdocs/IPCHAINS-HOWTO.html)                    
   
    User Authentication: http://tldp.org/HOWTO/                        
    User-Authentication-HOWTO/index.html, これは PAM についての素晴らし
    い議論を含んでいます。(JF日本語版http://www.linux.or.jp/JF/JFdocs/
    User-Authentication-HOWTO.txt)                                    
   
    VPN (Virtual Private Network): http://tldp.org/HOWTO/VPN-HOWTO.html
    と http://tldp.org/HOWTO/VPN-Masquerade-HOWTO.html (JF日本語版    
    http://www.linux.or.jp/JF/JFdocs/VPN-HOWTO.txt )                       
   
    The Remote X Apps Mini HOWTO, http://www.tldp.org/HOWTO/mini/      
    Remote-X-Apps.html, には X Window をセキュアに実装するための素晴ら 
    しい議論が含まれています。                                         
   
    The Linux Network Administrators Guide: http://tldp.org/LDP/nag2/  
    index.html, はネットワークと TCP/IP とファイアーウォールについての 
    良い概観説明を含んでいます。                                       
   
    The Linux Administrator's Security Guide: http://www.seifried.org/ 
    lasg/ , は、ファイアーウォール、パス
    ワード、認証、PAM などなどについての、興味深い多くのトピックを含ん 
    でいます。                                                         
   
    Securing Red Hat: http://tldp.org/LDP/solrhe/                      
    Securing-Optimizing-Linux-RH-Edition-v1.3/index.html               
   
 ・ ipchains と iptables ファイアーウォールスクリプトのカスタム設定を作
    るためのツール:
   
    Firestarter: http://firestarter.sourceforge.net
   
    二つの関連プロジェクト: http://seawall.sourceforge.net/           
    (ipchains), http://shorewall.sourceforge.net/ (iptables).          
   
 ・ netfilter ディベロッパーからの netfilter と iptables の文書(多くの
    他の言語でも入手可能):
   
    FAQ: http://netfilter.samba.org/documentation/FAQ/                 
    netfilter-faq.html                                                 
    パケットフィルタリング: http://netfilter.samba.org/documentation/ 
    HOWTO/packet-filtering-HOWTO.html                                  
    ネットワーキング: http://netfilter.samba.org/documentation/HOWTO/ 
    networking-concepts-HOWTO.html                                     
    NAT/マスカレーディング: http://netfilter.samba.org/documentation/ 
    HOWTO/NAT-HOWTO.html                                               
   
 ・ ポート番号割り当て、スキャナーがスキャンするかもしれないものについ
    て:
   
    http://www.linuxsecurity.com/resource_files/firewalls/             
    firewall-seen.html                                                 
   
    http://www.sans.org/newlook/resources/IDFAQ/oddports.htm
   
    http://www.iana.org/assignments/port-numbers, 公式のポート番号割り 
    当て。                                                             
   
 ・ 一般的なセキュリティサイト。これらには全て、文書、警告、ニュースレ
    ター、メイリングリスト、そのほかの情報源についてのコーナーがありま
    す。
   
    Linux Security.com: http://www.linuxsecurity.com, 良い情報が集めら 
    れている。Linux 固有の情報。良い文書が沢山: http://               
    www.linuxsecurity.com/docs/                                        
   
    CERT, http://www.cert.org
   
    The SANS Institute: http://www.sans.org/
   
    The Coroner's Toolkit (TCT)(検視官の道具箱): http://www.fish.com/
    security/, 侵入のその後の問題(侵入者が侵入して最初にすること)につ
    いての議論とツール群。                                             
   
 ・ プライバシー:
   
    Junkbuster: http://www.junkbuster.com, web プロキシ、クッキーマネー
    ジャ。                                                             
   
    PGP: http://www.gnupg.org/
   
 ・ 他の文書と参考サイト:
   
    Linux Security.com: http://www.linuxsecurity.com/docs/
   
    Linux Newbie: http://www.linuxnewbie.org/nhf/intel/security/       
    index.html                                                         
   
    The comp.os.linux.security FAQ: http://www.linuxsecurity.com/docs/ 
    colsfaq.html                                                       
   
    The Internet Firewall FAQ: http://www.interhack.net/pubs/fwfaq/
   
    The Site Security Handbook RFC: http://www.ietf.org/rfc/rfc2196.txt
   
 ・ 興味深いサイトいろいろ:
   
    http://www.bastille-linux.org, Mandrake と Redhat のみ。
   
    SAINT: http://www.wwdsi.com/saint/, システムセキュリティ解析。
   
    SSL: http://www.openssl.org/
   
    SSH: http://www.openssh.org/
   
    自分自身をスキャン:http://www.hackerwhacker.com
   
    PAM: http://www.kernel.org/pub/linux/libs/pam/index.html
   
    トロイの木馬をしかけられた Linux カーネルモジュールを検出: http://
    members.prestige.net/tmiller12/papers/lkm.htm                      
   
    ルートキット・チェッカーhttp://www.chkrootkit.org
   
    ポートスキャン・ツール nmap のホームページ: http://               
    www.insecure.org                                                   
   
    Nessus(単なるポートスキャナー以上のもの): http://www.nessus.org
   
    tripwire, 侵入検出ツール: http://www.tripwire.org
   
    snort, スニッファー、その他: http://www.snort.org
   
    http://www.mynetwatchman.com と http://dshield.org は"分散侵入検出 
    システム"です。これは前もって用意した"エージェントたち" によってロ 
    グを集め、データを解析することで邪悪な活動を見つけて報告してくれま 
    す。反撃したいなら、これをチェックしましょう。                     
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

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. コンピュータがビープ音を鳴らすか、スクリ
ーンがフラッシュするまで、  キーを三回押します。 2. :q!  と
キー入力する。

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

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

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

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

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

    

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

'ed' エディタ

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

'ed' の強制終了

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

'pico' エディタ

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

pico -w file_2_edit

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

==> 'pico' の強制終了

 キーを押しながら文字 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. セキュアな代替物

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

 ・ telnet, rsh は ssh に。
   
 ・ ftp, rcp は scp または sftp に。両方とも ssh パッケージに含まれてい
    ます。また、もし Apache が既に走っていれば、 HTTP 経由でファイルは
    簡単に転送できます。 Apache は SSL (HTTPS) を用いることでさらにしっ
    かりと鍵をかけられます。
   
 ・ sendmail は postfix, qmail に。 sendmail の新しいバージョンらが安全
    でないと言っているわけではありません。ただ単に、これには今までの酷
    い歴史があり、あまりに広く用いられているので、クラッカーを呼び寄せ
    がちだということです。
   
    上で述べたように、Linux インストールはしばしば完全な機能のメイルサ
    ーバを含んでいます。これには有利な点がいくつかありますが、単純にメ
    イルを送ったり取って来るだけの多くの場合には不必要です。これは全て"
    メイルサーバデーモン"がローカルで走っていなくても可能なことです。
   
 ・ POP3 は SPOP3, SSL 経由の POP3 に。もし本当にあなた自身の POP サー
    バを運用する必要があるのならば、これがその正しい方法です。プロバイ
    ダのサーバからあなたのメイルを取ってくる場合は、プロバイダが提供す
    るものに従わざるを得ません。
   
 ・ IMAP を IMAPS に。上に同じ。
   
 ・ 特定のサーヴィスが必要で、それが自分自身だけ、または少数の友人だけ
    の場合には、それをその標準でないポートで走らせることを考えましょう
    。ほとんどのサーバデーモンでこれが可能ですし、接続する人たちがそれ
    を知っている限り問題はありません。例えば、sshd の標準ポート番号は
    22 番です。どのワームやスキャンもこのポート番号をプローブするでしょ
    う。ですから、これをランダムに選んだポート番号で走らせるのです。詳
    しくは sshd の man ページを参照してください。
   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

8.10. ipchains と iptables 再び

この章では ipchains と iptables にできることのいくつかをもう少し詳しく
見てみます。これらは基本的には上のステップ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 チェインの両方に用いら
れています。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

9. 日本語版謝辞

校正を担当してくださった渡辺崇史さんと山下義之さん、貴重なご意見をいた
だいた JF メンバに御礼申し上げます。誤字・脱字・誤訳等なにかありました
ら  までお知らせください。

一覧に戻る
グリーンネット・トップページへ戻る

http://www.green.ne.jp/