- 日本語 (ja)
- English (en)
最近の更新
- 02 Apache2で自己認証ssl [中間証明書の整合性確認]
最近の更新
メールサーバも普通にたてるより、Dockerで作った方が良いかも
今回は下記でSSLを用意しておく想定
10 Docker Let's Encrypt
cd /app/ git clone https://github.com/docker-mailserver/docker-mailserver.git
cd /app/docker-mailserver/
volumesにSSL証明書を読み込むように書きを追加してあります。
/var/lib/docker/volumes/app_certs/_data:/etc/letsencrypt/live
compose.yml
services: mailserver: image: ghcr.io/docker-mailserver/docker-mailserver:latest container_name: mailserver # Provide the FQDN of your mail server here (Your DNS MX record should point to this value) hostname: mail.hogehoge.com env_file: mailserver.env # More information about the mail-server ports: # https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/ # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks. ports: - "25:25" # SMTP (explicit TLS => STARTTLS) - "143:143" # IMAP4 (explicit TLS => STARTTLS) - "465:465" # ESMTP (implicit TLS) - "587:587" # ESMTP (explicit TLS => STARTTLS) - "993:993" # IMAP4 (implicit TLS) volumes: - ./docker-data/dms/mail-data/:/var/mail/ - ./docker-data/dms/mail-state/:/var/mail-state/ - ./docker-data/dms/mail-logs/:/var/log/mail/ - ./docker-data/dms/config/:/tmp/docker-mailserver/ - /etc/localtime:/etc/localtime:ro - /var/lib/docker/volumes/app_certs/_data:/etc/letsencrypt/live restart: always stop_grace_period: 1m # Uncomment if using `ENABLE_FAIL2BAN=1`: cap_add: - NET_ADMIN healthcheck: test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1" timeout: 3s retries: 0
※Timezone設定は下記で行っている。
/etc/localtime:/etc/localtime:ro
# diff mailserver.env mailserver.env.org 45c45 < POSTMASTER_ADDRESS=hoge@hogehoge.com --- > POSTMASTER_ADDRESS= 91c91 < SPOOF_PROTECTION=1 --- > SPOOF_PROTECTION= 179c179 < ENABLE_DNSBL=1 --- > ENABLE_DNSBL=0 185c185 < ENABLE_FAIL2BAN=1 --- > ENABLE_FAIL2BAN=0 212c212 < SSL_TYPE=letsencrypt --- > SSL_TYPE= 348c348 < ENABLE_SPAMASSASSIN=1 --- > ENABLE_SPAMASSASSIN=0 460c460 < ENABLE_POSTGREY=1 --- > ENABLE_POSTGREY=0
DKIMが有効になっている事確認
# grep ENABLE_OPENDKIM mailserver.env ENABLE_OPENDKIM=1
DKIMキー作成
# ./setup.sh config dkim
このファイル ./docker-data/dms/config/opendkim/keys/[DOMAIN]/mail.txt でキーを確認できる。
# cat ./docker-data/dms/config/opendkim/keys/fl8.jp/mail.txt mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; " "p=MIIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Tgp1lVoJ03zG47q356P55lOhXopy36UhItepO22Fps44E69zHOPvwCNaz9ZqpWGI4E/KJ34GzHjb3I/ff16vOb+nNFknNNT0tdTj8a854meEz81S1hXv0pQCnbjyyy+6B1XEbozAsWsgCcq" "nvXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXn4Kc6f1cSl9P4knXbo0mau2WDoceUyZTXNdZ1CQT+zoMN/B89B4cOong3Cq6AqWGMX/kmyHYaBzBPJUnO0be2E0InomGptyGE7Ni1yBV8Jw/BE9RhpXF+wN+CYnD1M7CNo2St9lQ" "cXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFGIofzGAaNVr4PIhtNoqj6qRAG+MHGduAYWBn8rSYfzhGQgWZTRLTo2bVxDQoLc5T82/tGq+CC1IBFsOZemlAp/gj/51zUDzsNx3YXsgs8s5Ef+eECAwEAAQ==" ) ; ----- DKIM key mail for fl8.jp
※上記だと、““で区切らてますが、これをDNSに登録する時は全て繋げて1行で登録します。
# dig mail._domainkey.fl8.jp TXT mail._domainkey.fl8.jp. 120 IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Tgp1lVoJ03zG47q356P55lOhXopy36UhItepO22Fps44E69zHOPvwCNaz9ZqpWGI4E/KJ34GzHjb3I/ff16vOb+nNFknNNT0tdTj8a854meEz81S1hXv0pQCnbjyyy+6B1XEbozAsWsgCcqnvXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXn4Kc6f1cSl9P4knXbo0mau2WDoceUyZTXNdZ1CQT+zoMN/B89B4cOong3Cq6AqWGMX/kmyHYaBzBPJUnO0be2E0InomGptyGE7Ni1yBV8Jw/BE9RhpXF+wN+CYnD1M7CNo2St9lQcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFGIofzGAaNVr4PIhtNoqj6qRAG+MHGduAYWBn8rSYfzhGQgWZTRLTo2bVxDQoLc5T82/tGq+CC1IBFsOZemlAp/gj/51zUDzsNx3YXsgs8s5Ef+eECAwEAAQ=="
# docker-compose up -d
通常だとProcmail利用じゃないので、Procmailで配送するよう変更する場合imageを新たに作ります。
# Mail directory virtual_transport = lmtp:unix:/var/run/dovecot/lmtp virtual_mailbox_domains = /etc/postfix/vhost virtual_mailbox_maps = texthash:/etc/postfix/vmailbox virtual_alias_maps = texthash:/etc/postfix/virtual ↓ # Mail directory virtual_transport = procmail virtual_mailbox_domains = /etc/postfix/vhost virtual_mailbox_maps = texthash:/etc/postfix/vmailbox virtual_alias_maps = texthash:/etc/postfix/virtual virtual_uid_maps = static:5000 virtual_gid_maps = static:5000
これを変えると、「virtual_transport = lmtp:unix:/var/run/dovecot/lmtp」 → 「virtual_transport = procmail」に変わります。
# cat mailserver.env | grep POSTFIX_DAGENT POSTFIX_DAGENT= ↓ # cat mailserver.env | grep POSTFIX_DAGENT POSTFIX_DAGENT=procmail
procmail unix - n n - - pipe flags=R user=docker argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /tmp/docker-mailserver/procmailrc
docker-data/dms/config/procmailrc
SHELL=/bin/bash PATH=/usr/bin:/bin DROPPRIVS=yes MAILDIR=/var/mail/$DOMAIN/$USER DEFAULT=$MAILDIR/ # ロックファイル LOCKFILE=/var/mail/.procmail.lock # ログ出力先 LOGFILE=/var/mail/.procmail.log # 詳細ログ出力 VERBOSE=OFF ## 以下にprocmailレシピを書いていく :0 E * ^From:.*hoge@junkmail.com $MAILDIR/.Junk/
procmailだけ追加インストール
RUN <<EOF rm -rf /usr/share/locale/* rm -rf /usr/share/man/* rm -rf /usr/share/doc/* update-locale apt update apt install -y procmail EOF
DOCKER_BUILDKIT=1だけ入れて、build
DOCKER_BUILDKIT=1 docker image build -t mailserver2 .
こんなエラー出ます。
mailserver | 2024-02-06T11:08:45.394582+09:00 mail postfix/pipe[119008]: 5AC87A5145: to=<XXXXXX@fl8.jp>, relay=procmail, delay=0.02, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered via procmail service (procmail: Couldn't chdir to "/home/docker" procmail: Couldn't chdir to "/home/docker")) mailserver | 2024-02-06T11:18:40.840460+09:00 mail postfix/pipe[120188]: C5569A5147: to=<XXXXXX@fl8.jp>, relay=procmail, delay=0.03, delays=0.01/0.01/0/0.01, dsn=2.0.0, status=sent (delivered via procmail service (procmail: Couldn't chdir to "/home/docker" procmail: Couldn't chdir to "/home/docker")) mailserver | 2024-02-06T11:26:00.556709+09:00 mail postfix/pipe[121003]: 7DC92A5148: to=<XXXXXX@fl8.jp>, relay=procmail, delay=0.04, delays=0.01/0.02/0/0.02, dsn=2.0.0, status=sent (delivered via procmail service (procmail: Couldn't chdir to "/home/docker" procmail: Couldn't chdir to "/home/docker"))
これはprocmailを実行するdockerユーザの、homeディレクトリが存在しないからエラー出ています。
下記で出なくなります。
docker-compose exec mailserver mkdir -p /home/docker
cronで.Junkのメールを日々学習させておく
0 2 * * * docker exec mailserver sa-learn --spam /var/mail/example.com/username/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin
mailserver.envで、はじめのbuildで反映できてない場合、下記に書いてあげる。
cat docker-data/dms/config/amavis.cf $sa_spam_subject_tag = '***SPAM***';
そうすると、コンテナ内の下記に反映される。
# cat /etc/amavis/conf.d/50-user $sa_spam_subject_tag = '***SPAM***';
下記でDKIM追加したつもりなのに、DKIM署名が付かない事があった。
./setup.sh config dkim domain hogehoge2.com
設定ファイルには追加されているように見えるが、DKIM署名が付かない。。。
# cat docker-data/dms/config/opendkim/SigningTable *@flateight.com mail._domainkey.flateight.com *@hogehoge2.com mail._domainkey.hogehoge2.com
コンテナ内ファイルは、たしかに反映されてない。。。
# docker-compose exec mailserver cat /etc/opendkim/SigningTable *@flateight.com mail._domainkey.flateight.com
強制的にRecreateさせてあげれば、ちゃんと反映されます。
# docker-compose up -d --force-recreate