Date: Sat, 24 Feb 2018 08:08:57 +0000 (UTC) From: Ryusuke SUZUKI <ryusuke@FreeBSD.org> To: doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org Subject: svn commit: r51442 - head/ja_JP.eucJP/books/handbook/security Message-ID: <201802240808.w1O88veh001813@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ryusuke Date: Sat Feb 24 08:08:57 2018 New Revision: 51442 URL: https://svnweb.freebsd.org/changeset/doc/51442 Log: - Merge the following from the English version: r41645 -> r42014 head/ja_JP.eucJP/books/handbook/security/chapter.xml Modified: head/ja_JP.eucJP/books/handbook/security/chapter.xml Modified: head/ja_JP.eucJP/books/handbook/security/chapter.xml ============================================================================== --- head/ja_JP.eucJP/books/handbook/security/chapter.xml Fri Feb 23 21:25:32 2018 (r51441) +++ head/ja_JP.eucJP/books/handbook/security/chapter.xml Sat Feb 24 08:08:57 2018 (r51442) @@ -3,7 +3,7 @@ The FreeBSD Documentation Project The FreeBSD Japanese Documentation Project - Original revision: r41645 + Original revision: r42014 $FreeBSD$ --> <chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="security"> @@ -36,26 +36,22 @@ &os; における高度な話題について簡単に説明します。 ここで扱う話題の多くは、 一般的なシステムやインターネットセキュリティにもあてはまります。 - インターネットはもはや、誰もが親切な隣人であろうとする - <quote>友好的な</quote> 場ではありません。 - あなたのシステムを安全に保つことは、 - あなたのデータ、知的財産、時間、その他を、 + システムを安全に保つことは、データ、知的財産、時間、その他を、 ハッカーやその同類から守るためには欠かせません。</para> <para>&os; は、 - システムとネットワークの整合性と安全性を確実にする仕組みと一連のユーティリティを提供しています。</para> + システムとネットワークの整合性および安全性を保護する仕組みと一連のユーティリティを提供しています。</para> <para>この章を読むと、以下のことがわかります。</para> <itemizedlist> <listitem> <para>&os; - に関する基本的なシステムセキュリティの考え方</para> + における基本的なシステムセキュリティの考え方</para> </listitem> <listitem> - <para><acronym>DES</acronym> や <acronym>MD5</acronym> のような、 - &os; で利用できるさまざまな暗号化手法について</para> + <para>&os; で利用できるさまざまな暗号化手法</para> </listitem> <listitem> @@ -63,45 +59,49 @@ </listitem> <listitem> - <para><application>inetd</application> と組み合わせて + <para>&man.inetd.8; と組み合わせて <acronym>TCP</acronym> Wrappers を設定する方法</para> </listitem> <listitem> <para>&os; における - <application>Kerberos5</application> の設定方法</para> + <application>Kerberos</application> の設定方法</para> </listitem> <listitem> - <para>IPsec および FreeBSD/&windows; コンピュータの間で - <acronym>VPN</acronym> の設定方法</para> + <para>IPsec を設定して <acronym>VPN</acronym> を構築する方法</para> </listitem> <listitem> - <para>&os; で使われている <acronym>SSH</acronym> である + <para>&os; にける <application>OpenSSH</application> の設定および使用方法</para> </listitem> <listitem> - <para>ファイルシステムの <acronym>ACL</acronym> (アクセス制御リスト) - とは何か、またその使用法</para> + <para>ファイルシステム <acronym>ACL</acronym> (アクセス制御リスト) + の使用方法</para> </listitem> <listitem> - <para><application>Portaudit</application> - ユーティリティを使って、Ports Collection + <para>Ports Collection からインストールされたサードパーティ製ソフトウェア packages - を監査する方法</para> + を <application>Portaudit</application> + を使って監査する方法</para> </listitem> <listitem> - <para>公開される &os; セキュリティ勧告の利用方法</para> + <para>&os; セキュリティ勧告の利用方法</para> </listitem> <listitem> <para>プロセスアカウンティングがどのようなものか、 &os; 上で有効にする方法について</para> </listitem> + + <listitem> + <para>リソース制限データベースとは何か、 + この仕組みを使ったユーザ資源の管理方法</para> + </listitem> </itemizedlist> <para>この章を読む前に、次のことが必要になります。</para> @@ -112,33 +112,26 @@ </listitem> </itemizedlist> -<!-- <para>Additional security topics are covered throughout this book. - For example, Mandatory Access Control is discussed in <xref - linkend="mac"/> and Internet Firewalls are discussed in <xref - linkend="firewalls"/>.</para> --> +<!-- + <para>Additional security topics are covered elsewhere in this + Handbook. For example, Mandatory Access Control is discussed in + <xref linkend="mac"/> and Internet firewalls are discussed in + <xref linkend="firewalls"/>.</para> +--> </sect1> <sect1 xml:id="security-intro"> <title>はじめに</title> <para>セキュリティとは、システム管理者をいつも悩ませる仕事の一つです。 - すべての BSD &unix; マルチユーザシステムは、 - 従来からいくつかのセキュリティ機構を備えていますが、 - ユーザを疑心暗鬼に陥らせないように追加のセキュリティ機構を構築し保守する仕事はおそらく、 - システム管理者としてもっとも大きな責務の一つでしょう。 - マシンの安全性に反映されるのは、管理者が作業したことだけです。 - またセキュリティ問題は、快適な環境に必要なものと競合します。 - 一般に &unix; システムは膨大な数のプロセスを同時に動作させることができ、 - そのプロセスの大部分は、サーバ — - 外部から接続し、通信するものとして動作します。 - かつてのミニコンとメインフレームがデスクトップにとってかわり、 - さらにコンピュータが相互に接続されたネットワークを形成するようになった今日、 - セキュリティは一層大きな関心事になってきています。</para> + &os; は、固有のセキュリティ機構を備えていますが、 + 追加のセキュリティ機構を設定し保守する仕事はおそらく、 + システム管理者としてもっとも大きな責務の一つでしょう。</para> <para>また、システムセキュリティには、 さまざまな形での攻撃に対処することとも関係しています。 攻撃の中には <systemitem class="username">root</systemitem> - 権限を奪おう (<quote>root 権限を破る</quote>) とはしないけれども、 + 権限を奪おうとはしないけれども、 クラッシュやシステムの不安定状態を引き起こそうとするものもあります。 このセキュリティ問題は、いくつかに分類することが可能です。</para> @@ -152,7 +145,7 @@ </listitem> <listitem> - <para>アクセス可能なサーバを使った root 権限の不正利用</para> + <para>アクセス可能なサービスを使った root 権限の不正利用</para> </listitem> <listitem> @@ -177,20 +170,14 @@ <indexterm><primary>サービス妨害 (DoS)</primary></indexterm> - <para>サービス妨害攻撃 (DoS 攻撃) とは、 + <para>サービス妨害攻撃 (<acronym>DoS</acronym> 攻撃) とは、 マシンから必要な資源を奪う行為です。 - 通常、サービス妨害攻撃はそのマシンで実行されるサーバや - ネットワークスタックを過負荷状態にしてマシンをクラッシュさせたり、 + 通常、サービス妨害攻撃はそのマシンで実行されるサーバやネットワークスタックを過負荷状態にして、 + マシンをクラッシュさせたり、 マシンを使えなくしたりするような力任せの方法です。 - サービス妨害攻撃の中には、 - ネットワークスタックのバグを利用して、 - パケット一つでマシンをクラッシュさせようとするものもあります。 - 後者には、カーネルにバグ修正を施すことによってのみ対応することができます。 サーバプロセスに対する攻撃は、オプションを適切に指定することによって、 攻撃されている状況でサーバプロセスの負荷上昇に限界を設定することで対応できる場合が多いです。これらに比べると、 ネットワークへの力任せの攻撃への対応はずっと難しくなります。 - たとえば、偽造パケットによる攻撃 (spoof-packet attack) は、 - インターネットからシステムを切り離す以外の方法で防ぐことはほとんど不可能です。 この攻撃によって、マシンを落としてしまうことはできないかもしれませんが、 接続しているインターネット回線を飽和させてしまうことはできます。</para> @@ -200,34 +187,22 @@ </indexterm> <para>ユーザアカウントの不正利用は、 - サービス妨害攻撃よりもずっとよくある問題です。 - このご時勢でも、自分たちのマシンで標準の - <application>telnetd</application>, - <application>rlogind</application>, - <application>rshd</application>, - <application>ftpd</application> - サーバを実行させているシステム管理者は多いのです。 - これらのサーバは、デフォルトでは、 - 暗号化されたコネクション上で動作していません。 - その結果、抱えているユーザ数が標準くらいであれば、リモートログイン - (そのシステムにログインするには最も普通で便利な方法です) - しているユーザのうち一人以上は、 - パスワードを覗き見られてしまうでしょう。 + <acronym>DoS</acronym> 攻撃よりもずっとよくある問題です。 + このご時勢でも、 + 暗号化されていないサービスを実行させているシステム管理者は多く、 + そのため、リモートからログインしているユーザは、 + パスワードを覗き見られてしまう危険性があります。 システム管理者が注意深い人ならば、 - たとえログインが成功していたとしても、 リモートアクセスログを解析して、 - 疑わしい送信元アドレスを探すものです。</para> + 疑わしい送信元アドレスや疑わしいログインを探すものです。</para> - <para>ひとたび攻撃者がユーザアカウントへのアクセス権を入手したら、 - 攻撃者は <systemitem class="username">root</systemitem> - 権限を破れると仮定するべきです。 - しかし、セキュリティを十分維持し、 + <para>セキュリティを十分維持し、 手入れの行き届いたシステムにおいては、 あるユーザアカウントへのアクセスが可能となっても、 必ずしも攻撃者に <systemitem class="username">root</systemitem> - へのアクセス権を与えるとは限りません。この違いは重要です。 - というのは、一般的に - <systemitem class="username">root</systemitem> へのアクセス権がなければ、 + へのアクセス権を与えるとは限りません。 + <systemitem class="username">root</systemitem> + へのアクセス権がなければ、 攻撃者は自分の侵入の痕跡を隠蔽することができませんし、 そのユーザのファイルを引っかき回したり、 マシンをクラッシュさせたりするのがせいぜいです。 @@ -240,38 +215,18 @@ <secondary>裏口 (バックドア)</secondary> </indexterm> - <para>システム管理者は、あるマシン上で - <systemitem class="username">root</systemitem> - 権限を奪取する方法は、 - 潜在的に何通りもあるということを心しておかねばなりません。 + <para><systemitem class="username">root</systemitem> + 権限を奪取する方法は、潜在的に何通りもあります。 攻撃者は <systemitem class="username">root</systemitem> のパスワードを知っているかもしれませんし、 攻撃者が <systemitem class="username">root</systemitem> - 権限で実行されているサーバのバグを見つけ、 - ネットワーク接続を介して - <systemitem class="username">root</systemitem> - 権限を破ることができるかもしれません。 - また、攻撃者は suid-root プログラムに存在するバグを知っていて、 - ユーザアカウントを破れば - <systemitem class="username">root</systemitem> - 権限を奪取できるかもしれません。 - 攻撃者があるマシン上で - <systemitem class="username">root</systemitem> - 権限を破る方法を知ったならば、 - 攻撃者は裏口を用意する必要がありません。 - これまでに発見され、ふさがれた - <systemitem class="username">root</systemitem> - の穴の多くには、攻撃者が自分のしたことの痕跡を消そうとした作業が、 - かなりの割合で含まれています。 - そのため、ほとんどの攻撃者は裏口を作るのです。裏口は、 - 攻撃者がたやすくシステムへの - <systemitem class="username">root</systemitem> - アクセスを再び得られるようにしますが、 - 有能な管理者に侵入を検知する便利な手段を与えるものでもあります。 - 攻撃者に裏口を作らせないようにするということは、 - セキュリティにとっては実際には良くないことかもしれません。 - なぜなら、 - 攻撃者が最初に見つけて侵入してきたセキュリティホールはふさがれないからです。</para> + 権限で実行されているサービスのバグの脆弱性を利用できるかもしれません。 + また、攻撃者は SUID-root + プログラムに存在するバグを知っているかもしれません。 + 攻撃者は、 + バックドアとして知られているプログラムを使って脆弱性なシステムを探したり、 + 修正されていない脆弱性を利用してアクセスしたり、 + 攻撃者による違法行為の痕跡を消そうとしたりするかもしれません。</para> <para>セキュリティを改善する方法は、常に、 タマネギの皮のように階層化する手法 @@ -288,7 +243,7 @@ <para><systemitem class="username">root</systemitem> の安全性を高める – <systemitem class="username">root</systemitem> 権限で動作するサーバと - suid/sgid バイナリ。</para> + SUID/SGID バイナリ。</para> </listitem> <listitem> @@ -314,8 +269,7 @@ </listitem> </orderedlist> - <para>本章の次の節では、 - 上記の各項目についてより深く掘り下げていきます。</para> + <para>次の節では、上記の項目についてより深く掘り下げていきます。</para> </sect1> <sect1 xml:id="securing-freebsd"> @@ -326,60 +280,41 @@ <secondary>&os; の安全性を高める</secondary> </indexterm> - <note> - <title>コマンド対プロトコル</title> - - <para>この文書を通して、アプリケーションを指すのには - <application>太字</application> を使い、 - コマンドを指す場合には、<command>等幅</command> フォントを使います。 - プロトコルは通常のフォントで表します。 - このような書体による区別は、 - プロトコルであると同時にコマンドでもある - ssh などに対して有効です。</para> - </note> - - <para>以下の節では、本章の <link + <para>この節では、<link linkend="security-intro">前節</link> でとりあげた &os; - システムの安全性を高める方法について述べます。</para> + システムの安全性を高める方法について説明します。</para> <sect2 xml:id="securing-root-and-staff"> <title><systemitem class="username">root</systemitem> - アカウントとスタッフアカウントの安全性を高める</title> + アカウントの安全性を高める</title> <indexterm> - <primary><command>su</command></primary> + <primary>&man.su.1;</primary> </indexterm> - <para><systemitem class="username">root</systemitem> - のアカウントの安全性を確保しないうちからスタッフのアカウントの安全性をうんぬんしてもしかたがありません。 - ほとんどのシステムでは、<systemitem class="username">root</systemitem> - アカウントに割り当てたパスワードが 1 - つあります。まず最初にすべきことは、 - このパスワードは<emphasis>いつでも</emphasis>不正利用の危険に晒されていると仮定することです。 - これは <systemitem class="username">root</systemitem> - のパスワードを消すべきだと言っているのではありません。 + <para>ほとんどのシステムでは、 <systemitem class="username">root</systemitem> - のパスワードは、マシンにコンソールからアクセスするのには、 + アカウントに割り当てたパスワードが 1 つあります。 + このパスワードは<emphasis>いつでも</emphasis>不正利用の危険に晒されていると考えてください。 + これはパスワードを無効にすべきだと言っているのではありません。 + パスワードは、マシンにコンソールからアクセスするのには、 ほとんどいつでも必要なものです。 - ここで言いたいのは、コンソール以外からは、 - そして可能なら &man.su.1; コマンドを実行する場合も + しかしながら、コンソール以外からは、 + そして可能なら &man.su.1; + コマンドを実行する場合もパスワードを使えないようにするべきです。 + たとえば、<filename>/etc/ttys</filename> のエントリにおいて、 + 特定のターミナルに対し <systemitem class="username">root</systemitem> - のパスワードを使えないようにするべきである、ということです。 - たとえば、あなたが使っている pty が、 - <filename>/etc/ttys</filename> ファイルで insecure - と指定されているか確認してください。そうすると、 - <command>telnet</command> や <command>rlogin</command> 経由では + でログインできないように + <literal>insecure</literal> と設定してください。 + &os; では、デフォルトで、 + <filename>/etc/ssh/sshd_config</filename> において + <literal>PermitRootLogin</literal> が <literal>no</literal> + と設定されているので、&man.ssh.1; を使った <systemitem class="username">root</systemitem> - で直接ログインできないようになります。 - これは、<filename>/etc/ssh/sshd_config</filename> を編集して - <literal>PermitRootLogin</literal> に <literal>no</literal> - が設定されるようにすることで実現できます。 - <application>sshd</application> のような、 - 別のログインサービスを使っている場合でも同様に、直接 - <systemitem class="username">root</systemitem> - へログインすることを許していないかどうか確認してください。 - すべてのアクセス手段 — たとえば FTP - のようなサービスが、良くクラックの対象となることを考えましょう。 + へログインは無効になっています。 + すべてのアクセス手段、たとえば FTP + ようなサービスは、良くクラックの対象となることを理解してください。 <systemitem class="username">root</systemitem> への直接ログインは、 システムコンソール経由でのみ可能であるべきなのです。</para> @@ -387,57 +322,34 @@ <primary><systemitem class="groupname">wheel</systemitem></primary> </indexterm> - <para>また当然、システム管理者として自分が + <para>システム管理者は <systemitem class="username">root</systemitem> - になれるようにしておく必要がありますから、 - そのための穴をいくつか開けておきます。 - しかし、それらの穴を動作させるには、 - さらに追加のパスワード認証が必要であるようにしておくことが重要です。 - <systemitem class="username">root</systemitem> - でアクセス可能とする方法の一つとして、適切なスタッフアカウントを - (<filename>/etc/group</filename> 中の) + になれるようにしておく必要があるので、 + 追加のパスワード認証の設定が必要となります。 + ひとつは、適切なユーザアカウントを + <filename>/etc/group</filename> 中の + <systemitem class="groupname">wheel</systemitem> に加える方法です。 <systemitem class="groupname">wheel</systemitem> - グループに加えることがあります。 - <systemitem class="groupname">wheel</systemitem> - グループに入っているスタッフメンバは - <command>su</command> を使って + のメンバは、&man.su.1; を使って <systemitem class="username">root</systemitem> になることが許されます。 - パスワードエントリにおいて、スタッフメンバを - <systemitem class="groupname">wheel</systemitem> - グループに置くことによって直接 - <systemitem class="groupname">wheel</systemitem> - 権限を与えてはいけません。スタッフメンバのアカウントは - <systemitem class="groupname">staff</systemitem> - グループに所属させるべきで、その上で - <filename>/etc/group</filename> ファイルを通して - <systemitem class="groupname">wheel</systemitem> - グループに加えるべきです。実際に + 実際に <systemitem class="username">root</systemitem> - アクセスの必要なスタッフメンバのみ + アクセスの必要なユーザのみ <systemitem class="groupname">wheel</systemitem> - グループに置くようにすべきです。 - 他の認証方法の場合、たとえば Kerberos を使用する場合には、 - <systemitem class="username">root</systemitem> アカウントの - Kerberos <filename>.k5login</filename> ファイルを使えば、誰も - <systemitem class="groupname">wheel</systemitem> グループに置く必要なく - <systemitem class="username">root</systemitem> に &man.ksu.1; - することを許可できます。 - このやり方はよりよい解決策なのかもしれません。なぜなら、 - <literal>wheel</literal> のメカニズムでは、 - 侵入者がパスワードファイルを手に入れ、スタッフアカウントのいずれか - 1 つを破ることができると、 + に置くようにすべきです。 + Kerberos を使用して認証行う場合には、 <systemitem class="username">root</systemitem> - を破ることがまだできてしまうからです。 - <systemitem class="groupname">wheel</systemitem> - のメカニズムを用いる方が、何もしないよりは良いのですが、 - 必ずしも最も安全な選択肢とは限りません。</para> + のホームディレクトリに <filename>.k5login</filename> + を作成することで、 + 誰も <systemitem class="groupname">wheel</systemitem> に置く必要なく + &man.ksu.1; することを許可できます。</para> <para>アカウントを完全にロックするには、 - &man.pw.8; コマンドを使うべきです。</para> + &man.pw.8; を使ってください。</para> <screen>&prompt.root; <userinput>pw lock <replaceable>staff</replaceable></userinput></screen> - <para>これにより、ユーザは、&man.ssh.1; + <para>これにより、指定されたユーザは、&man.ssh.1; を含むいかなる方法でもログインできなくなります。</para> <para>アカウントへのアクセスをブロックするもう一つの方法は、 @@ -445,16 +357,16 @@ <quote><literal>*</literal></quote> 1 文字に置き換えることです。 この文字は、暗号化されたパスワードにマッチすることはないので、 ユーザアクセスをブロックします。 - たとえば、次のスタッフアカウントを、</para> + たとえば、次のアカウントのエントリを、</para> <programlisting>foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> - <para>こう変更します。</para> + <para>&man.vipw.8; を使って以下のように変更します。</para> <programlisting>foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> <para>この変更によって - <systemitem class="username">foobar</systemitem> ユーザは、 + <systemitem class="username">foobar</systemitem> は、 通常のログインはできなくなります。 このようなアクセス制限をした後は、 サイトで <application>Kerberos</application> をセットアップしたり、 @@ -463,34 +375,24 @@ <para>これらのセキュリティの仕組みでは、 制限の強いサーバから制限の弱いサーバへログインすることを前提としています。 - たとえば、メインマシンで、様々な種類のサーバを実行させている場合、 - ワークステーションではそれらのサーバを実行させてはなりません。 + たとえば、サーバがネットワークサービスを実行させている場合、 + ワークステーションではそれらのサービスを実行させてはなりません。 ワークステーションを十分に安全にしておくためには、 - 実行するサーバの数を、 - 一つもサーバが実行されていないというくらいにまでできる限り減らすべきです。 - また、パスワードで保護されたスクリーンセーバを走らせておくべきです。 - ワークステーションへの物理的アクセスが与えられたとすると、 + 実行するサービスをゼロにするか、可能な限り減らし、 + パスワードで保護されたスクリーンセーバを走らせておくべきです。 + システムへの物理的アクセスが与えられたとすると、 もちろん言うまでもなく、 - 攻撃者は管理者が設定したいかなる種類のセキュリティをもうち破ることができるのです。 - このことは、管理者として必ず考えておかねばならない問題ですが、 - システム破りの大多数は、ネットワーク経由でリモートから、 - ワークステーションやサーバへの物理的アクセス手段を持たない人々によって行われるという事実もまた、 - 念頭に置いておく必要があります。</para> + 攻撃者はいかなる種類のセキュリティをもうち破ることができるのです。 + 幸いにも、システム破りの大多数は、ネットワーク経由でリモートから、 + システムへの物理的アクセス手段を持たない人々によって行われています。</para> - <para>Kerberos のような方法を使うことで、 - スタッフアカウントのパスワードの変更もしくは停止を一箇所で行なうことと、 - スタッフメンバがアカウントを持つすべてのマシンに即時にその効果を及ぼすことが可能となります。 - スタッフメンバのアカウントが危険に晒されたときに、 - すべてのマシンでスタッフメンバのパスワードを即座に変更する能力を過小評価してはいけません。 - パスワードが分散されている状況では、 - N 台のマシンでパスワードを変更すると、 - てんやわんやの事態を招く可能性があります。 - Kerberos を使用すると、パスワードの再発行に制限 - (re-passwording restriction) を課することもできます。 - この機能を使うことにより、ある Kerberos - チケットをしばらく経つとタイムアウトにすることができるだけでなく、 - 一定期間 (例えば、1 ヶ月に 1 回) 経つと、 - ユーザに新しいパスワードを選ぶように要求することもできます。</para> + <para>Kerberos を使うことで、 + ユーザのパスワードの変更もしくは停止を一箇所で行なうことと、 + ユーザがアカウントを持つすべてのマシンに即時にその効果を及ぼすことが可能となります。 + アカウントが危険に晒されたときに、 + すべてのマシン上の関連するパスワードを即座に変更する能力を過小評価してはいけません。 + Kerberos では、Kerberos チケットにタイムアウトを設定でき、 + 設定した期間が経過するとユーザに新しいパスワードを選ぶように要求するといった追加の制限を課することができます。</para> </sect2> <sect2> @@ -498,134 +400,43 @@ SUID/SGID バイナリの安全性を高める</title> <indexterm> - <primary><command>ntalk</command></primary> - </indexterm> - <indexterm> - <primary><command>comsat</command></primary> - </indexterm> - <indexterm> - <primary><command>finger</command></primary> - </indexterm> - <indexterm> <primary>砂場 (sandbox)</primary> </indexterm> <indexterm> - <primary><application>sshd</application></primary> + <primary>&man.sshd.8;</primary> </indexterm> - <indexterm> - <primary><application>telnetd</application></primary> - </indexterm> - <indexterm> - <primary><application>rshd</application></primary> - </indexterm> - <indexterm> - <primary><application>rlogind</application></primary> - </indexterm> - <para>用心深いシステム管理者は、 - 自分に必要なサーバプロセスだけを過不足なく実行させるものです。 + <para>用心深いシステム管理者は、必要なサービスだけを有効にし、 サードパーティ製のサーバは、 - よくバグを持っていがちだということに注意して下さい。 - たとえば、古いバージョンの - <application>imapd</application> や - <application>popper</application> - を実行させておくのは、全世界に万能の + よくバグを持っていがちだということに注意しているものです。 + 注意深くチェックしていないサーバは、決して実行してはいけません。 + 多くのデーモンは、サービス専用のアカウント、もしくは + <firstterm>砂場 (sandbox)</firstterm> で起動させることができるので、 <systemitem class="username">root</systemitem> - の切符を与えているようなものです。 - 自分で注意深くチェックしていないサーバは、 - 決して実行してはいけません。 - <systemitem class="username">root</systemitem> - で実行させる必要のあるサーバはほとんどありません。たとえば、 - <application>ntalk</application>, - <application>comsat</application>, - <application>finger</application> デーモンを、 - 専用ユーザの <firstterm>砂場 (sandbox)</firstterm> - で実行させることができます。 - 管理者が膨大な数の問題を経験していないのなら、 - この「砂場」は完璧ではありませんが、 - セキュリティに関するタマネギ的アプローチはここでも成り立ちます。 - 砂場で実行されているサーバプロセスを経由して侵入を果たすことができたとしても、 - 攻撃者はさらに砂場から外に脱出しなければなりません。 - 攻撃者が通過せねばならない層の数が増えれば増えるほど、 - それだけ攻撃者が侵入に成功する確率が減ります。 - Root の抜け穴は歴史的に、基本システムサーバも含め、 - <systemitem class="username">root</systemitem> - 権限で実行されるほとんどすべてのサーバプロセスで発見されています。 - ユーザが <application>sshd</application> 経由でのみログインし、 - <application>telnetd</application>, - <application>rshd</application>, - <application>rlogind</application> - 経由でログインすることが決してないマシンを稼働させているのであれば、 - それらのサービスを停止させて下さい!</para> + 権限でサービスを実行する前には、よく考えてください。 + &man.telnetd.8; または &man.rlogind.8; + のような安全ではないサービスは有効にしないでください。</para> - <para>&os; では、今では - <application>ntalkd</application>, - <application>comsat</application>, - <application>finger</application> - は砂場で実行させることがデフォルトになっています。 - 次に砂場で実行させるべきプログラムの候補として、 - &man.named.8; があります。 - <filename>/etc/defaults/rc.conf</filename> ファイルには、 - <application>named</application> - を砂場で実行するために必要な引数がコメントアウトされた形式で含まれています。 - 新しいシステムをインストールしているか、 - それとも既存のシステムをアップグレードして使っているかに依存しますが、 - 砂場として使用する特別のユーザアカウントがインストールされていないかもしれません。 - 用心深いシステム管理者であれば、できるだけいつでも研究を怠らず、 - サーバに砂場を仕込むものでしょう。</para> - - <indexterm> - <primary><application>sendmail</application></primary> - </indexterm> - - <para>通常、砂場で実行しないサーバが他にいくつかあります。 - <application>sendmail</application>, - <application>popper</application>, - <application>imapd</application>, - <application>ftpd</application> などです。 - これらのうちいくつかのサーバには代わりとなるものがありますが、 - 代わりのものをインストールするには、 - あなたが思うより多くの仕事が必要になるかもしれません - (便利さという要素がまたも勝利を収めるわけです)。 - これらのサーバは、<systemitem class="username">root</systemitem> - 権限で実行しなければばならないかもしれません。また、 - これらのサーバ経由で生じる侵入を検出するためには、 - 他の仕組みに頼らなくてはならないかもしれません。</para> - - <para>システムの <systemitem class="username">root</systemitem> - 権限の潜在的な穴で他に大きなものには、 - システムにインストールされた suid-root/sgid バイナリがあります。 + <para>他のシステムの潜在的なセキュリティホールには、 + SUID-root および SGID バイナリがあります。 これらのバイナリは、 - <application>rlogin</application> のように、<filename + &man.rlogin.1; のように、<filename class="directory">/bin</filename>, <filename class="directory">/sbin</filename>, <filename class="directory">/usr/bin</filename> または <filename class="directory">/usr/sbin</filename> に存在するものがほとんどです。 100% 安全なものは存在しないとはいえ、 - システムデフォルトの siud/sgid バイナリは比較的安全といえます。 - それでもなお、<systemitem class="username">root</systemitem> - セキュリティホールがこれらのバイナリにときおり発見されています。 - 1998 年に <application>xterm</application> - (普通、suid 設定されています) を脆弱にしていた - <literal>Xlib</literal> の - <systemitem class="username">root</systemitem> - セキュリティホールが見つかりました。 - 安全である方がよいので、 - 用心深いシステム管理者は残念に思いながらも、 - スタッフのみが実行する必要がある suid バイナリは、 - スタッフのみがアクセス可能な特別なグループに含めるように制限を加え、 - 誰も使わない suid バイナリは - (<command>chmod 000</command> を実行して) 片付けてしまうでしょう。 - ディスプレイを持たないサーバは、一般的に - <application>xterm</application> のバイナリを必要としません。 - sgid バイナリもほとんど同様の危険な存在になり得ます。 - 侵入者が kmem に sgid されたバイナリを破ることができた場合、 + システムデフォルトの SUID/SGID バイナリは比較的安全といえます。 + SUID バイナリは、 + スタッフのみがアクセス可能な特別なグループに制限し、 + 使わない SUID バイナリは削除することが推奨されます。 + SGID バイナリもほとんど同様の危険な存在になり得ます。 + 侵入者が kmem に SGID されたバイナリを破ることができた場合、 その侵入者は <filename>/dev/kmem</filename> を読み出すことができるようになるでしょう。つまり、 暗号化されたパスワードファイルを読み出すことができるようになるので、 - パスワードを持つどのアカウントをも、 - 潜在的な危険に晒すことになります。他にも、 + ユーザアカウントを、潜在的な危険に晒すことになります。他にも、 <literal>kmem</literal> グループを破った侵入者が pty を通して送られたキーストロークを監視できるという危険があります。 キーストロークには、安全な方法でログインするユーザが使っている pty @@ -642,16 +453,10 @@ <title>ユーザアカウントの安全性を高める</title> <para>ユーザアカウントは、普通、安全性を高めることが最も困難です。 - スタッフに対しては、とても厳格なアクセス制限を強制しパスワードを - <quote>アスタリスク</quote> で外すことができるでしょうが、 - 管理者が持ちうる一般ユーザすべてのアカウントに対して同じことはできないかもしれません。 - 管理者が十分に統率をとることができるなら、管理者は勝利し、 - ユーザのアカウントの安全を適切に確保できるかもしれません。 - それができないならば、 - よりいっそう気を配って一般ユーザのアカウントを監視するよりほかありません。 - 一般ユーザアカウントに対し ssh や Kerberos を利用することには、 - システム管理がさらに増えたりテクニカルサポートが必要になるなどの問題があります。 - それでも、暗号化パスワードファイルと比較するとはるかに良い解です。</para> + 気を配ってユーザアカウントを監視するよりほかありません。 + ユーザアカウントに対し &man.ssh.1; や Kerberos を利用するには、 + システム管理がさらに増えたりテクニカルサポートが必要になりますが、 + 暗号化パスワードファイルと比較するとはるかに良い方法を提供します。</para> </sect2> <sect2> @@ -659,7 +464,7 @@ <para>できるだけ多くのパスワードをアスタリスクで外し、 それらのアカウントのアクセスには - ssh や Kerberos を使うようにすることが、唯一の確実な方法です。 + &man.ssh.1; や Kerberos を使うようにすることが、唯一の確実な方法です。 暗号化パスワードファイル (<filename>/etc/spwd.db</filename>) は <systemitem class="username">root</systemitem> @@ -667,90 +472,79 @@ たとえ、侵入者が root の書き込み権限は得られなくとも、 読み出しアクセス権限を得ることは可能かもしれません。</para> - <para>セキュリティスクリプトで常にパスワードファイルの変更をチェッ - クし、報告するようにすべきです (<link + <para><link linkend="security-integrity">ファイルの完全性のチェック</link> - 節参照)。</para> + 節で説明されているように、 + セキュリティスクリプトでパスワードファイルの変更をチェックし、 + 報告するようにすべきです。</para> </sect2> <sect2> - <title>カーネルのコア、raw デバイス、ファイルシステムの安全性を - 高める</title> + <title>カーネルのコア、raw デバイス、 + ファイルシステムの安全性を高める</title> - <para><systemitem class="username">root</systemitem> - の権限を破ると、攻撃者はほとんど何でもできますが、 - 特に重宝される特定の事柄もいくつかあります。 - たとえば、最近のカーネルは、組み込みのパケット覗き見デバイス + <para>最近のカーネルは、組み込みのパケット覗き見デバイス (packet sniffing device) ドライバを備えているものがほとんどです。 - &os; では <filename>bpf</filename> デバイスと呼ばれています。 - 侵入者は普通、 - 侵入済みのマシンでパケット覗き見プログラムを実行させようと試みます。 - 侵入者にわざわざそういう機能を提供する必要はないので、 - ほとんどのシステムで <filename>bpf</filename> - デバイスを組み込むべきではありません。</para> + &os; では <filename>bpf</filename> と呼ばれています。 + このデバイスは DHCP で必要となるため、 + DHCP を提供したり使う必要のないシステムでは、 + カスタムカーネルコンフィグレーションファイルから外すことができます。</para> <indexterm> - <primary><command>sysctl</command></primary> + <primary>&man.sysctl.8;</primary> </indexterm> - <para><filename>bpf</filename> デバイスを外しても、 - <filename>/dev/mem</filename> と - <filename>/dev/kmem</filename> - という悩みの種がまだ残っています。この問題に関しては、侵入者は - raw ディスクデバイスに書き込 - むこともできます。ほかにも、モジュールローダ、&man.kldload.8; - という、別のカーネル機能があります。やる気まんまんの侵入者は、KLD - モジュールを使って自分独自の <filename>bpf</filename> - もしくはその他覗き見デバイスを動作中のカーネルにインストールできます。 - この問題を避けるため、 - システム管理者はカーネルをより高いセキュアレベル、 - 少なくともセキュアレベル 1 で実行させる必要があります。</para> + <para><filename>bpf</filename> を外しても、 + <filename>/dev/mem</filename> および + <filename>/dev/kmem</filename> という問題がまだ残っています。 + 侵入者は raw ディスクデバイスに書き込むこともできます。 + やる気まんまんの侵入者は、&man.kldload.8; + を使って自分独自の <filename>bpf</filename>、 + もしくは他の覗き見デバイスを動作中のカーネルにインストールできます。 + この問題を避けるため、カーネルをより高いセキュリティレベル、 + 少なくともセキュリティレベル 1 で実行させる必要があります。</para> - <para>カーネルのセキュアレベルはいくつかの方法で設定できます。 - 現在動いているカーネルのセキュアレベルを高める最も簡単な方法は、 - <command>sysctl</command> を使って - <varname>kern.securelevel</varname> - カーネル変数を操作する方法です。</para> + <para>カーネルのセキュリティレベルはいくつかの方法で設定できます。 + 現在動いているカーネルのセキュリティレベルを高める最も簡単な方法は、 + <varname>kern.securelevel</varname> を設定する方法です。</para> <screen>&prompt.root; <userinput>sysctl kern.securelevel=<replaceable>1</replaceable></userinput></screen> - <para>デフォルトでは、&os; のカーネルはセキュアレベル -1 で起動します。 + <para>デフォルトでは、&os; のカーネルはセキュリティレベル + -1 で起動します。 + このセキュリティレベルは、 + 変更不可のファイルフラグを外したり、 + すべてのデバイスに対して読み込みおよび書き込みができたりするので、 + <quote>insecure mode</quote> と呼ばれます。 このセキュアレベルは、管理者または &man.init.8; による起動時のスクリプトにより変更されない限り -1 のままです。 - <filename>/etc/rc.conf</filename> ファイルで、 - <varname>kern_securelevel_enable</varname> 変数を - <literal>YES</literal>、 + <filename>/etc/rc.conf</filename> において、 + <varname>kern_securelevel_enable</varname> を + <literal>YES</literal> とし、 <varname>kern_securelevel</varname> - 変数を必要とする値に設定することで、 + に必要とする値を設定することで、 システム起動時にセキュアレベルを高めることができます。</para> - <para>&os; - システムの起動スクリプト実行直後のデフォルトのセキュアレベルは - -1 です。 - このセキュアレベルでは、 - 変更不可のファイルフラグを外したり、 - すべてのデバイスに対して読み込みおよび書き込みができたりするので、 - <quote>insecure mode</quote> と呼ばれます。</para> - - <para>セキュアレベルを 1 以上に設定すると、 + <para>セキュリティレベルを 1 以上に設定すると、 追加専用および変更不可ファイルのフラグを外すことはできなくなり、 また raw デバイスへのアクセスが拒否されます。 より高いレベルに設定すると、より多くの操作に制限がかかります。 - 各セキュアレベルの完全な説明については、 - &man.security.7; マニュアルページをご覧ください。</para> + 各セキュリティレベルの完全な説明については、 + &man.security.7; および &man.init.8; をご覧ください。</para> <note> - <para>セキュアレベルを 1 以上に設定した場合には、 - X11 (<filename>/dev/io</filename> へのアクセスがブロックされます) - やソースから &os; を構築してインストールするとき - (installworld のプロセスでは、 - いくつかのファイルの追加専用および変更不可のフラグは一時的にリセットされます) - など、それ以外にも問題が引き起こされる可能性があります。 - X11 の問題については、 + <para>セキュリティレベルを 1 以上に設定した場合には、 + <filename>/dev/io</filename> へのアクセスがブロックされるため、 + <application>&xorg;</application> や、 + installworld のプロセスでは、 + いくつかのファイルの追加専用および変更不可のフラグは一時的にリセットされるため、 + ソースから &os; + を構築してインストールするときなどで問題が引き起こされる可能性があります。 + <application>&xorg;</application> の問題については、 起動プロセス初期のセキュアレベルが十分低いときに &man.xdm.1; を起動することで、この問題に対応できます。 このような応急処置は、 - すべてのセキュアレベルやそれらが課す潜在的なすべての制限には対応できないでしょう。 + すべてのセキュリティレベルやそれらが課す潜在的なすべての制限には対応できないでしょう。 少し先を見越した計画的な対応をすべきです。 各セキュリティレベルで課される制限は、 システムを使用することによる利便性を著しく減らしてしまうため、 @@ -760,134 +554,122 @@ 設定に関する意外性を少なくできるでしょう。</para> </note> - <para>カーネルのセキュアレベルを 1 以上に設定した場合には、 + <para>カーネルのセキュリティレベルを 1 以上に設定した場合には、 システム起動に関わる重要なバイナリやディレクトリ、 - スクリプトファイル (すなわち、 - セキュアレベルが設定されるまでの間に実行されるすべてのものに対して)、 + スクリプトファイル、そして、 + セキュリティレベルが設定されるまでの間に実行されるすべてのものに対して、 <literal>schg</literal> フラグを設定することは有用でしょう。 - この設定をやり過ぎても構いませんが、 - より高いセキュアレベルで動作している場合、 - システムのアップグレードがはるかに困難になります。 - システムをより高い安全レベルで実行させるようにするが、 - すべてのシステムファイルとディレクトリに <literal>schg</literal> + システムをより高いセキュリティレベルで実行させるようにするが、 + <literal>schg</literal> フラグを設定しないというところで妥協するという手もあります。 もう一つの可能性としては、単純に <filename class="directory">/</filename> および <filename class="directory">/usr</filename> を読み込み専用でマウントすることです。 ここで特筆すべきことは、システムを守ろうとして厳しくしすぎると、 - 侵入を検出するという非常に重要なことができなくなってしまうということです。</para> + 侵入を検出することができなくなってしまうということです。</para> </sect2> <sect2 xml:id="security-integrity"> - <title>ファイルの完全性のチェック: バイナリ、 - 設定ファイルなど</title> + <title>ファイルの完全性のチェック</title> - <para>ことこの問題に至ると、システム管理者にできることは、 + <para>システム管理者にできることは、 便利さという要素がその醜い頭を上げない程度に、 コアシステムの設定と制御ファイルを防御することだけです。 たとえば、<filename class="directory">/</filename> および <filename class="directory">/usr</filename> にある大部分のファイルに <literal>schg</literal> - ビットを設定するために <command>chflags</command> + ビットを設定するために &man.chflags.1; を使用するのは、おそらく逆効果でしょう。 なぜなら、そうすることでファイルは保護できますが、 侵入を検出する窓を閉ざしてしまうことにもなるからです。 - セキュリティのタマネギの最後の層はおそらく最も重要なもの - — 検出です。 - セキュリティの残りのものは、突然の侵入を検出できなければ、 - まったく有用ではありません - (あるいは、もっと悪ければ、 - 安全性に対する間違った感覚を植え付けてしまいます)。 - タマネギの仕事の半分は、 + セキュリティ対策は、 + 侵入の可能性を検出できなければ、有用ではなく、 + もっと悪ければ、安全性に対する間違った感覚を植え付けてしまいます。 + セキュリティに対する仕事の半分は、 攻撃者を攻撃の最中に捕えるようにするために、 攻撃者を食い止めるのではなく侵入を遅らせることなのです。</para> <para>侵入を検出する最も良い方法は、変更されていたり、 消えていたり、入れた覚えがないのに入っているファイルを探すことです。 変更されたファイルを探すのに最も良い方法は、もう一つの - (しばしば中央に集められた)、 + しばしば中央に集められた、 アクセスが制限されたシステムから行なうものです。 さらに安全でアクセス制限されたシステム上でセキュリティ用スクリプトを書けば、 スクリプトは潜在的な攻撃者からはほぼ見えなくなります。 - これは重要なことです。 - この有効性を最大限に活用するためには、一般的に、 - アクセスの制限されたマシンから実際に使っている他のマシンへのかなりのアクセスを許可する必要があります。 - 普通は、他のマシンからアクセス制限されたマシンへ読み込み専用の - NFS エクスポートをしたり、アクセス制限されたマシンから他のマシンへ - ssh 接続を行なうために、 - ssh 鍵のペアを作ったりすることで行います。 + この有効性を最大限に活用するためには、 + アクセスの制限されたマシンから他のマシンへのかなりのアクセスを許可する必要があります。 + 普通は、読み込み専用の <acronym>NFS</acronym> エクスポートをしたり、 + &man.ssh.1; 鍵のペアを設定したりします。 ネットワークのトラフィックを別にして、 - NFS は最も可視性のない方法です — - 各クライアント上のファイルシステムを、 + <acronym>NFS</acronym> は最も可視性のない方法です。 + 管理者は、各クライアント上のファイルシステムを、 事実上検出されずに監視できるようになります。 アクセス制限されたサーバがスイッチを通してクライアントに接続されている場合、 - たいてい NFS がより良い選択肢です。 - アクセス制限されたサーバがハブや、 + たいてい <acronym>NFS</acronym> がより良い選択肢です。 + アクセス制限されたサーバが、 いくつかのルーティング層を通してクライアントに接続している場合、 - NFS は (ネットワークの面で) あまりにも危険なので、 - ssh の方が認証を行った跡は残りますが、良い方法でしょう。</para> + <acronym>NFS</acronym> はあまりにも危険なので、 + &man.ssh.1; の方が良い方法でしょう。</para> <para>アクセス制限されたマシンに、 監視しようとするクライアントシステムへの少なくとも読み込みのアクセス権を与えたら、 - 次に実際に監視するためのスクリプトを書かなくてはいけません。 - NFS マウントをすれば、&man.find.1; や &man.md5.1; + 次に監視するためのスクリプトを書かなくてはいけません。 + <acronym>NFS</acronym> マウントをすれば、&man.find.1; や &man.md5.1; などの単純なシステムユーティリティでスクリプトを書くことができます。 - 少なくとも 1 日 1 回、クライアントのファイルを直接 md5 にかけ、 + 少なくとも 1 日 1 回、クライアントのシステムファイルを直接 + &man.md5.1; にかけ、 さらにもっと頻繁に <filename class="directory">/etc</filename> および <filename class="directory">/usr/local/etc</filename> にあるようなコントロール用ファイルを試験するのが一番です。 アクセス制限されたマシンが正しいと知っている、 基となる md5 情報と比べて違いが見つかった場合、 - システム管理者に調べて欲しいと悲鳴を上げるようにすべきです。 + システム管理者に警告するようにすべきです。 優れたセキュリティ用スクリプトは、<filename class="directory">/</filename> および <filename class="directory">/usr</filename> などのシステムパーティション上で不適当に - suid されたバイナリや、 + SUID されたバイナリや、 新たに作成されたファイルや削除されたファイルがないかどうかを調べるでしょう。</para> - <para>NFS ではなく、ssh を使用する場合は、 - セキュリティ用スクリプトを書くのはずっと難しいことです。 - スクリプトを動かすためには、クライアントに対してスクリプトを - <command>scp</command> しなくてはいけませんし、 - それは目に見えてしまいます。 - そして、安全のためには、スクリプトが使うバイナリ (find など) を - <command>scp</command> する必要もあります。 - クライアントマシンの <application>ssh</application> + <para><acronym>NFS</acronym> ではなく、&man.ssh.1; を使用する場合は、 + セキュリティ用スクリプトを書くのはより難しいことです。 + たとえば、スクリプトを動かすためには、クライアントに対してスクリプトを + &man.scp.1; しなくてはいけませんし、 + クライアントマシンの &man.ssh.1; クライアントはすでに攻撃されてしまっているかもしれません。 - 結局のところ、安全でないリンク上の場合は - ssh は必要かもしれませんが、ssh - を扱うのはとても大変なことです。</para> + 安全でないリンク上の場合は + &man.ssh.1; は必要かもしれませんが、 + 扱いはとても大変になります。</para> <para>優れたセキュリティ用スクリプトは、 - ユーザやスタッフメンバのアクセス設定ファイルの変更もチェックするものです。 - <filename>.rhosts</filename>, <filename>.shosts</filename>, - <filename>.ssh/authorized_keys</filename> など <literal>MD5</literal> + <filename>.rhosts</filename>, + <filename>.ssh/authorized_keys</filename> + などの隠し設定ファイルの変更もチェックするものです。 + これらは <literal>MD5</literal> チェックの範囲外になってしまうであろうファイル群です。</para> - <para>ユーザ用のディスク容量が非常に大きい場合は、パーティション - 上の各ファイルを見て回るのに大変な時間がかかるかもしれません。 - この場合は、マウントフラグを設定して、 - suid されたバイナリを置けないようにするのが良い考えです。 *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802240808.w1O88veh001813>