MailmanにLDAP認証と独自の認可をApacheのmod_rewriteをつかって設定する

(1) モチベーション
Mailmanを使ってメーリングリストを管理する
インフラとして認証基盤が存在する
特定の人だけ特定のメーリングリストをWebから管理できないか

(2) Mailmanの設定
Mailmanのリスト管理をパスワードなしにする
Mailmanはソースからインストール
mm_cfg.pyで

UnAuthorized = 3

(3) Apacheの設定
Apacheはバンドルされている2.2をつかう
/etc/httpd/conf/httpd.conf

RewriteEngine On
RewriteLock /tmp/map.lock
RewriteMap authz prg:/etc/httpd/conf.d/authz.pl
RewriteLog "/var/log/httpd/rewrite_log"
#RewriteLogLevel 9
Include conf.d/mailman.conf

認証基盤を使うので
ほんとはSSLのVirtualHostに書きたかったが
RewriteLockがserver configのみなので
http://httpd.apache.org/docs/2.2/ja/mod/mod_rewrite.html#rewritelock
server config自体をSSL化(^^;;
# server configに書いてもVirtualHostに
# 設定は引き継がれないので...
# よくわからず


/etc/httpd/conf.d/mailman.conf

ScriptAlias /mailman/ /usr/local/mailman/cgi-bin/
<Directory /usr/local/mailman/cgi-bin/>
    AuthName "Ninsho kiban"
    AuthType Basic
    AuthBasicProvider ldap
    AuthLDAPUrl ldaps://[LDAPSERVER]:636/ou=people,dc=example,dc=com?uid
    AuthLDAPBindDN 'cn=mailman,o=manager,dc=example,dc=com'
    AuthLDAPBindPassword 'secret'
    AuthzLDAPAuthoritative Off
    Require valid-user
    RewriteEngine On
    RewriteBase /mailman
    RewriteCond ${authz:%{REQUEST_URI}:%{REMOTE_USER}} ng
    RewriteRule ^(.*)$ - [F]
</Directory>

とりあえずBasic認証を通るユーザはvalid-userで全員通す
そのあとmod_rewriteを使って
authzの出力が"ng"だとすべて403を返す

Apacheが起動すると
/etc/httpd/conf.d/authz.pl
のプロセスが常駐する
この中で${REQUEST_URI}(つまりメーリングリスト名)を使う人が
${REMOTE_USER}で正しいか判断する
中身はこんな感じ

#! /usr/bin/perl

$| = 1;

while(<STDIN>){
chop;
my ($uri,$user)=split /:/;
my $flag = "0";
if($uri =~ /(特定のメーリングリスト名)/){
open AUTHZ, "/bin/cat /some/where/ml-authz.txt | /bin/grep ^${1} |";
# メーリングリスト名: ユーザ1 ユーザ2 ...
my @users = split /\s+/,<AUTHZ>;
foreach(@users){
    if($_ eq $user){ $flag = "1"; }
}
}
if($flag){ print "ok\n"; }else{ print "ng\n"; }