たぶん難しくないApache2・初期設定編その3~関係者以外立ち入り禁止~ [Linux(Apache)]
これまでの設定作業で、どうにか「普通のWebサーバ」らしくなった気がするところまではこぎつけた。
今度は、様々な「お好み」カスタマイズをしていくことにしよう。
続いての設定内容は、許可された人だけがコンテンツへのアクセスができるようにする、いわゆる「認証」の仕組みを取り組んでいく。
自宅でサーバを立てる理由の一つに、『仲間内だけでこっそりと、しかし自由に使える空間が欲しい』なんてこともあるだろう。あるいは、会社の部門内にサーバと立てたとして、他部門あるいは関係者にだけ閲覧を許可したい部分も出てくるのではないかと思う。
すでに、IPアドレスやドメイン名(FQDN)でアクセスを許可・不許可とする仕組みがあることは紹介した。しかし、DHCPが運用されている環境では難しかったり、インターネットを経由してアクセスしてくる友人のIPアドレスがどれかなんてわかろうはずも無い。(いや、ちゃんと調べればわかるのだが…)
そこで、「ID」と「パスワード」を発行し、この組み合わせの正しかった人だけに対してアクセスを許可する「(ユーザー)認証」によって、個人を識別し、その人がコンテンツへのアクセス権限を持つのかどうかを調べる方法を採用することになる。
手順としては以下のような感じになるだろうか。
手順1:アクセスを制限するコンテンツを配置するディレクトリを決定する
手順2:認証を行うために必要な設定を導入する
手順3:認証時に使用するIDとパスワードを作成する
手順4:Apacheを起動してテストしてみる
手順1:アクセスを制限するコンテンツを配置するディレクトリを決定する
ドキュメントルートの下に、アクセスを制限するコンテンツを配置するディレクトリを作成するところから始まる。まあ、普通に「mkdir」コマンドでディレクトリを作成すればよい。
なお、「このサーバの全てのコンテンツには認証が必要です」という場合は、ドキュメントルートそのものに認証を導入することになるので、特に別途ディレクトリを用意する必要は無い。
手順2:認証を行うために必要な設定を導入する
続いて、httpd.confにその設定を導入しよう。なお、(ユーザー)認証の仕組みとしてはいくつかの機構が用意されているが、ひとまずここではIDとパスワードとをファイルで管理するBASIC認証について解説することにしよう。
ここで活躍するディレクティブは、ざっと以下のとおり。
AuthType Basic … 認証の仕組みを宣言する。ここでは「BASIC認証を使います!」と言っている
AuthBasicProvider file … BASIC認証時の、IDとパスワードを判別する仕組みを宣言する。ここでは「ファイルに保存されているものを使います!」と言っている
AuthUserFile (ファイルのパス名) … 上記で宣言した、IDとパスワードを記録したファイルの保存場所を指定する。
AuthName "(任意の文字列)" … 「認証領域」の名前を指定する。ブラウザのIDとパスワードを入力するダイアログに表示されることになり、利用者がどのIDとパスワードを入力すればよいか判断できるようにする。(タテマエ)
Require … どの認証済みユーザーがコンテンツへのアクセスを許可されるのかを指定する。認証された全てのユーザー(AuthUserFileディレクティブで指定されたファイルの中に記録されている全てのIDとパスワード)に対して許可する場合は「Require valid-user」と記述し、認証されたユーザーの中でも特定のユーザーにだけ許可したい場合は、そのIDを列挙する。「Require user userA userB userC ....」みたいな具合に。
また、注意すべきディレクティブとして忘れてはならないのは、既出の「Allow」「Deny」「Order」の他に加えて
Satisfy … AllowディレクティブとRequireディレクティブと両方が指定されている場合のアクセスポリシーを指定する。詳細は別途解説する。
上記のディレクティブを、認証を必要とするコンテンツを配置しているディレクトリに対して設定を行うこととなる。
ドキュメントルートが /var/www/html であり、認証を要求したいコンテンツが格納されているディレクトリが、 /var/www/html/auth_contents であるとしよう。この場合、
①ドキュメントルート配下、あるいは、auth_contents以外のディレクトリには自由にアクセスを認める
②ドキュメントルート配下ではあるが、auth_contentsディレクトリの下からは認証を要求する。
という動作を指定することになる。
ドキュメントルートに対する動作の指定がすでにある。
これに続けて、認証を要求するディレクトリに対する動作の指定を記述しよう。
まず、忘れないうちにディレクトリを作成して… 「mkdir /var/www/html/auth_contents」
こんな具合に書き足す。
ちなみに、/var/www/html/auth_contentsに対してAllowとかDenyとか特に書いていないが、この場合はその親ディレクトリ「/var/www/html」に対する指定がそのまま引き継がれる。(つまり、AuthナントカとかRequireとかの指定が追加されるイメージ)
AuthUserFileは、相対パス指定で記述しているが、これはすでに説明したとおり「サーバルート」からの相対パス指定になるので、実際に配置される場所は /etc/httpd/auth/userauth というフルパス名になる。(/etc/httpd/authというディレクトリはまだ存在しないので、 mkdir /etc/httpd/auth とか実行して作成する必要がある)
なお、よく言われることであるが、AuthUserFileで指定されるファイルはドキュメントルートの配下に置くべきではない。可能な限り避けること。
手順3:認証時に使用するIDとパスワードを作成する
次に、認証で使用するIDとパスワードを作成する。Apache2に標準添付の「htpasswd」というコマンドを使用する。使い方は、「htpasswd ファイル名 作成・編集するID」となる。
ただし、はじめてIDを作成する(まだIDとパスワードを保存しているファイルが存在しない)場合には、「-c」オプションを指定しなければならないので注意を要する。
また、さらに気をつけなければならないのは、すでにIDとパスワードが保存されているファイルがあるのに「-c」オプションをつけてしまうと、既存のファイルは破棄され、新しく1から作成されてしまうのである。「上書きしますか?」みたいな親切な質問はしてこないので厳重に注意すべし。
というわけで、まず最初の一人目のアカウントを作成する。コマンドは「htpasswd -c /etc/httpd/auth/userauth tadao.hiiragi」と実行。
これでファイルが作成される。ちなみに中身はこんな感じ。
二人目以降は「-c」を付けないで実行する。
こうして作成されたIDとパスワードのファイルはこんな具合になるだろう。
手順4:Apacheを起動してテストしてみる
…と、起動したいところであるが、モジュールの読み込み指定がまだ済んでいないので、このままではまだ起動できない。今回追加したディレクティブで使用するモジュールの宣言は以下のとおり。
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_user_module modules/mod_authz_user.so
この記述も書き足してやる必要がある。
また、auth_contentsディレクトリの中に適当なhtmlファイルを置いてやる。中身はなんでも良い。
これでhttpdをスタートしてチェックできる。
このとき、 http://server/ とだけ指定すれば特に認証などを求められることなくアクセスできるが、 http://server/auth_contents/ とか指定すると、IDとパスワードの入力を求められるダイアログが開くだろう。ここでは、htpasswdコマンドで作成したIDのどれかを入力し、対応するパスワードを入力することで、認証が行われ、許可されたコンテンツにアクセス出来るようになる。
以上で、BASIC認証を使った、アクセス制御が可能となった。
ここまでに作成したhttpd.confは以下のようになったはず。
今度は、様々な「お好み」カスタマイズをしていくことにしよう。
続いての設定内容は、許可された人だけがコンテンツへのアクセスができるようにする、いわゆる「認証」の仕組みを取り組んでいく。
自宅でサーバを立てる理由の一つに、『仲間内だけでこっそりと、しかし自由に使える空間が欲しい』なんてこともあるだろう。あるいは、会社の部門内にサーバと立てたとして、他部門あるいは関係者にだけ閲覧を許可したい部分も出てくるのではないかと思う。
すでに、IPアドレスやドメイン名(FQDN)でアクセスを許可・不許可とする仕組みがあることは紹介した。しかし、DHCPが運用されている環境では難しかったり、インターネットを経由してアクセスしてくる友人のIPアドレスがどれかなんてわかろうはずも無い。(いや、ちゃんと調べればわかるのだが…)
そこで、「ID」と「パスワード」を発行し、この組み合わせの正しかった人だけに対してアクセスを許可する「(ユーザー)認証」によって、個人を識別し、その人がコンテンツへのアクセス権限を持つのかどうかを調べる方法を採用することになる。
手順としては以下のような感じになるだろうか。
手順1:アクセスを制限するコンテンツを配置するディレクトリを決定する
手順2:認証を行うために必要な設定を導入する
手順3:認証時に使用するIDとパスワードを作成する
手順4:Apacheを起動してテストしてみる
手順1:アクセスを制限するコンテンツを配置するディレクトリを決定する
ドキュメントルートの下に、アクセスを制限するコンテンツを配置するディレクトリを作成するところから始まる。まあ、普通に「mkdir」コマンドでディレクトリを作成すればよい。
なお、「このサーバの全てのコンテンツには認証が必要です」という場合は、ドキュメントルートそのものに認証を導入することになるので、特に別途ディレクトリを用意する必要は無い。
手順2:認証を行うために必要な設定を導入する
続いて、httpd.confにその設定を導入しよう。なお、(ユーザー)認証の仕組みとしてはいくつかの機構が用意されているが、ひとまずここではIDとパスワードとをファイルで管理するBASIC認証について解説することにしよう。
ここで活躍するディレクティブは、ざっと以下のとおり。
AuthType Basic … 認証の仕組みを宣言する。ここでは「BASIC認証を使います!」と言っている
AuthBasicProvider file … BASIC認証時の、IDとパスワードを判別する仕組みを宣言する。ここでは「ファイルに保存されているものを使います!」と言っている
AuthUserFile (ファイルのパス名) … 上記で宣言した、IDとパスワードを記録したファイルの保存場所を指定する。
AuthName "(任意の文字列)" … 「認証領域」の名前を指定する。ブラウザのIDとパスワードを入力するダイアログに表示されることになり、利用者がどのIDとパスワードを入力すればよいか判断できるようにする。(タテマエ)
Require … どの認証済みユーザーがコンテンツへのアクセスを許可されるのかを指定する。認証された全てのユーザー(AuthUserFileディレクティブで指定されたファイルの中に記録されている全てのIDとパスワード)に対して許可する場合は「Require valid-user」と記述し、認証されたユーザーの中でも特定のユーザーにだけ許可したい場合は、そのIDを列挙する。「Require user userA userB userC ....」みたいな具合に。
また、注意すべきディレクティブとして忘れてはならないのは、既出の「Allow」「Deny」「Order」の他に加えて
Satisfy … AllowディレクティブとRequireディレクティブと両方が指定されている場合のアクセスポリシーを指定する。詳細は別途解説する。
上記のディレクティブを、認証を必要とするコンテンツを配置しているディレクトリに対して設定を行うこととなる。
ドキュメントルートが /var/www/html であり、認証を要求したいコンテンツが格納されているディレクトリが、 /var/www/html/auth_contents であるとしよう。この場合、
①ドキュメントルート配下、あるいは、auth_contents以外のディレクトリには自由にアクセスを認める
②ドキュメントルート配下ではあるが、auth_contentsディレクトリの下からは認証を要求する。
という動作を指定することになる。
ドキュメントルートに対する動作の指定がすでにある。
<Directory /var/www/html> Order Deny,Allow Allow from All </Directory>
これに続けて、認証を要求するディレクトリに対する動作の指定を記述しよう。
まず、忘れないうちにディレクトリを作成して… 「mkdir /var/www/html/auth_contents」
<Directory /var/www/html> Order Deny,Allow Allow from All </Directory> <Directory /var/www/html/auth_contents> AuthType Basic AuthBasicProvider file AuthUserFile auth/userauth AuthName "Takamiya Shrine" Require valid-user </Directory>
こんな具合に書き足す。
ちなみに、/var/www/html/auth_contentsに対してAllowとかDenyとか特に書いていないが、この場合はその親ディレクトリ「/var/www/html」に対する指定がそのまま引き継がれる。(つまり、AuthナントカとかRequireとかの指定が追加されるイメージ)
AuthUserFileは、相対パス指定で記述しているが、これはすでに説明したとおり「サーバルート」からの相対パス指定になるので、実際に配置される場所は /etc/httpd/auth/userauth というフルパス名になる。(/etc/httpd/authというディレクトリはまだ存在しないので、 mkdir /etc/httpd/auth とか実行して作成する必要がある)
なお、よく言われることであるが、AuthUserFileで指定されるファイルはドキュメントルートの配下に置くべきではない。可能な限り避けること。
手順3:認証時に使用するIDとパスワードを作成する
次に、認証で使用するIDとパスワードを作成する。Apache2に標準添付の「htpasswd」というコマンドを使用する。使い方は、「htpasswd ファイル名 作成・編集するID」となる。
ただし、はじめてIDを作成する(まだIDとパスワードを保存しているファイルが存在しない)場合には、「-c」オプションを指定しなければならないので注意を要する。
また、さらに気をつけなければならないのは、すでにIDとパスワードが保存されているファイルがあるのに「-c」オプションをつけてしまうと、既存のファイルは破棄され、新しく1から作成されてしまうのである。「上書きしますか?」みたいな親切な質問はしてこないので厳重に注意すべし。
というわけで、まず最初の一人目のアカウントを作成する。コマンドは「htpasswd -c /etc/httpd/auth/userauth tadao.hiiragi」と実行。
[root@kagami conf]# htpasswd -c /etc/httpd/auth/userauth tadao.hiiragi New password: Re-type new password: Adding password for user tadao.hiiragi
これでファイルが作成される。ちなみに中身はこんな感じ。
[root@kagami conf]# cat /etc/httpd/auth/userauth tadao.hiiragi:FkvD.5oGaIm76
二人目以降は「-c」を付けないで実行する。
[root@kagami conf]# htpasswd /etc/httpd/auth/userauth miki.hiiragi New password: Re-type new password: Adding password for user miki.hiiragi [root@kagami conf]# htpasswd /etc/httpd/auth/userauth inori.hiiragi New password: Re-type new password: Adding password for user inori.hiiragi [root@kagami conf]# htpasswd /etc/httpd/auth/userauth matsuri.hiiragi New password: Re-type new password: Adding password for user matsuri.hiiragi
こうして作成されたIDとパスワードのファイルはこんな具合になるだろう。
[root@kagami conf]# cat /etc/httpd/auth/userauth tadao.hiiragi:FkvD.5oGaIm76 miki.hiiragi:f8VEXD0xp4dXI inori.hiiragi:oipbVWsVT4qN6 matsuri.hiiragi:YykHU/0cnfbu2 kagami.hiiragi:BbchUr3onsYwQ tsukasa.hiiragi:CJDK3zJn6qNPU
手順4:Apacheを起動してテストしてみる
…と、起動したいところであるが、モジュールの読み込み指定がまだ済んでいないので、このままではまだ起動できない。今回追加したディレクティブで使用するモジュールの宣言は以下のとおり。
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_user_module modules/mod_authz_user.so
この記述も書き足してやる必要がある。
また、auth_contentsディレクトリの中に適当なhtmlファイルを置いてやる。中身はなんでも良い。
これでhttpdをスタートしてチェックできる。
[root@kagami conf]# apachectl -t Syntax OK [root@kagami conf]# service httpd start httpd を起動中: [ OK ]
このとき、 http://server/ とだけ指定すれば特に認証などを求められることなくアクセスできるが、 http://server/auth_contents/ とか指定すると、IDとパスワードの入力を求められるダイアログが開くだろう。ここでは、htpasswdコマンドで作成したIDのどれかを入力し、対応するパスワードを入力することで、認証が行われ、許可されたコンテンツにアクセス出来るようになる。
以上で、BASIC認証を使った、アクセス制御が可能となった。
ここまでに作成したhttpd.confは以下のようになったはず。
ServerRoot "/etc/httpd" PidFile run/httpd.pid Listen 80 User apache Group apache ServerName kagami.hiiragi.com:80 DocumentRoot "/var/www/html" LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule authn_file_module modules/mod_authn_file.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_default_module modules/mod_authz_default.so LoadModule dir_module modules/mod_dir.so LoadModule mime_magic_module modules/mod_mime_magic.so <Directory /> Order Allow,Deny Deny from All </Directory> <Directory /var/www/html> Order Deny,Allow Allow from All </Directory> <Directory /var/www/html/auth_contents> AuthType Basic AuthBasicProvider file AuthUserFile auth/userauth AuthName "Takamiya Shrine" Require valid-user </Directory> <Files ~ "^\.ht"> Deny from All </Files> DirectoryIndex index.html AddDefaultCharset off MimeMagicFile conf/magic
コメント 0