Amazon Linux 2023でopendkimを動かしたい。動かしたいの!

記事タイトルとURLをコピーする

はじめに

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/

RHEL9用SRPMダウンロードページ

コマンドラインで以下のように作業ディレクトリを作成、ソース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パッケージは無事ビルド、稼働できたようです。

DKIMタグの確認

まとめ

  • Amazon Linux 2023で利用したいパッケージはRHEL9 EPELから流用することができます。
  • ビルドエラーが出る場合は、機能の無効化を SPEC ファイルで指定することができます。

(opendkimのビルドオプションを修正してDBを使わないようにすればもっと簡単にできたかと思いますが、極力修正しないでリビルドすることを目標にしたので見逃してください。)

opendbxビルド時に無効にしたfirebirdやsqlite2のオプションなどはしっかり把握・確認し、今後のアップデートなどでも同様に設定する手順を用意しましょう。

これは大事なことですが、この記事で紹介した方法については弊社や くつなりょうすけ は一切責任を負いません