user icon

Dovecotのpostloginを使ってみる

Dovecotで認証直後にスクリプトを実行するpostloginが有ったので、それを設定してみます。
今回はDovecotからpostloginスクリプトに渡される環境変数を、ファイルとPostgreSQLへ書込んでみます。

Dovecot

まずはpostloginの有効化。
  • /etc/dovecot/conf.d/10-master.conf
service imap {
  executable = imap imap-postlogin
}
service imap-postlogin {
  executable = script-login /usr/local/bin/postlogin.sh
  # virtual_uidのownerにする
  user = vmb

  unix_listener imap-postlogin {
  }
}
最初は user = $default_internal_user としていて、何でファイルへの書込みが出来ないんだと暫く悩みました(スクリプト自体は実行可能)。Linuxユーザが存在しないんですね。
※デフォルトのrootでも良いんですが、今回はそこまでの権限は不要なのでvmbにしています。複数ユーザの混成等では、root権限が必要になるかも知れません。
更新後はdovecotをreloadします。

スクリプト

次はpostloginで実行するシェルスクリプトです。
  • /usr/local/bin/postlogin.sh
postlogin.sh内で別のphpファイルを実行可能ですので呼び出してみます。
#!/bin/bash
/usr/bin/php /usr/local/bin/postlogin.php
exec "$@"
exec “$@” を入れないと Error: Post-login script denied access to user のようなエラーが出てRoundCubeではログイン出来なくなります。暫くエラーがバンバン出てました。
  • /usr/local/bin/postlogin.php
#!/usr/bin/php
<?php
$str = print_r($_SERVER, 1);
// HOMEは/var/mail/vhosts/virtual.localdomain/aikawa のような、dovecotのhomeに
@file_put_contents($_SERVER["HOME"]."/php.log", $str, FILE_APPEND|LOCK_EX);

// PostgreSQLのlog_tbに環境変数を吐き出す
$con = @pg_connect("user=mail dbname=mail password=testpass");
if($con){
        $INSQL = array("server" => $str, "username"=> $_SERVER["USER"]);
        @pg_insert($con, "log_tb", $INSQL);
}else{
        shell_exec("logger -t imap-postlogin 'Failed to connect pgsql'");
}
ログを確認すると、PHP側にも環境変数は渡って来ている事が確認出来ました。
Array
(
    [AUTH_TOKEN] => ...
    [PWD] => /run/dovecot
    [HOME] => /var/mail/vhosts/virtual.localdomain/aikawa
    [LOCAL_IP] => ::1
    [QUOTA_RULE] => *:storage=100M
    [IP] => ::1
    [USER] => aikawa@virtual.localdomain
    [GID] => 5000
    [SHLVL] => 1
    [AUTH_MECH] => PLAIN
    [USERDB_KEYS] => HOME UID GID QUOTA_RULE AUTH_MECH AUTH_TOKEN
    [UID] => 5000
    [_] => /usr/bin/php
    [PHP_SELF] => /usr/local/bin/postlogin.php
    [SCRIPT_NAME] => /usr/local/bin/postlogin.php
    [SCRIPT_FILENAME] => /usr/local/bin/postlogin.php
    [PATH_TRANSLATED] => /usr/local/bin/postlogin.php
    [DOCUMENT_ROOT] =>
    [REQUEST_TIME_FLOAT] => 1673940553.5061
    [REQUEST_TIME] => 1673940553
    [argv] => Array
        (
            [0] => /usr/local/bin/postlogin.php
        )

    [argc] => 1
)
ログを取る以外にも、色々と用途は考えられます(ログイン時に何かする、というのが稀なのはともかく)。
  • PHPを呼び出せるのでcurlでWeb APIを叩くとか、割と本格的な事が出来そうです。
  • 環境変数の上書きでdovecotのHOMEを変更したり、vmbユーザ権限でフォルダを作ったりメールを移動させる等も出来るようです。
Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)