Apache - アクセス制御
概要
ディレクトリ単位のアクセス制御
<Directory "/srv/www/htdocs">
# Order : AllowおよびDenyの順序を決める
# Allow : 許可するアクセス元を指定する
# Deny : 禁止するアクセス元を指定する
Order Allow,Deny # 順序は、Allowが先
Allow from all # 全て許可する
Deny from 192.168.1.10 # IPアドレスを完全に指定する
Deny from 192.168.5 # IPアドレスを先頭から24ビットに限定して指定する
Deny from 192.168.1.0/24 # サブネットマスクも併せて指定する (下の書式と等価)
Deny from 192.168.1.0/255.255.255.0 # サブネットマスクも併せて指定する (上の書式と等価)
Deny from sample.co.jp # ホスト名またはドメイン名の一部を指定する
</Directory>
ファイル単位のアクセス制御
<File "/srv/www/htdocs/index.php">
# Order : AllowおよびDenyの順序を決める
# Allow : 許可するアクセス元を指定する
# Deny : 禁止するアクセス元を指定する
Order Allow,Deny # 順序は、Allowが先
Allow from all # 全て許可する
Deny from 192.168.1.10 # IPアドレスを完全に指定する
Deny from 192.168.5 # IPアドレスを先頭から24ビットに限定して指定する
Deny from 192.168.1.0/24 # サブネットマスクも併せて指定する (下の書式と等価)
Deny from 192.168.1.0/255.255.255.0 # サブネットマスクも併せて指定する (上の書式と等価)
Deny from sample.co.jp # ホスト名またはドメイン名の一部を指定する
</File>
# htdocsディレクトリ内に存在するファイルを全て指定する場合
<File "/srv/www/htdocs/*">
# ...略
</File>
# htdocsディレクトリ内のindexから始まるファイル名を指定する場合
<File "/srv/www/htdocs/index*">
# ...略
</File>
# .htaccessファイルを指定する場合
# これにより、外部から.htaccessファイルを閲覧することができなくなる
<Files ~ "^.*\.([Hh][Tt][Aa][Cc][Cc][Es][Ss][Ss])">
# ...略
</File>
HTTPリクエストヘッダ情報で制限
HTTPリクエストヘッダのWebブラウザの種類の情報、リンク元の情報により、アクセス制限を行う。
※注意
HTTPリクエストヘッダを確認する場合、
Chromium系ブラウザでは chrome://net-internals/#events にアクセスして、"type:URL_REQUEST"で検索することにより確認できる。
ユーザエージェントによる制限
HTTPリクエストヘッダには、Webブラウザの情報やOSの情報等(ユーザエージェント)が含まれている。
以下の例では、HTTPリクエストヘッダのUser-AgentヘッダにMozillaという文字列が含まれている場合のみアクセスを許可している。
<Directory "/usr/local/apache2/htdocs">
# BrowserMatch : User-Agentヘッダ内に"Mozilla"という文字列が正規表現がマッチする場合は、環境変数mozillaを設定
BrowserMatch "Mozilla" mozilla
Order Deny,Allow
Deny from all
# 環境変数mozillaが設定されている場合は、アクセスを許可する
Allow from env=mozilla
</Directory>
Refererによる制限
Referer (リンク元のURL情報) によるアクセス制御は、Webページ内の画像にディープリンク(直リンク)されたくない場合、または、アクセス解析を混乱させるリファラーSPAM対策時に有効である。
<Directory "/srv/www/htdocs/icons">
# SetEnvIf: 指定した対象に正規表現がマッチする場合、環境変数を設定する
# 任意のHTTPリクエストヘッダを対象にできる
# Refererヘッダに www.example.jp が含まれている場合、環境変数exampleを設定
SetEnvIf Referer "www\.example\.jp" example
Order Deny,Allow
Deny from all
# 環境変数exampleが設定されている場合はアクセスを許可する
Allow from env=example
</Directory>
リダイレクト
一時リダイレクト
# httpd.confファイル
# Redirect <アクセスするパス> <リダイレクト先のパスまたはURL>
# これは、ステータスコード 302 (tmp) である
# 以下の例では、http://example.com/redirect_sample/ にアクセスする場合、http://example.com/redirect/ にリダイレクトされる
Redirect /redirect_sample/ http://example.com/redirect/
# アクセスするパスは正規表現を使用して指定することもできる
# 以下の例は、http://example.com/redirect_sample/内のファイルにアクセスする場合は、全て http://example.com/redirect/ にリダイレクトされる
Redirect ^/redirect_sample/(.*)$ http://example.com/redirect/
恒久リダイレクト
# httpd.confファイル
# Redirect <ステータス> <アクセスするパス> <リダイレクト先のパスまたはURL>
# これは、ステータスparmanent (ステータスコード 301 : Moved Parmanetly) を返す
Redirect parmanent /redirect_sample/ http://example.com/redirect/
コンテントネゴシエーション
HTTPリクエストヘッダは、言語、文字タイプ、データタイプ等の環境情報について通知している。
複数の形式で優先度が付いており、サーバ側は最適なものを選択することができる。
このように、処理できるデータ形式をクライアントとサーバ間で自動的に問い合わせることを、コンテントネゴシエーションと呼ぶ。
# Accept : クライアントが処理できるデータタイプと優先度 # Accept-Language : クライアントが処理できる言語と優先度 # Accept-Charset : クライアントが処理できる文字コードと優先度 # Accept-Encoding : クライアントが処理できるデータ転送方式と優先度 # q : 品質値 GET / HTTP / 1.1 Accept-Language : ja, en-us; q=0.7, en:q=0.3 Accept-Charset : Shift_JIS,utf-8; q=0.7,*;q=0.7
# httpd.confファイル
<Directory "/srv/www/htdocs">
# MultiViews : コンテントネゴシエーションを有効にする
Options FollowSymLinks MultiViews
# AddLanguage : 拡張子を言語指定に関連付ける
AddLanguage en .en
AddLanguage ja .ja
# AddCharset : 拡張子を文字コード指定に関連付ける
AddCharset shift_jis .sjis
</Directory>
ドキュメントルートに日本語のページ(lang.html.ja)と英語のページ(lang.html.en)を配置してアクセスする。
<!-- lang.html.ja -->
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>日本語のページ</title>
</head>
<body>
<p>日本語のコンテンツ</p>
<p>English Content</p>
</body>
</html>
<!-- lang.html.en -->
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>English Page</title>
</head>
<body>
<p>日本語のコンテンツ</p>
<p>English Content</p>
</body>
</html>
HTTPリクエストヘッダで優先順位が決まらない、または、指定が無い場合は、LanguagePriority
、AddDefaultCharset
の設定を参照すること。
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
AddDefaultCharset off
BASIC認証
ユーザ登録
# htpasswd -c <パスワードファイルのパス> <ユーザ名> htpasswd -c Password.txt test-user
ユーザ単位の設定
# httpd.confファイル
<Directory "/srv/www/htdocs">
# AuthType : ユーザ認証の種類を指定
# AuthName : 認証ダイアログに表示されるメッセージを指定
# AuthUserFile : ユーザ名とパスワードが保存されたファイルを指定
# Require : 認証してアクセスできるユーザを指定
# valid-userを指定する場合、BASIC認証した全てのユーザがアクセスが許可される
AuthType Basic
AuthName "Password for example.com"
AuthUserFile /srv/www/conf/password.txt
Require valid-user
</Directory>
Apacheを再起動する。
sudo systemctl restart apache または sudo systemctl restart httpd
グループ単位の設定
グループ設定ファイルを作成して、グループを登録する。
vi <グループ設定ファイル>
# <グループ名>:<ユーザ名> <ユーザ名 1> <ユーザ名 2> <ユーザ名 3> ...略 example1 : test-user1 test-user2 example2 : test-user1 test-user3
# httpd.confファイル
<Directory "/srv/www/htdocs">
# AuthType : ユーザ認証の種類を指定
# AuthName : 認証ダイアログに表示されるメッセージを指定
# AuthUserFile : 上記で作成したグループ設定ファイルのパスを指定
# Require group : アクセス認証可能なグループ名を指定
AuthType Basic
AuthName "Password for example.com"
AuthUserFile /srv/www/conf/password.txt
AuthUserFile /srv/www/conf/groupauth.txt
Require group example2 # example2グループを認証する
</Directory>
アクセス制限と認証の組み合わせ
# httpd.confファイル
<Directory "/srv/www/htdocs">
# アクセス制限
Order allow,deny
Allow from all
Deny from 192.168.0.10
# 認証
# AuthType : ユーザ認証の種類を指定
# AuthName : 認証ダイアログに表示されるメッセージを指定
# AuthUserFile : ユーザ設定ファイルまたはグループ設定ファイルのパスを指定
# Require group : アクセス認証可能なグループ名を指定
AuthType Basic
AuthName "Password for example.com"
AuthUserFile /srv/www/conf/password.txt
Require valid-user
# Satisfy : アクセス制限と認証の関係
# all - 両方の条件を満たした場合、許可する
# any - いずれかの条件を満たした場合、許可する
# 未指定の場合は、Satisfy all
Satisfy all
</Directory>
エラーメッセージの変更
# Payment Required : 料金の支払いを行うまで、リクエストが処理できない状態
ErrorDocument 402 http://www.example.com/subscription_info.html
# Forbidden : 閲覧権限が無いファイルやディレクトリ
ErrorDocument 403 /deny.html
# Not Found : Webページが見つからない場合
ErrorDocument 404 /missing.html
# Not Found : Webページが見つからない場合 (CGIを使用することも可能)
ErrorDocument 404 "/cgi-bin/missing_handler.pl"
# Internal Server Error : サーバ内で起きた何らかのエラー
ErrorDocument 500 "The server made a boo boo."
ロボットからのアクセスを制限
ロボットにより収集されたくないディレクトリおよびファイルを、robots.txtファイルで指定する。
また、robots.txtファイルは、DocumentRootディレクトリに作成する必要がある。
# robots.txtファイル User-agent: * Disallow : /hoge/ Disallow : /piyo/fuga/
データタイプの追加
MIMEタイプは、サーバ側で決めた後、HTTPレスポンスヘッダであるContentTypeに記述する。
MIMEタイプの例を以下に示す。
- テキスト
- text/plain
- CSV
- text/csv
- HTML
- text/html
- CSS
- text/css
- PHP
- application/x-httpd-php
- XML
- text/xml (ただし、ユーザから読めるものである場合 (RFC 3023, section 3))
- JSON
- application/json
- 画像
- image/gif
- image/bmp
- image/jpeg
- image/png
- image/tiff
- image/webp
- image/svg+xml
# httpd.confファイル
# ファイル名の拡張子をMIMEタイプに関連付ける
AddType application/epub+zip .epub
サーバの種類を隠す
HTTPレスポンスヘッダ、エラードキュメントのサーバ種類、バージョン情報が含まれている。
サーバのバージョン固有の脆弱性が発見された場合、攻撃対象を回避するためにこれらの情報を隠すことができる。
# httpd.confファイル
# ServerTokens : HTTPレスポンスヘッダのServerヘッダ情報の表示を設定する
ServerTokens Prod
# ServerSignature : エラードキュメントの末尾情報の表示 / 非表示を設定する
# On または Offを指定する
ServerSignature Off
ServerTokensの種類 | 例 |
---|---|
Prod | Apache |
Majar | Apache/2 |
Minor | Apache/2.2 |
Minimal | Apache/2.2.15 |
OS | Apache/2.2.15(CentOS) |
Full (デフォルト) |
Apache/2.2.15(CentOS)DAV/2 |