Linux Security HOWTO Kevin Fenzi, kevin@scrye.com & Dave Wreski, dave@nic.com v1.0.2, 25 April 1999 The Linux Japanese FAQ Project 17 May 1999 このドキュメントでは,Linux システムの管理者が遭遇するセキュリティ関連 事項についての一般的な解説を行います.このドキュメントでは,セキュリ ティに対する一般的な考え方と,Linux システムを侵入者からより安全にする 方法の具体例を扱っています.また,セキュリティ関連の情報やプログラムへ のポインタも含まれています.改善,建設的な批判,追加,訂正は歓迎しま す.フィードバックを両方の著者に送ってください.その際にはサブジェクト に「Security HOWTO」という文字列を入れてください. ______________________________________________________________________ 目次 1. はじめに 1.1 このドキュメントの最新版について 1.2 フィードバック 1.3 免責事項 1.4 著作権表示 1.5 日本語訳について 2. 概要 2.1 なぜセキュリティが必要なのか 2.2 どの程度安全なら安全なのか? 2.3 何を守るのか? 2.4 セキュリティポリシーの作成 2.5 自分のサイトを安全にすることの意義 2.5.1 ホストのセキュリティ 2.5.2 ネットワークのセキュリティ 2.5.3 隠蔽によるセキュリティ 2.6 本ドキュメントの構成 3. 物理的なセキュリティ 3.1 コンピュータへの施錠 3.2 BIOS のセキュリティ 3.3 ブートローダのセキュリティ 3.4 xlock と vlock 3.5 物理的な攻撃を受けたことの発見 4. ローカルのセキュリティ 4.1 新規アカウントの作成 4.2 root のセキュリティ 5. ファイルとファイルシステムのセキュリティ 5.1 umask の設定 5.2 ファイルのパーミッション 5.3 Tripwire による,システムが無傷であるかどうかのチェック Tripwire 5.4 トロイの木馬 5.5 パスワードのセキュリティと暗号化 5.6 PGP 及び公開鍵暗号 5.7 SSL, S-HTTP, HTTPS, S/MIME 5.8 Linux における IPSEC の実装 5.9 ssh (Secure Shell) と stelnet 5.10 PAM - 交換可能な認証モジュール 5.11 暗号による IP のカプセル化 (Cryptographic IP Encapsulation, CIPE) 5.12 Kerberos 5.13 シャドウパスワード 5.14 "Crack" および "John the Ripper" 5.15 CFS (暗号化ファイルシステム)と TCF(透過的暗号化ファイルシステム) 5.16 X11, SVGA, ディスプレイに関するセキュリティ 5.16.1 X11 5.16.2 SVGA 5.16.3 GGI (Generic Graphics Interface project) 6. カーネルのセキュリティ 6.1 バージョン 2.0 のカーネルのコンパイルオプション 6.2 バージョン 2.2 のカーネルのコンパイルオプション 6.3 カーネルデバイス 7. ネットワークのセキュリティ 7.1 パケット盗聴 7.2 システムサービスと tcp_wrappers 7.3 DNS 情報の確認 7.4 identd 7.5 SATAN, ISS その他のネットワーク探査プログラム 7.5.1 ポート探査を受けたことの検出 7.6 sendmail, qmail 等の MTA 7.7 サービス妨害攻撃 7.8 NFS (Network File System) のセキュリティ 7.9 NIS (Network Information service) (かつての YP) 7.10 防火壁(ファイアウォール) 7.11 IP Chains - Linux カーネル 2.2.x における防火壁の構築 7.12 仮想プライベートネットワーク(VPN, Virtual Private Network) 8. セキュリティの準備 (ネットワークに接続する前に) 8.1 マシン全体のバックアップの作成 8.2 適切なバックアップ計画の決定 8.3 RPM ファイルデータベースや Debian のファイルデータベースのバックアップ 8.4 システムログの監視 8.5 システム更新パッケージの適用 9. システムに侵入された場合や現在侵入されている場合の対応 9.1 セキュリティが破られている最中 9.2 既にセキュリティが破られてしまった場合 9.2.1 セキュリティの穴を塞ぐ 9.2.2 被害の見積り 9.2.3 バックアップ,バックアップ,バックアップ! 9.2.4 侵入者を突き止める 10. セキュリティ関係の情報源 10.1 FTP サイト 10.2 ウェブサイト 10.3 メーリングリスト 10.4 書籍 11. 用語解説 12. よくある質問 13. まとめ 14. 謝辞 ______________________________________________________________________ 1. はじめに このドキュメントでは,Linux のセキュリティに関わる主な話題をいくつか扱 います.一般的な考え方とネット上で生まれたリソースについて議論します. 他の HOWTO ドキュメントの多くとセキュリティの話題で重なる部分がありま すが,このようなドキュメントは適当な場所で示します. このドキュメントは,最新の問題を扱うものでは「ありません」.常に新しい 被害がたくさん起きています.このドキュメントは最新の情報をどこで見れば 良いのかを示し,そのような悪用をされないための一般的な方法を示します. 1.1. このドキュメントの最新版について このドキュメントの最新版は定期的にcomp.os.linux.answersに投稿されま す.また,以下に示すような,ドキュメント関連の情報を集めている FTP サ イトにも置かれるでしょう: ftp://metalab.unc.edu/pub/Linux/docs/HOWTO また,Linux のウェブページでも本ドキュメントを見つけることができるで しょう. http://metalab.unc.edu/mdw/linux.html 最後に,本ドキュメントの最新版(各種形式があります)は以下のサイトで入手 できます. http://scrye.com/~kevin/lsh/ 1.2. フィードバック コメント,誤りの報告,追加情報,批判などは以下のメールアドレスに送って ください: kevin@scrye.com および dave@nic.com 注意: フィードバックは両方の著者に送ってください.また,Kevin が使って いるスパムフィルタを避けるため,サブジェクトには "Linux", "security", "HOWTO" のいずれかを必ず入れてください. 訳注: 日本語訳に関する誤りの指摘や,フィードバックはしたいけれど英語は 苦手だという方は JF プロジェクト() までご連絡くださ い. 1.3. 免責事項 No liability for the contents of this document can be accepted. Use the concepts, examples and other content at your own risk. Additionally, this is an early version, possibly with many inaccuracies or errors. A number of the examples and descriptions use the RedHat(tm) package layout and system setup. Your mileage may vary. As far as we know, only programs that, under certain terms may be used or evaluated for personal purposes will be described. Most of the programs will be available, complete with source, under GNU terms. 訳注: 日本語訳も挙げておきますが,これはあくまで参考です. 本ドキュメントの内容についての責任は一切持ちません.あなた自身の責任で 概念,実行例,その他の内容を利用してください.また,本ドキュメントは書 いたばかりのバージョンなので,おそらく不正確な部分や間違いがあると思わ れます. 例および説明の多くは RedHat(tm)パッケージに基づいています.読者の使用 しているパッケージによって手順が変わることがあるでしょう. 筆者の知っている限りで,個人目的で使用あるいは評価ができる使用条件のプ ログラムについて解説します.ほとんどのプログラムは GNU の条項に従い,完全なソースコー ド付きで配布されています. 1.4. 著作権表示 This document is copyrighted (c)1998,1999 Kevin Fenzi and Dave Wreski, and distributed under the following terms: o Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium, physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the authors would like to be notified of any such distributions. o All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below. o If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at tjbynum@metalab.unc.edu 訳注: 日本語訳も挙げておきますが,これはあくまで参考です. Copyright (c)1998,1999 Kevin Fenzi and Dave Wreski このドキュメントは Kevin Fenzi と Dave Wreski の著作物であり,以下の条 項に基づいて配布されています: o Linux HOWTO ドキュメントは,この著作権表示が全ての複製物に残されて いる限り,全体あるいは一部分を複製・配布すること,任意の物理メディ アや電子メディアで複製・配布することができます.商業的な再配布は奨 励されていますが,このような配布を行う場合には著者らに連絡すること を希望します. o 翻訳,派生物,Linux HOWTO ドキュメントのいずれかを集めた収集物全て はこの著作権表示に従わなければなりません.つまり,HOWTO ドキュメン トから派生したドキュメントを作り,これに制限を追加することはできま せん.特定の条件の下では,これらの規則には例外が認められます.以下 にアドレスを示す Linux HOWTO の世話人と相談してください. o 疑問点があれば,Linux HOWTO の世話人である Tim Bynum までご連絡くだ さい.アドレスは以下に示します. tjbynum@metalab.unc.edu 1.5. 日本語訳について 日本語訳は Linux Japanese FAQ Project が行いました (藤原輝嘉 (日本語訳),長谷川靖 (校正),関戸幸一 (校正,訳注),菱川功 (校正,訳注),高城正平 (校正) ).日本語訳に関する権利は原文に準ず るものとします. 2. 概要 本ドキュメントでは,Linux システムをより安全にするための方法と,よく使 われるソフトウェアについて解説します.具体的な内容に入る前に,基本的な 概念について議論し,セキュリティの基礎を押えておくことにしましょう. 2.1. なぜセキュリティが必要なのか 常に変化し続ける,グローバルなデータ通信,安価なインターネット接続,速 いペースのソフトウェア開発の世界の中で,セキュリティはより重要になりつ つあります.グローバルコンピューティングは本質的に危険なので,セキュリ ティは今や基本的な要件です.例えばデータが A 地点から B 地点までインタ ーネット上で送られる場合を考えると,データは経路の途中で他の地点を通る ので,他人がデータを傍受や改竄さえしてしまう可能性があります.同じシス テム上のユーザでさえ,あなたのデータを悪意を持って意図しないようなもの に変えてしまうかもしれません.「クラッカー」として知られる侵入者に,シ ステムのアクセス権を不正に得られてしまうかもしれません.クラッカーはあ なたになりすますために高度な知識を用い,あなたからデータを盗んだり,あ なたが自分自身のデータにアクセスできないようにしてしまいます.あなたが 「ハッカー」と「クラッカー」の違いが分かっていないようであれば,Eric Raymond 氏の書かれた「ハッカーになる方法(How to Become A Hacker)」を御 覧ください.(http://sagan.earthspace.net/~esr/faqs/hacker-howto.html で入手できます.) 訳注: 「ハッカーになる方法(How to Become A Hacker)」の日本語訳は http://www.linux.or.jp/JF/JFdocs/hacker.txt または http://www.post1.com/home/hiyori13/freeware/hacker.html で入手できま す. 2.2. どの程度安全なら安全なのか? 最初に,「完全に安全な」コンピュータシステムは存在しないことを覚えてお いてください.ただ,何者かがシステムを悪用することをより困難にすること しかできません.普通の Linux のホームユーザならば,偶然やってくるク ラッカーを防ぐのはそれほど大変ではありません.Linux を重要な仕事に使っ ている場合(銀行,通信業者など)には,ずっと多くの作業が必要になるでしょ う. 考慮に入れるべき別の要素として,セキュリティを高めれば高めるほど,セ キュリティが邪魔になることが挙げられます.そこで,目的に対して十分使い やすくかつ安全なシステムとなるように,バランスをとってやらなければなり ません.例えば,あなたのシステムに電話回線で接続してくる全てのユーザに コールバックモデムを使ってもらい,彼らの家にコールバックするようにする ことができます.これによって安全な運用をすることができますが,ユーザが 家にいないようなケースではログインが困難になってしまいます.Linux シス テムをネットワークやインターネットに繋がない設定も可能ですが,これでは 便利さも損なわれてしまいます. 大規模あるいは中規模のサイトならば,サイトがどの程度のセキュリティを必 要としていて,これをチェックするためどんな監査を行うのかというセキュリ ティポリシーを決めるべきです.有名なセキュリティポリシーの例は http://core.ring.gr.jp/pub/doc/rfc/rfc2196.txtです.これは最近改定され ており,会社のセキュリティポリシーを作る際の良い枠組になります. 訳注: 日本語訳が http://www.ipa.go.jp/SECURITY/rfc/RFC2196-00JA.html にあります. 2.3. 何を守るのか? システムを安全にしようとする前に,まず,どの程度のレベルの脅威から自身 を守るのか,どの程度のリスクを冒すべきなのか(あるいは冒すべきでないの か),結果的にシステムはどの程度脆弱なままにするのかを決めなくてはなり ません.何を守るのか,なぜそれを守るのか,それにどんな価値があるのか, データや他の財産に対しての責任は誰が負うのかを知るために,システムを解 析すべきです. o リスクとは,侵入者がシステムへのアクセスに成功する可能性です.侵入 者はファイルの読み書きをしたり,害をなすプログラムを実行できるで しょうか?重要なデータを消すことができるでしょうか? 重要な仕事の妨 害ができるでしょうか? 忘れてはならないのは,誰かがあなたのアカウン トやシステムへのアクセス権を手に入れてしまえば,その人はあなたにな りきることができてしまうということです. 加えて,安全でないアカウントがシステム上に1つあれば,結果的にネット ワーク全体が悪用される可能性があります..rhost ファイルを使ったログ インを許可しているユーザがいたり,tftp のような安全でないサービスを 使っている場合,侵入者がこれらを利用して「ドアの中に足を踏み入れ る」危険を背負うことになります.いったん侵入者があなたや他の誰かの システムのアカウントを手に入れれば,それは他のシステムや他のアカウ ントにアクセスするために利用されるかもしれません. o 脅威は概して,誰かがネットワークやコンピュータに許可なしにアクセス しようとすることから生じます.誰を信用してあなたのシステムにアクセ スさせるのか,そしてその人がどのような脅威をもたらすのかを考えてお かなければなりません. 侵入者にはいくつかのタイプがあります.その特徴を知っておくと,シス テムを安全にするのに役立つでしょう. o 好奇心 - このタイプの侵入者は基本的に,あなたがどんなシステムやデー タを持っているのか知ることに興味を持っています. o 悪意 - このタイプの侵入者は,あなたのシステムをダウンさせたり,ウェ ブページに落書きをするなど,復旧に金や時間がかかることをしようとし ます. o 名声 - このタイプの侵入者は,名声や悪名を得るためにシステムに侵入し ようとします.自分の能力を宣伝するために,名の通ったシステムに侵入 しようとします. o 競争相手 - このタイプの侵入者は,あなたがシステム上にどんなデータを 置いているのかに興味を持っています.この侵入者は,あなたが金銭的あ るいはそれ以外の方法で利益をもたらす何かを持っていると思っているの でしょう. o 借用 - このタイプの侵入者はあなたのシステムに作業場を作り,その資源 を自分のために使うことに興味を持っています.彼らは普通はチャットや IRC サーバ,ポルノアーカイブのサーバ,あるいは DNS サーバまで実行し ます. o 踏台 - このタイプの侵入者は,あなたのシステムを使って他のシステムに 侵入することしか考えていません.あなたのシステムの接続状態が良かっ たり,多数の内部システムに継っているゲートウェイならば,このタイプ の侵入者があなたのシステムを悪用しようとしていることがよく起こるか もしれません. o システムの脆弱さは,あなたのコンピュータが他のネットワークからどの 程度守られているかということや,誰かが不正なアクセスをする潜在的な 可能性を示します. 何者かがシステムに侵入した場合,何が問題となるのでしょうか? 当然な がら,家庭から PPP でダイアルアップ接続しているユーザの問題と,会社 のマシンをインターネットや他の大規模ネットワークに繋いでいる人々の 問題は異なります. 失ったデータを復旧あるいは再び作成するのにどれくらいの時間が必要で しょうか? ちゃんと初期投資をしておけば,後で失ったデータを再作成す るはめになったときにかかる時間は10分の1に節約できます.バックアップ の計画をチェックし,あとでデータの検証をしていますか? 2.4. セキュリティポリシーの作成 ユーザが容易に理解して守ることができる,簡単で一般的な方針を決めましょ う.この方針は大切なデータやユーザのプライバシーを守ってくれるでしょ う.これに加えて考えるべきことは,誰がシステムにアクセスできるのか(自 分の友人に自分のアカウントを使わせていいのでしょうか?),誰がシステム にソフトウェアをインストールすることができるのか,誰がどのデータを所有 するのか,それから事故時の復旧やシステムの適切な使いかたについてです. 一般に受け入れられているセキュリティポリシーは次の言葉から始まります. "許されていないことは禁止されている" これは,あるサービスをユーザに対して認めていない場合,許可を出すまでは ユーザはそのサービスを使うべきではないということです.正規ユーザアカウ ントに適用するポリシーを確認しましょう.「えっと,パーミッションの問題 がわからないので,root で実行しよう」などと言うことは,明らかなセキュ リティホールになりますし,今まで不正使用されたことのないセキュリティホ ールにさえなるかもしれません. rfc1244 は独自のネットワークセキュリティポリシーを作るための指針が書か れたドキュメントです. rfc1281 はセキュリティポリシーの例を示したドキュメントであり,各ステッ プの詳細な説明が付いています. 最後に,ftp://coast.cs.purdue.edu/pub/doc/policy にある COAST ポリシー アーカイブを調べ,実生活でのセキュリティポリシーがどのようなものかを見 ると良いでしょう. 2.5. 自分のサイトを安全にすることの意義 本ドキュメントでは,あなたが作ってきた貴重な財産(ローカルマシン,デー タ,ユーザ,ネットワーク,あなたの評判)を守るための方法を議論します. 侵入者があなたのユーザのデータを消してしまったら,あなたの評判はどうな るでしょう? あなたのウェブページに落書きをされてしまったらどうなるで しょう? また,あなたの会社の次の四半期の計画をばらされてしまったら? ネットワークのインストールを考えているならば,1 台のマシンをネットワー クにつなぐ前に考慮すべき要素はたくさんあります. あなたがダイアルアップ PPP アカウントを使っていたり,ごく小規模なサイ トを運営している場合であっても,侵入者があなたのシステムに興味は持たな いとは限りません.標的にされるのは,大規模で有名なサイトだけではありま せん.多くの侵入者は規模に関係なくできるだけ多くのサイトを不正使用しよ うとします.加えて,侵入者はあなたが接続する先のサイトにアクセスするた め,あなたのサイトのセキュリティホールを突くかもしれません. 侵入者は時間を持て余しており,あなたがどんなにシステムを隠蔽しても,推 測するのではなく,単に全ての可能性を試してしまいます.侵入者があなたの システムに興味を持つ理由は他にもたくさんありますが,それについては後で 議論します. 2.5.1. ホストのセキュリティ 管理者が最も集中するセキュリティの分野は,たぶんホストに基づく部分で しょう.これは基本的に,自分自身のシステムの安全を確保し,自分のネット ワーク上の他のホストも同様であることを期待することです.良いパスワード を選び,LAN へのサービスを安全に行い,きちんとログを取り,セキュリティ に問題があることが知られているプログラムのバージョンアップを行うこと は,ローカルのネットワーク管理者が責任を持って行うべきことです.これは 絶対に必要なことなのですが,ネットワークの規模が数台規模より大きくなる と実際に行うことが大変になってしまいます. 2.5.2. ネットワークのセキュリティ ネットワークのセキュリティもローカルのホストのセキュリティと同様に必要 です.何百,何千,あるいはそれ以上のコンピュータが同じネットワークにあ る場合,そのそれぞれが安全であると信頼することはできません.許可された ユーザしか自分のネットワーク資源にアクセスできないようにし,防火壁を構 築し,強力な暗号を使用し,「たちの悪い」マシンや安全でないマシンがネッ トワーク上に無いようにすることは,全てネットワーク管理者の任務です. 本ドキュメントではサイトを安全にするために使われる技術のいくつかについ て議論し,守るべきものを侵入者にアクセスさせないようにする方法をいくつ か示します. 2.5.3. 隠蔽によるセキュリティ 議論すべきセキュリティのタイプの 1 つは「隠蔽によるセキュリティ」で す.これは例えば,セキュリティ的な弱点が知られているサービスを標準でな いポートに移動させ,攻撃者に存在がばれないようにして悪用を避けようとす るものです.このようなものは心配しなくても攻撃者が見つけて悪用してくれ ます.隠蔽によるセキュリティは,セキュリティ的には全く無意味です.単に 小規模なサイトや比較的無名なサイトであるからといって,侵入者があなたの 持っているものに興味を持たないわけではありません.次の章で,あなたが守 るものについて議論します. 2.6. 本ドキュメントの構成 本ドキュメントはいくつもの章に分かれています.各章でセキュリティのおお まかな話題を押さえます.最初の話題は ``物理的なセキュリティ''で,マシ ンそのものを物理的にいじられないようにするための方法です.第 2 の話題 は ``ローカルのセキュリティ''で,ローカルユーザがシステムを改竄するの を防ぐ方法です.3 番目の話題は ``ファイルとファイルシステムのセキュリ ティ'' で,ファイルシステムとファイルのパーミッションの設定の方法を示 します.次の話題は ``パスワードのセキュリティと暗号化''で,マシンや ネットワークをより安全にするための暗号の使い方を議論します. ``カーネ ルのセキュリティ''では,マシンをより安全にするために設定あるいは意識す べきカーネルオプションについて議論します. ``ネットワークのセキュリ ティ''では, Linux システムを外部ネットワークからの攻撃に対してより安 全にする方法を解説します.``セキュリティの準備''では,マシンをネットワ ークに繋ぐ前の準備のやりかたについて議論します.次の ``システムに侵入 された/されている場合の対応'' では,システムに侵入されつつあることや侵 入が最近に起こったことに気づいた場合にすべきことを議論します. ``セ キュリティに関する情報源''では,セキュリティに関する基本的な情報源をい くつか示し, Q & A の章である``よく聞かれる質問''ではよく聞かれる質問 いくつかに対する回答を示します.最後に ``最後に'' の章で結びの言葉を述 べます. 本ドキュメントを読んで理解していただきたいポイントは主に2つあります. o システムに注意を払いましょう./var/log/messages 等のシステムログを チェックし,システムを見張りましょう. o 最新バージョンのソフトウェアをインストールし,セキュリティの警告が 出されればソフトウェアをアップグレードすることで,システムを常に最 新の状態にしましょう.単純にこれを行うだけで,システムは劇的に安全 になります. 3. 物理的なセキュリティ 最初に考慮すべきセキュリティの層は,コンピュータシステムの物理的なセ キュリティです.誰がマシンへ直接触ることができるのか? 触ることができ るべきなのか? また,彼らがマシンをいじれないよう守れるのか? あるいは 守るべきなのか? 物理的なセキュリティがどの程度必要になるかは,大抵の場合,状況や予算に よって決まります. もしあなたがマシンを自分の家で使っているのならば,たぶん注意すべきこと はあまりないでしょう(子供やうるさい親戚からマシンを守る必要はあるかも しれませんが).研究室ならば,かなり注意しなければならないでしょうが, ユーザはそのマシンで仕事をできる必要があります.そのためには以下の各章 が参考になるでしょう.あなたがオフィスにいるならば,終業後やあなたが席 を離れているときにマシンを安全にしておく必要があるかもしれませんし,そ の必要は無いかもしれません.会社によっては,コンソールを放置することは クビにされる程の規則違反です. ドアの施錠やケーブル,鍵付きのキャビネット,ビデオ監視装置等のわかりや すい物理的な防御方法は全て良い考えなのですが,このドキュメントの守備範 囲ではありません :-) 3.1. コンピュータへの施錠 最近の PC ケースの多くには「鍵」が付いています.普通はケースの前面に鍵 穴があり,鍵を施錠か解除の位置にセットできるようになっています.ケース の鍵によって,何者かが PC を盗んだり,ケースを開けて直接ハードウェアを いじったり盗んだりすることを防ぐことができます.ケースによっては,フ ロッピーディスクや他の機器によるマシンの再起動を防ぐことができます. マザーボードのサポートやケースの作りによっては,ケースの鍵で色々なこと ができます.多くの PC ではケースを開けるためにはこれを壊さなくてはなり ません.また,新しいキーボードやマウスを挿せないものもあります.詳しく はマザーボードやケースの説明書を読んでください.通常,鍵の質はとても低 く,攻撃者は偽造によって簡単に破ることができるのですが,それでも鍵はと ても便利な機能になり得ます. ケース(特に Sun SPARC や Macintosh)によっては,背面にドングル(dongle) が付いていて,これを通してケーブルを繋げば,ケーブルを切るかケースを壊 さなければ攻撃者はケーブルを繋ぐことができません.これらに単に南京錠や 連結錠を付けることで,マシンを盗もうとしている人への大きな抑止効果が得 られます. 3.2. BIOS のセキュリティ BIOS はもっともハードウェアに近いレベルのソフトウェアで,x86ベースのハ ードウェアの設定及び操作を行います.LILO 等のブートローダは,BIOS にア クセスして Linux マシンをどうやってブートさせるか指示します.Linux の 他のプラットフォームでも同様のソフトウェアがあります(Mac や 新しい Sun の OpenFirmware, Sun の boot PROM 等).BIOS の設定で,攻撃者がマシンを 再起動して Linux システムを操作するのを防ぐことができます. 多くの PC BIOS では起動パスワードの設定をすることができます.これはそ んなに安全ではありません(BIOS はリセットすることができますし,ケースを 開けることができるなら取り外すこともできるでしょう)が,抑止効果は大き いでしょう(時間かせぎにもなりますし,システムをいじった痕跡も残るから です).同様に S/Linux (SPARC(tm)プロセッサのマシン用の Linux)では, EEPROM を設定して起動パスワードをかけることができます.これで侵入者を 足止めできるかもしれません. 多くの x86 マシンの BIOS では,この他にも役立つセキュリティ設定を色々 指定できます.BIOS のマニュアルを調べるか,次回のマシン起動時にチェッ クしてみましょう.例えば,フロッピーディスクでの起動を禁止できる BIOS もありますし,一部の設定にパスワードをかけることができる BIOS もありま す. 注意: サーバマシンを管理していて,起動パスワードを設定している場合,人 がいないとマシンは起動しません.停電などの時は,マシンの所に行ってパス ワードを打ち込んでやる必要があることを覚えておきましょう. ;-( 3.3. ブートローダのセキュリティ 色々なブートローダにも起動パスワードを設定することができます.例えば LILO を使っている場合には,password と restricted の設定を調べてみま しょう.password は起動時に必ずパスワードを要求するようにしま す.restricted の場合は,LILO プロンプトに対してオプショ ン(single等)を指定した場合だけ起動パスワードを要求するようになります. パスワードを設定したら,これを忘れてはならない点に注意してくださ い.:-) また,気合いの入った攻撃者に対しては,このようなパスワードは単 なる足止め程度にしかならないことも忘れてはいけません.この方法では誰か がフロッピーディスクから起動してルートパーティションをマウントすること を防ぐことはできません.ブートローダと組み合わせたセキュリティ手法を使 う場合には,コンピュータの BIOS でフロッピーディスクからの起動を無効に することができますし,BIOS をパスワード保護することもできます. LILO 以外のブートローダ(grub, silo, milo, linload 等)のセキュリティ関 連情報をご存知ならば,ぜひお知らせください. 注意: サーバマシンにパスワードを設定した場合,人がいないとマシンは起動 しなくなります.停電などの場合でも,マシンのところに行ってパスワードを 打ち込まなければならないことは覚えておきましょう. ;-( 3.4. xlock と vlock 頻繁にマシンから離れて出歩くならば,コンソールに「鍵」を掛け,誰もマシ ンをいじったり,作業の様子を覗けないようにしておくと良いでしょう.この ようなプログラムとして,xlock と vlock の 2 つを紹介します. xlock は X のディスプレイをロックします.X をサポートしている Linux の ディストリビューションならば,普通 xlock はインストールされているで しょう.オプションについてはオンラインマニュアルを参照してほしいのです が,大まかに説明すると,ロックしたいコンソール上の xterm から xlock を 起動すると,ディスプレイがロックされ,パスワードを入力しないとこれを解 除できなくなります. vlock は Linux の仮想コンソールの一部あるいは全てをロックするための簡 単なプログラムです.現在作業中のコンソールを 1 つだけロックすることも できますし,全てをロックすることもできます.仮想コンソールを 1 つロッ クしている場合,他の人はコンソールを使うことができます.ですが,ロック されている仮想端末はロックが解除されるまでは使うことができません. vlock は RedHat Linux には入っていますが,入っていないディストリビュー ションもあるかもしれません. 当然ながら,コンソールをロックすれば何者かにあなたの作業をいじられるの を防ぐことはできますが,マシンを再起動されたりしてやりかけの作業が壊さ れることは防げません.また,ネットワーク上の他のマシンからコンソールを ロックしたマシンにアクセスして問題を起こすことを防ぐこともできません. さらに重要な点としては,誰かが X ウィンドウシステムから完全に抜けて通 常の仮想コンソールのログインプロンプトに行くことや,X11 を起動した仮想 コンソールに行き X をサスペンドさせ,ユーザの権限を奪ってしまうことを 防げない点が挙げられます.ですから,完全に xdm の制御下において使うこ とだけを考えるのがよいでしょう. 3.5. 物理的な攻撃を受けたことの発見 まずは,マシンをいつ再起動したのか必ず記録するようにしましょう.Linux は頑健で安定な OS ですから,あなたがマシンを再起動するのは OS のアップ グレードやハードウェアの交換等の時だけでしょう.あなたが知らないうちに マシンが再起動されていたら,これは侵入者に悪用されたことの印かもしれま せん.侵入者がマシンに物理的な攻撃をする手段の多くは,マシンを再起動し たり,電源を切ったりしなければならないからです. ケースやコンピュータ周辺をいじられた兆候が無いかどうかチェックしましょ う.侵入者は普通ログから痕跡を消しますが,これらを全てチェックし,矛盾 が無いか調べるのも良いでしょう. ログのデータを安全な場所(きちんと守られたネットワーク内部の専用のログ サーバ等)に置くのも良い考えです.あるマシンが悪用された場合には,ログ データはほとんど役に立たなくなるからです.というのも,侵入者は大抵ログ も書き換えてしまうからです. syslog デーモンを設定して,ログを自動的に中央のログサーバに送るように することもできますが,これは通常は平文のデータで送られます.したがっ て,侵入者は転送されているデータを見ることができます.これにより,公に するつもりのないネットワーク関係の情報が洩れてしまうかもしれません.デ ータを送る際に暗号化することができる syslog デーモンもあります. syslog のメッセージの偽造は容易である点にも注意してください.これを悪 用するためのプログラムも出回っています.syslog はローカルホストから出 されたと言っているネットワーク経由のログエントリであっても,本当の送信 元を示すことなく受け付けてしまいます. ログを調べる際には以下の点に注意します. o ログが短かったり,不完全ではないか o ログに記録されている時間はおかしくないか o ログのパーミッションや所有者はおかしくないか o システムそのものや,サービスの再起動は記録されていないか o 無くなっているログはないか o おかしな場所から su や login が行われていないか システムログデータについては,この HOWTO 内の ``後の章''で説明します. 4. ローカルのセキュリティ 次にローカルユーザの攻撃に対するシステムのセキュリティについて考えま す.そうです,ローカルのユーザに対してです. ローカルユーザのアカウントの獲得は,攻撃者が root のアカウントを破ろう とする際に最初に考えることの一つです.ローカルに対するセキュリティが甘 ければ,様々なバグやローカル向けのサービスのまずい設定を利用して,一般 ユーザの権限から root ユーザの権限へ「アップグレード」することができる のです.ローカルに対するセキュリティが強固であれば,侵入者が越えなけれ ばならないハードルはまだ残ることになります. ローカルユーザは,たとえ身元を詐称していなくても,システムに被害を与え ることができます.知らない人やコンタクトを取るための情報が無い人にアカ ウントを与えるのは,非常に危険なことです. 4.1. 新規アカウントの作成 アカウントを発行する際には,そのユーザが行う必要がある作業に対して必要 最小限のアカウントを与えるようにすべきです.息子(10才)にアカウントを与 えるのならば,ワープロやお絵描きプログラムにはアクセスできるけれど,自 分のものでないファイルを削除できないユーザにすべきでしょう. 他人に Linux マシンに対しての合理的にアクセスをしてもらうための,便利 な経験則があります. o 必要最小限の権限しか与えないようにする o いつ,どこからログインしたか,あるいはどこからログインすべきかに注 意を払う o 使われていないアカウントは必ず削除する o 全てのコンピュータとネットワークで同じユーザ ID を使うとよいでしょ う.これにより,アカウントの管理が楽になりますし,ログデータの解析 も容易になります. o グループユーザ ID の作成は絶対に禁止すべきです.ユーザアカウントで は責任の所在が明らかですが,グループアカウントではそうではないから です. セキュリティを破るときに使われるローカルユーザのアカウントの多くは,何 ヵ月あるいは何年も使われていないものです.誰も使っていないために,理想 的な攻撃の道具になってしまうのです. 4.2. root のセキュリティ あなたのマシンで最も欲しがられるアカウントは,root(ユーパーユーザ)のア カウントです.このアカウントはマシン全体に対する権限を持ち,ネットワー ク上の他のマシンに対する権限を持つこともあります.root のアカウントは できるだけ短時間の,特定の作業だけで使用し,それ以外の時は一般ユーザと してマシンを使用すべきです.root ユーザでログインしているとちょっとし たミスでも問題を起こしかねません.root 権限を持っている時間は短ければ 短いほど安全です. root 権限でマシンを壊してしまわないための仕掛けもいくつかあります. o 複雑なコマンドを実行するとき,特に globbing を使う(* や ? などのワ イルドカードを使用する)場合には,最初は失敗しても悲惨な結果にならな い方法をとりましょう.例えば "rmoo*.bak" を実行する場合には,まず "ls foo*.bak" を実行し,考えているファイルだけが消されるようになっ ているか確認するのです.危険なコマンドの代わりに echo が使えること もあります. o ユーザに対して rm コマンドのエイリアスを設定しておき,ファイルの削 除の際に確認を行うようにします. o 特定の作業 1 つを行うためだけに root になりましょう.自分が,どう やって作業しようか考えているような状態だとしたら,root でやらなけれ ばならないことがはっきりするまでは,一般ユーザに戻りましょう. o root ユーザのコマンドパスはとても重要です.コマンドパス(つまり PATH 環境変数)はシェルがプログラムを探すディレクトリを指定します.root ユーザ用のコマンドパスはできる限り制限すべきですし, '.' (これは 「カレントディレクトリ」を意味します)を PATH の指定に入れては絶対に いけません.さらに,書き込み可能なディレクトリを検索パスに入れては いけません.というのも,そうなっていると攻撃者が検索パス上のファイ ルを書き換えたり置き換えたりでき,あなたがそのコマンドを次に使った ときに root 権限で動作させることができるからです. o root で rlogin/rsh/rexec コマンド群(いわゆる r-ユーティリティ)を 使ってはいけません.これらのコマンドは色々な攻撃の対象となるの で,root で実行するのは実に危険です.root ユーザ用の .rhosts ファイ ルは決して作ってはいけません. o /etc/securetty には root がログインできる端末のリストが書かれていま す.(RedHat Linux の)デフォルトでは,これにはローカルの仮想端末 (vty)だけが設定されています.このファイルにそれ以外の端末を追加する ときには,細心の注意を払ってください.必要がある時でも一般ユーザと して (できれば ``ssh'' 等の暗号化チャネル経由で) リモートログイン し,それから su することができるはずなので,直接 root としてログイ ンできる必要はありません. o root での作業は,必ずゆっくり,慎重に行いましょう.作業の結果は大き な影響をもたらすかもしれません.コマンドを打ち込む前に,まず考えま しょう! どうしても誰か(できれば非常に信頼している人)に root 権限を与える必要が ある場合にも,これを補助するツールがあります.sudo を使えば,ユーザの パスワードを使って,制限されたコマンド群を root の権限で使用させること ができます.これにより,例えば Linux マシンのリムーバブルメディアをユ ーザにイジェクトやマウントをさせるけれど,それ以外の root 権限は与えな いようにすることができます.sudo は成功・失敗を含めて全ての sudo の試 みをログに取ることができるので,誰が何のためにどのコマンドを使ったか調 査することができます.このため,sudo は多くのユーザが root 権限を持つ ような環境でもうまく利用することができます.なぜならシステムに対して行 われた変更を調べやすくしてくれるからです. sudo を使って特定のユーザに特定目的のための特定の権限を与えることがで きますが,sudo には欠点がいくつかあります.sudo は,サーバの再起動やユ ーザの新規追加など,限られた作業の組に対してだけ使うべきです.シェルエ スケープができる任意のプログラムは,これを sudo を通して使ったユーザに root 権限を与えてしまいます.例えば,大部分のエディタがこれに該当しま す.また,/bin/cat のように無害なプログラムであってもファイルの上書き に使うことができるので,これを使って root 権限が破られることもあり得ま す.sudo は権限を使わせるための手段と考えるべきであり,root ユーザをよ り安全にするために置き換えるものと期待してはいけません. 5. ファイルとファイルシステムのセキュリティ システムをネットワークに繋ぐ前に少し準備と計画を行うだけで,システムと その中のデータを守るのに役立つでしょう. o ユーザのホームディレクトリに SUID/SGID したプログラムを置いて,これ を実行させる理由は全くありません.root 以外のユーザが書き込み可能な パーティションに対しては /etc/fstab で nosuid オプションを使いま しょう.また,ユーザのホームパーティションや /var では nodev や noexec を使おうと考えるかもしれません.これらのオプションはプログラ ムの実行や,キャラクタデバイス・ブロックデバイスの作成を禁止しま す.これらはいずれにせよ必要無いはずです. o NFS を用いてファイルシステムをエクスポートしている場合は必ず,アク セスをできる限り厳しく設定してください.つまり /etc/exports ででき る限り厳しいアクセス制限を行ってください.これはワイルドカードを使 わないこと,root での書き込みアクセスを許可しないこと,できる限り読 み取り専用でエクスポートするということです. o ファイル作成の umask をできる限り厳しく設定してください. ``umask の設定'' をご覧ください. o NFS 等のネットワークファイルシステムを用いてファイルシステムをマウ ントしているならば,必ず /etc/exports で適切な制限を付けた設定にし てください.普通は `nodev', `nosuid', それから多分 `noexec' が望ま しいでしょう. o デフォルトの unlimited を認めるのではなく,ファイルシステムに制限値 を設定しましょう.リソース制限を行う PAM モジュールと /etc/pam.d/limits.conf を使って,ユーザ別に制御することができます. 例えば,グループ users の制限は以下のようになります: @users hard core 0 @users hard nproc 50 @users hard rss 5000 この設定は,コアファイルの作成を禁止し,プロセスの数を 50 に制限し,メ モリの使用量をユーザ 1 人あたり 5MB に制限するものです. o /var/log/wtmp, /var/run/utmp ファイルには,システムの全てのユーザの ログイン記録が記録されています.このファイルは絶対いじられないよう にしなくてはなりません.というのも,このファイルを使ってユーザ(ある いは侵入者である可能性がある人)がいつ,どこからシステムに入ったのか を知ることができるからです.このファイルのパーミッションは 644 にす べきです.この設定は通常のシステム操作に影響を与えません. o immutable ビットを使うと,守らなくてはならないファイルを事故で消し たり上書きすることを防ぐことができます.このビットを使って,誰かが このファイルに対するシンボリックリンクを作成することを防ぐこともで きます(こういったシンボリックリンクは今まで /etc/passwd や /etc/shadow の削除を含む攻撃の手段となってきました). immutable ビットの情報については,オンラインマニュアルの chattr(1) を参照して ください. o SUID, SGID されたファイルがシステムにあるとセキュリティにとっては潜 在的に危険なので,これらのファイルはよく監視していなければなりませ ん.このようなプログラムは実行したユーザに特別な権限を与えるので, 安全でないプログラムが絶対にインストールされないようにする必要があ ります.クラッカーが好んで使うトリックとして,root に SUID されたプ ログラムをいじり,元のセキュリティホールが塞がれても次回に使える裏 口として,SUID されたプログラムを残しておく方法があります. システム上の SUID/SGID されたプログラムを全て見つけ,それらがどう なっているかを監視します.侵入者の可能性を示すこれらのファイルの変 化に注意してください.システム上の SUID/SGID されたプログラムを全て 見つけるには以下のコマンドを使います: root# find / -type f \( -perm -04000 -o -perm -02000 \) Debian ディストリビューションは,SUID されたファイルが存在するかどうか を調べるジョブを毎晩実行します.そして,これを昨晩の実行結果と比較しま す.このログは /var/log/suid* で参照できます. 怪しいプログラムは chmod を使って SUID や SGID のパーミッションを取り 除くことができます.どうしても必要だと思った時にはパーミッションを戻す こともできます. o 全てのユーザーが書き込み可能なファイル(特にシステムファイル)は,ク ラッカーがあなたのシステムにアクセスして,修正することによりセキュ リティホールとなりえます.さらに,世界中から書き込めるディレクトリ も,クラッカーが自由にファイルの追加・削除ができるため危険です.シ ステム上にあるこのようなファイルの位置を特定するには,以下のコマン ドを使います: root# find / -perm -2 ! -type l -ls それから,どうしてこれらのファイルが書き込み可能になったのかを確かめて ください.普通に操作している場合でも,/dev のいくつかのファイルやシン ボリックリンク等を含めて,世界中から書き込めるファイルがいくつかありま す.したがって,! -type l を用いて,先の find コマンドの結果からこれら を取り除いてください. o 所有者のいないファイルも侵入者がシステムにアクセスした可能性を示し ます.所有者がいないファイルや,どのグループにも属していないファイ ルは,以下のコマンドで見つけることができます: root# find / -nouser -o -nogroup -print o .rhosts ファイルを見つけることも,システム管理者の日常業務の一部で す.というのも,これらのファイルをシステムに置くことを許可するべき ではないからです.ネットワーク全体にアクセスする可能性を得るために は,クラッカーは安全でないアカウントが 1 つだけあれば良いということ を忘れないでください.システム上の全ての .rhosts ファイルは以下のコ マンドで見つけることができます: root# find /home -name .rhosts -print o 最後になりますが,システムファイルのパーミッションの変更は,しよう としていることを必ず理解してからにしてください.何かを動かすための 楽な方法だからといって,ファイルのパーミッションを変えてはいけませ ん.パーミッションを変える前には,ファイルのパーミッションがそう なっている理由を必ず理解してください. 5.1. umask の設定 umask コマンドを使って,システムのデフォルトのファイル生成モードを決め ることができます.umask 値は設定したいファイルモードの 8 進数での補数 になります.パーミッションに関する指定を何も行わずにファイルを生成する と,パーミッションを与えるべきでない何者かに対して読み書きのパーミッ ションを意図せずに与えてしまうかもしれません.通常は umask 値の設定は 022, 027, 077 です.077 は最も厳しい設定です.通常は umask 値は /etc/profile で設定され,システムの全ユーザに適用されます.ファイル生 成マスクは,777 から希望の値を引き算することによって計算することができ ます.言い換えると,umask 値が 777 であれば,新しく生成されるファイル は誰に対しても読み書きと実行のパーミッションを持ちません.マスクが 666 ならば,新しく生成されるファイルのモードは 111 となります.例えば,以 下のような行を設定することができます: # Set the user's default umask umask 033 root ユーザの umask 値は必ず 077 にしてください.こうしておくと,chmod を使って明示的に変えない限り,他のユーザの読み書きと実行は無効になりま す.この場合,新しく生成されるディレクトリはパーミッション 744 を持ち ます.この値は 777 から 033 を引いて得られたものです. umask 値 033 を 用いて新しく生成されるファイルはパーミッション 644 を持ちます. RedHat を使っており,RedHat のユーザ ID, グループ ID の作成方法(User Private Groups)に従う場合,umask には 002 だけ設定していれば十分で す.その理由は,デフォルトの設定で 1 グループに 1 ユーザしかいないため です. 5.2. ファイルのパーミッション システムファイルが,システム管理を行うべきでないユーザやグループの権限 によって変更できないようにしておくのは重要なことです. UNIX は ファイルとディレクトリのアクセス制御を 3 つの特性(所有者,グル ープ,全員)に分離しています.必ず 1 人だけの所有者,メンバー数が任意で あるグループ,それ以外の全員です. 以下で UNIX のパーミッションを簡単に説明します: 所有権(ownership) - あるノードやその親ノードのパーミッション設定をどの ユーザ,グループが行うことができるのかを示します パーミッション(permissions) - ファイルに対して行うことができるアクセス の種類を決めるビット列.組合せが同じでも,ディレクトリのパーミッション はファイルのパーミッションとは意味が異なることがあります. 読み出し(read): o ファイルの内容を見ることができる o ディレクトリの内容を見ることができる 書き込み(write): o ファイルの内容の追加,修正ができる o ディレクトリのファイルの消去やファイル移動ができる 実行(execute): o バイナリのプログラムやシェルスクリプトを実行できる o 読み出しのパーミッションと組み合わせて,ディレクトリ内を調べること ができる テキスト保存属性: (ディレクトリ用) ディレクトリに適用する場合,「sticky ビット」の意味はファイルに 適用する場合と異なります.sticky ビットがディレクトリに設定され ている場合に削除できるファイルは,そのディレクトリへの書き込み権 限があったとしても,自分が所有しているファイルか明示的に書き込み 許可が与えられているファイルだけです.このビットは /tmp のような ディレクトリのために用意されたものです.このようなディレクトリに は,世界中から書き込みできますが,どのユーザにも自由にファイルを 消すことを認めることは望ましくありません.ディレクトリを詳細表示 すると,sticky ビットは t で表されます. SUID 属性: (ファイル用) これはファイルへの SUID パーミッションを示します.ユーザ ID 設定 アクセスモードが所有者のパーミッションで設定されており,かつその ファイルが実行可能であれば,これを実行したプロセスは,プロセスを 起動したユーザではなくファイルを所有しているユーザに基づいてシス テムのリソースにアクセスできます.これは各種 'buffer overflow' 攻撃の原因となります. SGID 属性: (ファイル用) グループのパーミッションで設定されていれば,このビットはファイル の「グループ ID 設定」状態を制御します.これは SUID と同じように 動作しますが,ユーザではなくグループが影響を受ける点が異なりま す.このビットに効果を持たせるためには,やはりファイルは実行可能 でなければいけません. SGID 属性: (ディレクトリ用) (chmod g+s directory を行って)ディレクトリに SGID ビットを設定し た場合,このディレクトリに作られたファイルはディレクトリのグルー プに設定されたグループを持ちます. あなた - ファイルの所有者 グループ - あなたが所属するグループ 全員 - 所有者でもグループのメンバでもない,システム上の全員 ファイルの例: -rw-r--r-- 1 kevin users 114 Aug 28 1997 .zlogin 1番目のビット - ディレクトリか? (no) 2番目のビット - 所有者が読み出せるか? (yes, ユーザ kevin が可能) 3番目のビット - 所有者が書き込めるか? (yes, ユーザ kevin が可能) 4番目のビット - 所有者が実行できるか? (no) 5番目のビット - グループは読み出せるか (yes, users グループが可能) 6番目のビット - グループは書き込めるか? (no) 7番目のビット - グループは実行できるか? (no) 8番目のビット - 誰でも読み出せるか? (yes, 誰でも可能) 9番目のビット - 誰でも書き込めるか? (no) 10番目のビット- 誰でも実行できるか? (no) 以下の行は,アクセス権の説明に必要な最小限のパーミッションを集めた例で す.実際には,ここに示した以上のパーミッションを与えることが必要かもし れませんが,これらのファイルに関する最小限のパーミッションが意味すると ころは次のようなものです: -r-------- 所有者に読み込みアクセスを許可します --w------- 所有者にファイルの修正と削除を許可します (そのファイルが入っているディレクトリの書き込みパーミッショ ンを持つユーザは,ファイルの上書きや削除を行うことができます) ---x------ このプログラムの実行を許可します.シェルスクリプトの場合は これだけでは足りず,さらに読み込みパーミッションが必要です. ---s------ 「実効ユーザ ID = 所有者」として実行を行います -------s-- 「実効グループ ID = グループ」として実行を行います -rw------T 「最終更新時刻」を更新しません.通常はスワップファイルだけ に使います. ---t------ 無意味です(以前 sticky ビットだったものです). ディレクトリの例: drwxr-xr-x 3 kevin users 512 Sep 19 13:47 .public_html/ 1番目のビット - ディレクトリか? (yes, たくさんのファイルがある) 2番目のビット - 所有者は読み出せるか? (yes, ユーザ kevin が可能) 3番目のビット - 所有者は書き込めるか? (yes, ユーザ kevin が可能) 4番目のビット - 所有者は実行できるか? (yes, ユーザ kevin が可能) 5番目のビット - グループは読み出せるか?(yes, users グループが可能) 6番目のビット - グループは書き込めるか?(no) 7番目のビット - グループは実行できるか?(yes, users グループが可能) 8番目のビット - 誰でも読み出しできるか?(yes, 誰でも可能) 9番目のビット - 誰でも書き込めるか? (no) 10番目のビット- 誰でも実行できるか? (yes, 誰でも可能) 以下の行は,アクセス権の説明に必要な最小限のパーミッションを集めた例で す.示したもの以外にも多くのパーミッションが必要だと思うかもしれません が,これはこれらのファイルに対する最小限のパーミッションで記述できるは ずです: dr-------- 内容は表示できますが,ファイルの属性は読み出せません d--x------ ディレクトリに入れ,実行時に絶対パスの一部として使うことが できます. dr-x------ 所有者がファイル属性を読み出すことができます d-wx------ カレントディレクトリでなくても,ファイルの生成/削除が行え ます d------x-t 書き込み許可があっても他人はファイルを消すことを禁止します. /tmp で使われます. d---s--s-- 無意味です. システム設定ファイル(普通は /etc にあります)は通常,モードが 640(-rw- r-----)で,root が所有者です.サイトにおけるセキュリティの要求にした がって,これを調整することができます.システムファイルがグループや誰か らでも書き込めるようにしていてはいけません.一部のファイル (/etc/shadow 等)は root にしか読めない状態でなければなりませんし,少な くとも /etc 内にあるディレクトリはその他のユーザがアクセスできてはいけ ません. SUID されたシェルスクリプト SUID されたシェルスクリプトはセキュリティに重大な危険を及ぼすの で,カーネルはこれを無視します.そのシェルスクリプトがどれだけ安 全だと思っていても,これはクラッカーに root のシェルを奪われてし まう可能性を持っています. 5.3. Tripwire による,システムが無傷であるかどうかのチェック Tripwire ローカルからの(そしてネットワークからの)システムに対する攻撃を発見する 別の良い方法は, Tripwire のような,システムがいじられていないかどうか をチェックするプログラムを実行することです. Tripwire は重要なバイナリ や設定ファイル全てのチェックサムを取り,参照値として正しいことが分かっ ている以前の値のデータベースと比較します.したがって,これらのファイル の変更は全て知ることができます. Tripwire はフロッピーディスクにインストールし,このフロッピーを物理的 に書き込み禁止にするとよいでしょう.こうしておけば,侵入者も Tripwire そのものやデータベースを改竄することは不可能です. Tripwire を設定した ら,これを通常のセキュリティ管理作業の一部として実行し,何か変更がなさ れていないかチェックするとよいでしょう. 毎晩 フロッピーディスク上の Tripwire を実行し,朝にその結果をメールで 送るように crontab を設定することもできます.設定は以下のようになりま す. # set mailto MAILTO=kevin # run Tripwire 15 05 * * * root /usr/local/adm/tcheck/tripwire 実行結果は午前 5 時 15 分にメールで送られます. Tripwire は,他の方法で気づくよりも前に侵入者を発見する天の配剤になり 得ます.一般的なシステムでは多くのファイルが変更されますから, Tripwire を使う場合にはクラッカーの動きや,自分自身が行ったことに注意 していなくてはなりません. Tripwire は http://www.tripwiresecurity.comにあります.無料です.マ ニュアルとサポートは有料で入手することができます. 5.4. トロイの木馬 「トロイの木馬(Trojan Horse)」はホメーロスのイーリアスに書かれている有 名な計略に由来する名前です.基本的な考え方は,便利そうなプログラムやバ イナリを用意しておき,これを他人にダウンロードさせて root ユーザとして 実行させるというものです.これによって,相手が気づかないうちにシステム を悪用することができます.手に入れたバイナリが仕事をしている(とても役 立っているかもしれません)と思っている間に,このバイナリが同時にセキュ リティも破ってしまうのです. したがって,マシンにプログラムをインストールする時には注意が必要です. RedHat は MD5 チェックサムと PGP 署名を施した RPM ファイルを提供し,ユ ーザが本物のパッケージを入手しているのかどうかをチェックできるようにし ています.他のディストリビューションにも同様の仕組みがあります.素性が 知れず,ソースも提供されていないバイナリを root 権限で実行してはいけま せん! 誰もが調査できるようなソースコードを公開する攻撃者はほとんどい ません. 手間はかかるかもしれませんが,プログラムのソースコードはその正式の公開 サイトから入手するべきです.プログラムを root 権限で実行するならば,あ なたかあなたが信頼している人がソースコードを見て,検査すべきです. 5.5. パスワードのセキュリティと暗号化 現在用いられているセキュリティ機能のうち最も重要なものの1つがパスワー ドです.あなたとあなたのマシンのユーザの両方がパスワードを安全で推測し にくいものにしておくことが重要です.最近の Linux ディストリビューショ ンのほとんどには,簡単に推測できるパスワードは設定できないようになって いる passwd プログラムが入っています.passwd プログラムが最新のもの で,このような機能を持っているかどうか確かめておきましょう. 暗号化についての突っ込んだ議論は本書の範囲を越えてしまいますが,入門程 度ならば良いでしょう.暗号化は大変便利ですし,たぶん今日では必須とさえ 言えるでしょう.非常に多くの種類のデータ暗号化の方法がありますが,それ ぞれが特徴を持っています. ほとんどの UNIX(Linux も例外ではありません)は,DES (Data Encryption Standard)と呼ばれる片方向の暗号化アルゴリズムを主に使ってパスワードを 暗号化しています.暗号化されたパスワードは(普通) /etc/passwd か(少し一 般的でないですが)/etc/shadow に保存されます.ユーザがログインしようと すると,入力したパスワードは再び暗号化され,パスワードを格納している ファイルの該当項目と比較されます.これらが一致すればパスワードは同じは ずなので,ログインが許可されます. DES は双方向の暗号化アルゴリズム(正 しいキーを与えれば,暗号化も復号化もできる)なのですが,ほとんどの UNIX が使っているのは DES の一種で片方向のアルゴリズムです.つま り,/etc/passwd(または /etc/shadow) の内容からパスワードを得るために暗 号を解読することは不可能なはずです. パスワードが十分ランダムでない場合,"Crack" や "John the Ripper" (``'' 章を参照)のような力任せの攻撃でもパスワードを推測できます.PAM モジュ ール(後述)を利用すれば,別の暗号化ルーチン(MD5 など) を使用できま す.Crack にも良い使い方があります.パスワードデータベースに対して定期 的に Crack を実行し,安全でないパスワードを見つけるのです.そして問題 のあるユーザと話をして,パスワードを変えるように指導します. 良いパスワードの決め方に関する情報については http://consult.cern.ch/writeup/security/security_3.html を参照してくだ さい. 5.6. PGP 及び公開鍵暗号 PGP 等に使われている公開鍵暗号は,ある鍵を暗号化に使い,別の鍵を復号化 に使う暗号です.従来の暗号は,暗号化と復号化に同じ鍵を使っていました. この鍵は通信の両側が知っていなければならず,何らかの安全な方法で相手に 送らなければなりませんでした. 暗号に使った鍵を安全に転送する必要性を無くすため,公開鍵暗号では 2 つ の別々の鍵(公開鍵と秘密鍵)を用います.各自が持っている公開鍵は誰でも使 うことができ,暗号化はこれを使って行います.一方,各自は自分の秘密鍵を 持っており,正しい公開鍵を使って暗号化されたメッセージはこれを使って復 号化します. 公開鍵を使う暗号にも秘密鍵を使う暗号にも利点はあります.これらの違いに ついては,このセクションの最後に示す the RSA Cryptography FAQ に説明があります. PGP (Pretty Good Privacy) は Linux でちゃんとサポートされています.バ ージョン 2.62 と 5.0 の動作が確認されています.PGP への入門や使い方に ついては,PGP FAQ を見ると良いでしょう. http://www.pgp.com/service/export/faq/55faq.cgi 必ず,あなたの国で利用できるバージョンを使ってください.これはアメリカ 合衆国政府による輸出制限のためであり,強力な暗号を電子的に国外へ転送す ることが禁止されているからです. 現在は輸出の管理は EAR(Export Administration Regulations)が行っていま す.もはや ITAR(訳注: International Traffic in Arms Regulations の略 称) では管理されていません. Linux での PGP の設定に関するステップバイステップのガイドも http://mercury.chem.pitt.edu/~angel/LinuxFocus/English/November1997/article7.html にあります.これは PGP の国際バージョン用に書かれたものですが,アメリ カ合衆国バージョンにも簡単に適用できます.最新バージョンの Linux の一 部ではパッチが必要になることがあります.このパッチは ftp://metalab.unc.edu/pub/Linux/apps/crypto で入手できます. PGP をオープンソースでフリーに実装し直そうとしているプロジェクトがあり ます.GnuPG は PGP に置き換えることができる,既に完成しているフリーな プログラムです.GnuPG は IDEA も RSA も使っていないので,制限無しに使 用することができます.GnuPG は RFC2440 (OpenPGP) にほぼ準拠していま す.詳しくは GNU Privacy Guard の WWW ページ( http://www.gpg.org/)をご 覧ください. 訳注(略語の意味): o IDEA: International Data Encryption Algorithm の略.128ビットの秘密 鍵を用いた暗号アルゴリズムで,スイスの Ascom-Tech 社が特許権を持っ ています. o RSA: 公開鍵を用いた暗号化,電子署名に使われているアルゴリズムで,名 称は 3 人の開発者(Rivest,Shamir,Adleman)の頭文字からとられていま す.米国では 83 年に特許の認可を受けています. 暗号に関する詳しい情報は RSA cryptography FAQ に書かれています.これは http://www.rsa.com/rsalabs/newfaq/ から入手できます.このドキュメント には "Diffie-Hellman 法", "公開鍵暗号", "電子認証" といった用語に関す る情報が載っています. 訳注: 日本語訳は http://www.rsa-japan.co.jp/faq/index.html にありま す. 5.7. SSL, S-HTTP, HTTPS, S/MIME ユーザは各種セキュリティと暗号化プロトコルの違いや,これらの使い方につ いてよく質問してきます.このドキュメントは暗号化についてのものではない のですが,各プロトコルの内容を簡単に説明し,情報のありかを紹介しておく のも悪くないと思います. o SSL: - SSL (あるいは Secure Sockets Layer)は,Netscape が開発した暗 号化手法で,インターネット上でセキュリティを提供します.SSL はいく つかの異なる暗号化プロトコルとクライアントとサーバの認証手法を提供 します.SSL はトランスポート層を操作し,データの安全な暗号化チャネ ルを生成するので,各種データをシームレスに暗号化することができま す.SSL は Communicator で安全なサイトに行き,安全なオンラインド キュメントを見た時に見られます.他のたくさんの Netscape Communicator のデータ暗号化と同様に,これは Communicator を使った安 全な通信の基本部分として用意されています.詳しい情報は http://www.consensus.com/security/ssl-talk-faq.html にあります. Netscape の他のセキュリティ機構の実装と,これらのプロトコルの手引き については,http://home.netscape.com/info/security-doc.html で入手 できます. o S-HTTP: - S-HTTP はインターネット上での安全なサービスを提供する別の プロトコルです.これのプロトコルは,機密性 (confidentiality),認 証(authentication), 完全性(integrity), 否認防止性 [ 他の誰かと間違 うことがあり得ないこと] を与えるために設計されており,また,各トラ ンザクションにおける通信相手とのオプションのネゴシエーションを通じ て,複数の鍵管理機構と暗号化アルゴリズムをサポートします. S-HTTP は,これを実装している特定のソフトウェアでしか使えません.また,そ れぞれのメッセージを独立に暗号化します. [ RSA Cryptography FAQ の 138 ページより] o S/MIME: - S/MIME (すなわち Secure Multipurpose Internet Mail Extension)は,暗号化電子メールやその他の種類のインターネット上の メッセージで使われる暗号化の標準です.これは RSA が開発したオープン な標準なので,Linux 用のものもたぶん近いうちに登場するでしょう. S/MIME に関する詳しい情報は http://home.netscape.com/assist/security/smime/overview.html にあり ます. 5.8. Linux における IPSEC の実装 CIPE や他の形式のデータ暗号化とともに,Linux 用の IPSEC の実装も複数個 あります.IPSEC は IETF が作った規格で,暗号化された安全な通信経路を IP ネットワークレベルで作り,また認証,完全性,アクセス制御,機密性も 提供します.IPSEC の情報とインターネットドラフトは http://www.ietf.org/html.charters/ipsec-charter.html にあります.鍵管 理を含めて他のプロトコルへのリンク,IPSEC のメーリングリストやアーカイ ブも見つけることができます. University of Arizona で開発された x-kernel Linux という実装は,オブ ジェクトベースのフレームワークを使って x-kernel と呼ばれるネットワーク プロトコルを実装しています.これは http://www.cs.arizona.edu/xkernel/hpcc-blue/linux.html にあります.大 雑把に言うと,x-kernel はカーネルレベルでのメッセージパッシングの手法 であり,これにより実装が容易になっています. これとは別のフリーに利用できる IPSEC の実装は Linux FreeS/WAN IPSEC で す.その WWW ページを引用すると 「これらのサービスを用いると,信頼できないネットワーク上に安 全なトンネルを構築することができます.信頼できないネットワー クを通るデータは全て, IPSEC ゲートウェイマシンにより暗号化 され,その反対の端のゲートウェイによって復号化されます.これ により仮想プライベートネットワーク(Virtual Private Network, VPN)ができます.これは,安全でないインターネットで接続された 異なる複数のサイトを含んでいても,実質的にプライベートなネッ トワークです」 とのことです. これは http://www.xs4all.nl/~freeswan/ で入手することができます.この ドキュメントの執筆中にちょうどバージョン 1.0 になりました.他の形式の 暗号と同様に輸出が制限されているため,デフォルトではカーネルと共に配布 されていません. 5.9. ssh (Secure Shell) と stelnet ssh と stelnet はリモートのシステムにログインして暗号化された接続を行 うためのプログラムです. ssh は rlogin, rsh, rcp の安全な代用品として使われるプログラム群で す.ssh は 2 つのホスト間の通信とユーザ認証を公開鍵暗号を使って暗号化 します.ssh を使うと安全にリモートホストにログインしたり,データをホス ト間でコピーしたりすることができ,割り込み攻撃(セッションのハイジャッ ク)や DNS 詐称を防ぐことができます.ssh は接続上でデータ圧縮も行い,ホ スト間での安全な X11 の通信も行います.ssh のホームページは http://www.cs.hut.fi/ssh/ にあります. ssh を Windows PC から Linux の ssh サーバに対して使うこともできま す.Windows 用のクライアントの実装はいくつかあります.その 1 つは http://guardian.htu.tuwien.ac.at/therapy/ssh/ ですし, DataFellows に よる商用の実装も http://www.datafellows.com にあります."psst..." と呼 ばれる,ssh をオープンソースで実装し直そうとするプロジェクトもありま す.詳しくは http://www.net.lut.ac.uk/psst/ をご覧ください. SSLeay は Netscape の Secure Sockets Layer プロトコルのフリーの実装で す.これには Secure telnet, Apache 用のモジュール,いくつかのデータベ ース等のアプリケーションがいくつか含まれており,DES, IDEA, Blowfish 等 のアルゴリズムもいくつか含まれています. このライブラリを使って,telnet 接続上のデータを暗号化する telnet の安 全な代替プログラムが作られました.SSH と異なり,stelnet は Netscape が 開発した SSL (Secure Sockets Layer) プロトコルを使います.Secure telnet と Secure FTP は SSLeay FAQ からたどって見つけることができま す.この FAQ は http://www.psy.uq.oz.au/~ftp/Crypto/ にあります. 訳注: 日本語訳が http://www.infoscience.co.jp/technical/crypto/ssleay_jp.html にありま す. SRP は別の安全な telnet/ftp の実装です.その WWW ページを引用すると 「SRP プロジェクトは世界中でフリーに利用できる安全なインター ネットソフトウェアを開発しています.完全に安全な telnet と ftp の配布を始めとして,我々は弱いネットワーク認証を,セキュ リティのためにユーザインタフェースを犠牲にしない強力なものに 置き換えたいと考えています.セキュリティがオプションなんてと んでもない! セキュリティはデフォルトでなければなりません」 とのことです. 詳しい情報については http://srp.stanford.edu/srp を見てください. 5.10. PAM - 交換可能な認証モジュール 最近のバージョンの RedHat Linux ディストリビューションでは, "PAM" と 呼ばれる統一された認証方法が使われています.PAM を使うと,システムを動 作させたままで認証の方法や要件を変更することとローカルの認証方法をカプ セル化することが可能になります.バイナリは一切再コンパイルする必要があ りません.PAM の設定は本書の範囲を越えますが,必ず PAM のウェブサイト を見て,詳しい情報を見ておいてください. http://www.kernel.org/pub/linux/libs/pam/index.html PAM で可能になることをほんの少しだけ列挙します. o パスワードに DES 以外の暗号を用いる.(力任せの解読が難しくなりま す.) o サービス妨害攻撃を実行できなくするため,全てのユーザに対してリソー ス (プロセス数,メモリの大きさ等)の制限を加える. o システムを動作させたまま,シャドウパスワード(後述)を利用可能にす る. o 特定のユーザについて,特定の回数のみ,特定の場所からログインを許可 する. システムのインストールと設定を行う数時間の間に,実際に攻撃を受ける前に 多くの攻撃を予防しておくことができます.例えば PAM を使うと,ホーム ディレクトリの .rhosts ファイルの使用をシステム全体で無効にすることが できます.設定は /etc/pam.d/rlogin に以下のような行を追加します: # # Disable rsh/rlogin/rexec for users # login auth required pam_rhosts_auth.so no_rhosts 5.11. 暗号による IP のカプセル化 (Cryptographic IP Encapsulation, CIPE) このソフトウェアの基本的な目的は,インターネットのような安全でないパ ケットネットワークを通る安全な(トラフィック解析,偽メッセージ混入を含 む盗聴に対して)サブネットワーク間接続を提供することです. CIPE はデータをネットワークレベルで暗号化します.つまり,ネットワーク 上のホスト間を転送されるパケットが暗号化されます.暗号化エンジンはパ ケットを送受信するドライバの近くに配置されます. CIPE は,接続ごとにソケットレベルでデータを暗号化する SSH とは異なりま す.異なるホスト上で実行されているプログラム間の論理的な接続が暗号化さ れます. CIPE は仮想プライベートネットワーク(Virtual Private Network)を構築する ために,トンネリングで使うことができます.低レベルの暗号化には,アプリ ケーションソフトウェアを変更しなくても,VPN に接続している 2 つのネッ トワーク間で透過的に動作させることができるという利点があります. CIPE のドキュメントからの要約です: IPSEC 標準は,暗号化された VPN を構築するため(他にもあります が)に使うことができるプロトコル群を定義しています.しか し,IPSEC はオプションがたくさんある比較的重くて複雑なプロト コル群で,プロトコル群の完全な実装はまだほとんど使われておら ず,一部の問題(鍵管理など)はまだ完全には解決されていませ ん.CIPE は比較的簡単なアプローチを取っており, CIPE におい てパラメータ化できることの多く(実際に使う暗号化アルゴリズム の選択など)は,インストール時に選択したものに固定されます. これは柔軟さを制限しますが,実装が簡単に(したがって,効率的 でデバッグもしやすく) なります. 詳しい情報は http://www.inka.de/~bigred/devel/cipe.html にあります. 他の暗号化と同様の輸出制限のため,CIPE はカーネルと一緒には配布されて ません. 5.12. Kerberos Kerberos は MIT の Athena Project で開発された認証システムです.ユーザ がログインした時,Kerberos は(パスワードを用いて)ユーザを認証し,ネッ トワーク上に分散している他のサーバやホストに対してユーザの身分を証明す るための方法を提供します. それから,この認証情報は rlogin のようなプログラムが使い,ユーザがパス ワード無しで他のホストにログインすることを許可するために使います (.rhosts ファイルの代わり).この認証方法をメールシステムで使って,メー ルが正しい宛先に配達されたことの保証や,送信者が自分が名乗っている通り のユーザであることの保証が行えます. Kerberos およびこれに付属しているプログラムは,ユーザが自分を他のユー ザであるとシステムに思わせる「詐称」を実質的にできなくします.残念なが ら Kerberos のインストールはシステムに深く立ち入ったものになり,基本的 なプログラムをたくさん修正したり入れ換えたりすることが必要になります. Kerberos に関する詳しい情報は the kerberos FAQ にあり,コードは http://nii.isi.edu/info/kerberos/ にあります. [参考: Stein, Jennifer G., Clifford Neuman, and Jeffrey L. Schiller. "Kerberos: An Authentication Service for Open Network Systems." USENIX Conference Proceedings, Dallas, Texas, Winter 1998.] Kerberos はホストのセキュリティ向上のための最初のステップではありませ ん.Kerberos は非常に複雑ですし,例えば SSH ほど使われているわけでもあ りません. 5.13. シャドウパスワード シャドウパスワードは,暗号化されたパスワード情報を一般ユーザから隠す手 法です.暗号化されたパスワードは普通,誰でも読める /etc/passwd に格納 されています.したがって,誰でもパスワード推測プログラムを実行してパス ワードを見つけようと試みることができます.一方シャドウパスワードでは, この情報は特権ユーザしか読めない /etc/shadow ファイルに格納されます. シャドウパスワードを利用するためには,パスワード情報へアクセスする必要 があるユーティリティを全てシャドウパスワード対応に再コンパイルする必要 があります.(先述の)PAM を使っていれば,シャドウモジュールを使用するだ けでよく,実行ファイルを再コンパイルする必要はありません.必要ならば Shadow-Password HOWTO を参照して詳しい情報を調べてください.このドキュ メントは http://metalab.unc.edu/LDP/HOWTO/Shadow-Password-HOWTO.html にあります.このドキュメントは現在は多少古くなっていますし,PAM をサポ ートしているディストリビューションではたぶん不要でしょう. 5.14. "Crack" および "John the Ripper" 推測しにくいパスワードを passwd プログラムで強制することができない場合 には,パスワードをクラッキングするプログラムを実行し,ユーザのパスワー ドが安全かどうか確認するとよいでしょう. パスワードクラックのプログラムは,単純な考えに基づいて動作します.つま り,辞書に載っている単語とこれらの単語の変化形を順に試すのです.それぞ れを暗号化し,暗号化されたパスワード文字列と比べます.これらが一致すれ ば,パスワードがわかります. このようなプログラムはたくさんありますが,その中でも "Crack" と "John the Ripper"(http://www.false.com/security/john/index.html)の 2 つが有 名です.これらは CPU パワーを大量に消費しますが,予めこれを実行してお くことで,攻撃者がこれらのツールを使って侵入することができるかどうか知 ることができ,脆弱なパスワードを使っているユーザに注意することができま す.攻撃者はパスワードファイル(UNIX では /etc/passwd)を入手するため に,まず他のセキュリティホールを突かなければなりませんが,それは読者の 皆さんがが考えているよりもありふれているものであることは知っておいてく ださい. セキュリティの強さは最も弱いホストの強さになってしまいます.ですから, ネットワーク上に Windows マシンがある場合には,L0phtCrack を調べるべき だということは言っておく価値があるでしょう.これは Crack の Windows 用 の実装です.これは http://www.l0pht.com で入手できます. 5.15. CFS (暗号化ファイルシステム)と TCF(透過的暗号化ファイルシステ ム) CFS はディレクトリツリー全体を暗号化する手法で,このツリーに暗号化され たファイルを置くことができます.これはローカルマシン上で NFS サーバを 動作させます.RPM は http://www.replay.com/redhat/ で入手可能であり, 動作に関する情報は ftp://ftp.research.att.com/dist/mab/ で得られます. TCFS は CFS を改良したもので,ファイルシステムとの統合をより進めたもの です.したがって,ユーザは透過的に暗号化ファイルシステムを利用すること ができます.詳しい情報は http://edu-gw.dia.unisa.it/tcfs/ で得られま す. TCFS は必ずしもファイルシステム全体で使う必要はありません.これもディ レクトリツリーで使用することができます. 5.16. X11, SVGA, ディスプレイに関するセキュリティ 5.16.1. X11 グラフィックディスプレイを安全にしておき,攻撃者が入力したパスワードを 奪ったり,画面で見ているドキュメントや情報を読んだり,セキュリティホー ルを突いて root 権限を奪ったりできないようにしておくことは重要です. X アプリケーションをネットワーク越しにリモートで動作させることも,リモー トのシステムとのやりとりを全部盗聴されてしまう危険を伴うことがありま す. X にはアクセス制御機構がいくつもあります.その中で最も簡単なものはホス トに基づくものです.xhost コマンドを用いるとディスプレイへのアクセスが 許可されるホストを指定できます.しかし,この機構は非常に危険です.マシ ンにアクセスできる人は,xhost + を実行し,容易に侵入することができま す.もし,信頼できないホストからのアクセスを許可しなければならない場合 には,そのホストにログインしているユーザは誰でもディスプレイに不正アク セスすることができます. ログインのために xdm(X ディスプレイマネージャ)を使っている場合,ずっと 良いアクセス方法である MIT-MAGIC-COOKIE-1 を使いましょう.この機構は 128ビット長の「クッキー」を生成して,ユーザのホームディレクトリの .Xauthority ファイルに格納します.リモートのマシンにディスプレイへのア クセスを許可するには,xauth コマンドと .Xauthority ファイル内の情報を 使って,その接続だけを許可するようにします.Remote-X-Apps mini-howto をご覧ください.これは http://metalab.unc.edu/LDP/HOWTO/mini/Remote-X- Apps.html で入手できます. X の接続を安全に行うために ssh (前述の ``'' の項を参照のこと)を使うこ ともできます.ssh にはユーザが透過的に扱うことができる点およびネットワ ーク上に暗号化されていないデータが流れない点という 2 つの利点がありま す. X のセキュリティについての詳しい情報については,オンラインマニュアルの Xsecurity を参照してください.安全な策としては,コンソールにログインす るときには xdm を使い,リモートのサイトで X のプログラムを実行するとき には ssh を使うことです. 5.16.2. SVGA SVGAlib を使うプログラムはビデオ関係のハードウェアを操作するため,普通 は root に setuid されます.これは非常に危険です.プログラムがクラッ シュした場合,普通はコンソールを元に戻すためマシンを再起動しなくてはな らなくなってしまいます.このようなプログラムについては,確実に信頼でき ること,あるいは少なくとも少しは信用できることを確かめてください.でき れば,そもそも使わないのが良いでしょう. 5.16.3. GGI (Generic Graphics Interface project) Linux GGI プロジェクトは Linux のビデオインタフェースの問題について,1 つの解を提案しようとする試みです.GGI では Linux のカーネル内に少しビ デオ関係のコードを入れ,それからビデオへアクセスします.つまり GGI を 使えばいつでもコンソールを正常な状態に戻すことができます.また, secure attention key を使うことができ,コンソールでトロイの木馬が入っ た login プログラムを使われるのを防げます. http://synergy.caltech.edu/~ggi/ 6. カーネルのセキュリティ ここではセキュリティに関連するカーネル設定オプションの説明と,それらの 動作や使い方に関する説明を行います. カーネルはコンピュータのネットワークを制御するので,カーネルをこの上な く安全にしておくことと,カーネルそのものが破られないようにすることは重 要です.最近出現したネットワーク攻撃のいくつかを防ぐために,カーネルの バージョンは最新に保つようにすべきです.新しいカーネルは またはお使いのディストリビューションのベンダか ら入手できます. 本家の Linux カーネル用に 1 つに統合された暗号化パッチを提供している国 際的なグループもあります.このパッチは,各種暗号サブシステムや輸出制限 のために本家のカーネルに含まれていない機能を提供します.詳しい情報につ いてはグループの WWW ページ http://www.kerneli.org をご覧ください. 6.1. バージョン 2.0 のカーネルのコンパイルオプション 2.0.x カーネルでは以下のオプションが該当します.カーネルを設定する際に これらのオプションを確認することになるでしょう.ここに挙げたコメントの 多くは ./linux/Documentation/Configure.help から取っています.このコメ ントは,カーネルのコンパイル時にmake config の Help 機能で参照できるド キュメントと同じものです. o Network Firewalls (CONFIG_FIREWALL) このオプションは Linux マシンでファイアウォールを構築する際や IP マ スカレードを行う際に有効にすべきです.単に普通のクライアントマシン にするつもりならば no と設定するのが安全でしょう. o IP: forwarding/gatewaying (CONFIG_IP_FORWARD) IP forwarding を有効にすると,Linux マシンは本質的にルータになりま す.このマシンがネットワークに繋がっていると,あるネットワークから 別のネットワークにデータを転送しているかもしれず,これを起さないた めに設置されている防火壁をたぶん壊しています.通常のダイアルアップ ユーザはこれを無効にしたいと思うでしょうし,他のユーザはこれを行う ことのセキュリティ的な意味を良く考えるべきです.防火壁のマシンはこ れを有効にし,防火壁のソフトウェアと組み合わせて使おうと考えるで しょう. IP forwarding は以下のコマンドで動的に有効にすることができます: root# echo 1 > /proc/sys/net/ipv4/ip_forward また次のコマンドで無効にすることができます: root# echo 0 > /proc/sys/net/ipv4/ip_forward このファイルとその大きさ(0 かもしれませんし,そうでないかもしれません が)は実際のサイズを反映していないことは覚えておいてください. o IP: syn cookies (CONFIG_SYN_COOKIES) 「SYN 攻撃」はサービス妨害(DoS)攻撃の 1 つであり,マシンのリソース を全て喰い潰してしまい,リブートするはめに追い込みます.通常はこの オプションを有効にしない理由は考えられません.2.1 系のカーネルで は,この設定オプションは単に sync cookie を許可するだけで,有効には しません.これを有効にするには以下のコマンドを実行する必要がありま す: root# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

o IP: Firewalling (CONFIG_IP_FIREWALL) このオプションが必要になるのは,マシンを防火壁として設定する時 や,IP マスカレードを行う時に PPP のダイアルアップインタフェース経 由で何者かがダイアルアップマシンに入ってくるのを防ぎたい時です. o IP: firewall packet logging (CONFIG_IP_FIREWALL_VERBOSE) このオプションを使うと,送信者,受信者,ポート等の防火壁が受け取っ たパケットに関する情報が記録されます. o IP: Drop source routed frames (CONFIG_IP_NOSR) このオプションは有効にすべきです.始点で経路設定されたフレー ム(source routed frames)は,終点までの全体のパスをパケット内に持っ ています.つまり,パケットが通るルータはパケットを検査する必要がな く,単に転送すればよいということです.これは危険であるかもしれない データをシステムに入れる可能性を持ちます. o IP: masquerading (CONFIG_IP_MASQUERADE) Linux マシンが防火壁として動作している場合,そのローカルネットワー クのコンピュータの 1 つが外部に接続しようとすると,Linux マシンはそ のホストの「仮面を被る」ことができます.つまり,Linux マシンはロー カルネットワーク内のマシンが想定している終点アドレスへトラフィック を転送しますが,このトラフィックが防火壁のマシンから来たように見せ かけます.詳しい情報については http://www.indyramp.com/masq をご覧 ください. o IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) 前のオプションは TCP トラフィックと UDP トラフィックのマスカレー ディングしか行いませんが,このオプションは ICMP のマスカレーディン グも行うようにします. o IP: transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY) このオプションは,Linux マシンの防火壁の透過的リダイレクト機能を有 効にします.つまり,ローカルネットワークが始点であり,かつ終点がリ モートホストであるような任意のネットワークトラフィックがローカルの サーバ(いわゆる「透過的プロキシサーバ」)にリダイレクトされます.こ れにより,ローカルのコンピュータにリモート側と通信していると思わせ ながら,実際にはローカルのプロキシと接続した状態にします.詳しくは IP-Masquerading HOWTO と http://www.indyramp.com/masq をご覧くださ い. o IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG) 普通はこのオプションは無効になっていますが,防火壁や IP マスカレー ドを行うホストを構築する場合には,このオプションを有効にしたくなる はずです.あるホストから別のホストまでデータが送られる時,データは 必ずしも単独のデータパケットだけで送られるわけではなく,複数個のパ ケットに分割されます.このやり方の問題点は,ポート番号は最初のパ ケットにしか格納されていないことです.つまり,何者かが入っていない はずの情報をその接続の残りのパケットに入れることが可能なのです.こ のオプションは,teardrop 攻撃に対するパッチを当てていない内部ホスト に対する teardrop 攻撃も防ぐことができるはずです. o Packet Signatures (CONFIG_NCPFS_PACKET_SIGNING) このオプションは 2.1 系列のカーネルで利用可能なオプションで,セキュ リティを強固にするために NCP パケットに署名をするようにします.通常 はこれを無効にしておいて構いませんが,必要ならば使うことができま す. o IP: Firewall packet netlink device (CONFIG_IP_FIREWALL_NETLINK) これは実に便利なオプションで,ユーザ空間プログラムのパケットの先頭 の 128 バイトを解析し,正当さに基づいてそのパケットを許すか拒否する かを決められるようにできます. 6.2. バージョン 2.2 のカーネルのコンパイルオプション 2.2.x カーネルでも多くのオプションは同じですが,新しいオプションもいく つか開発されています.ここに挙げたコメントの多くは ./linux/Documentation/Configure.help から取っています.このコメント は,カーネルのコンパイル時に make config の Help 機能で参照できるド キュメントと同じものです.以下では新しく追加されたオプションだけを示し ます.必要な他のオプションについては,2.0 用の説明を参照してくださ い.2.2 カーネルにおける最大の変更点は,IP firewalling のコードで す.2.2 カーネルからは,IP firewalling を行うには, ipchains を使うよ うになりました.2.0 カーネルで使われていた ipfwadm は使いません. o Socket Filtering (CONFIG_FILTER) 大抵の人にとっては,このオプションに no を設定しておくのが安全で す.このオプションを使うと,ユーザ空間のフィルタを任意のソケットに 接続して,パケットを受け取るか拒否するかを決めることができます.ど うしても必要であり,かつファイルタのようなプログラムを組むことがで きるのでなければ,このオプションには no を設定すべきです.本 HOWTO の執筆時点では,TCP を除く全てのプロトコルがサポートされています. o Port Forwarding ポート転送(Port Forwarding)は IP マスカレードへの追 加機能であり,指定されたポートにおける一部のパケットについて,防火 壁の外部から内部への転送を許可します.このオプションが役立つのは, 例えば WWW サーバを防火壁の中やIP マスカレードを行うホストの後ろで 実行し,これを外の世界からアクセスできるようにしたい場合です.外部 のクライアントが防火壁の 80 番ポートにリクエストを送ると,防火壁は このリクエストを WWW サーバに転送します.WWW サーバはリクエストを処 理し,その結果を防火壁経由で元のクライアントに送ります.クライアン トにとっては,防火壁のマシンで WWW サーバが動いているように見えま す.この機能は,防火壁の後ろに全く同じ構成の WWW サーバが複数ある場 合に負荷調整(load balancing)を行うために使うこともできます. この機能に関する情報は http://www.monmouth.demon.co.uk/ipsubs/portforwarding.html にありま す (WWW を見るには,インターネットに接続しており,かつ lynx や Netscape のようなプログラムが使えるマシンが必要です).一般的な情報 については ftp://ftp.compsoc.net/users/steve/ipportfw/linux21/ をご 覧ください. o Socket Filtering (CONFIG_FILTER) このオプションを使うと,ユーザ空間 プログラムは任意のソケットにフィルタを付けることができ,特定の種類 のデータをソケット経由で取得する際に許可するか拒否するかをカーネル に指示することができます.Linux のソケットフィルタリングは現在,TCP を除く全ての種類のソケットで動作します.詳しくはテキストファイル ./linux/Documentation/networking/filter.txt をご覧ください. o IP: Masquerading カーネル 2.2 の IP マスカレードは改良されていま す.特殊なプロトコルのマスカレーディング等のサポートが追加されてい ます.詳しくは IP Chains HOWTO をご覧ください. 6.3. カーネルデバイス Linux には,セキュリティの向上にも使えるブロックデバイスやキャラクタデ バイスがいくつかあります. /dev/random と /dev/urandom という,いつでもランダムなデータを取り出せ る 2 つのデバイスがカーネルに用意されています. /dev/random と /dev/urandom はどちらも安全であり, PGP の鍵や ssh の チャレンジ文字列の生成や,ランダムな数字を必要とする他のアプリケーショ ンで利用できるはずです.これらを入力として数の初期シーケンスを与えて も,攻撃者が次の数を予測することは不可能なはずです.これらの入力から得 た数字があらゆる意味において言葉通りランダムであることを保証するため, 大変な努力が行われてきました. 2 つのデバイスの唯一の違いは,/dev/random はランダムなバイト列を全て使 う点と,計算を行うためのユーザの待ち時間がより長い点です.一部のシステ ムでは,ユーザが生成した新しいエントリをシステムに入るのを待つ長い間, ブロックされてしまうことに注意してください.したがって, /dev/random を使う前には気を付ける必要があります.(これを使う最も良い場面は多分, 機密キー入力情報を生成する時で,ユーザに「はい,もう十分です」と表示す るまでキーボードを繰り返し叩いてもらう場合です.) /dev/random は非常に高品質のエントロピーを持ち,割り込み間の時間等の測 定値から生成しています.このデバイスは十分なビット数のランダムデータが 利用可能になるまでブロックします. /dev/urandom も同様ですが,エントロピーの保持量が少なくなると,現在保 持している値の暗号学的に強いハッシュ値を返します.これは /dev/random ほど安全ではありませんが,ほとんどの目的に対してはこれで十分です. このデバイスは以下のようにして読み出すことができます: root# head -c 6 /dev/urandom | mmencode これはコンソールに 6 つのランダムな文字を出力します.これはパスワード 生成などによいでしょう.mmencode は metamail パッケージに入っていま す. アルゴリズムの説明については, /usr/src/linux/drivers/char/random.c を 参照してください. これについて筆者(Dave)に教えてくださった,Theodore Y. Ts'o さん, Jon Lewis さん他の Linux-kernel ML の皆さんに感謝します. 7. ネットワークのセキュリティ ネットワークに接続する時間が長ければ長いほど,ネットワークのセキュリ ティは重要になります.ネットワークのセキュリティを破ることは,物理的あ るいはローカルからセキュリティを破ることよりも簡単なことが多く,ずっと ありふれています. ネットワークのセキュリティ確保を支援するための良いツールはたくさんあ り,これらの多くは Linux の各ディストリビューションにも付属していま す. 7.1. パケット盗聴 侵入者がネットワーク上でより多くのシステムのアクセス権を得るためによく 使う方法の一つが,既に悪用しているホスト上でパケット盗聴プログラムを使 うことです.この「盗聴プログラム」は,イーサネット上のパケットストリー ムの passwd, login, su のようなものを監視し,その後のトラフィックをロ グに残します.このようにして,侵入者は破ろうとさえとしていないシステム のパスワードも得てしまいます.平文の(暗号化されていない)パスワードは, このような攻撃に対して非常に脆弱です. 例: ホスト A は既に破られています.攻撃者はパケット盗聴プログラムをイ ンストールします.ホスト C からホスト B への管理者のログインを拾い出し ます.まず管理者が B にログインするときに,個人のパスワードを入手しま す.それから,管理者は何か問題を処理するために su を実行します.このと きに,ホスト B の root のパスワードが入手できます.後で,管理者が誰か を他のサイトのホスト Z に telnet させます.こうして,攻撃者はホスト Z の password/login を入手することができます. 今日では,攻撃者はこの攻撃を行うためにシステムを破る必要などありませ ん.ノートパソコン等を建物に持ち込み,ネットワークに繋いでしまえばよい のです. この攻撃を防ぐには,ssh 等のパスワード認証を暗号化します.POP の場合に は APOP 等を使うことで,この攻撃を防ぐことができます.(通常の POP は, パスワードを暗号化せずにネットワーク上に流すので,この攻撃に対して非常 に脆弱です.) 7.2. システムサービスと tcp_wrappers どんなネットワークであれ,Linux システムを接続する前にまず確認すべきこ とは,どのサービスを提供するかです.提供する必要が無いサービスは無効に するべきであり,そうすることで 心配の種を一つ減らすことができ,攻撃者 がセキュリティホールを探す余地も一つ減ります. Linux でサービスを無効にするための方法は色々あります. /etc/inetd.conf ファイルを見れば,inetd 経由で提供されているサービスを確認することがで きます.必要の無いサービスは,コメントアウトして(行の先頭に # を挿入し ます),inetd のプロセスに SIGHUP を送ることで無効にすることができま す. /etc/services ファイル内のサービスを削除(またはコメントアウト)する方法 もあります.これによりローカルのクライアントもサービスを見つけられなく なります(例えば ftp の項を削除し,そのマシンからリモートサイトへ ftp すると,"unknown service" というエラーになるでしょう).しかしサービス の削除に伴うトラブルに見合うだけの価値はないでしょう.というのも,サー ビスを削除してもセキュリティが向上するわけではないからです. /etc/services で ftp の項目をコメントアウトしていても,ローカルのユー ザが ftp を使いたければ,FTP の一般的なポート番号を使うクライアントを 用意すればちゃんと動作するのですから. 有効なまま残しておくとよいサービスには以下のようなものがあります: o ftp o telnet (or ssh) o mail, such as pop-3 or imap o identd 特定のパッケージを使わないことが分かっているならば,そのパッケージを全 部削除する方法もあります.RedHat ディストリビューションでは, rpm -e パッケージ名 というコマンドがパッケージ全体を削除するコマンドで す.Debian の場合は,dpkg --remove コマンドで同様のことが実行できま す. 加えて,rsh/rlogin/rcp ユーティリティ(/etc/inetd.conf から login (rlogin が使用),shell(rcp が使用),exec (rsh が使用)の項目を含む)が /etc/inetd.conf から起動されるのを無効にしたいと思うことでしょう.これ らのプロトコルは非常に危険ですし,過去にも攻撃を受ける原因となってきま した. /etc/rc.d/rcN.d(N はシステムのランレベル)ディレクトリをチェックし,不 要なサーバが起動されていないかどうか確認しましょう. /etc/rc.d/rcN.d 中のファイルは実際には /etc/rc.d/init.d ディレクトリ中のファイルへのシ ンボリックリンクです.init.d ディレクトリ中のファイルの名前を変更する と,そのファイルに対して /etc/rc.d/rcN.d 内から張られている全てのシン ボリックリンクを無効にすることができます.特定のランレベルのサービスだ けを無効にしたい場合は,適切なファイルの名前について,大文字の 'S' を 小文字の 's' に置き換えてください.これは以下のように行います: root# cd /etc/rc6.d root# mv S45dhcpd s45dhcpd BSD スタイルの rc ファイルのシステムの場合には,不要なプログラムは /etc/rc* から探します. ほとんどの Linux ディストリビューションには,全ての TCP サービスを 「ラッピング(包む)」する tcp_wrappers が付いています. tcp_wrapper(tcpd)は,inetd が実際のサーバの代わりに呼び出します.tcpd はサービスを要求したホストをチェックし,サーバの起動かアクセス拒否を行 います./etc/hosts.allow ファイルを作り,そのマシンのサービスを受ける 必要があるマシンだけを指定しましょう. 家からダイアルアップ接続しているユーザは,全てを拒否する設定をお勧めし ます.tcpd はサービスへのアクセス失敗を記録することもできるので,攻撃 を受けた際には警告を受けることができます.新しいサービスを追加する際に は,必ず TCP ベースの tcp_wrappers を使う設定にすべきです.例えば通常 のダイアルアップユーザは外部からの接続を禁止することができますが,その 状態でもメールの取得やインターネットへのネットワーク接続はできます.こ れを行うには,/etc/hosts.allow に以下の設定を追加してください: ALL: 127 また,当然ながら /etc/hosts.deny も関係あります. ALL: ALL これにより,外部からあなたのマシンへの接続は全て禁止されますが,内部か らインターネット上のサーバへの接続は許されます. tcp_wrappers が守れるのは inetd から実行するサービスだけであり,他を選 択する余地はほとんどないことを覚えておいてください.サービスは他にもた くさん実行されているかもしれません.netstat -ta を実行すれば,お使いの マシンで行われているサービスを全て表示することができます. 7.3. DNS 情報の確認 自分のネットワーク上の全てのホストに関して最新の DNS 情報を保つこと は,セキュリティの向上に繋がります.許可されていないホストがネットワー クに繋がれた際には,そのホストが DNS エントリを持たないことから識別す ることができます.サービスの多くは正しい DNS エントリを持たないマシン からの接続を受け付けないように設定することができます. 7.4. identd identd は一般的に inetd の代わりとなる小さなプログラムです.identd は どのユーザがどの TCP サービスを受けているかを常に監視し,要求に応じて この結果を報告します. 多くの人は identd の有益さを誤解しており,identd を無効にしたり,外部 サイトからの identd へのリクエストをブロックしたりしています.identd はリモートサイトを助けるためにあるのではありません.リモートの identd から得たデータが正しいかどうかを知る術はありません.identd のリクエス トは認証を行いません. それでは,どうして identd を使うのでしょうか? それは読者の皆さんを助 けてくれるからであり,追跡調査の際のデータになるからです. identd が悪 用されていなければ,リモートサイトに TCP サービスを受けたユーザ名やユ ーザID を知らせることができます.リモートサイトの管理者が戻ってきて彼 らのサイトが攻撃されていると言ってきた場合,簡単にそのユーザに対して行 動を起こすことができます.もし identd が動いていなければ,大量のログを 調べ,その時に誰がいたのか調べなければなりませんが,そのユーザを突き止 めることは一般にとても時間がかかる作業です. ほとんどのディストリビューションに付属している identd は一般に思われて いるよりも細かい設定が可能です.特定のユーザについて identd を無効にす ることができますし(.noident ファイルを作ります),identd リクエストのロ グを全て残すこともできますし(この設定をお勧めします),ユーザ名の代わり にユーザID や NO-USER を返すようにすることさえできます. 7.5. SATAN, ISS その他のネットワーク探査プログラム マシンやネットワークのポートやサービスの探査を行うソフトウェアのパッケ ージはいろいろあります.SATAN や ISS, SAINT, Nessus はこの種のパッケー ジの中でも特に有名なものです.このソフトウェアは調査対象のマシン(ある いはネットワーク上の全ての対象マシン)の接続可能なポート全てに接続し, そのポートで提供されているサービスについて調べようとします.この情報に 基づいて,サーバに対する特定の攻撃に対してマシンが脆弱であるかどうか調 べることができます. SATAN(Security Administrator's Tool for Analyzing Networks)はウェブの インタフェースを持つポート探査プログラムです.マシンあるいはネットワー クに対して,light, medium, strong いずれかのチェックを行う設定ができま す.SATAN を入手し,自分のマシンやネットワークを検査し,見つかった問題 を修正するとよいでしょう.必ず,SATAN は metalab か有名 FTP/ウェブサイトから入手しましょう.過去に,トロイの木馬が仕込まれた SATAN がネットワーク上で配布されたことがあるからで す.http://www.trouble.org/~zen/satan/satan.html. SATAN はしばらく更新 されていないため,この後で説明する他のツールの方が役に立つかもしれませ ん. ISS (Internet Security Scanner) もポートを検査するプログラムです.ISS は SATAN よりも動作が軽いので,大規模ネットワークに向いているでしょ う.ただし,得られる情報は SATAN の方が詳しいようです. Abacus は,ホストベースのセキュリティと侵入者発見の機能を持つツールで す.詳しい情報については WWW 上のホームページを見てください. http://www.psionic.com/abacus/ SAINT は SATAN を更新したものです.SAINT はウェブベースであり,SATAN よりも新しい検査がたくさん追加されています.詳しくは http://www.wwdsi.com/~saint を見てください. Nessus はフリーのセキュリティ検査プログラムです.これは GTK による使い やすいグラフィカルインタフェースを持っています.また,新しいポート探査 を設定するための素晴らしいプラグイン機構を備えています.詳しい情報につ いては http://www.nessus.org を見てください. 7.5.1. ポート探査を受けたことの検出 SATAN や ISS などの探査プログラムによる探査を受けたことを警告するため に設計されたツールがいくつかあります.しかし,tcp_wrappers をうまく使 うことやログを定期的に確認することで,このような探査があったことを知る ことができます.最低限の設定でも,SATAN は RedHat の標準システムのログ に痕跡を残します. 「見えない」ポート探査もあります.TCP ACK ビットがセットされているパ ケット(確立されている接続ではそうなっています)は多分,パケットフィルタ リングを行う防火壁を通過するでしょう.確立されているセッションを持たな いポートから返される RST パケットは,そのポートが生きている証拠として 受け取ることができます.TCP wrappers はこれを検出できないと思います. 7.6. sendmail , qmail 等の MTA ユーザに提供するサービスの中でも特に重要なものの 1 つは,メールサーバ です.残念ながら,これは攻撃に特に弱いものの 1 つでもあります.単にそ の理由は,やらなければならない仕事の数が多いことと,一般に root ユーザ の権限を必要とするからです. sendmail を使う場合には特に,必ず最新バージョンを使うことが重要で す.sendmail にはセキュリティの問題の長い長い歴史があります.いつも必 ず最新バージョンを動作させましょう. http://www.sendmail.org メールを送信するだけなら sendmail を実行する必要はないことは知っておい てください.家庭ユーザであれば,sendmail を完全に使えなくしてしまい, メールの送信には単にメールクライアントを使うということもできます. sendmail の起動ファイルから "-bd" フラグを削除しても良いでしょう.これ によりメール送信のリクエストが無効になります.言い換えれば,今までの起 動スクリプトではなく以下のコマンドを使って sendmail を実行すればよいと いうことです: # /usr/lib/sendmail -q15m これにより sendmail は,最初に送信したときにうまく配送できなかったメー ルについて,15 分ごとに送信キューをフラッシュします. 管理者の多くは sendmail を使わないで,別のメール配送エージェントを使う ようになっています.qmail への乗り換えを検討してもよいでしょう.qmail は徹底的にセキュリティに注意して設計されています. qmail は高速かつ安 定,安全です.qmail は http://www.qmail.org で入手することができます. 訳注: http://www.jp.qmail.org も参考になるでしょう. qmail の対抗馬は "postfix" です.これは tcp_wrappers 等のセキュリティ 関連ツールの作者である Wietse Venema 氏が書かれたものです.以前は vmailer と呼ばれ,IBM の支援を受けていました.これも徹底的にセキュリ ティに配慮して書かれたメール配送エージェントです.vmailer に関するもっ と詳しい情報については http://www.postfix.org をご覧ください. 7.7. サービス妨害攻撃 「サービス妨害攻撃(Denial of Service attack, DoS attack)」は,リソース を食い潰すことにより,正当なリクエストに応じられないようにしたり,正当 なユーザがマシンにアクセスできないようにする攻撃です. サービス妨害攻撃は近年とても増えています.ここでは,有名なものや最近の ものをいくつか紹介します.新しいものが常に現れるので,ここ示す例はほん の一部に過ぎない点には注意してください.最新の情報を知るには,Linux の セキュリティ関連メーリングリストや bugtraq メーリングリストやこれらの アーカイブを読みましょう. o SYN Flooding - SYN flooding はネットワークでのサービス妨害攻撃で す.これは TCP 接続を確立する際の手順の「抜け穴」を利用するもので す.新しい Linux カーネル(2.0.30 以降)には,SYN flooding 攻撃により ユーザがマシンやサービスにアクセスできなくなることを防ぐための設定 オプションがあります.カーネルの適切な防御用オプションについて は,``カーネルのセキュリティ'' の章を参照してください. o Pentium の "F00F" バグ -これは最近見つかったもので,特定のアセンブ リコードを純正の Intel Pentium プロセッサに送ると,マシンがリブート してしまうというものです.この影響は,実行している OS に関係なく Pentium プロセッサを積んでいる全てのマシンが受けます(互換 CPU や Pentium Pro, Pentium II では問題ありません).Linux 2.0.32 以降に は,このバグに対する対処が入っているので,マシンが止まってしまうこ とはありません.カーネル 2.0.33 での対処はさらに改良されており,カ ーネル 2.0.32 よりもお勧めできます.現在 Pentium を使っているのな ら,カーネルのバージョンをすぐに上げましょう! o Ping Flooding - Ping flooding は単純な力任せのサービス妨害攻撃で す.攻撃者は対象となるマシンに ICMP パケットの「洪水(flood)」を送り ます.攻撃する側のマシンが攻撃を受ける側のマシンより広いバンド幅を 持っていた場合,攻撃を受けたマシンはネットワークに何も送れなくなっ てしまいます.この攻撃の一種である "smurfing 攻撃" では,あるホスト に対して,あなたのマシンの IP アドレスを返答先とした ICMP パケット を送り,ばれないように洪水を送ります."smurf" 攻撃に関する情報は http://www.quadrunner.com/~chuegen/smurf.txt で詳しく調べることがで きます. ping flooding 攻撃を受けた場合は,tcpdump などのツールを使ってどこ からパケットが来たのか(あるいは来たように見えるのか)を調べ,読者の 皆さんが接続しているプロバイダにこのデータに基づいて相談しましょ う. ping flood 攻撃はルータのレベルや防火壁の利用で簡単に止めるこ とができます. o Ping o' Death - Ping o' Death 攻撃は,ICMP ECHO REQUEST パケットを 格納するためのカーネルのデータ構造体よりも大きい ICMP ECHO REQUEST パケットを送るものです.巨大な(65,510 バイト) "ping" パケット 1 つ を送っただけで多くのシステムがハングしたり,クラッシュすることさえ あるため,この問題はそのまま "Ping o' Death" という名前を授けられま した.この問題はずっと前に修正されているので,現在は心配の必要は全 くありません. o Teardrop / New Tear - ごく最近の攻撃で,Linux と Windows プラット フォームの IP フラグメンテーションのバグを利用したものです.これに 対する修正はカーネルのバージョン 2.0.33 で行われており,この修正を 有効にするためにコンパイル時のオプションを選択する必要はありませ ん.見たところ,Linux は 'newtear' 攻撃は受け付けないようです. ほとんどの攻撃に関するコードおよびそのコードの動作原理に関する突っ 込んだ説明は,http://www.rootshell.com の検索エンジンを使って調べる ことができます. 7.8. NFS (Network File System) のセキュリティ NFS は大変広く使われているファイル共有プロトコルです.nfsd と mountd が動作しているサーバマシンは,カーネルに NFS ファイルシステムのサポー トが組み込まれている他のマシン(NFS クライアント機能をサポートしていれ ば Linux でなくても構いません)にファイルシステム全体を「エクスポート」 することができます.mountd は /etc/mtab に記録されているマウントされて いるファイルシステムを監視しています.これらのファイルシステムは showmount コマンドで表示することができます. 多くのサイトでは,ユーザのホームディレクトリを提供するために NFS を用 いており,LAN のどのマシンにログインした場合にも同じホームディレクトリ を使うことができます. ファイルシステムをエクスポートする時には,少しだけセキュリティをかける ことができます.nfsd にはリモートの root ユーザ(ユーザID = 0) を nobody ユーザとして扱わせ,エクスポートしたファイル全体にはアクセスで きないように設定できます.しかし,個々のユーザは自分の(あるいは少なく とも同じユーザ ID の)ファイルにはアクセスできるので,ローカルのスーパ ーユーザはそのユーザとしてログインするか su を行えば,そのユーザのファ イル全てにアクセスすることができます.つまり,この方法は読者の皆さんの リモートファイルシステムをマウントできる攻撃者に対してはちょっとした妨 害にしかなりません. NFS を使わなければならない場合は,本当に必要なマシンだけにエクスポート することを徹底しましょう.ルートディレクトリ以下全部をエクスポートする ようなことは絶対に行ってはなりません.エクスポートの必要があるディレク トリだけをエクスポートしましょう. NFS に関する詳しい情報については NFS HOWTO を参照してください.これは http://metalab.unc.edu/mdw/HOWTO/NFS-HOWTO.html にあります. 7.9. NIS (Network Information service) (かつての YP) NIS (かつての YP) は,多数のマシンに情報を配布するための仕組みです. NIS マスタは情報テーブルを保持し,これを NIS マップファイルに変換しま す.このマップはネットワーク上で得ることができるので,NIS クライアント はログイン名,パスワード,ホームディレクトリ,シェルの情報(標準的な /etc/passwd ファイルに書かれている全ての情報)を得ることができます.こ れにより,パスワードを一度変えるだけで,NIS ドメイン上の全てのマシンで 新しい設定を有効にできます. NIS は全く安全ではありません.そもそも安全にするつもりもなく,手軽で便 利に使うことが目的でした.NIS ドメインの名前を推測できれば誰でも(ネッ トワークのどこからでも)パスワードファイルのコピーを得ることができ, "Crack" や "John the Ripper" 等を使ってパスワードを破ることができま す.また,なりすまし等の汚いトリックも色々可能です.NIS を使わなければ ならない場合には,この危険性は知っておいてください. NIS+ と呼ばれる NIS よりもずっと安全な代替策があります.詳しくは NIS HOWTO を参照してください: (http://metalab.unc.edu/mdw/HOWTO/NIS- HOWTO.html). 7.10. 防火壁(ファイアウォール) 防火壁は,ローカルのネットワークに出入りできる情報を制御するための仕組 みです.普通,防火壁になるホストはインターネットとローカルの LAN に接 続され,あなたの LAN からインターネットへのアクセスは防火壁を通り抜け るしかないようになっています.このように,防火壁はインターネットと LAN の行き来を制御します. 防火壁にはたくさんの種類があり,その設定方法もたくさんあります.Linux はかなり良い防火壁になります.防火壁のコードは 2.0 以降のカーネルに組 み込むことができます.カーネル 2.0 では ipfwadm, カーネル 2.2 では ipchains というユーザ空間で動作するツールを使って,許可するネットワー クトラフィックの種類をシステムの動作中に変更することができます.特定の ネットワークトラフィックのログを取ることもできます. 防火壁はネットワークを守るために大変便利かつ重要な技術です.ただし,防 火壁があるからといって,その内部のマシンのセキュリティが不必要なわけで は決してありません.これは極めて重大な誤りです.防火壁と Linux につい ての詳しい情報については,metalab の最新のアーカイブにある Firewall- HOWTO がとても良い資料なので,これを参照してください (http://metalab.unc.edu/mdw/HOWTO/Firewall-HOWTO.html). 更に IP-Masquerade mini-howto にも情報があります (http://metalab.unc.edu/mdw/HOWTO/mini/IP-Masquerade.html). ipfwadm (防火壁の設定を変更するためのツール)に関する詳しい情報は以下の ホームページにあります: http://www.xos.nl/linux/ipfwadm/ 防火壁に関する経験をお持ちでないのに,単なるセキュリティ方針だけでなく 防火壁そのものを設定する予定であれば,O'Reilly and Associates 社の書籍 「Firewalls」またはその他のオンラインドキュメントを必ず読んでくださ い.この書籍の詳しい情報については http://www.ora.com をご覧ください. 国立標準技術研究所(The National Institute of Standards and Technology) も防火壁に関する素晴らしいドキュメントをまとめています.日付は 1995 年 となっていますが,現在でも非常に役立ちます.これは http://csrc.nist.gov/nistpubs/800-10/main.html にあります.以下の文書 も興味深いでしょう: o The Freefire Project -- フリーに利用できる防火壁用ツールのリストで す.http://sites.inka.de/sites/lina/freefire-l/index_en.html にあり ます. o SunWorld Firewall Design -- O'Reilly の書籍の著者が書いたドキュメン トであり,各種の防火壁を簡単に紹介していま す.http://www.sunworld.com/swol-01-1996/swol-01-firewall.html にあ ります. 7.11. IP Chains - Linux カーネル 2.2.x における防火壁の構築 Linux の IP Firewalling Chains はカーネル 2.0 の防火壁用のコードをカー ネル 2.2 用に更新したものです.これは以前の実装よりもずっと多くの機能 を持っています.これを以下に列挙します: o より柔軟なパケット操作 o より複雑なアカウンティング o 非常に細かい操作ができ,簡単なポリシー変更 o フラグメントの明示的なブロックや拒否など o 怪しいパケットの記録 o ICMP/TCP/UDP 以外のプロトコルの処理 現在,カーネル 2.0 で ipfwadm をお使いであれば,ipfwadm のコマンド形式 を ipchains で使える形式に変換するスクリプトがあります. 詳しくは IP Chains HOWTO をお読みください.これは http://www.rustcorp.com/linux/ipchains/HOWTO.html にあります. 7.12. 仮想プライベートネットワーク(VPN, Virtual Private Network) VPN は何らかの既存ネットワークの上に「仮想的な」ネットワークを確立する 手法です.この仮想ネットワークは,暗号化されることやネットワークに加 わっている何らかの既知の存在との間のトラフィックしか通さないことがよく あります.VPN は,暗号化された仮想ネットワークを用いて,家で作業してい る人と会社の内部ネットワークをインターネット経由で接続するためにもよく 使われます. Linux の IP マスカレードを行う防火壁を使っており,かつ MS の PPTP(Microsoft 製の VPN 接続のための製品)パケットを通過させる必要があ る場合には,これを行うためのカーネルパッチを使ってください. url="ftp://ftp.rubyriver.com/pub/jhardin/masquerade/ip_masq_vpn.html" name="ip-masq-vpn"> をご覧ください. Linux で利用できる VPN のソリューションはいくつかあります: o vpnd. http://www.crosswinds.net/nuremberg/~anstein/unix/vpnd.html をご覧ください. o Free S/Wan. http://www.xs4all.nl/~freeswan/ をご覧ください. o ssh を使って VPN を構築することができます.詳しくは VPN mini-howto をご覧ください. o vps (virtual private server). http://www.strongcrypto.com をご覧く ださい. 情報ポインタや詳しい情報については,IPSEC の章もご覧ください. 8. セキュリティの準備 (ネットワークに接続する前に) さて,システムのチェックが終わり,安全かつ使いやすいものになり,ネット ワークに接続する準備ができました.ここでは,実際に侵入された場合に備え ての準備のためにすべきことをいくつか挙げます.これを行っておけば,侵入 者をすぐに追い払い,システムを復旧,稼働させることができます. 8.1. マシン全体のバックアップの作成 バックアップの方法や保存媒体についての議論は本ドキュメントの範囲外です が,バックアップとセキュリティについて簡単に触れておきます: 1 つのパーティションに入っているデータが 650MB 以下であれば,CD-R にデ ータをコピーすると良いでしょう(改竄が困難ですし,きちんと保管すれば長 期間保存できます).テープなどの読み書き可能なメディアは,バックアップ が終わり次第書き込み禁止にし,改竄できないようにすべきです.バックアッ プはオンラインでアクセスできない場所に置きましょう.良いバックアップを 作っておけば,何かあった時にシステムをその時点に復旧させることができま す. 8.2. 適切なバックアップ計画の決定 6 本のテープを使い回すと管理が楽です.4 本のテープを平日に使い,残りの 2 本は 1 本ずつ金曜日に隔週で使います.毎日インクリメンタルバックアッ プを実行し,金曜日のテープ(適切な方)にはフルバックアップを取ります.特 に重要な変更がシステムにあった場合や,重要なデータを加えた場合には, バックアップを行うのが適切でしょう. 8.3. RPM ファイルデータベースや Debian のファイルデータベースのバック アップ システムに侵入された時に RPM データベースを tripwire 代わりに使うこと ができますが,これはデータベースが改竄されていないことが確実な場合だけ です.ですから,RPM データベースをフロッピーディスクにコピーしておき, コンピュータから取り出して保管しておきましょう.Debian ディストリビュ ーションについても同様です. ファイル /var/lib/rpm/fileindex.rpm や /var/lib/rpm/packages.rpm は大 抵フロッピーディスク 1 枚には収まらないでしょう.ですが圧縮すれば別々 のフロッピーディスクに収めることができるはずです. 仮にシステムに侵入されてしまったときには,次のコマンドを実行してシステ ムの各ファイルを検査します: root# rpm -Va rpm のオンラインマニュアルを参照すれば,出力を少なくするオプションに関 する説明があります.RPM のバイナリ自体が改竄されていないことも確認すべ きである点は忘れないでください. この方法を使う場合には,新しい RPM パッケージを追加するごとに RPM デー タベースのバックアップを取らなければなりません.この方法を使うかどうか は利点と欠点を考え合わせて決めてください. 8.4. システムログの監視 syslog から得られる情報が改竄されないようにするのはとても重要です.ま ず,/var/log を特定のユーザしか読み書きできないようにしておきましょ う. ログに出力されていること,特に auth の項目には目を通しましょう.例えば ログイン失敗が続いていると,これは侵入の試みの痕跡かもしれません. ログがどこにあるかは ディストリビューションによって異なります.RedHat のように "Linux Filesystem Standard" に準拠しているシステムであれば, /var/log に messages ファイルや mail.log 等があるはずです. 自分が使っているディストリビューションがどこにログを出力しているのか は, /etc/syslog.conf ファイルを見ればわかります.これは syslogd (シス テムのログを取るためのデーモン)に,メッセージの出力の仕方を指示する ファイルです. ログが長くなり過ぎないようにし,検査もしやすくするために,ログをローテ ートさせるスクリプトやデーモンを設定することもできます.最近の RedHat ディストリビューションでは logrotate パッケージを調べてみましょう.他 のディストリビューションにも同様の仕組みがあるはずです. ログファイルが改竄されてしまっても,いつ,どんな種類の改竄が行われたの かを調べましょう.長期間記録されていない項目はありませんか? (もしある ならば)バックアップのテープで,改竄されていないログをチェックすること もできます. 侵入の痕跡を消すため,侵入者は通常ログファイルを改竄しますが,それでも 思わぬところでチェックに引っかかることもあります.入口を見つけようとし ていたり,root 権限を得るためプログラムを不正使用しようとしている侵入 者に気づくかもしれません.侵入者がログを改竄するより前に,ログを見ま しょう. su によるユーザ変更やログインの試み等のユーザアカウント情報を含む auth の項目は,他のログから分離すべきでしょう. 可能ならば,重要なデータのコピーを安全なシステムに送るように syslog を 設定しましょう.これにより,login/su/ftp 等の記録を消して侵入者が足跡 を消してしまうことを防げます.syslog.conf のオンラインマニュアルの @ オプションを参照してください. 高機能版の syslogd がいくつかあります.例えば http://www.core- sdi.com/ssyslog/ にある Secure Syslog をご覧ください.Secure Syslog を 使うと syslog のエントリを暗号化して誰も改竄できないようにします. 別の高機能 syslogd としては syslog-ng があります.これを用いるとログの 記録をより柔軟に行うことができ,またリモートの syslog のストリームを改 竄できないようにします. 最後になりますが,誰も読んでいないようなログは役に立ちません.適当に間 隔を取ってログを読み,いつもはどんな感じであるのかを感覚的に知っておき ましょう.そうしておけば,異常があった場合にすぐに見つけることができま す. 8.5. システム更新パッケージの適用 ほとんどのユーザは Linux を CD-ROM からインストールします.しかし,セ キュリティのためのシステム修正は速いペースで行われているので,新しい (修正済みの)プログラムが常にリリースされています.マシンをネットワーク に接続する前には,お使いのディストリビューションの FTP サイトをチェッ クし,インストールに使った CD-ROM より新しいパッケージを全て手に入れま しょう.これらのパッケージにはセキュリティ関連の重要な修正が入っている ことが多いので,これをインストールするのは良い考えです. 9. システムに侵入された場合や現在侵入されている場合の対応 本ドキュメント(あるいは他の)のアドバイスに従っていて,システムへの侵入 を発見した場合にはどうすべきでしょうか? まず最初にすべきことは,平静 を保つことです.あわてて行動すると,侵入者にやられるよりも悲惨なことに なるかもしれません. 9.1. セキュリティが破られている最中 セキュリティが破られている最中であることに気づくと,緊張する仕事を強い られることになるでしょう.あなたがどのように対処するかは,重大な意味を 持ちうるからです. それが物理的な攻撃であるのなら,あなたは家や会社,研究室に何者か侵入し たことに気づいたということなのでしょう.まずは,このことをその場所の責 任者に知らせるべきです.研究室ならば,誰かがケースを開けようとしていた り,マシンをリブートしようとしているのを見つけたのかもしれません.この 場合には,あなたの権限と職務手順に基づいて,相手を止めるか警備員に連絡 することになるでしょう. ローカルのユーザがセキュリティを破ろうとしているのを見つけた場合には, まずは本当にその本人なのかどうか確認しましょう.その人がログインしてき ている元のサイトを調べましょう.そのサイトはその人が普段ログインしてく るところですか? 違うのならば,非ネットワーク的な手段で連絡を取りま しょう.例えば,その人のオフィスや家に電話したり直接赴いてから話をする のです.その人が自分がやったことを認めたら,何をしようとしていたのか説 明させたり,それをやめるように伝えます.何もしていないとか,全く身に覚 えが無いと言われた場合には,この事件は更に調査が必要でしょう.告発を行 う前には,まず事件を調べて多くの情報を集めましょう. ネットワークでの攻撃を見つけた場合には,まずは(可能ならば)ネットワーク への接続を切り離します.モデム接続ならばモデムケーブルを抜き,イーサ ネット接続ならばイーサネットケーブルを抜きましょう.これにより,より大 きな被害を防ぐことができますし,相手側にも発見に気づかせず,ネットワー クの問題だと思わせることができるかもしれません. ネットワーク接続を切り離せない場合(忙しいサイトや,マシンを物理的に操 作できない場合)には,次善の策として,tcp_wrappers や ipfwadm のような ツールを使って侵入者のサイトからのアクセスを拒否しましょう. 侵入者と同じサイトのユーザを全て拒否することができない場合は,ユーザア カウントをロックすべきです.ユーザアカウントをロックするのは容易でない ことには注意してください..rhosts ファイル,FTP でのアクセス,裏口にな り得るホストには気を付けてください. 以上の処置(ネットワークの切断,攻撃者のサイトからのアクセス拒否,アカ ウントの停止)の後は,これらのユーザのプロセスを全て止め,ログアウトさ せます. 攻撃者は戻ってこようとするでしょうから,その後しばらくは自分のサイトを 監視すべきです.おそらく,別のアカウントや別のネットワークアドレスを 使ってくるでしょう. 9.2. 既にセキュリティが破られてしまった場合 既にシステムに侵入されてしまったことに気づいた場合や,侵入に気づいて (願わくば)侵入者をシステムから追い出した場合にはどうすればいいでしょう か? 9.2.1. セキュリティの穴を塞ぐ 攻撃者がシステムに侵入した方法を調べることができたら,今度はその穴を塞 がなければなりません.例えば,そのユーザがログインする直前にいくつか FTP のエントリがあったとします.その場合には FTP のサービスを停止し, 新しいバージョンのサーバが出ていないか,あるいはセキュリティ関係のメー リングリストに修正方法が投稿されていないかを調べましょう. 全てのログファイルを調べ,セキュリティ関係のメーリングリストやウェブペ ージを調べ,修正可能な新しい一般的な弱点が出ていないか調べます. Caldela のセキュリティ修正は http://www.caldera.com/tech-ref/security/ にあります.RedHat はまだセキュリティ修正とバグ修正を分離していません が,ディストリビューションの訂正は http://www.redhat.com/errata にあり ます. Debian にはセキュリティのためのメーリングリストと WWW ページがありま す.詳しくは http://www.debian.com/security/ を見てください. あるベンダがセキュリティ更新パッケージをリリースしていれば,ほぼ確実に 他の Linux ベンダもセキュリティ更新パッケージを出しているでしょう. 現在はセキュリティ監査を行うプロジェクトがあります.このプロジェクト は,ユーザ空間で動作するユーティリティを組織的に全て検査して,セキュリ ティ的な弱点やオーバーフローの可能性がある部分を探す作業を行っていま す.このプロジェクトによるアナウンスを以下に引用します: 「我々は Linux 関連のソースコードの組織的な監査を行って OpenBSD と同じくらい安全にしようとしています.我々は既にいく つかの問題を明らかにして (そして修正して)いますが,まだまだ 助力が必要です.このメーリングリストは誰でも投稿できますし, セキュリティ関連の一般的な議論にも役立つリソースです.このメ ーリングリストのアドレスは security-audit@fer- ret.lmh.ox.ac.uk です.購読するには security-audit-sub- scribe@ferret.lmh.ox.ac.uk 宛に空メールを送ってください」 攻撃者を締め出さなければ,彼らはまた戻ってくるでしょう.あなたのマシン に戻ってくるだけでなく,同じ LAN にある他のマシンにも来るかもしれませ ん.彼らがパケット盗聴プログラムを実行していたら,大抵,他のマシンにも アクセスできるようになっていることでしょう. 9.2.2. 被害の見積り まず被害の見積りを行います.何が壊されているでしょうか? Tripwire のよ うな,システムの完全性をチェックするプログラムを実行していれば被害を調 べる助けとなるはずです.そうでなければ,重要なデータを全て個別に確認し なければならないでしょう. 最近は Linux のシステムのインストールが簡単になったので,設定ファイル を保存しておいてから,ディスクをフォーマットし直し,再インストールし, ユーザのファイルと設定ファイルを書き戻すという手順を考えてみてもよいで しょう.こうすれば,新しくてきれいなシステムであることを保証できます. 破られたシステムからバックアップファイルを行わなければならない場合に は,バイナリを書き戻す時には特に注意しましょう.侵入者がトロイの木馬を 置いているかもしれないからです. 侵入者に root 権限を奪われた場合には,再インストールも必須だと考えてく ださい.加えて,証拠を残しておきたいと思うでしょうから,予備のディスク を金庫に保管しておくことも無駄ではないかもしれません. その後は,どれだけ前にやられたのか,そして壊された成果はバックアップに 入っているのかどうかを心配しなければなりません.できるだけ新しいバック アップを使いましょう. 9.2.3. バックアップ,バックアップ,バックアップ! セキュリティの問題において,定期的なバックアップは大変貴重なものです. システムが破壊された場合,必要なデータをバックアップから書き戻すことが できます.もちろん攻撃者にとって価値のあるデータもありますから,彼らは データを破壊するだけでなく,盗んでしまうかもしれません.それでも最低限 こちら側にデータだけは残ります. 改竄されたファイルをバックアップから書き戻す前には,過去に渡っての複数 のバックアップを必ず調べましょう.侵入者がずっと前からファイルを壊して いるかもしれず,壊されたファイルの正しいバックアップを取っているかもし れません! もちろん,バックアップにまつわるセキュリティの問題もたくさんあります. バックアップは安全な場所に保管しましょう.誰がバックアップに触れるのか を知っておきましょう.(もし攻撃者がバックアップを手に入れてしまった ら,知らないうちにあなたの持つ全てのデータにアクセスされてしまいま す.) 9.2.4. 侵入者を突き止める さて,侵入者を締め出して,システムを復旧させましたが,まだ全ては終わっ ていません.侵入者が捕まることはまずありませんが,攻撃を受けたことは報 告しておくべきです. あなたのシステムに攻撃を行った攻撃者のサイトの管理者の連絡先に,攻撃を 受けたことを報告しましょう.この連絡先は whois コマンドか, INTERNIC のデータベースで調べることができます.適切なログのエントリと日時を相手 にメールで送りましょう.他にもわかっている侵入者の特徴があれば,それも 知らせましょう.メールを送った後に(気になるなら)電話をすべきです.その 管理者があなたのサイトへの攻撃者に気づいたら,今度はこの管理者が攻撃者 がやってきているサイトの管理者に話ができるかもしれません. 腕の立つクラッカーは,クラックしたシステムを間にいくつか挟んで攻撃して くることがよくあります.その経路には自分達がシステムを破られたことさえ 知らないサイトも(たくさん)あります.ですから,クラッカーの本拠地を追跡 して突き止めることは困難です.話をした管理者が役に立たなくても,その辺 りの配慮をしてあげましょう. また,自分が所属しているセキュリティ関連団体(CERT 等)や,お使いの Linux システムのベンダにも報告 すべきです. 10. セキュリティ関係の情報源 UNIX 一般のセキュリティと Linux 特定のセキュリティのいずれについても, 良いサイトがたくさんあります.セキュリティに関するメーリングリストを 1 つ(あるいはそれ以上)購読し,セキュリティに関する修正を常に最新の状態に しておくことが重要です.以下に挙げるリストは量こそ少ないですが,とても 有益なものです. 10.1. FTP サイト CERT は Computer Emergency Response Team の略です.CERT は最新の攻撃や その対処についての警告を発行しています.詳しくは cert.org を見てくださ い. Replay (http://www.replay.com) にはセキュリティ関連プログラムの大きな アーカイブがあります.このサイトはアメリカ合衆国国内にはありませんの で,アメリカの馬鹿げた暗号規制に従う必要はありません. Matt Blaze 氏は CFS の作者であり,セキュリティの大家です.Matt 氏のア ーカイブが ftp://ftp.research.att.com/pub/mab にあります. tue.nl はオランダにある大きなセキュリティ関係 FTP サイトです. ftp.win.tue.nl 10.2. ウェブサイト o The Hacker FAQ はハッカーに関する FAQ です: The Hacker FAQ o COAST アーカイブには UNIX のセキュリティ関連プログラムと情報がたく さんあります: COAST o SuSe によるセキュリティのページ: http://www.suse.de/security/ o Rootshell.com はシステムの問題を知るのに大変役立つサイトで,現在は クラッカーにも使われています: http://www.rootshell.com/ o BUGTRAQ はセキュリティに関する勧告を発行しています: BUGTRAQ archives o CERT(the Computer Emergency Response Team)は UNIX に対する一般的な 攻撃に関する勧告を発行しています: CERT のホームページ o Dan Farmer 氏は SATAN 等のセキュリティ関連ツールの作者です.氏のホ ームページにはセキュリティに関する興味深い調査結果やセキュリティ関 連ツールがあります: Dan Farmers trouble.org o The linux security WWW は Linux のセキュリティ情報を調べるのに便利 なサイトです: Linux Security WWW o Infilsec には特定のプラットフォームのセキュリティ的な弱点を調べるこ とができる検索エンジン(vulnerability engine)があります: http://www.infilsec.com/vulnerabilities/ o CIAC は一般的な問題について定期的にセキュリティ bulitin を送ってく れます: http://ciac.llnl.gov/cgi-bin/index/bulletins o Linux Pluggable Authentication Modules(差し替え可能な認証モジュー ル)の良い入門が http://www.kernel.org/pub/linux/libs/pam/ にありま す. o Debian プロジェクトにはセキュリティ関係の修正パッケージと情報を載せ た WWW ページがあります(http://www.debian.com/security/). o WWW Security FAQ: これは Lincoln Stein 氏が書かれた文書で,WWW のセ キュリティに関する素晴らしい参考文献で す.http://www.w3.org/Security/Faq/www-security-faq.html をご覧くだ さい. 10.3. メーリングリスト Bugtraq: Bugtraq を購読するには,listserv@netspace.org 宛に本文が `subscribe bugtraq' であるメールを送ります.(メーリングリストのアーカ イブについては,前述のリンクを参照してください.) CIAC: majordomo@tholia.llnl.gov 宛に本文(サブジェクトではありません)が `subscribe ciac-bulletin' であるメールを送ります. RedHat はたくさんのメーリングリストを運営していますが,その中でも特に 重要なのが redhat-announce メーリングリストです.セキュリティ(その他) の修正パッケージに関する情報が出るとすぐにここに投稿されます.本文が 「subscribe redhat-announce」であるメールを majordomo@redhat.com 宛に 送ってください. Debian プロジェクトもセキュリティ更新パッケージを扱うメーリングリスト を運営しています.詳しくは http://www.debian.com/security/ をご覧くだ さい. 10.4. 書籍 セキュリティ関係の良書はたくさんあります.この章ではその一部を紹介しま す.セキュリティ専門の本に加え,システム管理の本の多くでもセキュリティ の話題を扱っています. (訳注: これらの本の和訳があればぜひお知らせくだ さい.) Building Internet Firewalls By D. Brent Chapman & Elizabeth D. Zwicky 1st Edition September 1995 ISBN: 1-56592-124-0 Practical UNIX & Internet Security, 2nd Edition By Simson Garfinkel & Gene Spafford 2nd Edition April 1996 ISBN: 1-56592-148-8 Computer Security Basics By Deborah Russell & G.T. Gangemi, Sr. 1st Edition July 1991 ISBN: 0-937175-71-4 Linux Network Administrator's Guide By Olaf Kirch 1st Edition January 1995 ISBN: 1-56592-087-2 PGP: Pretty Good Privacy By Simson Garfinkel 1st Edition December 1994 ISBN: 1-56592-098-8 訳注: 和訳は 山本和彦監訳「PGP 暗号メールと電子署名」 株式会社オライリージャパン, 1996 ISBN: 4-900900-02-8 です. Computer Crime A Crimefighter's Handbook By David Icove, Karl Seger & William VonStorch (Consulting Editor Eugene H. Spafford) 1st Edition August 1995 ISBN: 1-56592-086-4 11. 用語解説 o 認証(authentication): 受け取ったデータが送られたものと同じであるこ とや,データの送り主が本当に実際に本人であるかどうかを確認するこ と. o 要塞ホスト(bastion host):通常はインターネットに接続したり,内部ネッ トワークでユーザがアクセスする中心ホスト.何も備えがないシステムは 攻撃に対して脆弱であるため,高度に安全にしなければならない.この名 前は中世の城砦の外壁の高度な防御工事に由来する.要塞の監督は守備の 要であり,通常は頑丈な壁があり,騎兵隊の詰所があり,攻撃者を撃退す るための油や熱湯を入れる桶がある. o バッファオーバーフロー(buffer overflow): 通常のプログラムの書き方で は,「十分長いバッファ」を確保されず,バッファのオーバーフローの チェックも行われないことがある.このようなバッファがオーバーフロー すると,プログラム(デーモンや setuid されたプログラム)を動作中に他 の目的に悪用することが可能である.一般的に,これはスタック上の関数 の戻り先を他の場所に上書きすることで行われる. o サービス妨害攻撃(denial of service): サービス妨害攻撃は,攻撃者が本 来の目的とは異なる使い方でコンピュータの資源を食い潰し,通常のネッ トワーク資源の利用を妨害する攻撃である. o dual-homed host: 少なくとも 2 つのネットワークインタフェースを持 つ,汎用のコンピュータシステム. o 防火壁(firewall): 保護されたネットワークとインターネット間,あるい は異なるネットワーク同士の間のアクセスを制限するコンポーネントある いはコンポーネントの集合. o ホスト(host): ネットワークに接続されたコンピュータ o IP 詐称(IP spoofing): IP 詐称は複数の要素からなる,技術的に複雑な攻 撃である.あなたは相手が誰かを知っているつもりであるが,実際にはそ うではないという,信頼関係に基づくトリックでセキュリティの問題を起 こす.daemon9, route, infinity によって書かれた詳しいペーパーが Phrack Magazine の 第 7 巻,第 48 号にある. o 否認防止性(non-repudiation): 送り主がデータを送ったことを後から否定 しようとしても,その送り主が実際にデータを送ったことをデータを受け 取った側が証明できるという性質. o パケット(packet): インターネットにおける通信の基本単位. o パケットフィルタリング(packet filtering:) ネットワークを出入りする データの流れを選択的に制御すること.パケットフィルタは,通常は外部 ネットワークとの間のルーティングの時に,パケットの通行を許可あるい は禁止する(普通はインターネットと内部ネットワークの間).パケット フィルタリングを行うためには,許可または禁止するパケットの種類(特定 の IP あるいはポートで指定)を指定するルールを設定する必要がある. o 境界ネットワーク(perimeter network): セキュリティの層を追加するため に,保護されたネットワークと外部ネットワークとの間に作るネットワー ク.境界ネットワークは非武装地帯(DMZ, demilitarized zone)と呼ばれる こともある. o 代理サーバ(proxy server): 内部クライアントに外部サーバへアクセスさ せるためのプログラム.クライアントは代理サーバにアクセスし,代理サ ーバは,クライアントの許可したリクエストを実際のサーバに中継し,そ の応答をクライアントに中継する. o ユーパーユーザ(superuser): root の通称. 12. よくある質問 1. ドライバをカーネルに直接組み込むのと,モジュールとして作成するので は,どちらが安全でしょうか? 回答: モジュールを用いたデバイスドライバのロード機能は無効にしてお く方が良いという意見の人もいます.というのも,侵入者がトロイの木馬 を仕込んだモジュールやシステムのセキュリティに影響を与えるモジュー ルをロードするかもしれないからです. しかし,モジュールを読み込むためには root にならなくてはなりませ ん.モジュールのオブジェクトファイルを書き換えることができるのも root だけです.つまり,侵入者がモジュールを組み込むためには,root 権限が必要です.逆に侵入者が root 権限を得てしまったら,モジュール をロードするかどうかということよりも,もっと深刻な事態になります. モジュールはあまり頻繁に使用しない特定デバイスを動的に読み込むため の仕組みです.例えばサーバマシンや防火壁などでは,こういうことはあ まり起こりません.従って,サーバとして動かすマシンでは,カーネルに 直接ドライバを組み込む方が良いでしょう.また,モジュールを使うと直 接カーネルに組み込む場合よりも動作が遅くなります. 2. リモートのマシンから root でログインできません. 回答: ``root のセキュリティ''の章を読みましょう.これはリモートのユ ーザが telnet で root としてログインしようとするのを防ぐため,わざ とそうしているのです. root として telnet でログインするのはセキュ リティ的には非常に危険なことです.侵入者になる可能性を持った人は常 にあなたのそばにいて,パスワードを盗むためのプログラムを自動的に動 かしていることを忘れてはなりません. 3. RedHat Linux 4.2, 5.x でシャドウパスワードを使うにはどうすれば良い でしょう? 回答: シャドウパスワードは,標準の /etc/passwd ファイル以外のファイ ルにパスワードを格納する機構です.これにはいくつかの利点がありま す.最初の利点は,シャドウファイル /etc/shadow は誰でも読めなければ ならない /etc/passwd ファイルと異なり,root しか読み出せない点で す.別の利点は,管理者として,他のユーザアカウントの状態を誰にも知 らせないまま,アカウントを有効または無効にできることです. シャドウパスワードを使っていても,ユーザやグループ名の格納には /etc/passwd ファイルが使われます.このファイルは, /bin/ls 等のプロ グラムがディレクトリ表示の際にユーザ ID を適切なユーザ名に変換する ために使います. /etc/shadow ファイルには,ユーザ名とパスワードとアカウントの有効期 限などのアカウント情報だけが含まれています. シャドウパスワードを有効にするためには,root になって pwconv コマン ドをを実行します.すると /etc/shadow ファイルが作られ,アプリケー ションに使われるようになります.RedHat 4.2 以降では,通常の /etc/passwd ファイルからシャドウパスワードへの変更への適合は PAM モ ジュールが自動的に行います.他の変更は全く必要ありません. パスワードの安全を考えていれば,たぶんパスワードも最初から良いもの を作ろうと思うでしょう.これを行うために PAM の一部である `pam_cracklib' モジュールが利用できます.これはパスワードに対して Crack ライブラリを適用し,パスワードクラッキングプログラムによって 簡単に推測されないかどうか調べることができます. 4. Apache の SSL 拡張はどうやって有効にするのですか? 回答: 1. バージョン 0.8.0 以降の SSLeay を から入手します 2. これをコンパイル,テスト,そしてインストールします 3. Apache 1.2.5 のソースを入手します 4. ここ か ら Apache SSLeay 拡張を入手します 5. これを Apache 1.2.5 のソースディレクトリで展開し,README に従っ てパッチを当てます 6. 設定とコンパイルを行います アメリカ国外にある Replay Associatesからバイナリパッケージを入手す ることもできます. 5. セキュリティを確保したままで,ユーザアカウントを処理するにはどうす れば良いでしょう? 回答: RedHat ディストリビューション,特に RedHat 5.0 には,ユーザア カウントの状態を変更するツールがたくさん入っています. o シャドウパスワードと非シャドウパスワードを相互変換する pwconv と unpwconv o passwd ファイルと group ファイルの構成が正しいかどうか検査する pwck と grpck o ユーザアカウントの追加,削除,変更を行う useradd, usermod, userdel.グループについて同様の作業を行うための groupadd, gropumod, groupdel o グループにパスワードを設定する gpasswd これらのプログラムは全て「シャドウ対応」です.つまり,シャドウパス ワードが有効であれば,/etc/shadow のパスワード情報を参照し,有効で なければこのファイルは参照しません. 詳しくは,それぞれのコマンドのオンラインマニュアルを参照してくださ い. 6. Apache で特定の HTML をパスワードで保護するにはどうすればよいでしょ うか? http://www.apacheweek.org のことをご存じないでしょう? ユーザ認証については,http://www.apacheweek.com/features/userauth に情報がありますし,ウェブサーバに関するその他のヒントも http://www.apache.org/docs/misc/security_tips.html にあります. 13. まとめ セキュリティに関する警告が流れるメーリングリストを購読することと,最新 のソフトウェアを使うことによって,セキュリティを大幅に向上させることが できます.ログファイルに注意を払い,tripwire のようなプログラムを定期 的に実行すればもっと良いでしょう. 家庭のマシンを管理する分には,十分なレベルのセキュリティも困難ではあり ません.仕事に使うマシンではかなり努力が必要でしょうが,Linux はかなり 安全なプラットフォームです.Linux の開発の特徴により,セキュリティ関連 の修正が商用の OS よりもずっと早いことが多々あり,このため Linux はセ キュリティが必要な場合には理想的なプラットフォームになっています. 14. 謝辞 本ドキュメントの情報はいろいろな所から集めたものです.直接・間接的に貢 献してくださった以下の方々に感謝します: Rob Riggs さん rob@DevilsThumb.com S. Coffin さん scoffin@netcom.com Viktor Przebinda さん viktor@CRYSTAL.MATH.ou.edu Roelof Osinga さん roelof@eboa.com Kyle Hasselbacher さん kyle@carefree.quux.soltc.net David S. Jackson さん dsj@dsj.net Todd G. Ruskell さん ruskell@boulder.nist.gov Rogier Wolff さん R.E.Wolff@BitWizard.nl Antonomasia さん ant@notatla.demon.co.uk Nic Bellamy さん sky@wibble.net Eric Hanchrow さん offby1@blarg.net Robert J. Berger さんrberger@ibd.com Ulrich Alpers さん lurchi@cdrom.uni-stuttgart.de David Noha さん dave@c-c-s.com 以下の方々はこの HOWTO を色々な言葉に翻訳してくださいました! Linux の言葉を広める手伝いをしてくださる全ての方々に深く感謝します. ポーランド語: Ziemek Borowski さん ziembor@FAQ-bot.ZiemBor.Waw.PL 日本語: 藤原輝嘉 fjwr@mtj.biglobe.ne.jp インドネシア語: Tedi Heriyanto さん 22941219@students.ukdw.ac.id