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"; }