とーますメモ

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

【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

【Ubuntu】自分用まとめ:セキュリティ対策

自分用メモ。

1)rootユーザでのログインを禁止

/etc/ssh/sshd_config

PermitRootLogin no

2)sshdのログインポートの変更

/etc/ssh/sshd_config

Port 1234

3)パスワード認証を禁止

/etc/ssh/sshd_config

PasswordAuthentication no

4)いらないサービスを停止/削除

いらないサービスを極力停止または削除する。

サービスの状態確認のコマンド

$ systemctl list-unit-files --type=service

ポートが開いているサービスの一覧コマンドは以下。

$ ss -atl

または

netstat -ntl

MySQLの停止例

$ sudo systemctl stop mysql

5)再起動させない設定

たとえばログインパスワードを知らなくても、再起動しメンテナンスモードで起動すれば
パスワード無しで管理者権限を得ることが可能。そのため、システムを再起動させないようにする。
一般的なIntelアーキテクチャだと、Ctrl + Alt + Deleteでシステムが再起動するので、
このキー操作を無効化する。

6) セキュリティアップデートの自動化

thoames.hatenadiary.jp

$ sudo systemctl mask ctrl-alt-del.target
$ sudo systemctl daemon-reload

7)fail2banのインストール

悪意あるアクセス元のIPアドレスを遮断する。
※Sshguardというサービスもあるが、感覚的にfail2banのほうが日本語情報が多い印象があるため、
fail2banを使用

8)Rootkit Hunter(rkhunter)でルートキット、バックドア、ローカルの脆弱性の検出を行う

インストール

$ sudo apt install rkhunter

rootkitデータベースを更新

$ sudo rkhunter --update

rootkitプロパティデータベースを更新

$ sudo rkhunter --propupd

システムチェック

$ sudo rkhunter -c

簡易。警告メッセージのみ表示し、テストごとにEnter入力を求めないシステムチェック)

$ sudo rkhunter -c --rwo -sk

9)ufw(ファイヤーウォール)のインストール及び設定

10)lynis(システム診断ツール)を入れる。

インストール

$ sudo apt install lynix

診断

$ sudo lynis audit system

WarningsやSuggestionsを見て、対処が必要なものから対応していく。

11)アンチウイルスソフトを入れる

定番の「Clam antivirus」を入れる。

インストール

$ sudo apt install -y clamav

現段階では不要な「ウイルス定義更新をclamdに通知する設定」をOFFにする。
/etc/freshclam.conf

$ # NotifyCamd /etc/clamav/clamd.conf

ウイルスデータベースを更新(手動)

$ sudo freshclam

自動的にウイルスデータベースを更新

$ sudo systemctl start clamav-freshclam

ディレクトリを手動でスキャン
/homeディレクトリをスキャンする例

sudo clamscan -i -r /home