はじめまして。
メールサーバーにて送信者によるメール送信制限というものは可能なのでしょうか?
具体的に申しますと、
送信者:aaa@bbb.comの人は、bbb@zzz.com,ccc@fff.co.jp宛にしか送信をできなくするようなことは可能なのでしょうか?
情報漏えい等の問題に対処するため、各fromアドレスにて送信先を限定させるようにしたいのです。
もし、可能かどうかご存知の方がいらっしゃいましたら、よろしくお願いいたします。
なお、SMTPサーバーにはqmailもしくはPostfixを考えています。
実際の運用はMs ExchangeサーバーからSmarthostにてqmail,Postfixなどのメールサーバーに転送し、そこで制限をかけたいと思っています。
どうぞ、よろしくお願いいたします。
すみません。編集途中に誤ってEnterキーを押してしまい、中途半端なまま投稿されてしまいました。
正しくは、「送信者ごとに受信者を制限してのメール送信」です。
Postfixなら可能かと思い、いろいろ調べてみましたところ、
smtpd_recipient_restrictions
permit_auth_destination
などを用いれば実現可能のような気がしますが、よくわかりません。
苦肉の策?として、main.cfを下記のように設定してみました。
MS Exchange ServerからのすべてのメールをPostfixに中継し、すべてのメールをtemp@mail2.hoge.comに転送するようにしました。
smtpd_client_restrictions =
check_client_access hash:/usr/local/etc/postfix/reject_client
[reject_client]
192.168.0.100 REDIRECT temp@mail2.hoge.com
そして、.fowardにてtemp@mail2.hoge.com宛てのメールをPHPプログラムに転送し、ヘッダーを解析し、MySQLに登録されてある情報に従って、再配送するというものです。
この方法であれば、誰がどこにどのようなメールを送信したのかログも残せるので、なかなか良いなと思いました。
最初はうまく動作しているように思いましたのですが、この方法ではBCCアドレスに配信できないことが判明しました。
そうです。BCCメールにはToヘッダが存在しません。
仕方なく、この方法をあきらめようと思います。
Postfixの標準機能でこのような制限は可能なのでしょうか?
また、他のメールサーバーでも構いませんので情報をお待ちしております。
> Postfixなら可能かと思い、いろいろ調べてみましたところ、
> smtpd_recipient_restrictions
> permit_auth_destination
> などを用いれば実現可能のような気がしますが、よくわかりません。
>
> 苦肉の策?として、main.cfを下記のように設定してみました。
>
> MS Exchange ServerからのすべてのメールをPostfixに中継し、すべてのメールをtemp@mail2.hoge.comに転送するようにしました。
> smtpd_client_restrictions =
> check_client_access hash:/usr/local/etc/postfix/reject_client
>
> [reject_client]
> 192.168.0.100 REDIRECT temp@mail2.hoge.com
>
> そして、.fowardにてtemp@mail2.hoge.com宛てのメールをPHPプログラムに転送し、ヘッダーを解析し、MySQLに登録されてある情報に従って、再配送するというものです。
> この方法であれば、誰がどこにどのようなメールを送信したのかログも残せるので、なかなか良いなと思いました。
> 最初はうまく動作しているように思いましたのですが、この方法ではBCCアドレスに配信できないことが判明しました。
> そうです。BCCメールにはToヘッダが存在しません。
> 仕方なく、この方法をあきらめようと思います。
Delivered-To: では?だめですか?
> Postfixの標準機能でこのような制限は可能なのでしょうか?
> また、他のメールサーバーでも構いませんので情報をお待ちしております。
標準機能では無理と思います。
なお、転送についてはフィルタ機能を使ってコントロールされたらどうですか?
フィルタの例は、おやじの例で言えばAntiVirを通したり、spamassassinでSPAM除去をしているのと同じ原理です。フィルタにまわす方法は下記にあります。
http://www.kobitosan.net/postfix/trans-2.1/jhtml/FILTER_README.html
・AntiVirでの例
http://www.aconus.com/~oyaji/suse/antivir_suse.htm
・Spamassassinでの例
http://www.aconus.com/~oyaji/suse9.2/smtp-mysql-spamassassin-suse.htm
おやじさん。アドバイスありがとうございます。
> > そうです。BCCメールにはToヘッダが存在しません。
> > 仕方なく、この方法をあきらめようと思います。
> Delivered-To: では?だめですか?
上記のような転送方法では、
Delivered-To: temp@mail2.hoge.comとなってしまい元の送信先がわかりません。
> > Postfixの標準機能でこのような制限は可能なのでしょうか?
> > また、他のメールサーバーでも構いませんので情報をお待ちしております。
>
> 標準機能では無理と思います。
やはりそうですか。Postfixに関するいろいろなサイトを閲覧してみたのですが、このような事例が載っていません。(必要がないのかもしれませんが...。)
私がもしかしたら可能かも?と思ったのは下記のサイトの「サイト外にメールを送信できるユーザを制限したい」という段落の中で「一つにはどのユーザがどこにメールを送ることができるかを定義し...」という文言を見つけたからです。
http://www.kobitosan.net/postfix/jhtml/faq.html#relay_restrict
> なお、転送についてはフィルタ機能を使ってコントロールされたらどうですか?
> フィルタの例は、おやじの例で言えばAntiVirを通したり、spamassassinでSPAM除去をしているのと同じ原理です。フィルタにまわす方法は下記にあります。
>
> http://www.kobitosan.net/postfix/trans-2.1/jhtml/FILTER_README.html
>
> ・AntiVirでの例
> http://www.aconus.com/~oyaji/suse/antivir_suse.htm
> ・Spamassassinでの例
> http://www.aconus.com/~oyaji/suse9.2/smtp-mysql-spamassassin-suse.htm
早速調べてみます。
どうもありがとうございました。
結果を報告させていただきたいと思います。
早速コンテンツフィルタを試してみました。
設定は下記のとおりです。(FreeBSD5.3.0)
まず、/usr/local/etc/postfix/master.cfを下記のように編集
--ここから---------------------------------------------------------------------------
smtp inet n - n - - smtpd
-o content_filter=filter:dummy
filter unix - n n - 10 pipe
flags=Rq user=filter argv=/usr/home/filter/filter_test -f ${sender} -- ${recipient}
--ここまで---------------------------------------------------------------------------
そして、/usr/home/filter/filter_testという名前のシェルスクリプトを作成。
---ここから--------------------------------------------------------------------------
#!/bin/sh
# Simple shell-based filter. It is meant to be invoked as follows:
# /path/to/script -f sender recipients...
# Localize these.
INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -i"
# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15
# Start processing.
cd $INSPECT_DIR || {
echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
cat >in.$$ || {
echo Cannot save mail to file; exit $EX_TEMPFAIL; }
# Specify your content filter here.
/usr/home/filter/filter.php <in.$$ || {
echo Message content rejected; exit $EX_UNAVAILABLE; }
#$SENDMAIL "$@" <in.$$
exit $?
--ここまで-----------------------------------------------------------------------------
PHPスクリプト/usr/home/filter/filter.phpを作成
--ここから-----------------------------------------------------------------------------
#!/usr/local/bin/php -q
<?php
main();
/* Main */
function main(){
//メールを標準入力から読み込み
$j = 0;
$stdin = fopen ('php://stdin' , 'r');
while (!feof ($stdin)){
//一行ずつ配列に格納
$buf_ary[$j] = fgets($stdin, 4096);
$j++;
}
fclose ($stdin);//Get Mail
//メールをテキストに保存
$fp = fopen("/home/filter/mail.txt", "a");
foreach($buf_ary as $val){
fwrite($fp,$val);
}
fclose($fp);
}
?>
--ここまで-------------------------------------------------------------------------------
BCCアドレスを判別するという課題がありますので、自作フィルタプログラムで送信したメールをテキストに保存してみました。
この例ではToに"Hoge" <to-user@hoge.com>を指定し、Bccにbcc-user@sample.comを指定しました。
下記は保存されたテキストファイルですが、やはり、bcc-user@sample.comに送るメールかどうかの判別がつきません。
やはり、ユーザーごとに送信先の制限を行うのは無理なのでしょうか?とほほ...。
--ここから-------------------------------------------------------------------------------
Return-Path: <test1@mail2.sample.com>
Received: from w166 (w166 [192.168.0.235])
by mail2.sample.com (Postfix) with SMTP id B0E516175;
Mon, 19 Sep 2005 15:56:49 -0500 (CDT)
Message-ID: <00a401c5bd5c$f1aa06e0$eb00a8c0@sample.com>
From: "Test" <test1@mail2.sample.com>
To: "Hoge" <to-user@hoge.com>
Subject: Test
Date: Mon, 19 Sep 2005 15:58:50 -0500
MIME-Version: 1.0
Content-Type: text/plain;
format=flowed;
charset="iso-8859-1";
reply-type=original
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2900.2180
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
Test Mail
--ここまで-------------------------------------------------------------------------------
ちなみに、おやじさんの下記ののページに
[Postfixの設定]
Postfixにフィルタ処理をさせるため、/etc/postfix/main.cf に設定を行います。
と書かれていますが、正しくは/etc/postfix/master.cfではないでしょうか?
もし、main.cfでも構わないんだったらごめんなさい。
http://www.aconus.com/~oyaji/suse9.2/smtp-mysql-spamassassin-suse.htm
以上、他になにか気がついた点等ございましたら、アドバイスをよろしくお願いいたします。
>
> そして、/usr/home/filter/filter_testという名前のシェルスクリプトを作成。
上記のスクリプトの引数を取得することによってBCCを含むすべての送信先アドレスが取得できました。
当たり前のようなことですが、うっかり引数の存在を見落としていました。
これで何とかなりそうです。アドバイスありがとうございました。感謝します。
> > そして、/usr/home/filter/filter_testという名前のシェルスクリプトを作成。
> 上記のスクリプトの引数を取得することによってBCCを含むすべての送信先アドレスが取得できました。
> 当たり前のようなことですが、うっかり引数の存在を見落としていました。
> これで何とかなりそうです。アドバイスありがとうございました。感謝します。
この件では、おやじの頭の中が整理でき、逆にありがとうございました。
BCCメールは、filterにくる時点では既に別々のメールで来るものと思っていましたので、「Delivered-To: では?だめですか?」と思ったのですが、SMTPで最終段階で分けているんですね。また、BCCはメールヘッダから削除されエンベロープを見なければわからないということを知りました。filterにはメールヘッダ以下しか来ておらず、エンベロープは引数で渡されているのも見れば当たり前のことを意識してませんでした。
ご指摘いただいたHPは誤っていますので修正しておきました。この手のミスがh上に多くお恥ずかしいです。
何はともあれ、あちこちで聞かれていたようですが解決の目処がたってよかったですね。