Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Q. Postfixで任意のユーザー宛のメ ールを拒否したい

1,381 views
Skip to first unread message

Kazuya Yamamoto

unread,
Oct 4, 2003, 3:42:32 AM10/4/03
to
Postfix を用いてバーチャルドメインを使用しています。

$mydomain は example.tld1 、
$myhostname は host.example.tld1 、
その他にも example.tld2 や example.tld3 を、
$virtual_maps で設定し(hash)、特定のユーザーに振り分けています。

host.example.tld1 には user1 や user2 と言うユーザーがいます。
user1 は $virtual_maps で設定した以下のメールアドレス宛のみを受信し、
us...@host.example.tld1 と
us...@example.tld1 宛に来たメールは拒否したい。
(現在は、設定内容どおり全て受信される状態です)
user2 は us...@host.example.tld1 と us...@example.tld1 も受信し、
$virtual_maps で設定した以下のメールアドレスも受信したい。

f...@example.tld2 user1
us...@example.tld3 user1
f...@example.tld3 user1

b...@example.tld2 user2
b...@example.tld3 user2

力量不足で、
これらの要望を満たす設定方法を調べる事が出来ません。お手上げです。
「ファイル××の●●と▲▲を設定しろ」と言った
ヒント的なものでも構いませんので、
ご存知の方がおられましたお教えください。

以下に /usr/sbin/postconf -n の結果を示します。

alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
header_checks = regexp:/etc/postfix/header_checks_list
inet_interfaces = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, $mydomain
mydomain = example.tld1
myhostname = host.example.tld1
mynetworks = 192.168.0.0/24, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-1.1.12/README_FILES
relay_domains = $mydestination,example.tld2,example.tld3
sample_directory = /usr/share/doc/postfix-1.1.12/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
transport_maps = hash:/etc/postfix/transport
virtual_maps = hash:/etc/postfix/virtual

よろしくお願いします。


-- K.Yamamoto

Shinji KONO

unread,
Oct 4, 2003, 5:15:27 AM10/4/03
to
河野真治 @ 琉球大学情報工学です。

In article <blltlr$9bj$1...@caraway.media.kyoto-u.ac.jp>, "Kazuya Yamamoto" <nos...@excite.co.jp> writes


> user1 は $virtual_maps で設定した以下のメールアドレス宛のみを受信し、
> us...@host.example.tld1 と
> us...@example.tld1 宛に来たメールは拒否したい。

こういうuser1宛のメールの内容による分類は、一旦、user1で受け
取って処理するのが良いと思います。そうしないと、postfix の
設定が個人の設定で一杯になっちゃうから。

postfixが使う procmail か user1 の.forward内にprocmailを書いて
分類すると思う。

そうしないと、postfix がversion upしたときにひどい目に
あうと思う。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球大学工学部情報工学科,

Kazuya Yamamoto

unread,
Oct 5, 2003, 4:00:41 AM10/5/03
to
元記事 news:blltlr$9bj$1...@caraway.media.kyoto-u.ac.jp を送信した後、
$header_checks で
/for <user1@example\.tld1>;/ REJECT と言う案を思いつき、
弾くことが出来ました。しかし、なんかスマートでは無い気がします。
受信中に弾くのでは無く、
受信後(?)に送信元に対し MAILER-DAEMON から
何らかのメッセージ( unknown user: "user1" 等)を返したいのです。
何か良い方法ありますでしょうか?

# 知人への奉仕なので、現状で良いって言えば良いんですが…。


-- K.Yamamoto

Kawaguti Ginga

unread,
Oct 5, 2003, 11:09:48 AM10/5/03
to
川口です

<bloj4e$p2$1...@caraway.media.kyoto-u.ac.jp>の記事において
nos...@excite.co.jpさんは書きました。


> 元記事 news:blltlr$9bj$1...@caraway.media.kyoto-u.ac.jp を送信した後、
> $header_checks で
> /for <user1@example\.tld1>;/ REJECT と言う案を思いつき、
> 弾くことが出来ました。しかし、なんかスマートでは無い気がします。

目的が良く分からないのでなんとも,ではありますが,

> 受信中に弾くのでは無く、
> 受信後(?)に送信元に対し MAILER-DAEMON から
> 何らかのメッセージ( unknown user: "user1" 等)を返したいのです。
> 何か良い方法ありますでしょうか?

これは最近は基本的には迷惑な話になりえます.
可能な限り受信中の SMTP セッションの中で
550 などで突っ返すようにしてください.
でないと,"エラーメール攻撃" の生成元になってしまいます.
(まともなメールであったなら,その時点で失敗したことの通知はちゃんと返りますし)
--
∧∧
Zzz.. (- - )⌒⌒⊇~ 川口 銀河
############## ginga-fj-s...@ginganet.org

Kazuya Yamamoto

unread,
Oct 5, 2003, 12:37:53 PM10/5/03
to
フォローアップありがとうございます。

> 目的が良く分からないのでなんとも,ではありますが,

目的は、タダ単に仕事で使ってるドメインと、
プライベートで使ってるドメインがありまして、
知人がプライベートで用いている方の
メールアカウントが欲しいというのであげようと思っていたのですが、
知人にあげたアカウントで
仕事用の $mydestination なメールアドレスに
到達されたら困るので悩んでおりました。

> これは最近は基本的には迷惑な話になりえます.
> 可能な限り受信中の SMTP セッションの中で
> 550 などで突っ返すようにしてください.
> でないと,"エラーメール攻撃" の生成元になってしまいます.
> (まともなメールであったなら,その時点で失敗したことの通知はちゃんと返りますし)

なるほど。では、現状のままがベストっぽいですね。

ありがとうございました。

-- K.Yamamoto

Kazuya Yamamoto

unread,
Oct 5, 2003, 12:47:43 PM10/5/03
to
フォローアップありがとうございます。

> 目的が良く分からないのでなんとも,ではありますが,

目的は、タダ単に仕事で使ってるドメインと、
プライベートで使ってるドメインがありまして、
知人がプライベートで用いているドメインの


メールアカウントが欲しいというのであげようと思っていたのですが、
知人にあげたアカウントで
仕事用の $mydestination なメールアドレスに
到達されたら困るので悩んでおりました。

> これは最近は基本的には迷惑な話になりえます.


> 可能な限り受信中の SMTP セッションの中で
> 550 などで突っ返すようにしてください.
> でないと,"エラーメール攻撃" の生成元になってしまいます.
> (まともなメールであったなら,その時点で失敗したことの通知はちゃんと返りますし)

なるほど。では、現状のままがベストっぽいですね。
ご助言ありがとうございました。

ところで、1つ疑問が生まれてしまったのですが、
これらは、本当に存在しないユーザー宛等の場合も、
そのようにしたほうが良いと言う事でしょうか?
川口さんの仰られる「エラーメール攻撃」対策と言う観点では、
全てそのようにするのが望ましいと思いますが。

-- K.Yamamoto

IWAMOTO, Kouichi

unread,
Oct 5, 2003, 1:03:23 PM10/5/03
to

岩本といいます。

<bloj4e$p2$1...@caraway.media.kyoto-u.ac.jp>の記事において
nos...@excite.co.jpさんは書きました。

>元記事 news:blltlr$9bj$1...@caraway.media.kyoto-u.ac.jp を送信した後、
>$header_checks で
>/for <user1@example\.tld1>;/ REJECT と言う案を思いつき、
>弾くことが出来ました。しかし、なんかスマートでは無い気がします。

これだと、途中経路のMTAがReceived:ヘッダに for <us...@example.tld1>; を
つけなかった場合、弾けないですよね。
他にも、Received:ヘッダ以外に for <us...@example.tld1>; が含まれていても
弾いてしまうという問題があります。
# 実用上は問題ないでしょうけれど

header_checks でやるよりは、smtpd_recipient_restrictions でやる方が
確実ではないでしょうか。

main.cf:
smtpd_recipient_restrictions =
check_recipient_access hash:/etc/postfix/reject_address,
permit_mynetworks,
reject_unauth_destination

/etc/postfix/reject_address:
us...@example.tld1 550 Unknown User

# postmapの実行を忘れずに

>受信中に弾くのでは無く、
>受信後(?)に送信元に対し MAILER-DAEMON から
>何らかのメッセージ( unknown user: "user1" 等)を返したいのです。

受信中(SMTPセッション中)に 550 で弾くのが一般的だと思います。
Postfix 1.1 では、デフォルトでは local_recipient_maps が設定されないので
受信後にバウンスメッセージを生成していましたが、Postfix 2.0 以降では
デフォルトで local_recipient_maps が設定されているので、存在しないユーザ
へのメールは、SMTPセッション中に 550 で弾きます。

--
いわもと こういち(do...@cds.ne.jp)
# なるようになれ、明日もイケイケ♪

Kazuya Yamamoto

unread,
Oct 5, 2003, 10:22:36 PM10/5/03
to
フォローアップありがとうございます。

> これだと、途中経路のMTAがReceived:ヘッダに for <us...@example.tld1>; を
> つけなかった場合、弾けないですよね。
> 他にも、Received:ヘッダ以外に for <us...@example.tld1>; が含まれていても
> 弾いてしまうという問題があります。
> # 実用上は問題ないでしょうけれど

はい、ダメでした。実用上も問題ありでした。 (^^;)
実用上の問題とは、
CC や BCC で送信されて来た場合、
Received に該当文字列は含まれていませんでした。

> header_checks でやるよりは、smtpd_recipient_restrictions でやる方が
> 確実ではないでしょうか。
>
> main.cf:
> smtpd_recipient_restrictions =
> check_recipient_access hash:/etc/postfix/reject_address,
> permit_mynetworks,
> reject_unauth_destination
>
> /etc/postfix/reject_address:
> us...@example.tld1 550 Unknown User

ありがとうございます。期待通りの処理を行ってくれました。

> 受信中(SMTPセッション中)に 550 で弾くのが一般的だと思います。

なるほど。
news:blpi0a$i94$1...@caraway.media.kyoto-u.ac.jp に記した疑問は
解決しました。ありがとうございます。

> Postfix 1.1 では、デフォルトでは local_recipient_maps が設定されないので
> 受信後にバウンスメッセージを生成していましたが、Postfix 2.0 以降では
> デフォルトで local_recipient_maps が設定されているので、存在しないユーザ
> へのメールは、SMTPセッション中に 550 で弾きます。

そうだったんですか、色々お教えいただきありがとうございます。
この教えを基に、以下2通りの設定を試みました。

local_recipient_maps = unix:passwd.byname $alias_maps
local_recipient_maps = $alias_maps unix:passwd.byname

上記の何れの設定も以下のような結果になりました。

・$alias_maps や $virtual_maps に記述された
ユーザーやアドレス宛のメールは正常に受信する

・上記以外は /etc/passwd にユーザーが存在しても
Unknown User となってしまう
( check_recipient_access でマッチしないものもです)

また壁に当たってしまいました。(汗)

-- K.Yamamoto

IWAMOTO, Kouichi

unread,
Oct 6, 2003, 3:10:39 AM10/6/03
to

岩本といいます。

<blqjm0$5s3$1...@caraway.media.kyoto-u.ac.jp>の記事において
nos...@excite.co.jpさんは書きました。

>この教えを基に、以下2通りの設定を試みました。
>
> local_recipient_maps = unix:passwd.byname $alias_maps
> local_recipient_maps = $alias_maps unix:passwd.byname
>
>上記の何れの設定も以下のような結果になりました。
>
> ・$alias_maps や $virtual_maps に記述された
> ユーザーやアドレス宛のメールは正常に受信する
>
> ・上記以外は /etc/passwd にユーザーが存在しても
> Unknown User となってしまう
> ( check_recipient_access でマッチしないものもです)

おそらく smtpd が chroot するように設定されていないでしょうか。

master.cf の中に、以下のような行があると思います。

# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - n - - smtpd

chrootの所が - になっていると $queue_directory に chroot します。
そのため、$queue_directory の外にある /etc/passwd が読めないのだと思います。

対策としては

・/var/spool/postfix/etc を作り、その中に /etc/passwd をコピーする
・smtpd が chroot しないように設定する
・local_recipient_maps を設定しない(空にする)

などがあると思います。

通常は最初の /var/spool/postfix/etc/passwd を作る方法を取ると思いますが、
ユーザの追加,削除等を行った時に忘れずにコピーする必要があります。
# 自宅では、smtpd が chroot しないように設定していました

Postfix 2 以降ならば、以下のように proxymap を使うという方法もあります。

local_recipient_maps = proxy:unix:passwd.byname $alias_maps

Kazuya Yamamoto

unread,
Oct 7, 2003, 8:00:54 AM10/7/03
to
いつも詳しいフォローアップに感謝しています。m(__)m

> おそらく smtpd が chroot するように設定されていないでしょうか。

その通りでした。勉強になります。m(__)m

ところで皆さんは、
仮想ドメインの不明ユーザー宛の
エラーメール攻撃対策はどのようしているのでしょうか?
今日、近所の本屋さんで以下の書籍を見つけたので、
パラッと眺めた感じでは該当する項目が無かったので疑問です。

『Postfix メールサーバの構築』(ISBN4-7561-4051-3)

当方の無い頭で考えると、
「仮想ドメインを用いなければいい」となったんですが「不便」です。
仮想ドメインを用いず、
受け取るメールドメインを全て $mydestination にしても、
凝ったことをすると、河野真治さんが
news:3989051...@insigna.ie.u-ryukyu.ac.jp
言われているように、「個人の設定で一杯」な状況になってしまいます。


-- K.Yamamoto

IWAMOTO, Kouichi

unread,
Oct 11, 2003, 10:57:02 PM10/11/03
to

岩本といいます。

<blu9uk$ftg$1...@caraway.media.kyoto-u.ac.jp>の記事において
nos...@excite.co.jpさんは書きました。

>ところで皆さんは、
>仮想ドメインの不明ユーザー宛の
>エラーメール攻撃対策はどのようしているのでしょうか?

仮想ドメインの不明ユーザ宛のメールは、特になにも設定していなくても
reject されませんか?
virtual(5)に以下の記述があるように、virtual_maps(virtual_alias_maps)を
使っているならば問題ないと思います。

| With a virtual alias domain, the Postfix SMTP server accepts mail for
| known...@virtual-alias.domain, and rejects mail for unknown-user@vir-
| tual-alias.domain as undeliverable.

存在しないユーザ宛のエラーメール攻撃で問題が出そうなのは、
例えば、組織内に複数のメールサーバがあり、それら宛のメールも
一度代表のメールサーバが受け取ってから下位のサーバに配送する
ような形態が考えられます。
他にも、私は使ったことがないので確認していないのですが、
virtual配送エージェントを使って仮想ドメインを設定している場合も
同様かもしれません。

これらの場合は、私は仕方ないんじゃないかと思っています。

Postfix 2以降ならばrelay_recipient_mapsでrelayするアドレスを
設定できますが、LDAP等でアドレスを一元管理しているとか、
さもなければ余程の小規模な所でない限り現実的ではないと思います。

0 new messages