qmail-manage


qmail-manage

  • installして動いたのを確かめてはいおしまい、とはいかないのが管理者です。
  • 実際に通常の24時間運営していくのに必要な情報にしてあるつもりです
  • 日本語manは目を通すべき

    #contents 

xinetdで動かしてみる

  • qmailの起動形態には、inetd/xinetd(&tcpd)、もしくはtcpserver経由の方法がある。 inetdはパフォーマンスに問題があるため、使用しないほうが良い。
  • tcpserverはqmailと同じ作者が開発したTCP用スーパサーバであり、qmailとの相性も良い。
    • これから先の説明は、システムに既にxinetdがセットアップされていることを前提とする。
$ cd /etc/xinet.d
  • xinetdでは、xinetd経由で起動するプログラム単位にこのディレクトリに設定ファイルを作る必要がある。
$ vi qmail
  • このファイルに以下のような設定を記述する。
service smtp
{
disable = no
flags = REUSE NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = qmaild
server = /usr/sbin/tcpd
server_args = /var/qmail/bin/tcp-env -R /var/qmail/bin/qmail-smtpd
}
  • 気をつける点としては、server, server_argsで示されるプログラム(tcpd, tcp-env, qmail-smtpd)が 指定のパスに存在していることを確認すること。

リレー許可ホストの設定を行う(xintedの続き)

  • 現在のままでは、このメールサーバ宛のメールしか送信することができない状態のため、 他のドメインへのメール送はできない。
  • つまり貴方宛のメールを受信することはできても、貴方から他のドメイン(メールアドレス)の誰かへはメールが出せないということ である。
$ cd /etc
$ vi hosts.allow
hosts.allowを編集する。
tcp-env : 127. : setenv = RELAYCLIENT
tcp-env : 192.168.10.0/24 : setenv = RELAYCLIENT
tcp-env : 192.168.20.15 : setenv = RELAYCLIENT
tcp-env : ALL
  • このhosts.allowというファイルは、tcpdが参照するファイルであり、特定の送信元のアドレスやドメインによって 指定のプログラムを動かして良いかどうかのアクセスコントロールに使用される。
  • このファイルの書式は
<プログラム> : <接続要求パターン> : <オプション> [ : <オプション> ... ]
  • 上記の例では、ある接続パターンの場合のみ、環境変数RELAYCLIENTを宣言している。
  • ここで言っている"ある接続パターン"とは正確にいうと、接続元のIPアドレスのパターンのことである。
  • 以前に少し話したが、qmailは環境変数RELAYCLIENTが宣言されている要求に対しては、設定ファイル rcpthostsを無効になり、どの宛先アドレスに対しても配送するということを思い出して欲しい。
  • 例では、内部ドメインのアドレス(信頼する身内のアドレス)からはどの宛先のメールでも受取り、 配送するという意味である。
  • 注意すべき点として、tcpdはhosts.allow中の記述のうち、マッチするものを見つけたらそれ以降のルールは 参照せずに、即座に指示に従ってしまうことだ。
  • つまり、tcp-env : ALL を最初に行に書いてしまうと、全ての接続に対して環境変数RELAYCLIENTが宣言 されることは無くなってしまうので注意すること。

設定一覧を見る

#/var/qmail/bin/qmail-showctl

qmail内部構造

queueを管理する

  • qmailに付属しているコマンド
# /var/qmail/bin/qmail-qstat
# /var/qmail/bin/qmail-qread
  • がありますが非常に使いにくいですそこでqueueから特定のメールだけを削除できるtoolを使用します.

特定のaddress拒否

  • 特定のアドレスの受け取り拒否 卒業・退社・人事移動などによる抹消アカウントがエラーを発生させる場合や、 spamのenvelope fromにアドレスを騙られた場合などアカウントが限定できる場合は、 badrcptto patchを使って smtpセション中に拒否をすることで受け取り後のエラー発生を防ぎます。

queue-adminの入手

wget http://cmf.ohtanz.com/download/queue-admin.txt

mv queue-admin.txt /var/qmail/bin/queue-admin

chmod 755 /var/qmail/bin/queue-admin

  • 詳細は”/var/qmail/bin/queue-admin”を実行
  • 使用例
1.queueに溜まっているメールのリストを表示 

/var/qmail/bin/queue-admin --ls

2.キュー番号「1111111」「2222222」のメールを表示 

/var/qmail/bin/queue-admin --cn 1111111 2222222

3.Toヘッダーに「aaa@ohtanz.com」「bbb@ohtanz.com」が含まれるメールを削除。 

/etc/rc.d/init.d/qmail stop

/var/qmail/bin/queue-admin --dt aaa@ohtanz.com bbb@ohtanz.com

/etc/rc.d/init.d/qmail start

4.Subjectヘッダーに「test1」「test2」が含まれるメールを表示 

/var/qmail/bin/queue-admin --ss test1 test2

5.メール本文に「test1」「test2」が含まれるメールを表示 

/var/qmail/bin/queue-admin --sb test1 test2

maillogから解析

  • /var/log/maillogに残る
    • 正常に配送が行われると
new msg [メッセージID]                       メッセージのログの開始
info msg [メッセージに関する情報]        メッセージの情報
starting delivery : [配送ID]                   配送開始
status : local 1/10 remote 0/20            状態表示
delivery [配送ID] : success                  状態表示
status : local 0/10 remote 0/20            状態表示
end msg : [メッセージID]                    キューからメッセージを削除し、
  • といったlogが残る(普段から見ていないとトラブルの原因はわからない)
  • 普段は見てもらうと分かるがsuccessと表示される、これがfailureあるいはdeferralといった文字列をはきだすようになる。

ERRORから原因をさぐる

Unable_to_chdir_to_maildir
  • メールボックスであるMaildirでディレクトリを変更できないという旨のメッセージ。qmail-localプログラムはユーザー権限でMaildir/newにメールを配送するため、Maildir以下のディレクトリがユーザーの所有になってないとcdしてファイルを作ることができない。
  • また、qmail-localはMaildir以下のディレクトリのパーミッションが700になっていないと、配送を中止する。このエラーによりユーザーがメールを受け取ることができない場合は、Maildirの所有者やパーミッションを確認する。
Sorry._Although_I’m_listed_as_a_best_preference_MX_or_A_for_that_host,
/_it_isn’t_in_my_control/locals_file,_so_I_don’t_treat_it_as_local.
  • DNSサーバのMXやAレコードでは配送先ホストとして存在するが、設定ファイルlocalsに自ホストの記述がないため、そのメールをローカル配送として処理することができないというエラー。localsにローカル配送として処理するホスト名を記述するか、smtproutesに自ホスト宛のメールを受け取る設定をしてあるホストを記述してメールを転送する。
Sorry,_that_domain_isn’t_in_my_list_of_allowed_rcpthosts
  • メールの転送を許可していないホストが、rcpthostsに記述されていないホストにメールを送信しようとしたときに出るエラー。メールの転送を無条件で許可するなら、そのホストに対応する環境変数のRELAYCLIENTに空文字列を設定する。
Sorry,_no_mailbox_here_by_that_name.
  • ローカル配送されるべきメールとして処理されたが、該当するユーザーがいない場合に出されるエラー。ユーザー名の間違いや、パーセントハックが有効になっていない状態でのパーセントハックを利用したメール配送の発生が原因と考えられる。alias/.qmail-defaultがあれば全ての宛先ユーザー不明のメールを受信して、このエラーメッセージは出さない。
  • 何らかのエラーによってメールの配送が延期されたメールは、その後、何度か再送が試みられる。それにもかかわらず配送が完了しないままqueuelifetimeで設定した時間が経過すると
I’m_not_going_try_again;_this_message_has_been_in_the_queue_too_long.
  • というメッセージを出して、差出人にメッセージを差し戻す。
delivery 9938: deferral: Sorry,_message_has_wrong_owner._(#4.3.5)/
Is qmail/bin/qmail-queue setuid and owned by qmailq?
To enable qmail to deliver the messages with the wrong owner,
check ls -al /var/qmail/queue
drwxr-x---   11 qmailq   qmail        4096 2003-09-19 09:41 .
drwxr-xr-x   11 root     qmail        4096 2003-09-19 17:11 ..
drwx------    2 qmails   qmail        4096 2003-09-21 22:48 bounce
drwx------   25 qmails   qmail        4096 2003-09-19 09:41 info
drwx------    2 qmailq   qmail        4096 2003-09-21 22:48 intd
drwx------   25 qmails   qmail        4096 2003-09-19 09:41 local
drwxr-x---    2 qmailq   qmail        4096 2003-09-19 09:41 lock
drwxr-x---   25 qmailq   qmail        4096 2003-09-19 09:41 mess
drwx------    2 qmailq   qmail        4096 2003-09-21 22:48 pid
drwx------   25 qmails   qmail        4096 2003-09-19 09:41 remote
drwxr-x---    2 qmailq   qmail        4096 2003-09-21 22:48 todo

chown qmailq qmail/queue/mess/*/*
メ ッセージをqmailqオーナになっていないことが原因
  • メールサーバの管理者はこうしたログを参照しながら、セキュリティーを保ちつつ、メールの配送が正常に行われるよう、保守管理を行うことが求められる。
% /usr/local/bin/qmailanalog/zddist < out      # メールの遅れの統計      
% /usr/local/bin/qmailanalog/zfailures < out   # 失敗メールのチェック     
% /usr/local/bin/qmailanalog/zrecipients < out # 受け取り先の統計       
% /usr/local/bin/qmailanalog/zrxdelay < out    # 受け取り先の統計(遅れでソート)
% /usr/local/bin/qmailanalog/zsuccesses < out  # 成功時に理由の統計(意味無し) 
% /usr/local/bin/qmailanalog/zdeferrals < out  # deferral時の理由の統計    
% /usr/local/bin/qmailanalog/zoverall < out    # 基本統計           
% /usr/local/bin/qmailanalog/zrhosts < out     # 相手のホストの統計      
% /usr/local/bin/qmailanalog/zsenders < out    # 差し出し元の統計       
% /usr/local/bin/qmailanalog/zsuids < out      # 差し出し元のuid の統計   

REPLYの設定

  • これまでの設定でclientからはrcpthosts以外のmachineへmailを出そうとすると、
553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)
  • というエラーに遭遇してしまいます。
  • これは /var/qmail/control/rcpthosts がお分かりのように
localhost
host.example.jp
  • となっているためです。
  • host.example.jp 以外のhostからは、このrcpthostsに表示されたhostにしかmailを送ることができません。
  • qmail は、mailの中継機能をこの rcpthostsにより制限しているのです。
  • ですが/var/qmail/control/rcpthosts を削除してしまえば、 qmail はどこのhostへのmailでも、無制限に中継します。 これは spam にはうってつけの状況となってしまいます。
  • そこで、hostsを選んで中継を許可するように設定します。
  • tcp_wrapperを使った方法
    • CIACから tcp-wrappersを入手
$ make 
  • とすると、対応しているsystem名が表示されます自分のsystemがなければ genericを選びます。
  • REAL_DAEMON_DIRはどこか?
    • /etc/inetd.conf などを参照して、(in.)telnetdや(in.)ftpdなどのdaemonがどこにいるか調べておきます。Linuxの場合は /usr/sbin、FreeBSDの場合は /usr/libexecなどです。
  • hosts_optionsを付けるために STYLE=-DPROCESS_OPTIONS を忘れずに、 make REAL_DAEMON_DIR=/foo/bar STYLE=-DPROCESS_OPTIONS system名 とします。
$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS linux
		
  • tcpd をcp
$ su
# cp tcpd /usr/sbin/tcpd
  • inetd.conf の qmail-smtpd の行を変更し、inetdにHUPを送ります。
    smtp stream tcp nowait qmaild /usr/sbin/tcpd /var/qmail/bin/tcp- 
    env /var/qmail/bin/qmail-smtpd
  • /etc/hosts.allow の設定
    • qmail-smtpdはRELAYCLIENT環境変数があるとcontrol/rcpthostsを無視して、メイルを受け取ります。
    • 中継を許可したいhost/networkの tcp-env に、RELAYCLIENTを空白文字列として設定します。
tcp-env: 1.2.3.4 : setenv = RELAYCLIENT 
	IP addressが 1.2.3.4 の hostからの接続を許可します。
tcp-env: 1.2.3.  : setenv = RELAYCLIENT
	network 1.2.3.0 の networkからの接続を許可します。
tcp-env: .y-min.or.jp : setenv = RELAYCLIENT
	network *.example.jpからの接続を許可します。
  • /etc/hosts.deny の設定
    • hosts.denyで .example.jp以外からはtcp-env --- qmail 以外のserviceを許可しないようにします。
ALL EXCEPT tcp-env: ALL

SPAMメイルの正しい捨て方

  • dot-qmailに"#"だけを書いておけばよろしい。
    • WWWに書いてある連絡用のメイルアドレスにゴミメイルが送られてくるので、 mess822パッケージのiftoccを使っています。
    • To:, Cc:に受け取りたいアドレスがなければゴミ箱(junk)行きにするわけです。 (SPAMはいちいち宛先を変更したりしていないというのを利用しています。)
  • こんなdot-qmailを作ってあります。
#1	| /var/qmail/bin/condredirect tmaeno-web@hpcl.titech.ac.jp iftocc
#2	/home/tmaeno/Mdir/junk
  • iftoccは標準入力から読んだメイルのTo:かCc:に $RECIPIENTアドレスが含まれていれば0を返します。そうでなければ、100を返します。それをcondredirect で判定します。
    • .qmailで使うにはperlは重すぎます。牛刀で大根の千切りを作るようなものです。
  • ゴミを送ってくる相手が決っているなら、 $SENDERで識別するようにshellコマンドを直接書くのが正解です。
  • UCE/SPAM対策のために、拡張子なしのアドレスへ届くメイルはゴミ箱行きをめざしています。

alias の設定

# cd /var/qmail/alias
# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
# chmod 644 .qmail*

sendmailとお別れ

# cd /usr/sbin
# mv sendmail sendmail.dist
# chmod 0 sendmail.dist
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

Maildir への移行

# cp /var/qmail/boot/home /var/qmail/rc
# vi /var/qmail/rc
s!/Mailbox!/Maildir/!g とする

alias のメール・ボックスを Maildir にする。

# /var/qmail/bin/maildirmake ~alias/Maildir
# chown -R alias ~alias/Maildir
  • 新規ユーザーの追加 useradd foo -m の時、各ユーザーのホーム・ディレクトリに Maildir が作られるようにする。
# mkdir /etc/skel
# /var/qmail/bin/maildirmake /etc/skel/Maildir

Openproxy

  • 以下の条件にあてはまるhttp proxyは、メールに限らず多くのプロトコルを中継してしまいます。
  • open proxyの問題点
    • spam中継に使われるopen proxyはMTAの不正中継以上に問題があります。
  • ヘッダ情報から真の送信元を隠してしまう。(spam被害者は追跡が困難)
  • open proxy管理者に連絡しても、open proxyによる送信であることを理解させないと、MTAのログだけを見て「記録にない」ということになってしまう。
  • open proxyのログには、最低限の情報しか残らない
  • spam以外にも、なんでもありの足場として使われる
  • open proxyと同一組織の、本来は不正中継をしないMTAが、open proxyを介することで中継を許してしまう。(MTAに限らず同一ネットワーク内のホスト・ネットワーク機器のIPアドレスによるアクセス制限が骨抜きになる可能性が高い)

squidOK?

  • squid(proxy)はnobody権限であり設定も簡単です
    • なので適切でない設定もよく見られます

proxy不正利用対処と対策

  • 被害を与えないために
    • 上記2つの条件を潰す。特にCONNECTメソッドの宛先ポートを443(https)[,563(snews)]だけに絞る。 (組織外だけでなく、組織内からのものも制限しないと、組織内からの「裏口」を作ることになってしまいます。)
squidなら(squid.conf.defalutに入ってるはず)  
acl SSL_ports port 443 563
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
acl localnet src 202.212.33.48/255.255.255.248(組織のnetwork)
acl localhost src 127.0.0.1/255.255.255.255
http_access allow localhost
http_access allow localnet
http_access deny all

dnsdl

人気の5件

最新の6件

2021-05-17 2011-10-17 2011-12-07 2011-12-02

統計情報

counter: 14004, today: 1, yesterday: 0