# アクセス制御したい(`.htaccess`) ```apache # 特定のIPからのアクセスを拒否 Order Allow,Deny Deny from 192.168.1.1 Allow from all # WordPress管理画面へのアクセスを限定 Order Deny,Allow Deny from all Allow from 許可IPアドレス # .htaccessファイルへのアクセス禁止 # 外部(=ブラウザ経由)のアクセスを禁止 # 内部(=ssh経由)のアクセスは可能 Order Allow,Deny Deny from all # Basic認証 AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/.htpasswd # .htpasswdのパス Require valid-user # リダイレクトの設定 Redirect 301 古いURL 新しいURL ``` `.htaccess`を使って、ウェブサイトに対するアクセスやレスポンスを制御できます。 ファイル/ディレクトリに対するアクセス制限やリダイレクト、パスワード認証などを設定できます。 ディレクトリごとに設置できるため、研究室サーバーの個人スペースなどでにも設置できます。 `httpd.conf`などのサーバー設定ファイルの編集権限がないケースで活躍します。 ## アクセス制御を有効にしたい(`AllowOverride`) ```console // httpd.confのパスを確認 $ find . -name httpd.conf ``` ```apache AllowOverride All Require all granted ``` `.htaccess`を使ってアクセス制御したい場合、 該当ディレクトリに対して`AllowOverride`ディレクティブが有効になっている必要があります。 ## アクセス制御したい(`Required`) ```apache # 一括許可/一括拒否 Require all granted # Allow from all に相当 Require all denied # Deny from all に相当 # IPアドレス/ドメインを指定して許可 Require ip 許可IPアドレス # Allow from 許可IPアドレスに相当 Require host 許可ドメイン名 # Allow from 許可IPドメイン名に相当 # IPアドレス/ドメインを指定して拒否 Require not ip 拒否IPアドレス # Deny from 拒否IPアドレスに相当 Require not host 拒否ドメイン名 # Deny from 拒否IPアドレスに相当 ``` `Require`ディレクティブを使って、アクセス制限を設定しています。 :::{note} `Require`ディレクティブはApache2.4で追加(改善?)されたディレクティブです。 Apache 2.4からは`Require`ディレクティブを使うことが推奨されています。 Apache 2.2までは`Order`、`Allow`、`Deny`ディレクティブが使われていましたが、 将来的に廃止される予定だそうです。 ::: ```apache Require ip 許可IPアドレス/サブネットマスク Require ip 192.168.1.1/8 # => 192. 0.0.0 - 192.255.255.255 Require ip 192.168.1.1/16 # => 192.168.0.0 - 192.168.255.255 Require ip 192.168.1.1/24 # => 192.168.1.0 - 192.168. 1.255 ``` IPアドレスはサブネットマスクを使って範囲指定できます。 :::{note} サブネットマスクは、 IPアドレス(IPv4)を**ネットワーク部**と**ホスト部**に分けることで、 巨大なIPアドレス空間を分割・管理するための仕組みです。 サブネットマスクが `255.255.0.0`(`/16`)の場合は、65534個のホスト、 `255.255.255.0`(`/24`)の場合は、254個のホスト、 がそのネットワーク内で利用できることを表しています。 ::: ## 複数条件したい(`RequireAny`) ```apache Require all denied Require ip 許可IPアドレス1/サブネットマスク Require ip 許可IPアドレス2/サブネットマスク ``` `RequiredAny`ディレクティブで、複数の条件を設定できます。 上記のサンプルは、WordPressの管理画面へのアクセスを制御しています。 `Files`ディレクティブを使って`wp-login.php`を指定し、 指定したIPアドレスからのアクセスを許可しています。 ## パスワード保護したい(Basic認証) ```apache AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/htpasswd Require valid-user ``` 特定のディレクトリに設置して、パスワード保護できます。 HTTPSが有効なウェブサイトであれば、Basic認証でよいそうです。 ```console // .htpasswdが存在しない場合 $ htpasswd -c /var/www/etc/.htpasswd ユーザー名 // パスワードを入力 // パスワードを入力(確認) // .htpasswdに追記する場合 $ htpasswd /var/www/etc/.htpasswd ユーザー名 ``` サーバー内で`htpasswd`コマンドを使って`.htpasswd`ファイルを作成します。 パスワードファイルは、ウェブで公開されるディレクトリの外に作成し、 `AuthUserFile`で指定したパスに配置します。 パスワードはハッシュ化されて、このファイルに保存されます。 :::{note} パスワード保護の手法として`Basic認証`と`Digest認証`という方式があります。 HTTPSが有効なサイトでは、通信が暗号化されているので`Basic認証`でOKです。 ::: ## リダイレクトしたい(`Redirect`) ```apache # 301: 恒久的リダイレクト Redirect 301 古いURL 新しいURL # 302: 一時的リダイレクト Redirect 302 古いURL 新しいURL ``` `Redirect`ディレクティブを使ってURLのリダイレクトを設定できます。 ## HTTPSリダイレクトしたい(`RewriteRule`) ```apache RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ``` `RewriteRule`ディレクティブを使って、HTTPSリダイレクトを設定できます。 `RewriteEngine`、`RewriteCond`ディレクティブを合わせて使います。 また、リダイレクトには`mod_rewrite`モジュールが有効になっている必要があります。 ## リファレンス - [Access Control - httpd.apache.org](https://httpd.apache.org/docs/2.4/howto/access.html) - [認証・承認・アクセス制御 - httpd.apache.org](https://httpd.apache.org/docs/2.4/howto/auth.html) - [Apacheチュートリアル: .htaccess](https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html) - [Require](https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#require) - [RequireAll](https://httpd.apache.org/docs/2.4/ja/mod/mod_authz_core.html#requireall) - [AllowOverride](https://httpd.apache.org/docs/2.4/ja/mod/core.html#allowoverride)