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ユーザ権限でフォルダを作ったりメールを移動させる等も出来るようです。
この投稿は 2023年1月17日 火曜日 16:49 に 未分類 カテゴリーに公開されました。 この投稿へのコメントは RSS 2.0 フィードで購読することができます。
このページの一番下でコメントを残すことができます。トラックバック / ピンバックは現在受け付けていません。