アクセス制御とセキュリティ
NCSA httpdでは次の2つの方法でWWWサーバへのアクセスを制限できます。
WWWブラウザのIPアドレスまたはドメイン名。 ユーザー(読者)名とパスワードによるユーザー認証。これはユーザー認証機能をWWWブラウザでサポートされている必要があります。httpdはKerberosをサポートしていますが、米国の暗号ソフトウェア輸出規制のため日本では利用できません。
アクセス制御ファイル
アクセス制御とユーザー認証はサーバ全体またはディレクトリ毎に可能です。
サーバ全体またはディレクトリ毎のアクセス制御はグローバルアクセス制御ファイル(ACF)によって制御されます。 ディレクトリ毎に設定する場合、デフォルトでは各ディレクトリにある.htaccessファイルで行います。 NCSA httpdではファイル毎のアクセス制限をサポートしておらず、もし個々のファイルでプロテクトをかける必要があれば、そのファイルをディレクトリの中に置いてプロテクトしなければなりません。
ディレクトリのアクセス制限をグローバルACFで行う場合は、次のように<Directory>ディレクティブで制限したいディレクトリを指定し、制限を行なう<Limit>ディレクティブを使用します。
<Directory /usr/local/etc/httpd/htdocs/subdirecty> <Limit get post> order, deny from, allow from, require <Limit> </Directory><Limit>ディレクティブは、以下のとおりメソッドによってクライアントからの要求を制限します。<Limit メソッド1 メソッド2...メソッドn>.htaccessを使って個々のディレクトリで行う場合、<Limit>ディレクティブのみを使用します。
メソッドはgetとpostのみをサポートしており、またLimitディレクティブを 閉じる場合は</Limit>を使用します。<Limit get> order, deny from, allow from, require </Limit>アクセス制御用ディレクティブ
アクセス制御、認証に使用されるディレクティブは下表のとおりです。
ディレクティブ パラメータ例 用 途 <Limit> <Limit get post> アクセス制限節の開始 </Limit> </Limit> アクセス制限節の終了 order deny, allow アクセスの評価順 deny from .yok.com アクセス拒否するドメインまたはIPアドレス allow from .yok.com アクセス許可するドメインまたはIPアドレス requre ben bob tom アクセスを許可するユーザまたはグループ AuthName Foo Members Only 認証を要求する際に表示されるメッセージ AuthType Basic 認証方式(Basic, PGP, PEM) AuthUserFile /www/etc/passwd パスワードファイルのパス名 AuthGroupFile /www/etc/group グループファイルのパス名
ドメイン毎のアクセス制限
ドメイン名やIPアドレスによってWWWサーバへのアクセスを制限するメカニズムは、特定のグループや組織内のみアクセスを許す場合に用いられます。 ドメイン制御ディレクティブドメインのアクセス制御ディレクティブは以下の3つがあります。これらは<Directory>ディレクティブの中で用います。
order Limit節の中で評価される denyとallowの順番を定義します。deny→allowの順番がデフォルト(初期設定)です。 allow ホストがディレクトリにアクセスできることを定義します。 deny ホストがディレクトリにアクセスできないことを定義します。 アクセス制御の方法
初期のWWWサーバーのコンフィギュレーションでは、アクセス制限はかかっていません。
<Directory /usr/local/etc/httpd/htdocs> Options Indexes FollowSymlinks AllowOverride All <Limit GET> order allow,deny allow from all <Limit> <Directory>たとえば、ローカル組織内でアクセス制限をする場合はaccess.confを次のように変更し、httpdを再起動します。<Directory /usr/local/etc/httpd/htdocs> Options Indexes FollowSymlinks AllowOverride None <Limit get> order deny,allow deny from all allow from yok.com <Limit> <Directory>アクセス制限のないパターンとの違いは次のとおりです。
orderディレクティブはallow,denyからdeny,allowに変わっています。これはhttpdがdenyを先に評価し、それをベースにallowを評価し、allowを許したドメインからのアクセスを許可します。 deny from allが書き加えられています。 allowディレクティブが allからローカルドメイン(yok.com)だけになっています。 複数のドメイン名を許可したりIPアドレスとドメインを組合せることも可能で、次はその記述例です。IPアドレスの場合は一致するアドレスを記述し、この場合なら172.16.0.1〜172.16.255.254までが許可されます。
allow yok.com chin.com 172.16ディレクトリ毎に制限する場合、.htaccessファイルへ<Limit>ディレクティブを置き、ACFの時と同様の記述形式で制限します。<Limit get> order deny,allow deny from all allow from yok.com </Limit>ユーザー認証
ユーザー認証はサーバ全体または個々のディレクトリに対して行なうことができます。ユーザー認証を行うと、そのサーバまたはディレクトリにアクセスする際、ログインと同じようにユーザ名とパスワードが一致しなくてはなりません。ユーザ名とパスワードを含むファイルはシステムが持つ/etc/passwrdと一致する必要はなく、WWWサーバー用にユーザ名とパスワードのファイルが用意されます。モザイクの場合、ユーザー認証を設定すると次のようなプロンプトが表示されます。
モザイクのユーザ認証ウィンドウ(ユーザ名入力)そしてユーザ名を入力後、
モザイクのユーザ認証ウィンドウ(パスワード入力)これに対してネットスケープの場合は、ユーザー名とパスワードをまとめて入力するウィンドウが表示されます。
ネットスケープのユーザ認証ウィンドウユーザー認証はWWWサーバ全体で行われることは少なく、ふつう特定のディレクトリに対して行われます。そして、ユーザー名とパスワードが収めてあるファイルは1つにまとめても個々のディレクトリ毎で持つことも可能です。そのパスワードファイルは一般に.htpasswdという名称で使われます。
パスワードファイルの管理
パスワードファイルへユーザーを登録したりパスワードを変更する場合、NCSA httpdソースパッケージのsupportディレクトリにあるhtpasswdプログラムを使います。
% htpasswd [-c] .htpasswd usernameusernameは加えたいあるいはパスワードを変更したいユーザー名です。-c フラグはそこにパスワードファイル(.htpasswd)が存在せず、新たに作成する場合に用います。パスワードファイルは以下のようにユーザー名とパスワードがセミコロン(:)で区切られたファイルです。削除する場合は、エディタで該当するユーザー行を削除します。ユーザ名:暗号化されたパスワード taro:y1ia3tjWkhCK2 jiro:kd03g0Wk09ErD saburo:tck3GxmQE7haccess.confによる認証設定WWWサーバ全体に認証設定を行う場合、DocumentRootに認証機能を与える設定を行う。次のように access.confを設定すればよい。
<Directory /usr/local/etc/httpd/htdocs> Options Indexes FollowSymlinks AllowOverride None AuthUserFile /usr/local/etc/httpd/conf/.htpasswd AuthGroupFile /dev/null AuthName By Secret Password Only! AuthType Basic <Limit get> require user username </Limit> </Directory>
AuthUserFileディレクティブはパスワードファイルの絶対パス名(ルート(/)から記述)を指定します。 AuthGroupFileディレクトリはグループ認証を行うためのグループファイルを設定します。無ければ、/dev/nullを設定します。 AuthNameディレクティブはユーザー名を尋ねるウィンドウに表示するコメントです。この場合、By Secret Password Only!というメッセージが表示されます。 AuthTypeディレクティブは認証をタイプを指定します。普通のパスワード入力のみであるため、Basicと設定します。NCSA httpd 1.5 では、MD5 (Digest)や Kerberos V4, V5(KerberosV4, KerberosV5)が使用できます。ただし、Kerberos は米国外では利用できません。 認証関係(Auth)のディレクティブはLimit部の外に置きます。 <Limit>部がrequireのみになっています。これは、usernameを持つユーザー名によるアクセスのみを要求していることを意味します。requireディレクティブには、AuthUserFile, AuthGroupFile, AuthName, AuthTypeディレクティブが必要です。また、order, allow, denyと組み合わせて、特定のホストからのみそのユーザーがアクセスが可能なようにも設定できます。 上記の設定を行ったら、WWWのパスワードファイルを作成します。次のコマンドを入力すると、新しいパスワードがファイルが作られ、新しいパスワードの入力が促されます。そして、パスワードを入力すると、パスワードの再入力が促され、正しいパスワードを入力すれば、完了です。
% htpasswd -c /usr/local/etc/httpd/conf/.htpasswd usernameディレクトリ毎に行う場合個々のディレクトリで設定を行う場合、アクセス制御の時と同様のファイル.htaccessを使って、以下のように設定します。
AuthUserFile /usr/local/etc/httpd/conf/.htpasswd AuthGroupFile /dev/null AuthName By Secret Password Only! AuthType Basic <Limit get> require user username </Limit>個々のディレクトリで設定する場合には、<Directory>節は必要ありません。 グループ認証
グループACF (access.conf)を変更します。 複数のユーザーをメンバーとして登録したグループファイル(.htgroup)を作成します。 グループファイルの中のすべてのユーザーがパスワードファイルにあるかどうかをチェックします。 そして、次のようにACFを変更します。
<Directory /usr/local/etc/httpd/htdocs> Options Indexes FollowSymlinks AllowOverride None AuthUserFile /usr/local/etc/httpd/conf/.htpasswd AuthGroupFile /usr/local/etc/httpd/conf/.htgroup AuthName By Secret Password Only! AuthType Basic <Limit get> require group groupname </Limit> </Directory>
まず、AuthGroupFileに作成するグループファイルの絶対パス名を書き込みます。 requireディレクティブを groupにして、該当するgroupnameを書き込ます。 次にグループファイル/usr/local/etc/httpd/conf/.htgroupをを作成します。
groupname: username1 username2 username3 ... usernameNユーザー名は空白で分割し、複数グループがあれば1行づつ登録します。 そして、登録し終ったらhttpdを再起動します。個々のディレクトリで設定を行う場合、アクセス制御の時と同様のファイル.htaccessを使って以下のように設定します。
AuthUserFile /usr/local/etc/httpd/conf/.htpasswd AuthGroupFile /usr/local/etc/httpd/conf/.htgroup AuthName By Secret Password Only! AuthType Basic <Limit get> require group groupname </Limit>個々のディレクトリで設定する場合、<Directory>節は必要ありません。 ディレクトリのセキュリティ上の注意FTPやGopherはchroot()機能を持っているため、対象ディレクトリ以外へのアクセスはシステムレベルで制限されていますが、WWWサーバにはこの機能がありません。しかし、WWWブラウザは自由にディレクトリの行き来ができないので、その心配は少ないといえます。一番注意しなければならないのが、DocumentRootで定義されたディレクトリツリー以外のディレクトリへシンボリック・リンクを張った場合やユーザーディレクトリにプライベート・ディレクトリがある場合です。この機能を使用した時の安全性を高めるため、WWW管理者はaccess.confファイルのfollowsymlinkオプションを無効にするか、SymLinksIfOwnerMatchに変更したほうが確実でしょう。
ユーザーのホームディレクトリへpublic_htmlディレクトリを設けると、http://www.yok.com/~username/ でアクセスできます。これに対して個々のグローバルACFを許さないようプロテクトをかけるには以下の方法があります。
たとえば、すべてのユーザーが/homeというディレクトリにいる場合、/homeディレクトリ全体へプロテクトをかけるだけです。そのやり方は、access.confファイルの中に次のディレクティブを加えます。
<Directory /home> AllowOverride None Options Indexes </Directory>また、ユーザーディレクトリがバラバラの場合は次のようにワイルドカードを使って設定します。<Directory /*/*/public_html*> AllowOverride None Options Indexes </Directory>