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のバージョン情報を表示したくない場合は、httpd.confに ServerSignature と ServerTokens との設定を変更・追加すればよい。セキュリティホールの発見等でバージョン情報の表示から攻撃者に有力な情報を与えないためである。この設定はApache 1.3.12以降から利用可能である。
httpd.confのServerSignatureの設定をOnからOffに変更して、エラーメッセージ出力時にフッタを表示しないようにする。
ServerSignature Off
同じく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/*
以上の操作により、コンテンツディレクトリのファイルは、ディレクトリのパーミッションとファイルのパーミッションとで二重に守られることになる。
Directory指示子を使って、外部からアクセスされるディレクトリと、アクセスできないディレクトリを確実に分けておく。
ルート・ディレクトリへのアクセス禁止 <Directory /> Order Deny,Allow Deny from all </Directory> ドキュメント・ルートへのアクセス許可 <Directory /home/httpd/html> Order Deny,Allow Allow from all </Directory>
まず、ルート・ディレクトリへのアクセスを禁止し、次にドキュメント・ルートへのアクセスを許可する。こうすれば、ドキュメント・ルート以外のディレクトリはすべてルート・ディレクトリとなり、そこへのアクセスはできなくなる。
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を使った認証がある。それらを使用する際には、特にクライアント側では、以下の点に留意しなければならない。
一番簡単な認証方式であるが、Webブラウザで入力されたパスワードはWebサーバに暗号化されないで送信される。通信自体も暗号化されない。テキストファイルを用いたものと、データベースを利用するものとがある。それぞれ以下のモジュールが必要になる。
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というアルゴリズムを使ってダイジェスト値を計算し、この値がユーザ認証に利用される。しかし、通信自体の暗号化は行われない。必要なモジュールは、
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(Secure Sockets Layer)を利用する。 必要なモジュールは、
SSL機能の本体であるオープンソースのOpenSSLが必要である。、必須ではないが、共有メモリライブラリであるmmがあると、性能が向上する。
/etc/httpd/confディレクトリ以下に次のSSL関係のディレクトリが作成される。
[Prev] | [Top] | [Next] |