postfix->procmail->dovecotの雑多な設定とTLS鍵の作成

※実際には7/6のネタです。

■キューの確認と削除

pflogsumm_reportで宛先を間違え、キューに溜まったメールを発見した事を前提とします。
テスト用の簡易メールサーバとしての最低限の管理です。

$ mailq || /usr/sbin/postqueue -p | tail -1
-- 3 Kbytes in 4 Requests.

$ sudo postsuper -d ALL
postsuper: Deleted: 4 messages

■mailqとpostqueueの違い

「/usr/bin」と「/usr/sbin」の違いです。

$ echo "mailq postqueue" | xargs whereis
mailq: /usr/bin/mailq /usr/share/man/man1/mailq.1.gz
postqueue: /usr/sbin/postqueue /usr/share/man/man1/postqueue.1.gz

■「/usr/bin」との区別の為、「/usr/sbin」へのパスが通っていないのが原因です。

$ echo $PATH | sed s/\:/"\n"/g | grep bin
/usr/local/bin
/usr/bin
/bin

■manマニュアルのおさらい。

$ LANG=C;man man | grep " [1-8] " | head -8
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conven-
8 System administration commands (usually only for root)

■ユーザコマンド
$ apropos postfix | grep \(1 | awk '{print $1}' | column
mailq postalias postfix postmulti saslfinger
newaliases postcat postkick postqueue sendmail
pflogsumm postconf postlog postsuper
pflogsumm.pl postdrop postmap qshape

■ユーザコマンドで、/usr/bin のコマンド
$ apropos postfix | grep \(1 | awk '{print $1}' | \
for list in `xargs`;do whereis "$list" | grep usr\/bin\/ > /dev/null 2>&1 && echo "$list";done | column
mailq newaliases saslfinger

■ユーザコマンドで、/usr/sbin のコマンド
$ apropos postfix | grep \(1 | awk '{print $1}' | \
for list in `xargs`;do whereis "$list" | grep usr\/sbin\/ > /dev/null 2>&1 && echo "$list";done | column
pflogsumm postcat postfix postmap postsuper
pflogsumm.pl postconf postkick postmulti qshape
postalias postdrop postlog postqueue sendmail

■設定ファイル
$ apropos postfix | grep \(5 | awk '{print $1}' | column
access cidr_table mysql_table postfix-wrapper virtual
aliases generic nisplus_table regexp_table
body_checks header_checks pcre_table relocated
bounce ldap_table pgsql_table tcp_table
canonical master postconf transport

■システムコマンド
$ apropos postfix | grep \(8 | awk '{print $1}' | column
anvil oqmgr smtp
bounce pickup smtpd
cleanup pipe spawn
defer postfix-add-filter tlsmgr
discard postfix-add-policy trace
error proxymap trivial-rewrite
flush qmgr verify
lmtp qmqpd virtual
local scache
master showq

■現在動作しているコマンドを確認

$ ps -ef | grep postfix | cut -c 48-
/usr/lib/postfix/master
pickup -l -t fifo -u -c
qmgr -l -t fifo -u
grep postfix

■どのユーザが実行してるか。

$ ps aux | grep postfix | grep -v grep | awk '{print $1 " : " $11}'
root : /usr/lib/postfix/master
postfix : qmgr
postfix : tlsmgr
postfix : pickup

■「/usr/lib/postfix」以下のコマンドだった。

$ cd /usr/lib/postfix;echo 'master pickup qmgr' | ls `xargs`
master pickup qmgr

■アクセスを許可するIPアドレスについて

$ sudo grep -v "^#\|^\$" /etc/postfix/main.cf | grep mynetworks
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

例えば、以下のように自身のセグメントを設定できます。

「mynetworks = 192.168.0.0/24 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

また、以下ではCLIの設定ウイザードで入力出来ます。

$ sudo dpkg-reconfigure postfix

■送信メールサーバから受信メールサーバへのローカル配送

以下がコメントアウトされている場合、ローカル配送がされません。

$ less /etc/postfix/main.cf | grep procmail
mailbox_command = procmail -a "$EXTENSION"

■事前に用意されているTLS認証について

$ sudo grep -v "^#\|^\$" /etc/postfix/main.cf | grep -i tls
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

$ sudo grep pem /etc/dovecot/dovecot.conf
#ssl_cert_file = /etc/ssl/certs/dovecot.pem
#ssl_key_file = /etc/ssl/private/dovecot.pem

$ sudo ls -l /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/private/ssl-cert-snakeoil.key
-rw-r--r-- 1 root root 1013 2011-07-05 21:24 /etc/ssl/certs/ssl-cert-snakeoil.pem
-rw-r----- 1 root ssl-cert 1675 2011-07-05 21:24 /etc/ssl/private/ssl-cert-snakeoil.key

/etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/private/ssl-cert-snakeoil.key
$ sudo ls -l /etc/ssl/certs/dovecot.pem /etc/ssl/private/dovecot.pem
-rw-r--r-- 1 root dovecot 1659 2011-07-05 21:24 /etc/ssl/certs/dovecot.pem
-rw------- 1 root dovecot 1679 2011-07-05 21:24 /etc/ssl/private/dovecot.pem

$sudo postconf | grep ssl
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key

$ sudo dovecot -a | grep ssl_[ck][e].*_file
ssl_cert_file: /etc/ssl/certs/dovecot.pem
ssl_key_file: /etc/ssl/private/dovecot.pem

■自分でTLS認証の鍵を作成する

root権限で作業します。

初期のTLS鍵がRSA鍵なので、同様に作成してみます。

# ls /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/ssl/private/ssl-cert-snakeoil.key | xargs head -1
==> /etc/ssl/certs/ssl-cert-snakeoil.pem <==
-----BEGIN CERTIFICATE-----

==> /etc/ssl/private/ssl-cert-snakeoil.key <==
-----BEGIN RSA PRIVATE KEY-----

# cd /etc/ssl/private/
# openssl genrsa -des3 1024 > mail.key
Generating RSA private key, 1024 bit long modulus
......++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:

# ls -l mail.key
-rw-r--r-- 1 root root 963 2011-07-06 03:42 mail.key
# chmod 600 mail.key

# openssl rsa -in mail.key -out mail.key
Enter pass phrase for mail.key:
writing RSA key

# cd ../certs/
# openssl req -utf8 -new -key ../private/mail.key -x509 -days 365 -out mail.pem -set_serial 0
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Dokoka
Locality Name (eg, city) []:Dokoka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:labunix.net
Organizational Unit Name (eg, section) []:www.labunix.net
Common Name (eg, YOUR name) []:debian-vmamd64
Email Address []:postmaster@debian-vmamd64.amd64.vm

■vim等のエディタで「/etc/postfix/main.cf」と「/etc/dovecot/dovecot.conf」を編集。

# sudo postconf | grep "\.pem\|\.key"
smtpd_tls_cert_file = /etc/ssl/certs/mail.pem
smtpd_tls_key_file = /etc/ssl/private/mail.key

# sudo dovecot -a | grep "\.pem\|\.key"
ssl_cert_file: /etc/ssl/certs/mail.pem
ssl_key_file: /etc/ssl/private/mail.key

# /etc/init.d/postfix restart;/etc/init.d/dovecot restart

■icedopeで自分で作った署名のインポートを求められることを確認。

細かいオプションは「man openssl」で確認しよう。

パケットキャプチャでは、ユーザ名やパスワードは平文で流れなくなった。
自分で作ったmail.pemで入力した項目は平文で見える。
(JPやDokoka)など。自己署名なので問題はないのだけど。。。

次はPGPの導入かな。。。