Webサイトをアクセスする人を制限する場合、いくつかの方法がある。
①Webサイトにたどり着きづらくする
Webサイトへのアクセスは、以下によって行われる。
- 他サイトからのリンク(検索エンジン含む)
- URLの直接入力
GoogleやYahoo!などの検索エンジンからのアクセスを防ぐためには、robot.txt(検索エンジンのロボット(クローラー)に対し、指示するテキスト。)などをドキュメントルートに設定して、検索エンジンに拾われないようにする方法がある。
ただし、この方法ではURLがバレたらアクセスできてしまいます。
もっと有効な方法としてはApacheの設定(Requireの設定)もしくは、ファイアウォールの設定などで、特定のIPアドレスからしか操作できないように制限することが考えられる。
社内サーバーなどでクライアントのIPアドレスを固定できる場合によく使われる。
②Webサイト内部に入れないようにする
会員制のWebサイトなど、接続元のIPアドレスが固定できない場合は、ユーザー認証が使われるのが一般的。
JavaScriptやPerl・PHPなどを使って、プログラムでログインの仕組みを作ったり、Apacheの機能を利用したBasic認証やDigest認証でユーザー名やパスワードを確認したりする。※Webサービスの場合は、Basic認証をあまり用いない。
Basic認証とDigest認証の仕組み
Apacheでは、「.htaccess」を使ったBasic認証とDigest認証に対応している。どちらもサーバー側にユーザー名とパスワードのファイルを置いて、それを認証に利用する仕組み。
Basic認証は、それだけだと平文で通信されるため、盗聴されてしまうと、パスワードが漏れることがある。そのため、SSLでの暗号化とセットであることが多い。
一方、Digest認証はチャレンジ&レスポンスという方式を使用しており、パスワードを直接通信網に流すことなく、1回限り有効な計算値をもって認証する。ただし、一部ブラウザやレンタルサーバーで対応していないケースもある。
Basic認証とDigest認証ともに、ユーザー名とパスワードを問う「.htaccess」ファイルと、正しいユーザー名とパスワードを記載したパスワードファイルを使用して認証を行う。パスワードファイルはBasic認証の場合は「.htpasswd」、Digest認証の場合は「.htdigest」。
ApacheでBasic認証やDigest認証を設定する
デフォルトでは「.htaccess」は有効になっていないので、Basicn認証やDigest認証を有効にするには、「.htaccess」を有効にする必要がある。
これらは、Apacheの設定ファイル(etc/httpd/conf/httpd.conf)で変更する。設定ファイルの<Directory "var/www/html">
以下に「AllowOverride None」となっている箇所を書き換える。
この「None」を「All」に書き直して保存すると、「.htaccess」が使えるようになる。変更を保存後、systemctl reload httpd
コマンドでApacheを再起動する。
パスワードファイルを作る
認証では、ユーザー名とパスワードの組み合わせが記述されたパスワードファイルをサーバーに置き、入力された情報と合致するかを確かめる。
パスワードファイルは以下の名称にするのが一般的。
- Basic認証の場合、「.htpasswd」
- Digest認証の場合「.htdigest」
このとき、サーバー側には生の状態ではなく、ハッシュ化されたパスワードが保存される。
ハッシュ化とは、あんが桜花の一種で元のデータが予測できないよう、特別の計算式を使って変換した値のこと。生のパスワードの漏洩を防ぐ目的で使う。
Basic認証のファイルの書式
ユーザー名:ハッシュ化されたパスワード
Digest認証のファイルの書式
ユーザー名:レルム:MD5でハッシュかした値
例)
banana:Please input password:4c24626e523af2ee637d45161544d538
実際にBasic認証で使うパスワードファイルを作る方法
Apacheの機能(htpasswdコマンド)を使うことで、パスワードをハッシュ化することができる。ちなみにハッシュ化には「bcrypt」「MD5」「SHA1」「CRYPT」の4つの方式に対応している。
- 「.htpasswd」ファイルを生成するコマンド(/var/www/html/にbananaユーザーを記述しつつパスワードファイルを作成する
# htpasswd -c /var/www/html/.htpasswd banana
- すでに存在するパスワードファイルにユーザー名とパスワードを追記する場合は「-c」は不要。
ユーザーとパスワードを設定する方法
制限をかけたいディレクトリに「.htaccess」ファイルを置いて、認証機能を有効化する。全てのページに制限をかけたいのであれば「/var/www/html」ドキュメントルートに「.htaccess」ファイルを置く
- ファイルの書き方(Basic認証)
AuthType Basic
AuthName "Please input password"
AuthUserFile /var/www/html/.htpasswd
Require valid-user