OpenARC

OpenARCをインストール・設定する。

OpenARC/openarc/openarc.conf.sample at master · trusteddomainproject/OpenARC · GitHub

インストール

dnfでインストール

$ env LANG=C sudo dnf install openarc
Last metadata expiration check: 1:08:33 ago on Fri Jan 12 20:46:55 2024.
Dependencies resolved.
============================================================================================================================================
 Package                      Architecture             Version                                   Repository                            Size
============================================================================================================================================
Installing:
 openarc                      x86_64                   1.0.0-0.15.Beta3.el8                      ol8_developer_EPEL                    66 k
Installing dependencies:
 libopenarc                   x86_64                   1.0.0-0.15.Beta3.el8                      ol8_developer_EPEL                    48 k

Transaction Summary
============================================================================================================================================
Install  2 Packages

Total download size: 113 k
Installed size: 202 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): openarc-1.0.0-0.15.Beta3.el8.x86_64.rpm                                                               41 kB/s |  66 kB     00:01
(2/2): libopenarc-1.0.0-0.15.Beta3.el8.x86_64.rpm                                                            29 kB/s |  48 kB     00:01
--------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                        69 kB/s | 113 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                    1/1
  Installing       : libopenarc-1.0.0-0.15.Beta3.el8.x86_64                                                                             1/2
  Running scriptlet: openarc-1.0.0-0.15.Beta3.el8.x86_64                                                                                2/2
  Installing       : openarc-1.0.0-0.15.Beta3.el8.x86_64                                                                                2/2
  Running scriptlet: openarc-1.0.0-0.15.Beta3.el8.x86_64                                                                                2/2
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.1.2.el8uek.x86_64.conf:6: hwcap directive ignored
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.7.4.el8uek.x86_64.conf:6: hwcap directive ignored

  Verifying        : libopenarc-1.0.0-0.15.Beta3.el8.x86_64                                                                             1/2
  Verifying        : openarc-1.0.0-0.15.Beta3.el8.x86_64                                                                                2/2

Installed:
  libopenarc-1.0.0-0.15.Beta3.el8.x86_64                                 openarc-1.0.0-0.15.Beta3.el8.x86_64

Complete!
$ 

設定ファイル確認

$ env LANG=C ls -la /etc/openarc.conf
-rw-r--r--. 1 root openarc 679 Oct 11  2022 /etc/openarc.conf
$ env LANG=C ls -la /etc/openarc/
total 20
drwxr-xr-x.   2 root    openarc  4096 Jan 12 21:55 .
drwxr-xr-x. 161 root    root    12288 Jan 12 21:55 ..
-r--r-----.   1 openarc openarc    23 Oct 11  2022 PeerList
$

設定していく。秘密鍵DKIMのをコピーして利用(OpenDKIMとはユーザが異なるので、コピーする)。

$ sudo cp /etc/opendkim/keys/example.jp/20231210.private /etc/openarc/
$ chown openarc:openarc /etc/openarc/20231210.private
$ env LANG=C ls -la /etc/openarc/
total 24
drwxr-xr-x.   2 root    openarc  4096 Jan 12 22:04 .
drwxr-xr-x. 161 root    root    12288 Jan 12 22:00 ..
-rw-------.   1 openarc openarc  1679 Jan 12 22:04 20231210.private
-r--r-----.   1 openarc openarc    23 Oct 11  2022 PeerList
$ 

/etc/openarc.conf の

  • Domain
  • Selector
  • KeyFile

を変更。

$ sudo cat /etc/openarc.conf
## See openarc.conf(5) or /usr/share/doc/openarc-1.0.0/openarc.conf.sample for more
#PidFile /run/openarc/openarc.pid
Syslog  yes
UserID  openarc:openarc
Socket  local:/run/openarc/openarc.sock
SignHeaders to,subject,message-id,date,from,mime-version,dkim-signature
PeerList /etc/openarc/PeerList
MilterDebug 6
EnableCoredumps yes

## After setting Mode to "sv", running
## opendkim-genkey -D /etc/openarc -s key -d
## and putting /etc/openarc
Mode                    sv
Canonicalization        relaxed/relaxed
Domain                  example.jp
Selector                20231210
KeyFile                 /etc/openarc/20231210.private
#SignatureAlgorithm rsa-sha256
$ 

設定ファイルチェック

# /sbin/openarc -n
# echo $?
0
#

起動してみる。問題なさそうなので、自動起動を有効にしておく。

# systemctl start openarc
# systemctl status openarc
* openarc.service - Authenticated Receive Chain (ARC) Milter
   Loaded: loaded (/usr/lib/systemd/system/openarc.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-01-12 22:12:30 JST; 17s ago
     Docs: man:openarc(8)
           man:openarc.conf(5)
           http://www.trusteddomain.org/openarc/
  Process: 4074895 ExecStartPost=/sbin/restorecon -r -F /run/openarc (code=exited, status=0/SUCCESS)
 Main PID: 4074894 (openarc)
    Tasks: 3 (limit: 203056)
   Memory: 976.0K
   CGroup: /system.slice/openarc.service
           `-4074894 /usr/sbin/openarc -f

Jan 12 22:12:30 mail.example.jp systemd[1]: Starting Authenticated Receive Chain (ARC) Milter...
Jan 12 22:12:30 mail.example.jp openarc[4074894]: OpenARC Filter: Opening listen socket on conn local:/run/openarc/openarc.sock
Jan 12 22:12:30 mail.example.jp openarc[4074894]: OpenARC Filter v1.0.0 starting (args: -f)
Jan 12 22:12:30 mail.example.jp systemd[1]: Started Authenticated Receive Chain (ARC) Milter.
# systemctl enable openarc
Created symlink /etc/systemd/system/multi-user.target.wants/openarc.service -> /usr/lib/systemd/system/openarc.service.
# 

Postfix設定

Postfixのmilterとして、OpenARCを指定する。

/run/openarc/openarc.sock 経由で接続するため、postfixユーザをopenarcグループに追加しておく。

$ groups postfix
postfix : postfix mail opendkim
$ sudo gpasswd -a postfix openarc
$ groups postfix
postfix : postfix mail opendkim openarc

/etc/postfix/main.cfを編集。

diff -r1.4 main.cf
733c733
< smtpd_milters = local:/run/opendkim/opendkim.sock
---
> smtpd_milters = local:/run/opendkim/opendkim.sock, local:/run/openarc/openarc.sock

Postfixを再起動

$ sudo systemctl restart postfix
$ sudo systemctl status postfix
* postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-01-12 22:32:44 JST; 7s ago
  Process: 4075663 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 4075695 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 4075691 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 4075687 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
  Process: 4075683 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=255)
 Main PID: 4075763 (master)
    Tasks: 3 (limit: 203056)
   Memory: 8.2M
   CGroup: /system.slice/postfix.service
           |-4075763 /usr/libexec/postfix/master -w
           |-4075764 pickup -l -t unix -u
           `-4075765 qmgr -l -t unix -u

Jan 12 22:32:43 mail.example.jp systemd[1]: Starting Postfix Mail Transport Agent...
Jan 12 22:32:43 mail.example.jp restorecon[4075683]: /usr/sbin/restorecon: lstat(/var/spool/postfix/pid/master.pid) failed: No such file or>
Jan 12 22:32:44 mail.example.jp postfix/master[4075763]: daemon started -- version 3.5.8, configuration /etc/postfix
Jan 12 22:32:44 mail.example.jp systemd[1]: Started Postfix Mail Transport Agent.
[shinichi@kasumi postfix]$

メールを送受信してみる。ヘッダーに

  • ARC-Seal
  • ARC-Message-Signature
  • ARC-Authentication-Results

がつく。また、Authentication-Resultsヘッダーに arc= でARCとしての検証結果がつく。

PostfixでTLSを有効にする

Googleの2024年2月1日からの新しいメールセキュリティポリシーに対応するため、PostfixTLSを有効にする。証明書はLet's Encryptで取得済み。

main.cf

/etc/postfix/main.cf に以下を記載。デフォルトで設定入っているようなので注意。

asmtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.jp/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.jp/privkey.pem
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1

master.cf

/etc/postfix/master.cf を編集。smtpsを有効化(コメント解除)する。

Postfix再起動

postfix checkで文法チェック実施

Postfixを再起動

# postfix check
# systemctl restart postfix
# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2024-01-02 14:42:15 JST; 5s ago
  Process: 3671390 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 3671421 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 3671419 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 3671411 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
  Process: 3671407 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=255)
 Main PID: 3671489 (master)
    Tasks: 3 (limit: 203056)
   Memory: 8.6M
   CGroup: /system.slice/postfix.service
           tq3671489 /usr/libexec/postfix/master -w
           tq3671490 pickup -l -t unix -u
           mq3671491 qmgr -l -t unix -u

 Jan 02 14:42:14 mail.example.jp systemd[1]: Starting Postfix Mail Transport Agent...
 Jan 02 14:42:14 mail.example.jp restorecon[3671407]: /usr/sbin/restorecon: lstat(/var/spool/postfix/pid/master.pid) failed: No such file o>
 Jan 02 14:42:15 mail.example.jp postfix/master[3671489]: daemon started -- version x.y.z, configuration /etc/postfix
 Jan 02 14:42:15 mail.example.jp systemd[1]: Started Postfix Mail Transport Agent.
#

送受信テストを実施して、メール受信とログを確認しておく。

証明書更新時の処理

Let's Encryptで取得した証明書の有効期限は90日なので、定期的に証明書更新処理がお行われる。証明書が更新されたら、Postfix側で再読み込みする必要がある。

Let's Encryptの証明書更新処理は、certobtの更新処理(renew)がsystemdのタイマー機能に登録されている

# systemctl list-timers | grep cert
Tue 2024-01-02 16:50:00 JST  1h 47min left Tue 2024-01-02 03:07:02 JST  11h ago      snap.certbot.renew.timer     snap.certbot.renew.service
#

更新処理は毎日実施されているが、certbotのrenewは証明書の有効期限が30日を切るまでは更新処理を行わない。

certbotが証明書を更新した後にPostfixを再起動するため、

  • /etc/letsencrypt/renewal-hooks/deploy 以下にPostfixを再起動するスクリプトを用意する
  • 用意したスクリプトPostfixが再起動することを確認する
    • systemctl status postfix 、/var/log/maillogから確認しておく
  • /etc/letsencrypt/renewal-hooks/pre 以下にhttpdを停止するスクリプトを置いておく
    • mail.example.jp と www.example.jpの2つの証明書を更新するため、httpdが動いているとmail.example.jpの証明書更新に失敗する
  • certbot renew --force-renew で強制的に証明書を更新し、以下を確認する
    • 証明書が更新されること
    • Postfixが再起動すること
    • httpdが再起動されること

という手順を踏む。

deploy以下のスクリプトは更新する証明書ごと(今回だと2回)に実行されるので、環境変数RENEWED_DOMAINSなどを参照して、対象ドメインの場合のみ再起動するような処理を入れたほうがよい。

まずはdry run

# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/mail.example.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for mail.example.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/www.example.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for www.example.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/mail.example.jp/fullchain.pem (success)
  /etc/letsencrypt/live/www.example.jp/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[root@kasumi letsencrypt]#

続いて、certbot renew --force-renew を実行して確認する。

  • /etc/letsencrypt/live/ 以下の証明書が更新されている
  • Postfix, httpdが再起動されている

事を確認しておく。

Let's Encryptから追加で証明書を取得する

メールサーバでTLSをサポートするにあたり、メールサーバ用に証明書を取得する

現在取得している証明書を確認する

現在、Webサーバ用に証明書を取得している

$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: www.example.jp
    Serial Number: 
    Key Type: RSA
    Domains: www.example.jp
    Expiry Date: YYYY-mm-DD HH:MM:SS+00:00 (VALID: nn days)
    Certificate Path: /etc/letsencrypt/live/www.example.jp/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/www.example.jp/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$

httpdの停止

稼働しているhttpdを一時的に停止します。停止しないと、

Could not bind TCP port 80 because it is already in use by another process on
this system (such as a web server). Please stop the program in question and then
try again.

というエラーが発生します。

メールサーバ用に証明書を取得する

Webサーバ用に証明書を取得しているため、メールアドレスの入力、利用規約の承認などはスキップされます。

$ sudo certbot certonly --standalone -d mail.example.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for mail.example.jp

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.example.jp/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mail.example.jp/privkey.pem
This certificate expires on YYYY-mm-DD
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$

コマンドの出力のとおり、証明書は/etc/letsencrypt/live/mail.example.jp/以下に作成されます。

証明書が生成されていることを確認したら、httpdを起動しておきます。

OpenDKIM

OpenDKIMをインストール・設定してみた

OpenDKIMのインストール

opendkim, opendkim-toolsをインストールする

$ sudo dnf install opendkim
メタデータの期限切れの最終確認: 0:11:52 時間前の 2023年12月10日 20時01分00秒 に実施しました。
依存関係が解決しました。
============================================================================================================================================
 パッケージ                         アーキテクチャー        バージョン                            リポジトリー                        サイズ
============================================================================================================================================
インストール:
 opendkim                           x86_64                  2.11.0-0.34.el8                       ol8_developer_EPEL                  245 k
依存関係のインストール:
 libbsd                             x86_64                  0.11.7-2.el8                          ol8_developer_EPEL                  121 k
 libmd                              x86_64                  1.1.0-1.el8                           ol8_developer_EPEL                   46 k
 libmemcached-libs                  x86_64                  1.0.18-17.el8                         ol8_appstream                       137 k
 libopendkim                        x86_64                  2.11.0-0.34.el8                       ol8_developer_EPEL                   84 k
 opendbx                            x86_64                  1.4.6-21.el8                          ol8_developer_EPEL                   57 k
 sendmail-milter                    x86_64                  8.15.2-34.0.1.el8                     ol8_appstream                        82 k

トランザクションの概要
============================================================================================================================================
インストール  7 パッケージ

ダウンロードサイズの合計: 773 k
インストール後のサイズ: 1.7 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/7): libopendkim-2.11.0-0.34.el8.x86_64.rpm                                                                48 kB/s |  84 kB     00:01
(2/7): libmd-1.1.0-1.el8.x86_64.rpm                                                                          22 kB/s |  46 kB     00:02
(3/7): libbsd-0.11.7-2.el8.x86_64.rpm                                                                        52 kB/s | 121 kB     00:02
(4/7): opendbx-1.4.6-21.el8.x86_64.rpm                                                                       42 kB/s |  57 kB     00:01
(5/7): opendkim-2.11.0-0.34.el8.x86_64.rpm                                                                  153 kB/s | 245 kB     00:01
(6/7): libmemcached-libs-1.0.18-17.el8.x86_64.rpm                                                            91 kB/s | 137 kB     00:01
(7/7): sendmail-milter-8.15.2-34.0.1.el8.x86_64.rpm                                                          49 kB/s |  82 kB     00:01
--------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                        160 kB/s | 773 kB     00:04
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                    1/1
  インストール中   : sendmail-milter-8.15.2-34.0.1.el8.x86_64                                                                           1/7
  scriptletの実行中: sendmail-milter-8.15.2-34.0.1.el8.x86_64                                                                           1/7
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.1.2.el8uek.x86_64.conf:6: hwcap directive ignored
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.7.4.el8uek.x86_64.conf:6: hwcap directive ignored

  インストール中   : libmemcached-libs-1.0.18-17.el8.x86_64                                                                             2/7
  インストール中   : opendbx-1.4.6-21.el8.x86_64                                                                                        3/7
  インストール中   : libmd-1.1.0-1.el8.x86_64                                                                                           4/7
  インストール中   : libbsd-0.11.7-2.el8.x86_64                                                                                         5/7
  インストール中   : libopendkim-2.11.0-0.34.el8.x86_64                                                                                 6/7
  scriptletの実行中: opendkim-2.11.0-0.34.el8.x86_64                                                                                    7/7
  インストール中   : opendkim-2.11.0-0.34.el8.x86_64                                                                                    7/7
  scriptletの実行中: opendkim-2.11.0-0.34.el8.x86_64                                                                                    7/7
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.1.2.el8uek.x86_64.conf:6: hwcap directive ignored
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.7.4.el8uek.x86_64.conf:6: hwcap directive ignored

  検証             : libbsd-0.11.7-2.el8.x86_64                                                                                         1/7
  検証             : libmd-1.1.0-1.el8.x86_64                                                                                           2/7
  検証             : libopendkim-2.11.0-0.34.el8.x86_64                                                                                 3/7
  検証             : opendbx-1.4.6-21.el8.x86_64                                                                                        4/7
  検証             : opendkim-2.11.0-0.34.el8.x86_64                                                                                    5/7
  検証             : libmemcached-libs-1.0.18-17.el8.x86_64                                                                             6/7
  検証             : sendmail-milter-8.15.2-34.0.1.el8.x86_64                                                                           7/7

インストール済み:
  libbsd-0.11.7-2.el8.x86_64  libmd-1.1.0-1.el8.x86_64        libmemcached-libs-1.0.18-17.el8.x86_64   libopendkim-2.11.0-0.34.el8.x86_64
  opendbx-1.4.6-21.el8.x86_64 opendkim-2.11.0-0.34.el8.x86_64 sendmail-milter-8.15.2-34.0.1.el8.x86_64

完了しました!
$ sudo dnf install opendkim-tools
メタデータの期限切れの最終確認: 0:27:39 時間前の 2023年12月10日 20時01分00秒 に実施しました。
依存関係が解決しました。
============================================================================================================================================
 パッケージ                        アーキテクチャー          バージョン                         リポジトリー                          サイズ
============================================================================================================================================
インストール:
 opendkim-tools                    x86_64                    2.11.0-0.34.el8                    ol8_developer_EPEL                     85 k

トランザクションの概要
============================================================================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 85 k
インストール後のサイズ: 201 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
opendkim-tools-2.11.0-0.34.el8.x86_64.rpm                                                                    49 kB/s |  85 kB     00:01
--------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                         49 kB/s |  85 kB     00:01
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                    1/1
  インストール中   : opendkim-tools-2.11.0-0.34.el8.x86_64                                                                              1/1
  scriptletの実行中: opendkim-tools-2.11.0-0.34.el8.x86_64                                                                              1/1
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.1.2.el8uek.x86_64.conf:6: hwcap directive ignored
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2011.7.4.el8uek.x86_64.conf:6: hwcap directive ignored

  検証             : opendkim-tools-2.11.0-0.34.el8.x86_64                                                                              1/1

インストール済み:
  opendkim-tools-2.11.0-0.34.el8.x86_64

完了しました!
$

DKIM署名用の鍵作成

作成先ディレクトリを/etc/opendkim/keys 以下に作成する。

$ sudo mkdir /etc/opendkim/keys/example.jp
$

opendkim-genkeyで鍵ファイルを作成する

 sudo /usr/sbin/opendkim-genkey -v -b 2048 -D /etc/opendkim/keys/example.jp -d example.jp -s 20231210
opendkim-genkey: generating private key
opendkim-genkey: private key written to 20231210.private
opendkim-genkey: extracting public key
opendkim-genkey: DNS TXT record written to 20231210.txt
$

鍵ファイルのowner/groupをopendkim:opendkimに変更する(作成時点では root:root)

$ sudo chown opendkim:opendkim /etc/opendkim/keys/example.jp/20231210.private
$ sudo chown opendkim:opendkim /etc/opendkim/keys/example.jp/20231210.txt
$

DNSレコード登録

DKIMの公開鍵を セレクタ名._domainkey.example.jp. に登録する。

登録後、権威DNSサーバに対して公開鍵レコードの問い合わせを行い、設定した値が返って来ることを確認する。

OpenDKIMの設定

/etc/opendkim.conf を変更する。

39c39
< Mode  v
---
> Mode  sv
99c99
< KeyFile       /etc/opendkim/keys/default.private
---
> #KeyFile      /etc/opendkim/keys/default.private
104c104
< # KeyTable    /etc/opendkim/KeyTable
---
> KeyTable      /etc/opendkim/KeyTable
109c109
< # SigningTable        refile:/etc/opendkim/SigningTable
---
> SigningTable  refile:/etc/opendkim/SigningTable
113c113
< # ExternalIgnoreList  refile:/etc/opendkim/TrustedHosts
---
> ExternalIgnoreList    refile:/etc/opendkim/TrustedHosts
116c116
< # InternalHosts       refile:/etc/opendkim/TrustedHosts
---
> InternalHosts refile:/etc/opendkim/TrustedHosts

次に

  • /etc/opendkim/KeyTable に秘密鍵情報
  • /etc/opendkim/SigningTable に署名を行うドメイン
  • /etc/opendkim/TrustedTable にメール送信を行うホストのIPアドレス

を記載します。なお、/etc/opendkim 以下のファイルのowner/groupはopendkim/opendkimとなるようにする。

その後、OpenDKIMを起動する。

# systemctl start opendkim
# systemctl status opendkim
● opendkim.service - DomainKeys Identified Mail (DKIM) Milter
   Loaded: loaded (/usr/lib/systemd/system/opendkim.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-12-10 21:21:14 JST; 4s ago
     Docs: man:opendkim(8)
           man:opendkim.conf(5)
           man:opendkim-genkey(8)
           man:opendkim-genzone(8)
           man:opendkim-testadsp(8)
           man:opendkim-testkey
           http://www.opendkim.org/docs.html
 Main PID: 2859618 (opendkim)
    Tasks: 3 (limit: 203056)
   Memory: 1.5M
   CGroup: /system.slice/opendkim.service
           mq2859618 /usr/sbin/opendkim -f -x /etc/opendkim.conf

12月 10 21:21:14 kasumi.s14n.org systemd[1]: Started DomainKeys Identified Mail (DKIM) Milter.
12月 10 21:21:14 kasumi.s14n.org opendkim[2859618]: OpenDKIM Filter v2.11.0 starting (args: -f -x /etc/opendkim.conf)
#

起動確認が取れたら、OpenDKIMが自動起動するように設定しておく(systemctl enable opendkim)

Postfix設定

PostfixとOpenDKIMを連携させる。

  • milterにOpenDKIMを追加する
    • smtpd_milters
    • non_smtp_milters
  • milterのデフォルトの挙動を指定する
    • milter_default_action
  • ユーザpostfixをopendkimグループに追加しておく
    •  /run/opendkim/opendkim.sock 経由で接続するため

 

SVM data mobilityを試してみた

SVM Data Mobility調査 - しろぺん日記でまとめた後、実際に試す環境を用意できたのでやってみた。

環境

SVM data mobilityを試した環境は以下

機材 AFF C190 FAS 8200
ONTAP 9.12.1P4 9.12.1P4

移行対象のSVMには100GBのvolumeを1つ作って、約15GBのデータを入れておきました。

前提条件確認

cluster peer関係

ソース・デスティネーションクラスタ間でcluster peer関係を構築しておきます。構築後、cluster peer showコマンドで確認します

ontap1::> cluster peer show
Peer Cluster Name         Cluster Serial Number Availability   Authentication
------------------------- --------------------- -------------- --------------
ontap2                    x-xx-xxxxxx           Available      ok
1 entries were displayed.
 
ontap1::>

ライセンス確認

ソースデスティネーションとデスティネーションクラスタ両方にData Protection Bundleライセンスがインストールされている必要があります。

最近は「ONTAP One」というすべての機能が包括されたオールインワンライセンスになっているので、通常は気にする必要はないでしょう(ONTAP Baseを選択している場合は別途購入が必要)。

system license show-statusコマンドで、SnapMirror、SnapMirror Synchronous、SnapVaultが有効になっていればよいです

ONTAPバージョン

AFF-Aシリーズ、AFF-Cシリーズ、FASSVM data mobilityをサポートするONTAPのバージョンが異なります。ONTAP 9.12.1P4以降なら、AFF-A/AFF-C/FASどれでもサポートされます。

ソースクラスタ・デスティネーションクラスタそれぞれでノードのONTAPバージョンは同じである必要があります(通常運用している場合はほぼないかと思います)。

デスティネーションクラスタのONTAPバージョンはソースクラスタと同じか、メジャーバージョンが2世代後以内のONTAPバージョンである必要があります。ONTAPバージョンのメジャーバージョンが異なると、SVMを双方向に移行できないので、ONTAPのメジャーバージョンはそろえておいたほうがよいです。

data LIF用ネットワーク

ソースクラスタとデスティネーションクラスタで、移行対象SVMのdata LIFが利用するネットワークへの疎通が取れる必要があります。

その他

  • ソースクラスタとデスティネーションクラスタ間の最大RTT
    • ONTAP 9.11.1までは2ms
    • ONTAP 9.12.1以降は10ms
  • デスティネーションクラスタのアグリゲートに十分な空き容量がある
  • SVMのボリューム数

にも制限があります。

やってみる

事前確認

作業はデスティネーションクラスタ側で実施します。

vserver migrate startコマンドに--check-only trueを指定することで、事前確認を実施することができます。

ontap2::> vserver migrate start -vserver svm-test -source-cluster ontap1 -check-only true
 
Error: command failed: There are no network ports on the destination cluster "ontap2" where reachability is confirmed for the following IP addresses: 192.168.1.111
 
ontap2::> vserver migrate start -vserver svm-test -source-cluster ontap1 -ipspace IPSPACE1 -check-only true
 
Info: Vserver migrate checks finished successfully. Vserver migrate can be started now.
 
ontap2::>

上記にある通り、移行対象SVMのdata LIFが所属しているIPSPACEを指定しなかった場合、疎通確認に失敗して、事前確認がエラーとなります。

移行

事前確認で問題ないことを確認後、実際に移行を行います。

ontap2::> vserver migrate start -vserver svm-test -source-cluster ontap1 -ipspace IPSPACE1
 
Info: To check the status of the migrate operation use the "vserver migrate show" command.
 
ontap2::> vserver migrate show
                 Destination         Source
Vserver          Cluster             Cluster             Status
---------------- ------------------- ------------------- ---------------------
svm-test         ontap2              ontap1              setup-configuration
 
 
ontap2::>

vserver migrate showに-instanceオプションをつけると、詳細が表示されます。ただし、進捗はステータスのみで、%表示はないです(なので、時間予測が難しい)。

デフォルトでは、転送→カットオーバー→クリーンアップまで自動で実施されますが、カットオーバーとクリーンアップを手動で行うことも可能です。

移行中および後のSVMへのアクセスは、

  • NFSマウントは維持されている
  • SVMが提供しているボリュームへの書き込みは約50秒停止
    • 1秒間隔で書き込みしていたところ、カットオーバー開始から遅延発生
  • NFSクライアントからのping監視は1回だけ落ちた

という状態でした。

snapshot関連では、

  • SVM内のボリュームで取得していたsnapshotは一緒に移行される
  • snapshotポリシーも移行される
  • job scheduleは移行したSVMに紐づく形で移行される

ことを確認しています。

 

 

VMware Virtual Watchdog Timerを試してみる

OSハングアップ時に強制再起動させたい、という要望が出てきたので、Virtual Watchdog Timer(VWDT)を試してみる

環境

VWDT追加

要件を満たしているかを確認

問題ない場合は、仮想マシンをパワーオフする

「アクション」→「設定の編集」を選択し、「新規デバイスを追加」から「ウォッチドッグ タイマー」を選択する

バイス追加後、「BIOS/EFIブートでの起動」にチェックを入れる(チェックを入れることで、VMが電源ONになるとすぐにwatchdogが開始される)。

仮想マシンを起動し、デバイスが作成されていることと、watchdog moduleがインストールされていることを確認する

[ ~]$ ls -la /dev/watchdog
crw-------. 1 root root 10, 130  8月  8 20:50 /dev/watchdog
[ ~]$ lsmod | grep wdat
wdat_wdt               13590  1
[ ~]$

 

watchdogインストール

yumコマンド(CentOS 7なので)でwatchdog packageをインストールする。今回はwatchdog-5.13-12.el7.x86_64をインストールした。

[~]# env LANG=C sudo yum info watchdog
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Available Packages
Name        : watchdog
Arch        : x86_64
Version     : 5.13
Release     : 12.el7
Size        : 79 k
Repo        : base/7/x86_64
Summary     : Software and/or Hardware watchdog daemon
URL         : http://sourceforge.net/projects/watchdog/
License     : GPLv2+
Description : The watchdog program can be used as a powerful software watchdog daemon
            or may be alternately used with a hardware watchdog device such as the
            : IPMI hardware watchdog driver interface to a resident Baseboard
            : Management Controller (BMC).  watchdog periodically writes to /dev/watchdog;
            : the interval between writes to /dev/watchdog is configurable through settings
            : in the watchdog sysconfig file.  This configuration file is also used to
            : set the watchdog to be used as a hardware watchdog instead of its default
            : software watchdog operation.  In either caseif the device is open but not
            : written to within the configured time period, the watchdog timer expiration
            : will trigger a machine reboot. When operating as a software watchdog, the
            : ability to reboot will depend on the state of the machine and interrupts.
            : When operating as a hardware watchdog, the machine will experience a hard
            : reset (or whatever action was configured to be taken upon watchdog timer
            : expiration) initiated by the BMC.
 
[~]# env LANG=C yum install watchdog
(snip)
Resolving Dependencies
--> Running transaction check
---> Package watchdog.x86_64 0:5.13-12.el7 will be installed
--> Finished Dependency Resolution
 
Dependencies Resolved
 
============================================================================================================================================
 Package                           Arch                            Version                              Repository                     Size
============================================================================================================================================
Installing:
 watchdog                          x86_64                          5.13-12.el7                          base                           79 k
 
Transaction Summary
============================================================================================================================================
Install  1 Package
 
Total download size: 79 k
Installed size: 160 k
Is this ok [y/d/N]: y
Downloading packages:
watchdog-5.13-12.el7.x86_64.rpm                                                                                      |  79 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Installing : watchdog-5.13-12.el7.x86_64                                                                                              1/1
  Verifying  : watchdog-5.13-12.el7.x86_64                                                                                              1/1
 
Installed:
  watchdog.x86_64 0:5.13-12.el7
 
Complete!
[~]# rpm -qa | grep watchdog
watchdog-5.13-12.el7.x86_64
[~]#

インストール後、watchdog serviceを起動する

[~]# env LANG=C systemctl status watchdog
* watchdog.service - watchdog daemon
   Loaded: loaded (/usr/lib/systemd/system/watchdog.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[~]# env LANG=C systemctl enable watchdog
Created symlink from /etc/systemd/system/multi-user.target.wants/watchdog.service to /usr/lib/systemd/system/watchdog.service.
[~]# env LANG=C systemctl start watchdog
[~]# env LANG=C systemctl status watchdog
* watchdog.service - watchdog daemon
   Loaded: loaded (/usr/lib/systemd/system/watchdog.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2023-08-08 20:54:49 JST; 2s ago
  Process: 2748 ExecStart=/usr/sbin/watchdog (code=exited, status=0/SUCCESS)
 Main PID: 2750 (watchdog)
   CGroup: /system.slice/watchdog.service
           `-2750 /usr/sbin/watchdog
 
Aug 08 20:54:49 XXX systemd[1]: Starting watchdog daemon...
Aug 08 20:54:49 XXX watchdog[2750]: starting daemon (5.13):
Aug 08 20:54:49 XXX watchdog[2750]: int=1s realtime=yes sync=no soft=no mla=0 mem=0
Aug 08 20:54:49 XXX watchdog[2750]: ping: no machine to check
Aug 08 20:54:49 XXX watchdog[2750]: file: no file to check
Aug 08 20:54:49 XXX watchdog[2750]: pidfile: no server process to check
Aug 08 20:54:49 XXX watchdog[2750]: interface: no interface to check
Aug 08 20:54:49 XXX watchdog[2750]: test=none(0) repair=none(0) alive=none heartbeat=none temp=none to=root no_act=no
Aug 08 20:54:49 XXX systemd[1]: Started watchdog daemon.
[~]#

watchdogの設定ファイルを調整する。設定ファイルは/etc/watchdog.confにある。設定したのは以下。

watchdog-device        = /dev/watchdog
watchdog-timer  = 10

変更後、watchdog serviceを再起動しておく

vCenterからもwatchdogが動いていることを確認する

動作確認

実際に仮想マシンをハングアップさせて、VWDTによる仮想マシン再起動が発生するかを確認する。

RHEL/CentOSでは echo c > /proc/sysrq-triggerを実行すると、即時再起動してしまうので、この方法は使えない(「kernel.panic = 0」であるにもかかわらず、カーネルパニック後にシステムが再起動する - Red Hat Customer Portal参照)。

Linuxのテスト用に、ハングアップやパニック状態にするカーネルモジュールを作ってみた - のぴぴのメモで紹介されていたGitHub - Noppy/HangAndPanicKernelModule: Hang_and_panic module causes a hang condition or a panic condition.を利用して、ハングアップさせてみる。

[~]# cat /proc/hang_panic
<<Hang&Panic module>>
'echo c > /proc/hang_panic' >>> panic
'echo h > /proc/hang_panic' >>> hang(disable local irq and preempt)
'echo H > /proc/hang_panic' >>> hang(disable only local irq)
[~]# date;echo h > /proc/hang_panic
2023年  8月  9日 水曜日 13:36:19 JST

しばらくすると、再起動していた

[~]$ env LANG=C date
Wed Aug  9 13:48:28 JST 2023
[~]$ uptime
 13:48:29 up 11 min,  1 user,  load average: 0.00, 0.01, 0.03
[~]$

vmware.logを確認する。VWDTによって再起動していることがわかる

2023-08-09T04:37:05.022Z In(05) vmx - VigorTransportProcessClientPayload: opID=lro-1925252931-10ca8c3a-01-01-69-503d seq=6902: Receiving GuestStats.SetNotificationTime request.
2023-08-09T04:37:05.022Z In(05) vmx - VigorTransport_ServerSendResponse opID=lro-1925252931-10ca8c3a-01-01-69-503d seq=6902: Completed GuestStats request.
2023-08-09T04:37:19.716Z No(00) vmx - ConfigDB: Setting vwdt.watchdogFired = "TRUE"
2023-08-09T04:37:19.723Z In(05) vmx - VWDT: Resetting VM since watchdog fired.
2023-08-09T04:37:19.725Z In(05) vcpu-0 - Destroying virtual dev for scsi0:0 vscsi=450399446371412041
2023-08-09T04:37:19.725Z In(05) vcpu-0 - VMMon_VSCSIStopVports: No such target on adapter
2023-08-09T04:37:19.735Z In(05) vcpu-0 - DEVICE: Resetting device 'ALL'.
2023-08-09T04:37:19.735Z In(05) vcpu-0 - Tools: ToolsRunningStatus_Reset, delayedRequest is 0x0
2023-08-09T04:37:19.736Z In(05) vcpu-0 - Tools: Changing running status: 1 => 0.
2023-08-09T04:37:19.736Z In(05) vcpu-0 - Tools: [RunningStatus] Last heartbeat value 9091 (last received 0s ago)
2023-08-09T04:37:19.736Z In(05) vcpu-0 - GuestLib Generated SessionId 7805150419715780647

おしまい。

参考

SVM Data Mobility調査

ONTAPを9.12.1P3/9.12.1P4 (途中でP4が出ていることを知ったのでpatch levelが異なる)にしたので、SVM Data Mobility(旧 SVM Migrate)を試すべく、資料を探している。 

SVM data mobilityについて

  • SVMとは
    • 1つまたは複数の論理インタフェース(LIF)から、LUNやNASネームスペースへのデータアクセスを提供する論理ストレージサーバ
    • HAペアをまたいでボリュームを構成可能
    • SVM-DR利用可能
  • SVMの移行はSnapMirrorでバックグラウンド処理できるが、切り替えは停止が必要
  • SVM-DRによる移動は停止を伴う

SVM data mobilityはSVMクラスタ間で移動できるようにする機能。非常に短い(サービスへの)影響時間で移行が可能。

前提条件

  • source/destination clusterでcluster peer関係にある
  • source/destination cluster両方にData Protection Bundleライセンスがインストールされている
  • source clusterはONTAP 9.10.1以降
  • destination clusterはsource clusterと同じかECV(Effective Cluster Version)の差が2つ以内で新しいもの
  • source/destination clusterで、データLIF用に同じL2 network, VLAをサポートしている
  • RTTが10ms(9.12.1~) or 2ms (~9.11.1)未満
  • destination clusterに空き容量がある

cut over時のオプション

  • check-only
    • pre-checkのみを実施して、SVM data mobilityが実行可能かどうかの確認を行う
  • auto-cutover
    • 移行完了時に自動cut overするかどうか。defaultはtrue
  • auto-source-clearnup
    • cut over後にsource cluster上のSVMを自動削除するかどうか。defaultはtrue

リンク

おまけ

ONTAP 9.12.1P4にアップグレードする・したときに発生する事象について。