Knowledge for WordPress

Knowledge for Google Products

2016年4月8日金曜日

【備忘録】Postfix 3.1.0 with LibreSSL をコンパイルしてインストールしてみた

ちょっと前から新サーバー設定してましたが、年度末、年度明けでバタバタしていて途中で止まっていました。ようやく、postfixの導入まできました。
さて、postfix もソースからコンパイルして導入します。ただし、SSLライブラリに、 LibreSSLを使っており、ネット情報があまりないのでちょっと苦労しました。ので纏めます。

ここではコンパイルしてインストール、とりあえず /etc/init.d/postfix start で起動できるまでにします。各種設定はまた別の機会に

Postfix 3.2.0 + LibreSSL は下記を参考にしてみてください。ちょっとやり方変わっています(2017年3月1日)



パッケージで postfixは入っている

crontabs を yum install crontabs で入れると、もれなく postfix も入っちゃいます。
まぁそれは仕方がないということ、また /etc/init.d/postfix の起動や再起動、停止スクリプトは使えるので、そのまま上書きインストールすることにします。


LibreSSLの導入


これは別途書いているので、入っているものとします。インストールの仕方は下記を参考にしてください。それほど難しくはありません。


libicu の導入

postfix 3.0.0 より、国際化ドメイン(SMTPUTF8)に対応したってことで、これに対応するためには先に入れておく必要があります。 パッケージは古いのでソースから入れます。


より、「ICU4C Source Code Download」より、icu4c-57_1-src.tgz をダウンロードします。あとは

tar -xzvf icu4c-57_1-src.tgz
cd icu/source
./runConfigureICU Linux
make
sudo make install

で、 /usr/local 以下にインストールされます。

有効なっていることの確認(postfixをインストール後にしてください)


ldd /usr/sbin/postfix 
...
libicui18n.so.57 => /usr/local/lib/libicui18n.so.57 (0x*****)
libicuuc.so.57 => /usr/local/lib/libicuuc.so.57 (0x*****)
libicudata.so.57 => /usr/local/lib/libicudata.so.57 (0x******)
...
のように、インストールした icu ライブラリが postfix 実行ファイルに含まれていればOKです。もちろん実際につかうには、postfixの main.cf にて「smtputf8_enable = yes」を有効にする必要があります。
このあたりは、postfixのドキュメントにある「Postfix SMTPUTF8 support」を参考にしてみてください。

※現時点では未検証です。とりあえずインストールできたという備忘録メモなので。

Postfix 3.1.0 を TLSサポート付きでコンパイル!


smtp認証は、Google Apps for Workを使っているので、もう smtp.gmail.com に任せることにして、ここでは入れません。ただし TLS対応にはしておきたいっていう感じです。

http://www.postfix.org/ より postfix-3.1.0.tar.gz をダウンロードし、サーバーへアップ。

tar -xzvf postfix-3.1.0.tar.gz

src/tls/tls.h の修正


これをせずに、TLS利用するオプション付きで makeすると

tls_misc.c: In function 'tls_run_version':
tls_misc.c:984: error: 'OPENSSL_VERSION' undeclared (first use in this function)
tls_misc.c:984: error: (Each undeclared identifier is reported only once
tls_misc.c:984: error: for each function it appears in.)
make: *** [tls_misc.o] Error 1
make: *** [update] Error 1

とエラーがでて止まります。 OPENSSL_VERSION 関数が定義されてないよ!ってことです。これについては、 src/tls/tls.h で OpenSSL 1.1.0 未満の場合のみ定義されていたため、この条件をとりあえず外してあげる必要があるようです。

手動で下記を編集するか、ここのパッチ(postfix-3.1.0-libressl.patch)をダウンロードして、

cd postfix-3.1.0
cat ../postfix-3.1.0-libressl.patch | patch -p0

として修正してください。

patchの中身


--- src/tls/tls.h.org 2016-04-08 15:56:33.000000000 +0900
+++ src/tls/tls.h 2016-04-08 16:40:05.000000000 +0900
@@ -89,12 +89,12 @@ extern const char *str_tls_level(int);
 #endif

  /* Backwards compatibility with OpenSSL < 1.1.0 */
-#if OPENSSL_VERSION_NUMBER < 0x10100000L
+/*#if OPENSSL_VERSION_NUMBER < 0x10100000L*/
 #define OpenSSL_version_num SSLeay
 #define OpenSSL_version SSLeay_version
 #define OPENSSL_VERSION SSLEAY_VERSION
 #define X509_up_ref(x) CRYPTO_add(&((x)->references), 1, CRYPTO_LOCK_X509)
-#endif
+/*#endif*/

 /* SSL_CIPHER_get_name() got constified in 0.9.7g */
 #if OPENSSL_VERSION_NUMBER >= 0x0090707fL /* constification */

手動で変更される方はこちら


#if OPENSSL_VERSION_NUMBER < 0x10100000L と
#endif

の2つの行を下記のようにコメントしてください。
OpenSSLの場合、1.1.0 より以前のみ、OPENSSL_VERSION が定義されていました。
これが LibreSSL の場合 2.2.x なので条件に合致せず定義されないんですよね。

 /* Backwards compatibility with OpenSSL < 1.1.0 */
/* #if OPENSSL_VERSION_NUMBER < 0x10100000L */
 #define OpenSSL_version_num SSLeay
 #define OpenSSL_version SSLeay_version
 #define OPENSSL_VERSION SSLEAY_VERSION
 #define X509_up_ref(x) CRYPTO_add(&((x)->references), 1, CRYPTO_LOCK_X509)
/* #endif */


インストール


make makefiles CCARGS="-DUSE_TLS -I/usr/local/include"  AUXLIBS="-L/usr/local/lib -lssl -lcrypto -lz -ldl"
make
sudo make install

以下、どこに入れるか聞いてきますがデフォルトでいいでしょう。

LibreSSLライブラリを使っていることの確認


ldd /usr/bin/postfix
....
libssl.so.35 => /usr/local/lib/libssl.so.35 (0x********)
...
のように、 /usr/local/lib 以下のものを使っていれば、自前でしか入れないので LibreSSLを使っていると判断できるでしょう。

パッケージの postfix を上書きしているなら


/usr/sbin/newaliases
/usr/sbin/mailq

はパッケージのものを参照にしているので変更しておいてください。

cd /usr/bin
sudo mv newaliases newaliases.org 
sudo ln -s newaliases.postfix newaliases
sudo mv mailq mailq.org
sudo ln -s mailq.postfix mailq

のような感じで、前のものも残しつつ、ソースからコンパイルしたコマンドへシンボリックリンクをしておくといいかなと思います。

0 件のコメント: