security(7) FreeBSD 一般コマンドマニュアル

security

前のページ 上に戻る 次のページ

security


     機能です。 BSD マルチユーザシステムは、昔ながらのセキュリティをいくらかは
     備えていますが、さらなるセキュリティ機構を組み込んで維持していくことで、
     ユーザを `正直に' し続ける仕事は、システム管理者の最も大きな責務の一つで
     しょう。マシンは、管理者が設定しただけのセキュリティしか示しません。セ
     キュリティに関する問題は、むしろ、便利さを求める人間との競合問題です。一
     般に、 UNIX システムは莫大な数のプロセスを同時に実行させることができ、そ
     れも、サーバとして動作するものが多いのです。つまり、外部の何者かが接続し
     てきて、サーバプロセスと会話することができるということなのです。昨日まで
     使われていたミニコンピュータやメインフレームは、今日ではデスクトップコン
     ピュータが取って代わり、しかも、それらはネットワークで結ばれてインター
     ネットと接続されるようになりました。これにより、セキュリティは昔と比べて
     はるかに大きな問題となっています。

     セキュリティは、タマネギの階層のようなアプローチを通すと最もよく実装でき
     ます。手短に言って、やりたいことは、便利さを損ねない程度にできるだけ多く
     の階層を作り、システムに侵入されていないかを注意深く監視することです。セ
     キュリティの階層を作りすぎたくはありません。作りすぎると、侵入の検出が妨
     げられることになるでしょう。どんなセキュリティ機構でも、侵入の検出をする
     ことが唯一とても重要なことなのですから。例えば、システムの各バイナリに
     schg フラグ ( chflags(1) 参照) を設定するのは大して意味がありません。フラ
     グを設定すると、一時的にはバイナリを保護することができますが、侵入してき
     たクラッカーが、マシンのセキュリティ機構がクラッカーの侵入を全く検知でき
     なくなるような変更ではあるが、管理者が容易に検出できるような変更をできな
     くしてしまうからです。

     システムセキュリティには、さまざまな形での攻撃に対処することもついて回り
     ます。攻撃には、root を破ろうとはしないが、システムをクラッシュさせたり、
     さもなければ、システムを使用不能にしたりしようとするものも含まれていま
     す。セキュリティに関する問題は、いくつかのカテゴリに分類することができま
     す。

           1.   サービス不能攻撃

           2.   ユーザアカウントにかかる危険

           3.   アクセス可能なサーバを経由した root 権限にかかる危険

           4.   ユーザアカウントを通した root 権限にかかる危険

           5.   裏口の作成

     サービス不能攻撃とは、マシンから必要な資源を奪う行為です。サービス不能攻
     撃は、普通は、そのマシンで実行されるサーバやネットワークスタックを圧倒し
     て、マシンをクラッシュさせたり、さもなければマシンを使えなくしたりするよ
     うな力任せの方法です。サービス不能攻撃のいくつかは、ネットワークスタック
     のバグを利用して、パケット一つでマシンをクラッシュさせようとします。後者
     は、カーネルにバグ修正を施すことによってのみ修正することができます。サー
     バプロセスに対する攻撃は、オプションを適切に指定して、不利な状況にあるシ
     ステムにおいて、サーバプロセスが引き起こす負荷に限界を設けることで修正す
     ることができます。これらに比べると、ネットワークへの力任せの攻撃への対応
     はずっと難しくなります。たとえば、偽造パケットによる攻撃 (spoof-packet
     attack) は、インターネットからシステムを切り離す以外の方法で防ぐことはほ
     の権限を破る可能性があることを仮定するべきです。しかし、セキュリティを十
     分維持し、手入れの行き届いたシステムにおいては、あるユーザアカウントへの
     アクセスが可能となっても、攻撃者に必ずしも root へのアクセス権を与えると
     は限らないのが現実です。この違いは重要です。というのは、root へのアクセス
     権がなければ、一般的に、攻撃者は自分の侵入の痕跡を隠蔽することができませ
     んし、そのユーザのファイルを引っかき回したり、マシンをクラッシュさせたり
     できるのがせいぜいです。ユーザアカウントが危険に晒されるということは、た
     いへんよく起こることです。なぜなら、ユーザは、システム管理者ほどには前
     もって注意を払わない傾向があるからです。

     システム管理者は、あるマシン上で root の権限を破る方法は、潜在的に何通り
     もあるのだということを心しておかねばなりません。攻撃者が root のパスワー
     ドを知ってしまうかもしれません。攻撃者が root の権限で実行されるサーバの
     バグを見つけ、ネットワークからそのサーバへ接続して root の権限を破ること
     ができるかもしれません。ひとたびユーザアカウントを破ると、ユーザアカウン
     トから root の権限を破ることが可能であるというバグを持つ suid-root プログ
     ラムの存在を、攻撃者は知っているかもしれません。あるマシン上で、攻撃者が
     root の権限を破る方法を知ったとすると、攻撃者は、裏口を作る必要などないか
     もしれません。発見され、ふさがれた root の穴の多くには、クラッカーが侵入
     した跡を消そうとしてたくさん仕事した結果が含まれています。そのためにこ
     そ、多くのクラッカーは裏口を作るのです。この裏口は、クラッカーの検出をす
     るのに便利なやり方です。クラッカーに裏口を作らせないようにするということ
     は、セキュリティにとっては実際には良くないことかもしれません。なぜなら、
     そうすることで、クラッカーが最初に侵入してくるために発見したセキュリティ
     ホールがふさがるわけではないからです。

     セキュリティを改善する方法は、常に、 `タマネギの皮剥き' のように複数の層
     のアプローチで実装されるべきです。これらは次のように分類できます。

           1.   root とスタッフのアカウントの安全性を高める。

           2.   root の安全性を高める - root 権限のサーバと suid/sgid バイナ
                リ。

           3.   ユーザアカウントの安全性を高める。

           4.   パスワードファイルの安全性を高める。

           5.   カーネルのコア、raw デバイス、ファイルシステムの安全性を高め
                る。

           6.   システムに対して行なった、不適切な変更をすばやく検出する。

           7.   偏執狂的方法。


root アカウントとスタッフアカウントの安全性を高める

     root のアカウントの安全性を確保しないうちからスタッフのアカウントの安全性
     をうんぬんしてもしかたがありません。ほとんどのシステムでは、root アカウン
     トに割り当てたパスワードが 1 つあります。まず最初にすべきことは、このパス
     ワードは `いつでも' 危険に晒されていると仮定することです。ここでは、root
     のパスワードを消すべきだと言っているのではありません。パスワードは、マシ
     ンにコンソールからアクセスするのには、ほとんどいつでも必要なものです。こ
     /etc/group) の wheel グループに加えることがあります。 wheel グループに置
     かれたスタッフメンバには、 `su' を使って root になることが許されます。パ
     スワードエントリにおいて、最小限のメンバを wheel グループを置くことで、ス
     タッフメンバに wheel のアクセス権を与えてはいけません。スタッフメンバのア
     カウントは `staff' に置くべきです。そして `/etc/group' ファイルを通して
     wheel グループに加えるべきです。実際に root アクセスの必要な staff メンバ
     のみ wheel グループに置くようにすべきです。kerberos のような認証方法を使
     用する場合、root アカウントで `.k5login' ファイルを使って、誰も wheel グ
     ループに置く必要なく root に ksu(1) を許すようにすることもできます。この
     やり方はよりよい解決策なのかもしれません。なぜなら、wheel のメカニズムで
     は、侵入者がパスワードファイルを手に入れ、staff アカウントのいずれか 1 つ
     を破ることができると、root を破ることがまだできてしまうからです。 wheel
     のメカニズムを用いる方が、何もしないよりは良いのですが、必ずしも最も安全
     な選択肢とは限りません。

     root アカウントの安全性を高める間接的な方法として、別のログインアクセスの
     方法を用いて、スタッフのアカウントの暗号化パスワードを * にしておくこと
     で、スタッフのアカウントの安全性を高めるものがあります。この方法だと、侵
     入者がパスワードファイルを盗むことができるかもしれませんが、スタッフアカ
     ウントを破ることはできないでしょう。また、たとえ root が暗号化パスワード
     をパスワードファイルに付けていたとしても、間接的には root アカウントも破
     ることができないでしょう。スタッフメンバがスタッフアカウントでログインす
     る際には、 kerberos(1)ssh(1) のような、公開鍵 / 秘密鍵の鍵の組を使う
     安全性の高いログインの仕組みを使います。kerberos のような仕掛けを使う場
     合、一般に、kerberos サーバを実行するマシンと自分のデスクトップワークステ
     ーションとの安全性を確保しなければなりません。ssh で公開鍵 / 秘密鍵の組を
     使う場合、一般に、ログイン元マシン (通常は自分のワークステーション) の安
     全性を確保しなければなりません。ここで、 ssh-keygen(1) で公開鍵 / 秘密鍵
     の組を生成する際、鍵の組をパスワードで防御することにより、鍵の組への防御
     層を追加することもできます。スタッフアカウントのパスワードを * で外すこと
     ができると、管理者自身が設定した安全性の高い方法でしかスタッフメンバがロ
     グインできないことも保証できます。こうして、多くの侵入者が使う重大なセ
     キュリティの穴 (安全性の低い無関係なマシンからネットワークを覗き見る方法)
     を塞ぐようなセッションを提供する、安全性の高い暗号化されたコネクションを
     使うことを、スタッフメンバ全員に強制することができるのです。

     より間接的なセキュリティの仕組みでは、制限の強いサーバから制限の弱いサー
     バへログインすることを前提としています。例えば、メインマシンで、様々な種
     類のサーバを実行させている場合、ワークステーションではそれらのサーバを実
     行させてはなりません。ワークステーションを十分に安全にしておくためには、
     実行するサーバの数を、一つもサーバが実行されていないというくらいにまでで
     きる限り減らすべきです。また、パスワードで保護されたスクリーンセーバを走
     らせておくべきです。ワークステーションへの物理的アクセスが与えられたとす
     ると、もちろん言うまでもなく、攻撃者は管理者が設定したいかなる種類のセ
     キュリティをもうち破ることができるのです。これは、管理者として必ず考えて
     おかねばならない問題ですが、システム破りの大多数は、ネットワーク経由でリ
     モートから、ワークステーションやサーバへの物理的アクセス手段を持たない人
     々によって行われるという事実もまた、念頭に置いておく必要があります。

     kerberos のような方法を使うことで、スタッフアカウントのパスワードの変更も
     しくは停止を一箇所で行なうことと、スタッフメンバがアカウントを持つすべて
     のマシンに即時にその効果を及ぼすことが可能となります。スタッフメンバのア
     くチェックしていないサーバは、決して実行してはいけません。 root で実行さ
     せる必要のあるサーバはほとんどありません。例えば、ntalk, comsat, finger
     デーモンを、特別の「砂場 (sandbox) 」ユーザで実行させることができます。管
     理者が膨大な数の問題に直面していないのなら、この「砂場」は完璧ではありま
     せんが、セキュリティに関するタマネギ的アプローチはここでも成り立ちます。
     砂場で実行されているサーバプロセスを経由して侵入を果たすことができたとし
     ても、攻撃者はさらに砂場から外に脱出しなければなりません。攻撃者が通過せ
     ねばならない層の数が増えれば増えるほど、それだけ攻撃者が侵入に成功する確
     率が減ります。root の抜け穴は歴史的に、基本システムサーバも含め、 root 権
     限で実行されるほとんどすべてのサーバプロセスで発見されています。ユーザが
     sshd 経由でのみログインし、 telnetd, rshd, rlogind 経由でログインすること
     が決してないマシンを稼働させているのであれば、それらのサービスを停止させ
     て下さい。

     FreeBSD では、今では ntalkd, comsat, finger は砂場で実行させることがデ
     フォルトになっています。次に砂場で実行させるべきプログラムの候補として、
     named(8) があります。デフォルトの rc.conf ファイルには、named を砂場で実
     行するために必要な引数がコメントアウトされた形式で含まれています。新しい
     システムをインストールしているか、それとも既存のシステムをアップグレード
     して使っているかに依存しますが、砂場として使用する特別のユーザアカウント
     がインストールされていないかもしれません。用心深いシステム管理者であれ
     ば、できるだけいつでも研究を怠らず、サーバに砂場を仕込むものでしょう。

     通常、砂場で実行しないサーバが他にいくつかあります。sendmail, popper,
     imapd, ftpd などです。これらのうちいくつかのサーバには代わりとなるものが
     ありますが、代わりのものをインストールするには、それだけ多くの仕事が必要
     になるので、結局これらを喜んで入れてしまいます (便利さという要素がまたも
     勝利を収めるわけです)。これらのサーバは、root 権限で実行せねばならいかも
     しれません。また、これらのサーバ経由で生じる侵入を検出するためには、他の
     仕組みに頼らなくてはならないかもしれません。

     システムの root 権限の潜在的な穴で他に大きなものとして、システムにインス
     トールされた suid-root/sgid バイナリがあります。これらのバイナリ
     は、rloginのように、 /bin, /sbin, /usr/bin, /usr/sbin に存在するものがほ
     とんどです。 100% 安全なものは存在しないとはいえ、システムデフォルトの
     siud/sgid バイナリは比較的安全といえます。それでもなお、root の穴がこれら
     のバイナリにときおり発見されています。1998 年に Xlib で見つかった root の
     穴は、xterm (普通、suid 設定されています) を攻撃可能にしていました。安全
     である方がよいので、用心深いシステム管理者は残念に思いながらも、スタッフ
     のみが実行する必要がある suid バイナリは、スタッフのみがアクセス可能な特
     別なグループに含めるように制限を加え、誰も使わない suid バイナリは (chmod
     000 を実行して) 片付けてしまうでしょう。ディスプレイを持たないサーバは、
     一般的に xterm のバイナリを必要としません。 sgid バイナリもほとんど同様の
     危険な存在になり得ます。侵入者が kmem に sgid されたバイナリを破ることが
     できた場合、その侵入者は /dev/kmem を読み出すことができるようになります。
     つまり、暗号化されたパスワードファイルを読み出すことができるようになるの
     で、パスワードを持つどのアカウントをも、 (潜在的な) 危険に晒すことになり
     ます。代わりに、kmem グループを破った侵入者が pty を通して送られたキース
     トロークを監視できます。キーストロークには、安全な方法でログインするユー
     ザが使っている pty も含まれます。tty グループを破った侵入者は、ほぼ任意の
     ユーザの tty へ書き込みができます。ユーザが端末プログラムやキーボードをシ
     ミュレーションする機能を持ったエミュレータを使っている場合、侵入者は潜在


パスワードファイルの安全性を高める

     できるだけ多くのパスワードを * で外し、それらのアカウントのアクセスには
     ssh や kerberos を使うようにすることが、唯一の確実な方法です。たとえ暗号
     化パスワードファイル (/etc/spwd.db) が root でのみ読み出し可能だとして
     も、侵入者がそのファイルの読み出しアクセス権限を得ることは可能かもしれま
     せん。たとえ root の書き込み権限が得られないにしてもです。

     セキュリティスクリプトは常にパスワードファイルの変更をチェックし、報告す
     るようにすべきです (後述の「ファイルの完全性のチェック」を参照して下さ
     い)。


カーネルのコア、raw デバイス、ファイルシステムの安全性を高める

     root の権限を破ると、攻撃者は何でもできますが、もっと簡便なこともいくつか
     あります。例えば、最近のカーネルは、組み込みのパケット覗き見デバイス
     (packet sniffing device) ドライバを備えているものがほとんどです。 FreeBSD
     では `bpf' デバイスと呼ばれています。侵入者は普通、危険に晒されたマシンで
     パケット覗き見プログラムを実行させようと試みます。侵入者にわざわざそうい
     う機能を提供する必要はないので、ほとんどのシステムで bpf デバイスを組み込
     むべきではありません。

     bpf デバイスを外し、モジュールローダを無効にしても、 /dev/mem/dev/kmem という悩みの種がまだ残っています。この問題に関しては、侵入者は
     raw デバイスに書き込むこともできます。また、 kldload(8) という、別のカー
     ネル機能があります。やる気まんまんの侵入者は、KLD モジュールを使って自分
     独自の bpf もしくはその他覗き見デバイスを動作中のカーネルにインストールす
     ることができます。この問題を避けるため、システム管理者はカーネルをより高
     い安全レベル (securelevel) 、少なくとも安全レベル 1 で実行させる必要があ
     ります。 sysctl を使って kern.securelevel 変数に安全レベルを設定すること
     ができます。ひとたび安全レベルに 1 を設定すると、 raw デバイスに対する書
     き込みアクセスは拒否され、例えば `schg' のような特別な chflags フラグが効
     果を発揮します。これに加えて、起動時において重要なバイナリ・ディレクト
     リ・スクリプトファイルなど、安全レベルが設定されるまでの間に実行されるも
     のすべてに対しても `schg' フラグを確実に on にしておく必要があります。こ
     の設定をやり過ぎても構いませんが、より高い安全レベルで動作している場合、
     システムのアップグレードがはるかに困難になります。システムをより高い安全
     レベルで実行させるようにするが、お天道さまの下にあるすべてのシステムファ
     イルとディレクトリに schg フラグを設定しないという妥協をする方法もありま
     す。もう一つの可能性としては、単純に / および /usr を読み込み専用でマウン
     トすることです。ここで特筆すべきことは、システムを守ろうとしてアテナイの
     ドラコのように厳しくしすぎると、侵入を検出するという非常に重要なことがで
     きなくなってしまうということです。


ファイルの完全性のチェック: バイナリ、設定ファイルなど

     ことこの問題に至ると、システム管理者にできることは、便利さという要素がそ
     の醜い頭を上げない程度に、コアシステムの設定 / 制御ファイルを防御すること
     だけです。例えば、/ および /usr にある大部分のファイルに schg ビットを設
     定するために chflags を使用するのは、おそらく逆効果でしょう。なぜなら、そ
     うすることでファイルは保護できますが、侵入を検出する窓を閉ざしてしまうこ
     とにもなるからです。セキュリティのタマネギの最後の層はおそらく最も重要な
     もの、すなわち検出です。セキュリティの残りのものは、突然の侵入を検出でき
     なければ、全然有用ではありません( あるいは、もっと悪ければ、間違った安全
     います。ネットワークのトラフィックを別にして、NFS は最も可視性のない方法
     です。事実上検出されない各クライアント上のファイルシステムを監視できるよ
     うになります。アクセス制限されたサーバがスイッチを通してクライアントに接
     続する場合、たいてい NFS がより良い選択肢です。アクセス制限されたサーバが
     ハブを通したり、いくつかのルーティング層を通したりしてクライアントに接続
     する場合、 NFS はあまりにも危険な方法かもしれず ( ネットワークの面で )
     、ssh の方が認証の道筋は跡となって残りますが、それでもより良い方法かもし
     れません。

     アクセス制限されたマシンに、少なくとも監視することを前提としたクライアン
     トシステムへの読み込みアクセスをひとたび与えると、実際に監視するためのス
     クリプトを書かなくてはいけません。 NFS マウントをすれば、 find(1)md5(1) などの単純なシステムユーティリティでスクリプトを書くことができま
     す。少なくとも 1 日 1 回、クライアントのファイルを直接 md5 にかけ、さらに
     もっと頻繁に /etc および /usr/local/etc にあるようなコントロール用ファイ
     ルを試験するのが一番です。試験ファイルは、アクセス制限されたマシンが適性
     であると知っている、基となる md5 情報と比べて違いが見つかった場合、システ
     ム管理者に調べて欲しいと訴えるようにするべきです。優れたセキュリティ用ス
     クリプトは、 / および /usr などのシステムパーティション上で不適当に suid
     されたバイナリや、新たに作成されたファイルや削除されたファイルもチェック
     するのでしょう。

     NFS ではなく、ssh を使用する場合は、セキュリティ用スクリプトを書くのは
     ずっと難しいことです。スクリプトをクライアントから見えるようにし、動かす
     ためには、クライアントに対して scp を必ず行わなくてはいけません。そして、
     安全のため、スクリプトが使うバイナリ ( find など ) を scp する必要もあり
     ます。クライアントの ssh デーモンはすでに危険に晒されているかもしれませ
     ん。以上のことから、安全でないリンク上の場合は ssh は必要かもしれません
     が、 ssh を扱うのはとても大変なことです。

     優れたセキュリティ用スクリプトは、ユーザやスタッフメンバのアクセス設定
     ファイルもチェックするものです。 .rhosts, .shosts, .ssh/authorized_keys
     などがそれですが、MD5 のチェックの範囲外になってしまうかもしれません。

     ユーザ用のディスク容量が非常に大きい場合は、パーティション上の各ファイル
     を見て回るのに大変な時間がかかるかもしれません。この場合は、マウントフラ
     グを設定して、このパーティションに suid されたバイナリやデバイスを置けな
     いようにするのが良い考えです。 `nodev' および `nosuid' オプション (
     mount(8) 参照) が調べたいものでしょう。私なら、ともかくも週に 1 度はファ
     イルシステムをスキャンするでしょう。なぜなら、この層での目的は、侵入が意
     味があるかどうかに関わらず、侵入を検出することだからです。

     プロセスアカウンティング ( accton(8) 参照) は、比較的オーバヘッドの低いオ
     ペレーティングシステムの機能で、マシンに侵入されてしまった後の評価の仕組
     みとして使用することをお勧めします。侵入を受けた後でも当該ファイルが無傷
     である場合に、侵入者が実際にどのようにしてシステムに侵入したかを追跡する
     のに特に有益です。

     最後に、セキュリティスクリプトはログファイルを処理するようにし、ログファ
     イル自体もできるだけ安全性の高い方法で `リモート syslog は極めて有益にな
     り得ます' 生成するようにすべきです。侵入者は自分の侵入の痕跡を覆い隠そう
     としますし、また、ログファイルはシステム管理者が最初の侵入の時刻と方法を


サービス不能攻撃 (D.O.S. attack) についての特記事項

     このセクションではサービス不能攻撃を扱います。サービス不能攻撃は、普通
     は、パケット攻撃です。ネットワークを飽和させる最先端の偽造パケット
     (spoofed packet) 攻撃に対してシステム管理者が打てる手はそれほど多くありま
     せんが、一般的に、その種の攻撃によってサーバがダウンしないことを確実にす
     ることで、被害をある限度に食い止めることはできます。

           1.   サーバの fork の制限

           2.   踏み台攻撃の制限 (ICMP 応答攻撃、ping broadcast など)

           3.   カーネルの経路情報のキャッシュ

     普通に見られるサービス不能攻撃に、fork するサーバプロセスに対するものがあ
     ります。これは、サーバにプロセス・ファイル記述子・メモリを食い尽くさせ
     て、マシンを殺そうとするものです。 inetd ( inetd(8) 参照) には、この種の
     攻撃を制限するオプションがいくつかあります。マシンがダウンすることを防止
     することは可能ですが、この種の攻撃によりサービスが崩壊することを防止する
     ことは一般的に言ってできないことに注意する必要があります。inetd のマニュ
     アルページを注意深く読んで下さい。特に、 -c, -C, -R オプションに注意して
     下さい。IP 偽造攻撃 (spoofed-IP attack) は inetd の -C オプションの裏をか
     けるので、一般にオプションを組み合わせて使用するべきであることに注意して
     下さい。スタンドアロンサーバの中には、自分自身で fork を制限するパラメー
     タを持っているものがあります。

     sendmail には、 -OMaxDaemonChildren オプションがあります。負荷には遅れが
     あるので、 sendmail の負荷に限界を設けるオプションを使うよりも、このオプ
     ションを使う方がまともに動作する可能性ははるかに高いです。 sendmail の実
     行を開始する際に、 MaxDaemonChildren パラメータを設定するべきです。その値
     は、通常見込まれる負荷を扱える程度に十分高いが、それだけの数の sendmail
     を操作しようとするとマシンが卒倒してしまうほどには高くないような値に設定
     するべきです。 sendmail をキュー処理モード (-ODeliveryMode=queued) で実行
     することや、 sendmail デーモン (sendmail -bd) をキュー処理用プロセス
     (sendmail -q15m) と別に実行することも、用心深いことと言えます。それでもな
     おリアルタイムでの配送を望むのであれば、 -q1m のようにすることで、キュー
     処理をはるかに短い時間間隔で行うことができます。いずれにしても、
     MaxDaemonChildren オプションに合理的な値を確実に指定して、sendmail がなだ
     れをうって失敗することがないようにして下さい。

     syslogd は直接攻撃される可能性があるので、可能ならばいつでも -s オプショ
     ンを用いることを強く推奨します。これができないなら、 -a オプションを使っ
     て下さい。

     tcpwrapper の逆 identd などの接続返し (connect-back) を行うサービスについ
     ては十分注意を払うようにするべきです。これらは直接攻撃を受ける可能性があ
     ります。こういう事情があるので、tcpwrapper の逆 ident 機能を使おうとは思
     わないのが一般的です。

     境界ルータのところでファイアウォールを設けて、外部からのアクセスに対して
     内部サービスを防御するという考えは実によいものです。この考えは、LAN の外
     部からの飽和攻撃を防ぐことにあり、root ネットワークベースの root 権限への
     攻撃から内部サービスを防御することには、あまり考慮を払っていません。ファ
     アウォールに通常のfirst/last の範囲として、 4000 から 5000 を、高位ポート
     の範囲として、49152 から 65535 を使用しています。そして、 (いくつかのイン
     ターネットアクセス可能なポートをブロックから除外するのはもちろんですが)
     4000 より下のすべてをブロックしています。

     また別のありふれたサービス不能攻撃として、踏み台攻撃 (springboard attack)
     と呼ばれるものがあります。これは、サーバが自分自身、ローカルネットワー
     ク、そして他のマシンを過負荷に追い込むような応答を生成させる方法でサーバ
     を攻撃します。この種の攻撃の中で最もありふれたものは、ICMP PING BROADCAST
     攻撃があります。攻撃者は、実際に攻撃したいマシンのアドレスをソースアドレ
     スに設定した ping パケットを偽造して、対象の LAN のブロードキャストアドレ
     スに向けてパケットを送信します。境界にあるルータがブロードキャストアドレ
     スに対する ping パケットを握り潰すように設定されていない場合、LANは、詐称
     されたソースアドレスに向けて応答パケットを生成するはめになり、犠牲となる
     マシンが飽和するところまで行ってしまいます。攻撃者が同じトリックを異なる
     ネットワーク上のいくつものブロードキャストアドレスに対して同時に使用した
     場合、とくにひどいことになります。これまでに、120 メガビット以上のブロー
     ドキャスト攻撃が観測されています。 2 番目の踏み台攻撃は、ICMP エラー報告
     の仕掛けを狙うものです。ICMP エラー応答を生成するパケットを生成することに
     より、攻撃者はサーバの受信ネットワークを飽和させることができ、同時に、サ
     ーバが送信ネットワークを ICMP 応答で飽和させるようにすることができます。
     mbuf を消費し尽くさせることにより、この種の攻撃でサーバをクラッシュさせる
     ことも可能です。サーバの ICMP 応答生成が速過ぎて、 ICMP 応答の送信が追い
     付かない場合、とくにひどいことになります。 FreeBSD カーネルには、この種の
     攻撃の効果を抑制する ICMP_BANDLIM と呼ばれる新しいコンパイルオプションが
     あります。 3つめの主要なクラスに属す踏み台攻撃は、udp echo サービスのよう
     な、ある種の内部 inetd サービスに関連するものです。攻撃者は、単にソースア
     ドレスがサーバ A の echo ポートであり、ディスティネーションアドレスがサー
     バ B の echo ポートであるかのように UDP パケットを偽造します。ここでサー
     バ A, B はともに自分の LAN に接続されています。この 2 つのサーバは、この
     一つのパケットを両者の間で互いに相手に対して打ち返しあいます。このように
     してパケットをいくつか注入するだけで、攻撃者は両方のサーバと LAN を過負荷
     状態にすることができます。同様の問題が内部 chargen ポートにも存在します。
     有能なシステム管理者はこの手の inetd 内部テストサービスのすべてを無効にし
     ておくものです。

     偽造パケット攻撃は、カーネルの経路情報キャッシュに過負荷を生じさせるため
     に用いられることもあります。net.inet.ip.rtexpire, rtminexpire, rtmaxcache
     の sysctl パラメータを参照して下さい。でたらめなソース IP を用いたこの偽
     造パケット攻撃により、カーネルは、一時的なキャッシュ経路を経路情報テーブ
     ルに生成します。これは `netstat -rna | fgrep W3' で見ることができます。こ
     れらの経路は、普通は 1600 秒程度でタイムアウトになります。カーネルが
     キャッシュ経路テーブルが大きくなり過ぎたことを検知すると、カーネルは動的
     に rtexpire を減らしますが、rtminexpire より小さくなるようには決して減ら
     しません。ここに問題が 2 つあります。 (1) 負荷の軽いサーバが突然攻撃され
     た場合、カーネルが十分素早く反応できないことB>B(2) カーネルが攻撃に耐え生
     き延びられるほど十分 rtminexpire が低く設定されていないこと。の2つです。
     自分のサーバが T3 もしくはそれより良質の回線でインターネットに接続されて
     いる場合、 sysctl(8) を用いて rtexpire と rtminexpire とを手動で上書きし
     ておくことが思慮深いことといえます。 (自分のマシンをクラッシュさせたくな
     いのであれば :-)) どちらか一方でも 0 には決してしないで下さい。両パラメー
     タを 2 秒に設定すれば、攻撃から経路情報テーブルを守るには十分でしょう。
     持続させるために配送用ポートを作ります。クラッカーが安全でないマシンの
     root を破ると、クラッカーは、このポートを使って暗号鍵を取得し、暗号鍵で
     ロックの外れる他のマシンへのアクセスを得ます。

     staff のログインには、kerberos を組み合せた ssh を使用することを勧めま
     す。 ssh は、kerberos と一緒にコンパイルできます。こうすると、見えてしま
     うかもしれない ssh 鍵をあまりあてにしないで良いようになります。また、それ
     と同時に、kerberos 経由でパスワードを保護することもできます。 ssh 鍵は、
     安全なマシンからの自動化されたタスク (kerberos では不向きなものなど ) 用
     のみに使用するべきです。また、ssh の設定で ssh 鍵を送らないようにするか、
     あるいは、 authorized_keys ファイル中で from=IP/DOMAIN オプションを使用し
     て、特定のマシンからログインしてきたもののみに有効になる鍵を ssh が生成で
     きるようにすることも勧めます。


関連項目

     chflags(1), find(1), kerberos(1), md5(1), netstat(1), openssl(1), ssh(1),
     xdm(1), group(5), ttys(5), accton(8), init(8), sshd(8), sysctl(8),
     syslogd(8), vipw(8)


歴史

     security マニュアルページは、もともと Matthew Dillon によって書かれまし
     た。最初に現れたのは、 FreeBSD 3.1 で 1998 年 12 月のことです。

FreeBSD 4.4                   September 18, 1999                   FreeBSD 4.4

ABELNET VPSサービス