ApacheのPAM認証連携(Red Hat Linux)

最終更新日:2006年09月14日

はじめに

概要

Apacheの認証に PAM(Portable Authentition Module) を使用する事により、OSのパスワードファイル(passwd, shadow)だけでなく、NIS(Network Information Service)やSMB(Server Message Block)などの様々な認証と連携可能になる。

※ 但し、パスワード漏洩によるシステムへの影響も増大するので、使用方法には十分な注意が必要!

構築した環境

名称 バージョン 備考
Red Hat Linux 9
Apache 2.0.40 2005.08.18時点での最新版。
Mod_Auth_External 2.2.9 2005.08.18時点での最新版。
pwauth 2.2.8 2005.08.18時点での最新版。

PAM連携環境構築

Mod_Auth_External のインストール

DSO(Dynamic Shared Objects)モジュールを作成する。
$ tar zxf mod_auth_external-2.2.9.tar.gz
$ cd mod_auth_external-2.2.9
$ /usr/sbin/apxs -c mod_auth_external.c
# /usr/sbin/apxs -i -a mod_auth_external.la
以上で、コンパイルしたDSOモジュールのコピーと /etc/httpd/conf/httpd.conf の書き換えが完了する。
httpd.conf には以下のディレクティブが自動的に追加される。
LoadModule external_auth_module /usr/lib/httpd/modules/mod_auth_external.so
※ 自動的に追加される上記ディレクティブは、最後に出現する LoadModule ディレクティブの次行に追加されるので、環境によっては関係の無い <IfModule> セクションディレクティブの中に追加されてしまう場合がある。必要に応じて書き換えが必要。

pwauth のインストール

ソースを展開してディレクトリ移動
$ tar zxf pwauth-2.2.8.tar.gz
$ cd pwauth-2.2.8

config.hを編集
$ diff config.h config.h.orig
96c96
< /* #define SHADOW_SUN         /**/
---
> #define SHADOW_SUN            /**/
100c100
< #define PAM                   /**/
---
> /* #define PAM                        /**/
148c148
< #define SERVER_UIDS 48                /* user "apache" */
---
> #define SERVER_UIDS 99                /* user "nobody" */

Makefileを編集
$ diff Makefile Makefile.orig
10c10
< #LIB= -lcrypt
---
> LIB= -lcrypt
14c14
< LIB=-lpam -ldl
---
> # LIB=-lpam -ldl

コンパイル&インストール
$ make
# mkdir -p /usr/local/libexec/
# cp pwauth /usr/local/libexec/
# chmod u+s /usr/local/libexec/pwauth
# ls -l /usr/local/libexec/pwauth
-rwsr-xr-x    1 root     root        34400  8月 14 13:41 /usr/local/libexec/pwauth

/etc/httpd/conf/httpd.conf に以下を追加
AddExternalAuth pwauth /usr/local/libexec/pwauth
SetExternalAuthMethod pwauth pipe

PAMの設定

以下の /etc/pam.d/pwauth を新規作成
#%PAM-1.0
auth       required   pam_stack.so service=system-auth
auth       required   pam_nologin.so
account    required   pam_stack.so service=system-auth

httpdの再起動

httpd.conf の設定確認後、httpdの再起動を行う。
# /etc/init.d/httpd configtest
# /etc/init.d/httpd restart

認証の設定例

httpd.conf 又は .htaccess に認証の設定を行う。

PAM経由で認証可能な全ユーザを許可
AuthExternal pwauth                     ← pwauthで認証を行う
AuthName "Restricted Access Area"       ← 認証のメッセージ
AuthType Basic                          ← Basic認証を使用
require valid-user                      ← 認証を通過した全ユーザを許可

内部ネットからのアクセスには認証を行わないが、外部ネットからのアクセスには認証を行う
satisfy any                                   ← 何れかの条件を満たせば許可

order deny,allow
deny from all
allow from 172.16.0.0/16 .your.domain.name    ← 内部ネットを許可

AuthExternal pwauth
AuthName "Restricted Access Area"
AuthType Basic
require valid-user                            ← 認証を通過した全ユーザを許可

※ 認証設定の詳細は、『core - Apache HTTP サーバ』参照

グループ認証の設定


pwauth に付属している unixgroup(perlプログラム)でグループによるアクセス制限が実現できる。

unixgroup の環境設定

unixgroup を適当なディレクトリにコピー
# cp unixgroup /usr/local/libexec/
# ls -l /usr/local/libexec/unixgroup
-rwxr-xr-x    1 root     root         1858  8月  14 13:57 /usr/local/libexec/unixgroup

httpd.conf に以下を追加
AddExternalGroup unixgroup /usr/local/libexec/unixgroup
SetExternalGroupMethod unixgroup environment

httpdの再起動

httpd.conf の設定確認後、httpdの再起動を行う。
# /etc/init.d/httpd configtest
# /etc/init.d/httpd restart

グループ認証の記述例

httpd.conf 又は .htaccess に認証の設定を行う。

"staff"および"admin"グループにアクセスを許可
AuthExternal pwauth
GroupExternal unixgroup              ← グループ認証に unixgroup を使用
AuthName "Restricted Access Area"
AuthType Basic
require group staff admin            ← "staff"と"admin"グループを許可

PAMによるアクセス制限方法


pam_listfile.so モジュールを使用する事により、PAMでのアクセス制限が可能になる。

特定のグループのみ許可する場合の設定例

/etc/pam.d/pwauth の内容
#%PAM-1.0
auth       required     pam_listfile.so item=group sense=allow file=/etc/pwauth.allow-group onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
account    required     pam_stack.so service=system-auth
/etc/pwauth.allow-group には、許可するグループ名を1行ずつ記述する。
admin, staff グループのみを許可する場合
admin
staff

特定のユーザを拒否する場合の設定例

/etc/pam.d/pwauth の内容
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/pwauth.deny-user onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
account    required     pam_stack.so service=system-auth
/etc/pwauth.deny-user には、拒否するユーザ名を1行ずつ記述する。
root, bin, nobody ユーザを拒否する場合
root
bin
nobody

コマンドラインでのアクセス制限確認方法


Basic認証をコマンドラインで確認する方法を説明する。

Basic認証について

Basic認証はIDとパスワードをコロン(:)で繋げてBASE64でエンコードしているだけである。つまり、暗号化はされていないので、盗聴されるとIDとパスワードは容易にばれてしまう。
IDとパスワードの漏洩を避けるためには、https(SSL/TLS)通信を使用すべきである。

例えば
ID = guest
PW = password
の場合、IDとPWをコロン(:)で繋げると
guest:password
となり、これをBASE64でエンコードして
Z3Vlc3Q6cGFzc3dvcmQ=
となる。
この値がhttpヘッダで
Authorization: Basic Z3Vlc3Q6cGFzc3dvcmQ=
としてWebサーバに渡されて認証が行われる。

コマンドラインでのアクセスとレスポンス例

localhostのWebサーバにアクセス
$ telnet localhost 80                 ← localhost の Webサーバ(port:80/tcp)に接続
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.0                       ← Webサーバへの要求を入力
                                      ← 空行を入力(入力終了)
HTTP/1.1 200 OK                       ← ここから下がWebサーバからのレスポンス
Date: Thu, 18 Aug 2005 12:27:56 GMT
Server: Apache
Last-Modified: Fri, 05 Aug 2005 05:20:02 GMT
ETag: "cd743-64-d98a4480"
Accept-Ranges: bytes
Content-Length: 100
Connection: close
Content-Type: text/html; charset=ISO-8859-1

Connection closed by foreign host.
$ 

認証が必要なページへのアクセス例

$ telnet localhost 80                  ← localhost の Webサーバ(port:80/tcp)に接続
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD /auth/ HTTP/1.0                   ← Webサーバへの要求を入力
                                       ← 空行を入力(入力終了)
HTTP/1.1 401 Authorization Required    ← 認証が要求されている
Date: Thu, 18 Aug 2005 12:37:13 GMT
Server: Apache
WWW-Authenticate: Basic realm="Restricted Access Area"
Vary: accept-language
Accept-Ranges: bytes
Connection: close
Content-Type: text/html; charset=ISO-8859-1
Expires: Thu, 18 Aug 2005 02:37:13 GMT

Connection closed by foreign host.
$ 

認証が成功した場合の例

$ telnet localhost 80                        ← localhost の Webサーバ(port:80/tcp)に接続
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.0                              ← Webサーバへの要求を入力
Authorization: Basic Z3Vlc3Q6cGFzc3dvcmQ=    ← 認証情報を入力
                                             ← 空行を入力(入力終了)
HTTP/1.1 200 OK                              ← 認証が成功している
Date: Thu, 18 Aug 2005 12:40:57 GMT
Server: Apache
Last-Modified: Fri, 05 Aug 2005 06:32:24 GMT
ETag: "415b-6b-dc57ee00"
Accept-Ranges: bytes
Content-Length: 107
Connection: close
Content-Type: text/html; charset=ISO-8859-1

Connection closed by foreign host.
$