3.6.1 Apacheの設定

現在UNIXシステムにおいて最も多く使われているであろうhttpdはApacheです。
Apacheの設定を行うファイルは、従来のバージョンではhttpd.conf, access.conf, srm.confの3本に分かれていましたが、現在のバージョンではhttpd.confに一本化されています。
今回取り上げるバージョンは1.3.19です。

以前のバージョン(1.0.3以前)では、phfによってパスワードファイルを取得することができましたが、現在ではこれは出来ないようになっています。

(1) phf攻撃

phfとは、NCSA httpdやApacheに添付されていたCGICommon Gateway Interface)のスクリプトです。 実際に使用しなくとも非常に危険なスクリプトとされています。
なぜなら、このスクリプトを参考にして作成されたスクリプトにも同じ危険が潜んでいるからです。
phf攻撃は、phfがインストールされているサーバーに対し、いくつかのコマンドを記述したURLを送ることによって、相手のサーバがURLとして渡されたコマンドを実行してしまいます。これによって、パスワードファイルがWebクライアントに表示されるといったことがありました。
つまり、phf攻撃はURLにコマンドを記述することができる人であれば、 Webクライアントだけでパスワードファイルを閲覧することができたのです。
現在ではNCSA httpd, Apache共に、このファイルの添付は行っていません。

もし、従来からのOSやhttpdをアップグレードし続けたサーバであれば、cgi-binディレクトリにphfが存在しないか確認してください。
残っているようでしたら速やかに削除しログの確認等を行ってくだい。 特に、ログの中でGETメソッドのステータスコードが200の場合はパスワードファイルの取得が成功している可能性があるため、全ユーザのアカウントリセットなどを行うようにしてください。

(2) 実行するユーザ

httpdをセキュアな環境に設定するための第一歩は実行するユーザを正しく設定するということです。
これはhttpd.confの次の項目で設定します。

User nobody
Group #-1
デフォルトでユーザはnobodyに設定されています。 もし、nobodyが他に動かすものが無ければこのままで良いでしょう。
しかし、nobodyで他に動作するプログラムがあるならば、別のユーザ権限で動作させるべきです。
ここで言う別のユーザとは、既存のユーザに変更するのではなく、 httpdを起動する以外は何も起動しないユーザ、つまり新規で作成します。
たとえば、apacheというユーザを作成し、この権限で動作させます。
このユーザに対して、httpdを起動するだけ必要最小限度の権限のみを付与しておけば、 もしこのユーザの情報が漏れてもシステム全体に影響することはありません。

(3) ドキュメントディレクトリ

Webにおいてhttpdの動作に次いで重要なものがドキュメントディレクトリの設定です。
デフォルトではドキュメントルートが次のように設定されています。
このディレクトリの権限を正しく設定する必要があります。 もちろん、必要以上に権限を出してはいけません。 外部からの攻撃だけでなく、内部から誤ってデフォルトドキュメント(index.htmlなど)を書き換えてしまったという事故も有り得ます。特に最上位のデフォルトドキュメントは、組織のホームページとなる部分です。この部分を間違って書き換えてしまう、または外部から改竄されてしまうということのないように設定してください。

DocumentRoot "@@ServerRoot@@/htdocs"

次に、ドキュメントルートのオプションを確認します。
デフォルトでは次のように設定されています。

Options FollowSymLinks
ここには、絶対にIndexesを書き加えてはいけません。 なぜなら、何らかの理由でデフォルトドキュメント(index.htmlなど)をhttpdが認識しなくなったとき、ディレクトリ中の一覧を表示してしまいます。
最上位のディレクトリに限らず、Indexesの利用は必要最小限度に留めておくべきです。 たとえば、あるディレクトリでファイルの一覧を手作業で作成せずに必要なファイルをユーザが取得するといった運用を行うページ以外ではIndexesの使用を避けるようにしてください。

Indexesを使用しなくとも、悪意を持ったユーザがファイル名を推測し取得しようとする場合があります。
このファイルは主に次の3つです。

.htaccessは、各ディレクトリごとにユーザが任意に動作を決めるもので、 アクセス制限等に使用される場合が多いようです。
その他の2つは、基本認証において使用されます。
これらは、Apacheが提供するデフォルトのファイル名を使用する場合が多く、 これらのファイルが第三者に取得されるケースが少なくありません。
あらかじめ、httpd.confや各.htaccessでアクセス制御を行っておくべきです。

.htaccessの例
<FilesMatch "^\.(htaccess|htpasswd|htgroup)$">
    order allow,deny
    deny from all
</FilesMatch>
また、この場合、そもそも.htpasswdや.htgroupをドキュメントツリーの中に置くことが良くありません。これら認証に使用するファイルは、組織外のユーザに対しサービスを行っているなどのサーバ以外では必ずドキュメントツリー外に置くようにしてください。

(4) アクセス制御ファイル

先に説明したFileMatchによってユーザの認証や参照できるネットワークなどを制限することができます。
ユーザの認証は基本認証(ベーシック認証とも呼ばれる)が使用されますが、 参照するクライアントが属するネットワークが限定されている場合、 IPアドレスやドメイン名で制限するほうが確実です。 なぜなら、基本認証を使用すると、ユーザ名やパスワードを盗聴される可能性があるからです。
たとえば、社外に出て一般のISPから接続する営業マンが居る環境では、不特定のネットワークから特定のユーザが接続することとなります。この場合は基本認証で行うしかありません。この場合はSSLなどを使用するべきでしょう。
ネットワーク単位で指定する場合は次のように行います。
192.168.0.0/24のネットワーク全体、およびipa-sec.com全体、そして172.16.0.1のホストが接続できるようにするためには次のように設定します。

参照可能なクライアントを制限した例
<LIMIT GET POST>
  Order deny,allow
  Allow from 192.168.0. .ipa-sec.com 172.16.0.1
  Deny from all
</LIMIT>
このようにしてhttpd.confまたは.htaccessに記述します。これは、ディレクトリ単位で有効になるため、ユーザが作成したディレクトリごとや、Webサーバ全体としてのポリシーを検討の上設定するようにしてください。

(5) .htaccessの禁止

httpd.confにおいて、Optionと共に記述されたディレクトリごとの設定は、 httpd.confを書き換えることなく各ディレクトリにおいて.httaccessファイルを記述することによって任意に変更することができます。
しかし、各ディレクトリ内で変更させないということが行えます。 これには、以下の記述をhttpd.confに追加します。

httpd.confで.htaccessを使用させないようにする
<Directory />
  AllowOverride None
  Options None
  allow from all
</Directory>
この設定によって、.htaccessは無効となり、管理者が設定したディレクトリの設定で動作することとなります。

(6) SSI

ApacheではSSI(Server Side Include)が利用できるようになっています。
しかし、これはイントラネットなどの限られた環境以外では無効にすべきです。
特に、SSIを使用したEXEC命令は各種の危険が伴います。 このため、IncludesNoExecを設定しておく必要があります。

Options IncludesNoExec

    Copyright(C)  2001 Information-technology Promotion Agency, Japan.  All rights reserved.