====== 04 Docker MailServer ====== メールサーバも普通にたてるより、Dockerで作った方が良いかも [[https://github.com/docker-mailserver/docker-mailserver]] ===== 1.先にSSL用意 ===== 今回は下記でSSLを用意しておく想定 [[06_virtualization:05_container:10_docker_let_s_encrypt]] ===== 2. git clone ===== cd /app/ git clone https://github.com/docker-mailserver/docker-mailserver.git ===== 3.設定変更 ===== cd /app/docker-mailserver/ volumesにSSL証明書を読み込むように書きを追加してあります。 /var/lib/docker/volumes/app_certs/_data:/etc/letsencrypt/live 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設定 ==== 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==" ===== 4.起動 ===== # docker-compose up -d ===== 5. Procmail利用の場合 ===== 通常だとProcmail利用じゃないので、Procmailで配送するよう変更する場合imageを新たに作ります。 ==== main.cf ==== # 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 ==== master.cf ==== procmail unix - n n - - pipe flags=R user=docker argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /tmp/docker-mailserver/procmailrc ==== 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/ ==== Dockerfile ==== procmailだけ追加インストール RUN < ==== build ==== DOCKER_BUILDKIT=1だけ入れて、build DOCKER_BUILDKIT=1 docker image build -t mailserver2 . ==== procmail使った場合のエラー ==== こんなエラー出ます。 mailserver | 2024-02-06T11:08:45.394582+09:00 mail postfix/pipe[119008]: 5AC87A5145: to=, 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=, 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=, 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 ===== 6.Spamassassin ===== cronで.Junkのメールを日々学習させておく 0 2 * * * docker exec mailserver sa-learn --spam /var/mail/example.com/username/.Junk --dbpath /var/mail-state/lib-amavis/.spamassassin ===== 7.amavisd ===== 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追加したつもりなのに、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 {{tag>Docker mail DKIM Spamassassin procmail postfix}}