コンテンツにスキップ

認証と認可

Apacheのアクセス制御では、Basic認証の入口、資格情報を検証する認証プロバイダー、アクセスを許可する認可条件を分けて考える。


認証は、ユーザー名とパスワードなどを使って「誰であるか」を確認する処理である。認可は、確認されたユーザーに対象リソースへのアクセスを許可するか判断する処理である。

credentials
-> authentication
-> authenticated user
-> authorization
-> allow or deny

Apacheでは、AuthBasicProviderで認証プロバイダーを選び、Requireで認可条件を指定する。


mod_auth_basicは、HTTP Basic認証のchallengeと資格情報の受け取りを処理し、AuthBasicProviderで選ばれた認証プロバイダーへ検証を依頼する。モジュール一覧ではauth_basic_moduleと表示される。

未認証のクライアントへ401 UnauthorizedとWWW-Authenticateヘッダーを返すと、クライアントはユーザー名とパスワードをAuthorizationヘッダーに入れて再送する。

Basic認証の資格情報はBase64で表現されるだけであり、暗号化されない。クライアントとApacheの間はHTTPSで保護する。HTTPSの処理はHTTPSとTLSを参照する。


AuthTypeは、クライアントとの間で使うHTTP認証方式を選ぶ。

AuthType Basic

BasicはHTTP Basic認証を意味する。認証先がPAMかLDAPかはAuthTypeではなくAuthBasicProviderが決める。


AuthNameは認証領域の名前であり、Basic認証のrealmとしてクライアントへ通知される。

AuthName "Private Area"

ブラウザーはrealmを認証ダイアログに表示したり、同じ認証情報を再利用する範囲の識別に使ったりする。


AuthBasicProviderは、Basic認証で受け取ったユーザー名とパスワードをどの認証プロバイダーで検証するか指定する。

AuthBasicProvider PAM

PAMはmod_authnz_pamが提供するPAM認証プロバイダーである。

AuthBasicProvider ldap

ldapはmod_authnz_ldapが提供するLDAP認証プロバイダーである。LDAP固有の検索・BindはLDAP認証の仕組みを参照する。


Requireは認可条件を指定する。

Require valid-user

valid-userは、設定された認証プロバイダーで認証に成功したすべてのユーザーを許可する。認証プロバイダーの設定だけではアクセス許可条件は完成せず、Requireが最終的な認可判断を表す。

Requireの認可処理の中核はmod_authz_coreが提供し、valid-userとuserという認可プロバイダーはmod_authz_userが提供する。モジュール一覧ではそれぞれauthz_core_moduleとauthz_user_moduleと表示される。

Require all granted、Require local、設定セクションとの関係はVirtualHostと設定セクションを参照する。


flowchart LR
  C["Web client"] -->|"HTTPS request + Basic credentials"| A["Apache HTTP Server"]
  A -->|"PAM authenticate / account"| P["PAM service"]
  P -->|"Backend-specific authentication"| B["Configured PAM backend"]
  B -->|"Success or failure"| P
  P -->|"PAM result"| A
  A -->|"HTTP 200 or 401"| C

mod_authnz_pamはApacheとPAMの接続部分を担当する。PAMの先でローカル認証、SSSD、LDAPなどのどの認証先を使うかは、PAMサービスの設定で決まる。

AuthPAMServiceは、Apacheが呼び出すPAMサービス名を指定する。

AuthPAMService apache2

この指定では、PAMは/etc/pam.d/apache2に定義されたスタックを使用する。

Debianの共通PAMスタックを使う場合、@include common-authはユーザーの認証処理、@include common-accountはアカウントの有効期限や利用可否の確認を呼び出す。共通スタックがローカルユーザー、LDAP、SSSDなどのどの認証先を使うかは、DebianのPAM設定によって決まる。

Basic認証プロバイダーとしてmod_authnz_pamを使う場合は、PAMのauthとaccountの両処理が実行される。authは資格情報を検証し、accountは期限切れやアクセス制限などを確認する。

同じPAMサービスをRequire pam-account apache2でも指定すると、account処理が二重に実行される。Basic認証でPAMを使い、認証成功者を許可する構成ではRequire valid-userを使う。

PAMの処理グループはNSSとPAMによるLinuxログインを参照する。

PAMへ接続する別の方法として、mod_authnz_externalから外部プログラムのpwauthを実行する構成がある。この場合はApacheがpwauthへユーザー名とパスワードを渡し、pwauthがPAMを呼び出す。

Debianのpwauthパッケージは/etc/pam.d/pwauthを提供する。mod_authnz_pamがPAMを直接呼び出す構成とは、ApacheとPAMの間の接続方法と使用するPAMサービス名が異なる。


flowchart LR
  C["Web client"] -->|"HTTPS request + Basic credentials"| A["Apache HTTP Server"]
  A -->|"LDAP search"| L["LDAP server"]
  L -->|"Unique user DN"| A
  A -->|"LDAP user bind"| L
  L -->|"Bind success or failure"| A
  A -->|"HTTP 200 or 401"| C

LDAP認証では、Apacheがユーザー名を検索し、見つかったユーザーDNと入力されたパスワードでBindする。検索条件、TLS、検索用アカウントなどはLDAP認証の仕組みで説明する。


静的コンテンツを保護する場合は、ファイルシステム上の対象を<Directory>で指定する。URL空間を対象にする場合は<Location>を使う。

両者の違いと設定の統合はVirtualHostと設定セクションを参照する。