Apacheのセキュリティ

Webを公開する際には、セキュリティに十分な配慮が必要になることはいうまでもないが、具体的にはどうすればセキュリティが保たれるのであろうか。Apacheの設定ファイルhttpd.confの設定についてその点を調べてみた。

起動ユーザーの変更

Apacheが実行時に利用するユーザ権限とグループ権限の指定においては、nobodyが初期値として指定されている場合がある。しかし、nobodyは各種サービスでも利用される汎用のユーザアカント、グループアカントなので、apacheやwww等のApache専用ユーザ、グループを作成し使用するのが望ましい。

	User apache
	Group apache

httpd.confファイルのUserおよびGroupをapacheに変更する。apacheにはroot権限がないが、もしapacheの権限が奪取された場合、Apacheが使用している他のプロセスに影響を与える可能性がある。そのため、必ず専用のIDを指定する。その場合、ログインシェルを/bin/falseにしてシェルの使用およびログイン禁止にしてしまう。

	/etc/passwd
	apache:暗号:Apache:/home/httpd:/bin/false

	/etc/shadow
	apache:!!:暗号

管理者のメールアドレスの非公開

WWWサーバの管理者のメールアドレスを直接公開すると、管理者のメールアドレスがWebブラウザ上に表示され、そこから管理者が特定される恐れがある。特定されないようにするには、httpd.confファイルのServer Adminの設定をwebmaster@localhostというような特定できないメールアドレスにしておく。

	ServerAdmin	webmaster@localhost

そして、実際の管理者のメールアドレスは、/etc/aliasesファイルを利用し、そこに実際の管理者のメールアドレスを記載する。

	webmaster:	xxx@xxxx.xxx.jp

これでメールアドレスの置き換えが行われ、実際の管理者へメールが配信されるようになる。

Apacheのバージョン情報を表示しない

Apacheのバージョン情報を表示したくない場合は、httpd.confに ServerSignature と ServerTokens との設定を変更・追加すればよい。セキュリティホールの発見等でバージョン情報の表示から攻撃者に有力な情報を与えないためである。この設定はApache 1.3.12以降から利用可能である。

ServerSignature の変更

httpd.confのServerSignatureの設定をOnからOffに変更して、エラーメッセージ出力時にフッタを表示しないようにする。

	ServerSignature Off

ServerTokens の追加

同じくhttpd.confにServerTokensを追加し、ProductOnlyを定義する。ServerSignatureの次に追加すればよい。

	ServerTokens ProductOnly

コンテンツのセキュリティ

新規に作成されるファイルのパーミッションは「644」であり、ディレクトリは「755」である。所有者以外はファイルやディレクトリの内容を変更できないようになっているが、すべてのユーザが読み込みできる。Webサーバのコンテンツを第三者による改竄から守るためには、許可のないユーザがコンテンツディレクトリにアクセスできないようにする必要がある。WebサーバのプログラムのApacheがapacheユーザとapacheグループの権限で動作する場合、コンテンツディレクトリ(/home/httpd/html)の所有者と所有グループをapacheに設定し、その他のユーザから一切の権利を奪う。

	#chown apache:apache /home/httpd/html
	#chmod 770 /home/httpd/html

さらに、/home/httpd/htmlディレクトリにSGIDを設定し、同ディレクトリに作成されたファイルの所有グループが自動的にapacheになるようにする。その上で、ファイルのパーミッションもその他のユーザがアクセスできないように「660」に変更する。

	#chmod 2770 /home/httpd/html/
	(chmod g+s /home/httpd/html/)
	
	#chmod 660 /home/httpd/html/*
SGID(Set Group ID): 誰が実行した場合でも、実行時にファイルの所有グループの権限が使われるようになる。実行ファイルとディレクトリに対して設定することができる。表記上、「x」が「s」に変わり、「rwxr-sr-x」となる。

以上の操作により、コンテンツディレクトリのファイルは、ディレクトリのパーミッションとファイルのパーミッションとで二重に守られることになる。

公開ディレクトリ内のアクセス制限

Directory指示子を使って、外部からアクセスされるディレクトリと、アクセスできないディレクトリを確実に分けておく。

	ルート・ディレクトリへのアクセス禁止
	<Directory />
		Order Deny,Allow
		Deny from all
	</Directory>

	ドキュメント・ルートへのアクセス許可
	<Directory /home/httpd/html>
		Order Deny,Allow
		Allow from all
	</Directory>	

まず、ルート・ディレクトリへのアクセスを禁止し、次にドキュメント・ルートへのアクセスを許可する。こうすれば、ドキュメント・ルート以外のディレクトリはすべてルート・ディレクトリとなり、そこへのアクセスはできなくなる。

CGI

CGIのプログラムにセキュリティホールがあると、それを突かれて不正アクセスを受ける可能性が高まる。CGIプログラムを利用する際には、その動作を十分に検証し、セキュリティ情報に留意する。 そして、CGIの利用には専用のディレクトリを用意し、他のディレクトリのものは実行できないようにしておく。

	CGIモジュールの読み込みと使用
	LoadModule cgi_module	modules/mod_cgi.so
	AddMoodule mod_cgi.c

	CGIの利用を専用のディレクトリに制限
	ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"

	実行できるCGIの制限
	<Directory "/home/httpd/cgi-bin">
		AllowOverride None
		Options None
		Order Allow,Deny
		Allow from all
	</Directory>

CGIファイルおよびHTMLファイルのパーミッションの問題がある。CGIファイルは読み・実行でよい。HTMLファイルは読みだけでよい。

	chmod 500 abc.cgi
	chown apache:apache abc.cgi

	chmod 400 def.html
	chown apache:apache def.html

	chmod 700 html_directory

ホスト単位でのアクセス制御

特定のホストからのアクセスを許可する場合は、

	<Directory /home/httpd/html/xxxx>
		Order Deny,Allow
		Deny from all
		Allow from 特定ホスト	--例:192.168.1.0/24、192.168.1、.xxx.xx.jp
	</Directory>

逆に、特定のホストからのアクセスを拒否する場合は、

	<Directory /home/httpd/html/xxxx>
		Order Allow,Deny
		Allow from all
		Deny from  特定ホスト
	</Directory>

両者で、Order指示子の引数の順序が違うのは、Order指示子は最後に評価した内容を優先させるからである。

以上のアクセス設定でも、完全ではない。DNSサーバが改竄されると、ドメイン名やIPアドレスの詐称は簡単に行える。また、パケットフィルタ等を使って、アクセス対策を施しておかなければならない。

ユーザ単位のアクセス制御

ベーシック認証、ダイジェスト認証およびSSLを使った認証がある。それらを使用する際には、特にクライアント側では、以下の点に留意しなければならない。

  1. Webサイトのユーザ認証に用いるユーザ名とパスワードは、サーバのシステムに登録されたユーザ名とパスワードと別物である。システムにユーザとして登録されていても、ユーザ認証に用いるファイルやデータベースに登録されていなければ、そのユーザはWebサイトにアクセスできないし、同じユーザ名で登録されていても、そのパスワードは同じではない。
  2. 一度ユーザー認証を通過すると、Webブラウザを閉じるまでその認証が有効になっている。ユーザ認証で送信したユーザ名とパスワードは、Webブラウザが記憶している。従って、たとえほかのサイトへ移動したとしても、Webブラウザを終了するまでは再度認証を受けることがない。Webブラウザをそのまま起動したままにしていると、誰でもがWebサイトにアクセスすることができる状態にある。

ベーシック認証

一番簡単な認証方式であるが、Webブラウザで入力されたパスワードはWebサーバに暗号化されないで送信される。通信自体も暗号化されない。テキストファイルを用いたものと、データベースを利用するものとがある。それぞれ以下のモジュールが必要になる。

  1. mod_auth:認証データをテキストファイルで管理
  2. mod_auth_dbm:認証データをDBM形式で管理
  3. mod_auth_db:認証データをバークレーDB形式で管理

テキストファイルでの管理

htpasswdコマンドを使って、ユーザを登録するファイルを作成し、ユーザを登録する。

	#htpasswd -c /etc/httpd/ht_passwd ユーザ名
	New password:
	Re-type new password:
	Adding password for user ユーザ名

cオプションは新規ファイルを指定して作成する。パスワードファイルはWebサーバがアクセスしないディレクトリに保管する。また。パーミッションは読み取り可能であればよい。

	#chmod 444 /etc/httpd/ht_passwd

作成されたパスワードファイルのパスワードそのものは暗号化されて記載される。順次、ユーザを追加するには、cオプションをはずして、htpasswdコマンドを実行する。

/etc/httpd/conf/httpd.confファイルにDirectory指示子を用いて、ベーシック認証の設定を記述する。

	<Directory "/home/httpd/html/admin/">	--admin以下のディレクトリを認証対象
		AuthType Basic
		AuthName "Admin Area"	--ユーザ認証の際にWebブラウザのダイアログに表示されるメッセージ
		AuthUserFile /etc/httpd/ht_passwd
		AuthGroupFile	/dev/null	--グループ単位のアクセスファイルを利用しない
		require  valid-user	--パスワードファイルに記載されたユーザすべてにアクセスを許可
	</Directory>

設定を終えたならば、Apacheの再起動を行えば有効になる。

データベースを利用した管理

ダイジェスト認証

パスワードが送信されない。Webブラウザが、ユーザのパスワード、ユーザ名、時刻等のデータからMD5というアルゴリズムを使ってダイジェスト値を計算し、この値がユーザ認証に利用される。しかし、通信自体の暗号化は行われない。必要なモジュールは、

  1. mod_auth_digest

htdigestコマンドを使って、パスワードファイルを作成し、認証領域(realm)を指定し、ユーザを登録する。

	htdigest -c /etc/httpd/digest_passwd "/home/httpd/html/admin" ユーザ名
	New password:
	Re-type new password:
	Adding password for user ユーザ名

/etc/httpd/conf/httpd.confファイルにDirectory指示子を用いて、ダイジェスト認証の設定を記述する。

	<Directory "/home/httpd/html/admin/>
		AuthType digest
		AuthName "Admin Area"
		AuthDigestFile /etc/httpd/digest_passwd
		require valid-user
	</Directory>

ただし、このダイジェスト認証が使えるWebブラウザは、IE5.0、NN6.0、Mozilla等の最近のものに限られる。

SSLを使った認証

ユーザの認証から通信自体の暗号化を行うには、SSL(Secure Sockets Layer)を利用する。 必要なモジュールは、

  1. mod_ssl
このモジュールをインストールすると、SSL通信に必要なサーバの証明書もインストールされている。この証明書は動作テスト用の証明書であり、ベリサイン等の認証局(CA)による認証を行うものではない。証明書を利用するサーバ自身で改竄防止の署名が行われた自己証明書である。

SSL機能の本体であるオープンソースのOpenSSLが必要である。、必須ではないが、共有メモリライブラリであるmmがあると、性能が向上する。

  1. OpenSSL
  2. mm

/etc/httpd/confディレクトリ以下に次のSSL関係のディレクトリが作成される。

  1. ssl.key/: 秘密鍵
  2. ssl.csr/: CSR(Certificate Signing Request)正規のサーバ証明書を得る場合に使用する、証明書を受け取るために必要な情報
  3. ssl.crt/: CRT(Certificate)PEMエンコードされたX.509証明書
  4. ssl.csl
  5. ssl.prm



inserted by FC2 system