とーますメモ

Ruby on Rails / Goなどの学習メモ

【Postfix】Ubuntu16.04でDKIM設定(送信元ドメイン認証)を行ってみた

自分用メモ。

DKIMとは

以下、Postfix + OpenDKIMで送信元ドメイン認証を実装するメモより引用

処理の流れ

1. 送信者が送信メールのヘッダ+本文でハッシュ作成
2. ハッシュ + 秘密鍵で電子署名作成
3. 電子署名をDKIM-Signatureヘッダとして添付
4. メール送信
5. 受信者が受信メールのヘッダ+本文でハッシュ作成
6. DKIM-Signatureヘッダの電子署名から公開鍵でハッシュを復号
7. 受信者が作成したハッシュと比較する

インストールは以下を参考にすれば簡単にできた。
How To Install and Configure DKIM with Postfix on Debian Wheezy | DigitalOcean

注意したいのはポイントは以下。
thoames.hatenadiary.jp

【Postfix】DKIM設定時に、header_checksでFromを触っていると失敗(Fail)する

タイトルの件、そのまま。

自分の場合、
mailutilsのメールコマンドで、メール送信時に
Fromヘッダーを付けなくても、デフォルトの送信者名を付与するため
header_checks内でFromを以下のように変更していた。

/^From: {{ postfix_admin_mail_from }} (.*?)/ REPLACE From: {{ postfix_admin_mail_from }} ({{ postfix_admin_name }})

これが原因で、DKIM認証が失敗していた。


以下のページをより引用
Postfix opendkim and missing From header | Skull's blog

The presence of a “From” or “Sender” header within the email is mandatory for DKIM, otherwise the mail can’t be signed

つまりDKIMが電子署名作成するには、Fromヘッダが必要だが
DKIMの処理の流れが、以下なので

1. 送信者が送信メールのヘッダ+本文でハッシュ作成
2. ハッシュ + 秘密鍵で電子署名作成
3. 電子署名をDKIM-Signatureヘッダとして添付
4. メール送信
5. 受信者が受信メールのヘッダ+本文でハッシュ作成
6. DKIM-Signatureヘッダの電子署名から公開鍵でハッシュを復号
7. 受信者が作成したハッシュと比較する

Postfix + OpenDKIMで送信元ドメイン認証を実装するメモより引用

恐らく、header_checksがFromを書き換えるのは
2の後の「電子署名作成後」に、行われるためDKIMが失敗するものと勝手に納得した。
(※個人的見解なので、詳しい方がいらっしゃればコメントお願いします)

要は、header_checks自体を使用するのは構わないが
DKIM認証を使用する場合、Fromヘッダーを変更するのは辞めたほうがよいということ。

素直に、Fromヘッダーはメール送信時に設定すればよいという結論。

以下、mailutilsでのFromヘッダ付加例)

$ echo Dkim Test | mail -s "Test" -aFrom:'Admin <hoge@example.com>' to@example.com


[他参考]
DomainKeys Identified Mail (DKIM) and Postfix Header Checks | Gaia Environmental Sciences

【Postfix】ムームードメインで、送信のみのSPF認証設定をやってみた

Ubuntu16.04にPostfixをインストールし
メール送信テストは、mailutilsパッケージをインストールして行った。

送信のみのSPF認証は、Postfix側は何も触らず
ドメインのDNSレコードを追加するだけで良い。


全体の流れは以下。

1)ドメイン取得

まずは「ムームードメイン」でドメインを取得する。
取得の手順については、他のサイトさんで説明されつくされているので省略。

2)カスタムDNSの設定

手順1

f:id:Thoames1212:20180819062212p:plain

手順2

f:id:Thoames1212:20180819062224p:plain

手順3

f:id:Thoames1212:20180819062236p:plain

以下の設定を行う。
xxx.xxx.xxx.xxxはサーバIP。

サブドメイン:''(空)
種別:TXT
内容:v=spf1 +ip4:xxx.xxx.xxx.xxx -all

SPFレコード(TXT)の書式は以下のとおり

バージョン情報 空白 定義 空白 定義 ……

詳細は以下のサイトの説明がわかりやすい。
Sender ID:送信者側の設定作業 (3/4):送信ドメイン認証技術解説 - @IT
Sender Policy Framework - Wikipedia


定義の書式については、認証について記述する修飾句(クオリファイヤ)と
ホスト情報について記述する修飾句(メカニズム)で主に構成される。

上記の「v=spf1 +ip4:xxx.xxx.xxx.xxx -all」の内容を説明すると、
バージョンにバージョン1である「spf1」を設定し、
「ip4:xxx.xxx.xxx.xxx」のメカニズムに、マッチ後に「認証成功」の結果を返す「+」を設定し
「all」のメカニズムに、マッチ後に「認証失敗」の結果を返す「-」を設定している。
「all」はプログラムで言うelse的な使われ方で、定義の最後で使用される。

ちなみにクオリファイヤを設定しない場合は、デフォルトで[+]が設定される。

MXレコードを既にゾーンに設定していれば、「v=spf1 +mx -all」とするのも可能っぽい。


DNSレコードの変更が、ちゃんと認識されているかは以下のサイトを使用した。
DNS Checker - DNS Check Propagation Tool

あとはテスト送信して見て、受信先のメールのメッセージ情報を見れば
正しく設定されているかが確認できる。


[質問]
TXTレコードの「~all」と「-all」は何が違うの?
SPFの送受信設定


【Postfix】送信元の名前をユーザ名ではなく、指定した名前に設定する方法

以下の記事を参考。
How to change the From header for messages sent by Postfix - 4PSA Knowledge Base - 4PSA Wiki

1)main.cfに追記

FQDN箇所は適切なものを設定

sender_canonical_maps = static:no-reply@<FQDN>

2)header_checksファイルを作成

/etc/postfix/内に作成

名前を「Administrator」に設定し、送信元を「no-reply@example.com」として設定

/^From:[[:space:]]+(.*)/ REPLACE From: Administrator <no-reply@example.com>

3)header_checks.dbを作成し、stmp_header_checks時に参照

cd /etc/postfix
postmap header_checks
postconf -e 'smtp_header_checks = regexp:/etc/postfix/header_checks'
service postfix reload

ちなみに、header_checksとstmp_header_checksの違いは、
header_checksがIncomingとoutgoingの両方に適応されるのに対し、
stmp_header_checksはoutgoingのみに対応している(?)ということなのか。。


[参考]
Postfix manual - header_checks(5)
email - postfix - different header checks for incoming and outgoing mail - Server Fault

【Postfix】不要なヘッダー情報を削除する方法

header_checksを利用する。

1)main.cfの設定

以下を追記

header_checks = regexp:/etc/postfix/header_checks

2)header_checksファイルの作成

/etc/postfix/header_checksを作成し、削除したいヘッダーの正規表現を書く。

例)

/^X-Mailer:/            IGNORE

/^To:.*@example.com/ OK
/^To:.*/ REJECT

3)header_checks.dbの作成

以下のコマンドで、/etc/postfix/以下にheader_checks.dbができる。

$ postmap hash:/etc/postfix/header_checks

【Postfix】メール送信元アドレス(From)が、[ユーザ@ホスト名]になってしまう原因と対策

以下の記事から引用
メモ: 自宅サーバー(Ubuntu)のPostfix設定方法(OP25B、SMTP-AUTH、送信元ドメイン確認対応) - fuzzy Weblog@hatena (更新終了)

まず、デフォルトの送信元アドレスを確認します。

この前の設定よりホスト名が www2.YOUR.DOMAIN で、またこのサーバーの一般ユーザーが USER の場合、

root 権限で実行された cron → 送信元「root@www2.YOUR.DOMAIN」
USER 権限で実行された cron → 送信元「USER@www2.YOUR.DOMAIN」
となります。

要はデフォルトだと[ユーザ@ホスト名]でメールが送られるよう。。
メール送信元アドレスを変更するには以下の手順が必要。
※Ubuntu16.04で検証

1)sender_canonicalファイルの作成

/etc/positfix/sender_canonicalファイルを作成
以下はその例

root info@example.net
www-data www@example.net
test@example.net test2@example.net

2)postmapコマンドで、sender_canonical.dbファイルを作成

postmap hash:/etc/postfix/sender_canonical

コマンドを打つと、sender_canonical.dbが/etc/postfix内に作成される。

3)main.cfの設定

以下を追記

sender_canonical_maps = hash:/etc/postfix/sender_canonical

4)再起動

$ sudo systemctl restart postfix


[参考]
Postfix: Rewrite sender on outgoing mails | DevOps Zone

【Ansible】aptモジュールで「apt upgrade」ができなくてハマった

困っていたところ、以下の記事がヒット。
AnsibleでUbuntu16.04使った時にでたエラー - The Pragmatic Ball boy

原因は、「aptitude」パッケージが入っていなかったことが原因。
よく見ると公式にも「aptitude」が必須って書いてある。
apt - Manages apt-packages — Ansible Documentation

結局、以下のplaybookでできた。
※packages内に「aptitude」が入っている。

- name: Install apt packages
  apt: pkg={{ item }} state=present update_cache=yes
  with_items: "{{ packages }}"

- name: Update all packages to the latest version
  apt: update_cache=yes upgrade=yes