Apache - アクセス制御

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要



ディレクトリ単位のアクセス制御

 <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リクエストヘッダで優先順位が決まらない、または、指定が無い場合は、LanguagePriorityAddDefaultCharsetの設定を参照すること。

 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の設定
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