ネットワークに接続する時間が長ければ長いほど, ネットワークのセキュリティが重要になってきます. ネットワークのセキュリティを破ることは, 物理的あるいはローカルのセキュリティを破るよりも簡単なことが多く, よりありふれたことです.
ネットワークのセキュリティ確保を支援するための良いツールはたくさんあり, これらの多くは Linux の各ディストリビューションにも付属しています.
侵入者がネットワーク上でより多くのシステムのアクセス権を得るためによく
使う方法の一つが, 既に悪用しているホスト上でパケット盗聴プログラムを使
うことです. この「盗聴プログラム」は, イーサネット上のパケットストリー
ムの passwd
, login
, su
のようなものを監視し,
その後のトラフィックをログに残します. このようにして, 侵入者は破ろうと
さえとしていないシステムのパスワードも得てしまいます. 平文の(暗号化さ
れていない)パスワードは, このような攻撃に対して非常に脆弱です.
例: ホスト A は既に破られています. 攻撃者はパケット盗聴プログラムをイ
ンストールします. ホスト C からホスト B への管理者のログインを拾い出し
ます. まず管理者が B にログインするときに, 個人のパスワードを入手しま
す. それから, 管理者は何か問題を処理するために su
を実行しま
す. このときに, ホスト B の root のパスワードが入手できます. 後で, 管
理者が誰かを他のサイトのホスト Z に telnet
させます. こうして,
攻撃者はホスト Z の password/login を入手することができます.
今日では, 攻撃者はこの攻撃を行うためにシステムを破る必要などありません. ノートパソコン等を建物に持ち込み, ネットワークに繋いでしまえばよいので す.
この攻撃を防ぐには, ssh
等のパスワード認証を暗号化します. POP
の場合には APOP 等を使うことで, この攻撃を防ぐことができます. (通常の
POP は, パスワードを暗号化せずにネットワーク上に流すので, この攻撃に対
して非常に脆弱です. )
どんなネットワークであれ, Linux システムを接続する前にまず確 認すべきことは, どのサービスを提供するかです. 提供する必要が無いサービ スは無効にするべきであり, そうすることで 心配の種を一つ減らすことがで き, 攻撃者がセキュリティホールを探す余地も一つ減ります.
Linux でサービスを無効にするための方法は色々あります.
/etc/inetd.conf
ファイルを見れば, inetd
経由で提供され
ているサービスを確認することができます. 必要の無いサービスは, コメントア
ウトして(行の先頭に #
を挿入します), inetd のプロセスに
SIGHUP を送ることで無効にすることができます.
/etc/services
ファイル内のサービスを削除
(またはコメントアウト) する方法もあります.
これによりローカルのクライアントもサービスを見つけられなくなります
(例えば ftp
の項を削除し,
そのマシンからリモートサイトへ ftp すると,
"unknown service" というエラーになるでしょう).
しかし, サービスの削除に伴うトラブルに見合うだけの価値はないでしょう.
というのも,
/etc/services
からサービスを削除してもセキュリティが向上するわけではないからです.
/etc/services
で ftp
の項目をコメントアウトしていても,
ローカルのユーザが ftp
を使いたければ,
FTP の一般的なポート番号を使うクライアントを用意すればちゃんと動作するのですから.
有効なまま残しておくとよいサービスには以下のようなものがあります:
ftp
telnet
(or ssh
)pop-3
or imap
identd
特定のパッケージを使わないことが分かっているならば, そのパッケージを全
部削除する方法もあります. Red Hat ディストリビューションでは,
rpm -e パッケージ名
というコマンドがパッケージ全体を
削除するコマンドです. Debian の場合は, dpkg --remove
コマンド
で同様のことが実行できます.
加えて, rsh/rlogin/rcp ユーティリティ(/etc/inetd.conf から login
(rlogin
が使用), shell(rcp
が使用), exec
(rsh
が使用)の項目を含む)が /etc/inetd.conf
から起動
されるのを無効にしたいと思うことでしょう. これらのプロトコルは非常に危
険ですし, 過去にも攻撃を受ける原因となってきました.
/etc/rc.d/rc[0-9].d
(Red Hat の場合. Debian では /etc/rc[0-9].d
)
ディレクトリをチェックし,
不要なサーバが起動されていないかどうか確認しましょう.
こういったディレクトリ中のファイルは実際には
/etc/rc.d/init.d
ディレクトリ
(Red Hat の場合. Debian では /etc/init.d
)
中のファイルへのシンボリックリンクです.
init.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
を実行すれば,
お使いのマシンで行われているサービスを全て表示することができます.
自分のネットワーク上の全てのホストに関して最新の DNS 情報を保つことは, セキュリティの向上に繋がります. 許可されていないホストがネットワークに 繋がれた際には, そのホストが DNS エントリを持たないことから識別するこ とができます. サービスの多くは正しい DNS エントリを持たないマシンから の接続を受け付けないように設定することができます.
identd
identd
は一般的に inetd
の代わりとなる小さなプログラ
ムです. identd
はどのユーザがどの TCP サービスを受けているか
を常に監視し, 要求に応じてこの結果を報告します.
多くの人は identd
の有益さを誤解しており, identd
を
無効にしたり, 外部サイトからの identd
へのリクエストをブロッ
クしたりしています. identd
はリモートサイトを助けるためにある
のではありません. リモートの identd
から得たデータが正しいか
どうかを知る術はありません. identd
のリクエストは認証を行いま
せん.
それでは, どうして identd を使うのでしょうか? それは読者の皆さんを
助けてくれるからであり, 追跡調査の際のデータになるからです.
identd
が悪用されていなければ, リモートサイトに TCP サービス
を受けたユーザ名やユーザID を知らせることができます. リモートサイトの
管理者が戻ってきて彼らのサイトが攻撃されていると言ってきた場合, 簡単に
そのユーザに対して行動を起こすことができます. もし identd
が
動いていなければ, 大量のログを調べ, その時に誰がいたのか調べなければな
りませんが, そのユーザを突き止めることは一般にとても時間がかかる作業で
す.
ほとんどのディストリビューションに付属している identd
は一般
に思われているよりも細かい設定が可能です. 特定のユーザについて
identd
を無効にすることができますし(.noident
ファイ
ルを作ります), identd
リクエストのログを全て残すこともできま
すし(この設定をお勧めします), ユーザ名の代わりにユーザID や NO-USER を
返すようにすることさえできます.
マシンやネットワークのポートやサービスの探査を行う ソフトウェアのパッケージはいろいろあります. 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 を見てください.
SATAN や ISS などの探査プログラムによる探査を受けたことを 警告するために設計されたツールがいくつかあります. しかし, tcp_wrappers をうまく使い, ログを定期的に見ていれば, このような探査があったことはわかります. 最低限の設定でも, SATAN は Red Hat の標準システムのログに痕跡を残します.
「見えない」ポート探査もあります. TCP ACK ビットがセットされているパケッ ト(確立されている接続ではそうなっています)は多分, パケットフィルタリング を行う防火壁を通過するでしょう. 確立されているセッションを持たない ポートから返される RST パケットは, そのポートが生きている証拠として受 け取ることができます. TCP wrappers はこれを検出できないと思います.
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 の支援を受けていました. これも徹底的にセキュリティに配慮して書かれたメール配送エージェントです. postfix に関するもっと詳しい情報については http://www.postfix.org をご覧ください.
「サービス妨害攻撃(Denial of Service attack, DoS attack)」は, リソース を食い潰すことにより, 正当なリクエストに応じられないようにしたり, 正当 なユーザがマシンにアクセスできないようにする攻撃です.
サービス妨害攻撃は近年とても増えています. ここでは, 有名なものや最近の ものをいくつか紹介します. 新しいものが常に現れるので, ここ示す例はほん の一部に過ぎない点には注意してください. 最新の情報を知るには, Linux の セキュリティ関連メーリングリストや bugtraq メーリングリストやこれらの アーカイブを読みましょう.
ping flooding 攻撃を受けた場合は, tcpdump
などのツールを使っ
てどこからパケットが来たのか(あるいは来たように見えるのか)を調べ, 読者
の皆さんが接続しているプロバイダにこのデータに基づいて相談しましょう.
ping flood 攻撃はルータのレベルや防火壁の利用で簡単に止めることができ
ます.
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 にあります.
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).
防火壁は, ローカルのネットワークに出入りできる情報を制御するための仕組みです. 普通, 防火壁になるホストはインターネットとローカルの 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 にあります. ほかには:
Linux の IP Firewalling Chains はカーネル 2.0 の防火壁用のコードを カーネル 2.2 用に更新したものです. これは以前の実装よりもずっと多くの機能を持っています. 以下に列挙します:
現在, カーネル 2.0 で ipfwadm
をお使いであれば,
ipfwadm
のコマンド形式を
ipchains
で使える形式に変換するスクリプトがあります.
詳しくは IP Chains HOWTO をお読みください. これは http://www.rustcorp.com/linux/ipchains/HOWTO.html にあります.
VPN は何らかの既存ネットワークの上に 「仮想的な」ネットワークを確立する手法です. この仮想ネットワークは, 暗号化されていたり, ネットワークに加わっている何らかの既知の存在との間のトラフィックしか 通さないようになっていたりします. VPN は, 家で作業している人と会社の内部ネットワークを インターネット経由で接続するためにもよく使われます.
Linux の IP マスカレードを行う防火壁を使っており, かつ MS の PPTP (Microsoft 製の VPN 接続のための製品) パケットを通過させる必要がある場合には, これを行うためのカーネルパッチを使ってください. ip-masq-vpn をご覧ください.
Linux で利用できる VPN のソリューションはいくつかあります:
情報ポインタや詳しい情報については, IPSEC の章もご覧ください.