はじめに
CS部のくつなりょうすけです。こんにちは。
GMailやYahoo!メールが1日5,000通以上のメールを送信してくる場合の制限が2024年2月1日から適用されるそうです。 DKIMやSPFなどでの対応を求められており、業界でも話題になっていることはご存じかと思います。
この記事は、その必須対応の中の、DKIMについて、Amazon Linux 2023でSMTPサーバ運用・メール送信している場合のopendkimパッケージ構築方法を示すものです。
AWSではEC2でメールサーバを構築していても、Amazon SESを使いDKIMを有効にすれば比較的容易に対応は可能です。 ここはあえてEC2で、Amazon Linux 2023でSMTP運用しているし、Amazon SESを使えない環境向けの話題を扱います。
方針
SMTPサーバのフィルタとしてメールの署名や検証を行うopendkimパッケージをAmazon Linux 2023でビルドしてインストールします。 postfixやRoute53、オンプレDNSへの公開鍵登録はさらっと流します。
opendkimパッケージは、有志が運用しているFedoraプロジェクトのRHEL9用EPELから取得します。 なるべく純粋にビルドさせることを目標としますが、動作環境によって必要ない機能だったり作業時間等を理由にサポートしない機能を削除することも例として出します。
ちなみに、RHEL8/9でもopendkimは含まれておりません。(EPELには含まれています。つまりredhatのサポート対象ではありません。)
opendkimをビルドするためのAmazon Linux 2023(以下「ビルド用AL2023」)と、運用で利用するAmazon Linux 2023(以下「運用AL2023」)は別のEC2として用意する想定です。
注意: OpenDKIM、SMTPサーバの設定はこの記事ではほとんど書いてません。
opendkimパッケージビルド
ビルド環境構築
ビルド用AL2023を用意し、ログインしてビルドツールをインストールします。以下のコマンドのように rpm-build パッケージをインストールします。
$ sudo dnf install rpm-build
opendpkimをビルドする
ビルド用AL2023でopendkimのソースRPMをダウンロードします。ブラウザでは以下でアクセスできます。 https://docs.fedoraproject.org/en-US/epel/
コマンドラインで以下のように作業ディレクトリを作成、ソースRPMをダウンロードしてビルドを始めます。
$ mkdir -p ~/rpms/SRPMS $ cd ~/rpms/SRPMS $ curl https://dl.fedoraproject.org/pub/epel/9/Everything/source/tree/Packages/o/opendkim-2.11.0-0.36.el9.src.rpm -O opendkim-2.11.0-0.36.el9.src.rpm $ rpmbuild --rebuild opendkim-2.11.0-0.36.el9.src.rpm (snip) error: Failed build dependencies: libbsd is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 libbsd-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 libdb-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 libmemcached-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 libtool is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 lua-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 make is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 opendbx-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 openldap-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 openssl-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64 sendmail-milter-devel is needed by opendkim-2.11.0-0.36.amzn2023.x86_64
ビルドするために必要なパッケージが不足している、というエラーが出てきていますが想定内です。 libdb-develやopenldap-develなどは内部で利用するライブラリですので必要なのはわかります。
opendbx-develはPostgreSQLやMySQL、SqliteなどのDBについて同じようにアクセスできるライブラリです。 opendkimではこれらのDBにデータを入れて参照する機能があります。利用する場合は必須ライブラリになります。
ではこれらのビルドするのに必要な依存パッケージをインストールしておきます。
$ sudo dnf install libbsd libbsd-devel libdb-devel libmemcached-devel \ libtool lua-devel make opendbx-devel openldap-devel \ openssl-devel sendmail-milter-devel Last metadata expiration check: 0:10:47 ago on Thu Jan 25 08:12:25 2024. No match for argument: opendbx-devel
opendbx-develはAmazon Linux 2023のリポジトリには含まれていないようでインストールができませんでした。 opendbx-devel以外のパッケージはインストールしちゃいましょう。
(脱線1) opendbx-develをなんとかする
OpenDBXは複数のDBへのアクセスを容易にするライブラリです。(https://www.linuxnetworks.de/doc/index.php/OpenDBX) RHEL9用EPELにopendbxのソースRPMがありましたのでビルドを試みましょう。
以下のようにダウンロードしてビルドを始めてみます。
$ curl https://dl.fedoraproject.org/pub/epel/9/Everything/source/tree/Packages/o/opendbx-1.4.6-31.el9.src.rpm -O opendbx-1.4.6-31.el9.src.rpm $ rpmbuild --rebuild opendbx-1.4.6-31.el9.src.rpm (snip) error: Failed build dependencies: docbook2X is needed by opendbx-1.4.6-31.amzn2023.x86_64 doxygen is needed by opendbx-1.4.6-31.amzn2023.x86_64 firebird-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 freetds-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 gcc-c++ is needed by opendbx-1.4.6-31.amzn2023.x86_64 libpq-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 mariadb-connector-c-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 ncurses-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 readline-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 sqlite-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64 sqlite2-devel is needed by opendbx-1.4.6-31.amzn2023.x86_64
OpenDBXの性格上、DB関連の依存パッケージが不足していることがわかります。 Amazon Linux 2023で対応できるならばそのままビルドできることが望ましいので、ビルド依存パッケージをインストールしていきます。
$ sudo dnf install docbook2X doxygen firebird-devel freetds-devel \ gcc-c++ libpq-devel mariadb-connector-c-devel \ ncurses-devel readline-devel sqlite-devel sqlite2-devel Last metadata expiration check: 0:10:47 ago on Thu Jan 25 08:12:25 2024. No match for argument: firebird-devel No match for argument: freetds-devel No match for argument: sqlite2-devel
おっと。firebird-develとfreetds-devel、sqlite2-develがAmazon Linux 2023には入ってなかったようです。 Firebirdは歴史あるInterBaseを元にしたOSSのRDBMSです。これはビルドしようとするとちょっと手間そうですね。
FreeTDSはMicrosoft SQL ServerやSybaseデータベースへ接続するためのライブラリです。(https://www.freetds.org/) 接続ライブラリ程度であれば、ソースRPMがあれば対応できそうです。
sqlite2はAmazon Linux 2023では sqlite3 に置き換わり、すでに含まれていません。 こちらは微調整が必要そうです。
(脱線2) freetds-develをなんとかする。
FreeTDSはMicrosoft SQL ServerやSybaseデータベースへ接続するためのライブラリです。 こちらもRHEL9用EPELにソースRPMがありましたので同じようにビルドしましょう。
$ curl https://dl.fedoraproject.org/pub/epel/9/Everything/source/tree/Packages/f/freetds-1.3.3-1.el9.src.rpm -O freetds-1.3.3-1.el9.src.rpm $ rpmbuild --rebuild freetds-1.3.3-1.el9.src.rpm error: Failed build dependencies: docbook-style-dsssl is needed by freetds-1.3.3-1.amzn2023.x86_64 gnutls-devel is needed by freetds-1.3.3-1.amzn2023.x86_64 krb5-devel is needed by freetds-1.3.3-1.amzn2023.x86_64 libgcrypt-devel is needed by freetds-1.3.3-1.amzn2023.x86_64 unixODBC-devel is needed by freetds-1.3.3-1.amzn2023.x86_64
同じようにビルド依存パッケージがありましたので、Amazon Linux 2023でインストールを試みます。
$ sudo dnf install docbook-style-dsssl gnutls-devel krb5-devel libgcrypt-devel unixODBC-devel
上記はうまくいきました。ではビルドを再開してみましょう。
$ rpmbuild --rebuild freetds-1.3.3-1.el9.src.rpm $ sudo rpm -ivh /home/ec2-user/rpmbuild/RPMS/x86_64/freetds-devel-1.3.3-1.amzn2023.x86_64.rpm /home/ec2-user/rpmbuild/RPMS/x86_64/freetds-libs-1.3.3-1.amzn2023.x86_64.rpm /home/ec2-user/rpmbuild/RPMS/x86_64/freetds-1.3.3-1.amzn2023.x86_64.rpm
freetdsのビルドが無事終わったので、作成されたパッケージをインストールしました。
(脱線3) firebird-develをなんとかする。
Firebirdは歴史あるInterBaseを元にしたOSSのRDBMSです。 こちらもRHEL9用EPELにソースRPMがありましたので同じようにビルドしましょう。
$ curl https://dl.fedoraproject.org/pub/epel/9/Everything/source/tree/Packages/f/firebird-4.0.0.2496-2.el9.src.rpm -O firebird-4.0.0.2496-2.el9.src.rpm $ rpmbuild --rebuild firebird-4.0.0.2496-2.el9.src.rpm error: Failed build dependencies: chrpath is needed by firebird-4.0.0.2496-2.amzn2023.x86_64 libedit-devel is needed by firebird-4.0.0.2496-2.amzn2023.x86_64 libicu-devel is needed by firebird-4.0.0.2496-2.amzn2023.x86_64 libstdc++-static is needed by firebird-4.0.0.2496-2.amzn2023.x86_64 libtomcrypt-devel is needed by firebird-4.0.0.2496-2.amzn2023.x86_64 libtommath-devel is needed by firebird-4.0.0.2496-2.amzn2023.x86_64 procmail is needed by firebird-4.0.0.2496-2.amzn2023.x86_64
例によってビルド依存パッケージがありましたので対応してみます。
$ sudo dnf install chrpath libedit-devel libicu-devel libstdc++-static \ libtomcrypt-devel libtommath-devel procmail $ rpmbuild --rebuild firebird-4.0.0.2496-2.el9.src.rpm
ビルド依存パッケージはインストールできましたが、ビルドしてみると、闇の深そうなエラーがでたのであきらめることにします。(エラーメッセージは省略)
(脱線1に復帰) OpenDBXをも一度なんとかする。
OpenDBXは、いくつかのDBへのアクセスを容易にするパッケージですが、FirebirdとSqlite2をサポートしないように設定すればビルドは容易に通りそうです。 もちろんFirebirdやSqlite2に極端に依存する運用環境では利用できないopendbxパッケージができることは覚悟する必要があります。
まずはソースRPMを展開します。 展開するディレクトリを ~/rpms/SOURCES とします。このディレクトリにrpm2cpioとcpioコマンドを利用して展開します。
$ mkdir ~/rpms/SOURCES $ cd ~/rpms/SOURCES $ rpm2cpio ../SRPMS/opendbx-1.4.6-31.el9.src.rpm | cpio -id 1471 blocks
展開されたディレクトリにはopendbxのソースアーカイブ、パッチやSPECファイルが配置されます。 「opendbx.spec」というSPECファイルがRPMを作成するための設計図です。dockerfileみたいなものです。(例が極端)
このSPECファイルにはビルドするためのオプション指定などが含まれます。
ここでは、firebirdとsqlite2を使わないでビルドするようにしちゃいます。 opendbx.specを編集してビルドが通るようにします。
もう一つ。ビルドし始めると「sqlite.hがない」とエラーが出ました。 Amazon Linux 2023ではsqlite3が入ってるのでconfigureからsqliteの指定をなくします。
出来た差分がこちらになります。 (-から始まるのは削除された行、+から始まるのは追加された行です)
ポイントはfirebirdに関連するパッケージの指定の削除、firebird向けビルドオプションの削除、sqlite2固有の指定の修正です。
1 --- opendbx.spec.bak 2024-01-25 09:21:15.441852631 +0000 2 +++ opendbx.spec 2024-01-25 09:26:40.652864486 +0000 3 @@ -17,12 +17,9 @@ 4 5 6 BuildRequires: make 7 -%if 0%{?fedora} || 0%{?rhel} <= 7 8 -BuildRequires: sqlite2-devel 9 -%endif 10 BuildRequires: gcc-c++ 11 BuildRequires: gcc 12 -BuildRequires: mariadb-connector-c-devel, libpq-devel, sqlite-devel, firebird-devel, readline-devel 13 +BuildRequires: mariadb-connector-c-devel, libpq-devel, sqlite-devel, readline-devel 14 BuildRequires: freetds-devel, ncurses-devel 15 BuildRequires: doxygen, docbook2X, gettext 16 17 @@ -60,15 +57,6 @@ 18 %description postgresql 19 Allows odbx_init with "pgsql" as the backend parameter. 20 21 -%if 0%{?fedora} || 0%{?rhel} <= 7 22 -%package sqlite2 23 -Summary: SQLite 2 backend - provides sqlite2 support in %{name} 24 -Requires: %{name}%{?_isa} = %{version}-%{release} 25 - 26 -%description sqlite2 27 -Allows odbx_init with "sqlite" as the backend parameter. 28 -%endif 29 - 30 %package sqlite 31 Summary: SQLite 3 backend - provides sqlite3 support in %{name} 32 Requires: %{name}%{?_isa} = %{version}-%{release} 33 @@ -76,13 +64,6 @@ 34 %description sqlite 35 Allows odbx_init with "sqlite3" as the backend parameter. 36 37 -%package firebird 38 -Summary: Firebird backend - provides firebird support in %{name} 39 -Requires: %{name}%{?_isa} = %{version}-%{release} 40 - 41 -%description firebird 42 -Allows odbx_init with "firebird" as the backend parameter. 43 - 44 %package mssql 45 Summary: MSSQL backend - provides mssql support in %{name} 46 Requires: %{name}%{?_isa} = %{version}-%{release} 47 @@ -118,9 +99,9 @@ 48 %build 49 export CXXFLAGS="-std=c++14 $RPM_OPT_FLAGS" 50 %if 0%{?fedora} || 0%{?rhel} <= 7 50 %if 0%{?fedora} || 0%{?rhel} <= 7 51 -%configure --with-backends="mysql pgsql sqlite sqlite3 firebird mssql sybase" CPPFLAGS="-I%{_includedir}/mysql -I%{_includedir}/firebird" --disable-test --disable-static LDFLAGS="-L%{_libdir}/mysql" 52 +%configure --with-backends="mysql pgsql sqlite3 mssql sybase" CPPFLAGS="-I%{_includedir}/mysql" --disable-test --disable-static LDFLAGS="-L%{_libdir}/mysql" 53 %else 54 -%configure --with-backends="mysql pgsql sqlite3 firebird mssql sybase" CPPFLAGS="-I%{_includedir}/mysql -I%{_includedir}/firebird" --disable-test --disable-static LDFLAGS="-L%{_libdir}/mysql" 55 +%configure --with-backends="mysql pgsql sqlite3 mssql sybase" CPPFLAGS="-I%{_includedir}/mysql" --disable-test --disable-static LDFLAGS="-L%{_libdir}/mysql" 56 %endif 57 sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool 58 sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool 59 @@ -157,20 +138,10 @@ 60 %{_libdir}/opendbx/*pgsql*.so 61 %{_libdir}/opendbx/*pgsql*.so.* 62 63 -%if 0%{?fedora} || 0%{?rhel} <= 7 64 -%files sqlite2 65 -%{_libdir}/opendbx/*sqlitebackend.so 66 -%{_libdir}/opendbx/*sqlitebackend.so.* 67 -%endif 68 - 69 %files sqlite 70 %{_libdir}/opendbx/*sqlite3backend.so 71 %{_libdir}/opendbx/*sqlite3backend.so.* 72 73 -%files firebird 74 -%{_libdir}/opendbx/*firebird*.so 75 -%{_libdir}/opendbx/*firebird*.so.* 76 - 77 %files mssql 78 %{_libdir}/opendbx/*mssql*.so 79 %{_libdir}/opendbx/*mssql*.so.*
では気を取り直してビルドしてみましょう。
$ rpmbuild -ba opendbx.spec $ sudo rpm -ivh /home/ec2-user/rpmbuild/RPMS/x86_64/opendbx-devel-1.4.6-31.amzn2023.x86_64.rpm /home/ec2-user/rpmbuild/RPMS/x86_64/opendbx-1.4.6-31.amzn2023.x86_64.rpm
あっさり通ったのでopendbxパッケージをインストールします。
OpenDKIM再挑戦
opendkimパッケージをビルドするためのパッケージの準備ができたので、opendkimビルドに再挑戦です。
$ cd ~/rpms/SRPMS/ $ rpmbuild --rebuild opendkim-2.11.0-0.36.el9.src.rpm $ sudo rpm -ivh /home/ec2-user/rpmbuild/RPMS/x86_64/opendkim-2.11.0-0.36.amzn2023.x86_64.rpm /home/ec2-user/rpmbuild/RPMS/x86_64/libopendkim-2.11.0-0.36.amzn2023.x86_64.rpm opendkim-tools-2.11.0-0.36.amzn2023.x86_64.rpm
ビルドができたのでインストールしてみましょう。
稼働確認
稼働用AL2023にRPMを持参し、インストールします。
$ sudo dnf localinstall opendkim-2.11.0-0.36.amzn2023.x86_64.rpm \ libopendkim-2.11.0-0.36.amzn2023.x86_64.rpm \ opendkim-tools-2.11.0-0.36.amzn2023.x86_64.rpm
既に記事が長いのでここからは省略...。
以下手順です。
1) OpenDKIMを設定 2) Route53や利用しているDNSに公開鍵を登録 3) PostfixなどのSMTPサーバを設定 4) opendkimとsmtpサーバを再起動
稼働環境で様子がおかしい場合は以下のようにするとログを見ることができます。
$ sudo journalctl -f -u opendkim $ sudo journalclt -f -u postfix
mailコマンドでメールを送信、受信してみるとDKIMヘッダが付加されていることが確認できました。 opendkimパッケージは無事ビルド、稼働できたようです。
まとめ
- Amazon Linux 2023で利用したいパッケージはRHEL9 EPELから流用することができます。
- ビルドエラーが出る場合は、機能の無効化を SPEC ファイルで指定することができます。
(opendkimのビルドオプションを修正してDBを使わないようにすればもっと簡単にできたかと思いますが、極力修正しないでリビルドすることを目標にしたので見逃してください。)
opendbxビルド時に無効にしたfirebirdやsqlite2のオプションなどはしっかり把握・確認し、今後のアップデートなどでも同様に設定する手順を用意しましょう。
これは大事なことですが、この記事で紹介した方法については弊社や くつなりょうすけ は一切責任を負いません。