ラベル Nginx の投稿を表示しています。 すべての投稿を表示
ラベル Nginx の投稿を表示しています。 すべての投稿を表示

2019年5月31日金曜日

【備忘録】LibreSSL 2.9.2 + Postfix 3.4.5 + nginx 1.17.0 へのアップグレード

Postfix 3.4系は、OpenSSL 1.0.1以下のサポートを打ち切ったため、Redhat Linux ES 6(まだ現役の場合も多いハズ)の標準 OpenSSL 1.0.1にいれると悲劇が・・・というつぶやきがありますね。なら、LibreSSLなら問題ないはずだよね?ってことでやってみました。ついでに nginx もバージョンアップしておきました。

サーバー環境:Redhat Linux ES 6

過去記事


LIBRESSL自体は簡単


./configure
make
sudo make install

openssl version
LibreSSL 2.9.2

です。何も苦労はしません。
上記では /usr/local 以下にインストールされるようになっているので、
/usr/local/lib/libssl.so(シンボリックリンク) の実体が
/usr/local/lib/libssl.so.47.0.5
ならOKということになります。

LibreSSL 2.8.x では
/usr/local/lib/libssl.so.46.0.x 
だったので、2.9.x 系は、libssl.so.47.0.x ってことですね。


動作中の NGINXへの影響はありません


NGINXについては、コンパイル時にその時利用するlibreSSLを組み込むため、影響をうけません。
 --with-openssl=../libressl-2.9.2
など。

nginx -V 
...
built with LibreSSL バージョン
...

のように組み込まれていることがわかります。


動作中の POSTFIXについては影響を受けませんが注意が必要です。


動作中のものはメモリ上に展開されて実行されているため、即座に影響は受けませんが、postfixを再起動したときには少なくても影響を受ける可能性があります。

今回 2.8.x --> 2.9.x へのアップグレードのため影響は受けませんでした。

ldd /usr/sbin/postfix | grep libssl
 libssl.so.46 => /usr/local/lib/libssl.so.46.0.x

のように 2.8.x 系は libssl.so.46 ですが、2.9.xは libssl.so.47 (2.9.2 は libssl.so.47.0.5 が実体)となっているためです。もし 2.9.2 --> 2.9.3 にアップデートした場合には、おなじ libssl.so.47 の実体を参照するので影響をうけるというわけです。

NGINXのアップグレード


先に nginx の方をやってしまいます。
【備忘録】LibreSSL 2.8.1 + Postfix 3.3.1 + nginx 1.15.5 へのアップグレード
を参考にして

 --with-openssl=../libressl-2.9.2

の部分を上記のように libssl-2.9.2 ライブラリを使いように気をつけてください。

objs/nginx -V
...
built with LibreSSL 2.9.2
...

とうまく組み込むことができれば、
/usr/local/nginx で起動するように作っていると仮定すると、

/usr/local/nginx-1.17.0 にインストールされたことになります。

/etc/init.d/nginx stop
cd /usr/local/nginx
rm nginx
ln -s nginx-1.17.0 nginx
/etc/init.d/nginx start

のように前のバージョンに手軽に戻すことができるようにしておきましょう。それが出来るのがソースからコンパイルする利点の一つでもあります。

POSTFIX のアップグレード



を参考にして src/tls/tls.h に対して、OPENSSLのバージョンをごまかす設定を追加します。今回は、1.0.1 以下だと TLSが組み込まれなくなるので注意が必要です。

src/tls/tls.h の設定をしなかった場合


../../lib/libtls.a(tls_certkey.o): In function `use_chain':
/usr/local/src/postfix/postfix-3.4.5/src/tls/tls_certkey.c:159: undefined reference to `SSL_CTX_use_cert_and_key'
/usr/local/src/postfix/postfix-3.4.5/src/tls/tls_certkey.c:162: undefined reference to `SSL_use_cert_and_key'
../../lib/libtls.a(tls_server.o): In function `tls_server_init':
/usr/local/src/postfix/postfix-3.4.5/src/tls/tls_server.c:521: undefined reference to `SSL_CTX_set_num_tickets'
collect2: ld はステータス 1 で終了しました
make: *** [smtpd] エラー 1
make: *** [update] エラー 1

のように make エラーになります。

src/tls/tls.h に設定追加


#include <openssl/ssl.h>
の下に

#undef OPENSSL_VERSION_NUMBER
#define OPENSSL_VERSION_NUMBER  0x1000900fUL

を追加します。今回 OpenSSL 1.0.9 だと名乗ることにしました。
LibreSSLは 1.0.1g をベースにカスタマイズされてきたため、あまりバージョンをあげて OpenSSL独自の機能を使っておかしなことにならないように注意したほうがいいかなと思ったためです。

なお tls.hには

#if (OPENSSL_VERSION_NUMBER < 0x1000200fUL)   
#error "OpenSSL releases prior to 1.0.2 are no longer supported"
#endif
  
 /* Backwards compatibility with OpenSSL < 1.1.0 */
#if OPENSSL_VERSION_NUMBER < 0x10100000L 
 /* Backwards compatibility with OpenSSL < 1.1.1 */
#if OPENSSL_VERSION_NUMBER < 0x1010100fUL  
  * Backwards compatibility with OpenSSL < 1.1.1a.
#if OPENSSL_VERSION_NUMBER < 0x1010101fUL

のように、1.0.2 未満だとエラーになりますし、1.1.0 未満、1.1.1未満、1.1.1a 未満それぞれに対する互換設定もあるので、1.0.9 あたりしておこうかなと思ったわけです。

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

などを指定して make するわけですが、
./tls.h:99:1: 警告: "OPENSSL_VERSION" が再定義されました
のように警告はでます。確信犯的にやっているわけなので無視します。

ldd bin/postfix | grep libssl
libssl.so.47 => /usr/local/lib/libssl.so.47
(libssl.so.47 の実体は、 libssl.so.47.0.5)

のように LibreSSL 2.9.2 のライブラリを参照していることを確認した上で、/etc/postfix をバックアップし

make upgrade

をしてアップグレードします。
念の為
/etc/postfix/master.cf 
の末尾をチェックしてください(*)。

それから
/etc/init.d/postfix restart
をして再起動します。

*今回、
fatal: master_spawn: exec /usr/libexec/postfix/smtppostlog: No such file or directory
と出てうまく動かないトラブルが発生しました。

理由は
master.cf の末尾に
postlog   unix-dgram n  -       n       -       1       postlogd
が今回から追加されたわけなのですが、その前の行で改行されていなかったからか
smtp-hogehoge   unix   -   -   n   -   -    smtppostlog   unix-dgram n  -       n       -       1       postlogd
となってしまっていたのでした。

正しくは

smtp-hogehoge   unix   -   -   n   -   -    smtp
postlog   unix-dgram n  -       n       -       1       postlogd

のようにする必要がありました。

なおメールログには
postfix/smtpd[12446]: warning: run-time library vs. compile-time header version mismatch: OpenSSL 2.0.0 may not be compatible with OpenSSL 1.0.0
が定期的にでます。

LibreSSL 2.9.2 だからです。postfix的には 2.9.2 だけをみて 1.0.1 互換ないかもしれないよって親切に教えてくれているわけです。でも確信犯的に LibreSSLを使っているので無視です。早く postfix が LibreSSLに対応してくれないかなぁ。

2019年5月31日 @kimipooh

2018年10月18日木曜日

【備忘録】LibreSSL 2.8.1 + Postfix 3.3.1 + nginx 1.15.5 へのアップグレード

以前にアップグレードしましたが、忘れないうちに備忘録として残しておきます。
以下、ソースからコンパイルしてインストールする場合の備忘録になります。

LibreSSL のアップグレード


LibreSSLを組み込んでいる nginx, postfix は、libreSSLをアップデートしても影響は受けません。逆を言えば、LibreSSLをアップデートした場合には、nginx, postfix を再度コンパイルし直す必要があるということです。

./configure 
make 
sudo make install
sudo ldconfig

でインストールできます。

openssl version
LibreSSL 2.8.1

となるでしょう。

NGINX に LibreSSL を組み込んでアップグレード


ここでやったようなおまじないを libressl ソース側でしておく必要があります。

/usr/local/src/nginx-1.15.5
/usr/local/src/libressl-2.8.1

でそれぞれソースを展開していたと仮定します。

./configure 
... 
... 
--with-openssl=../../libressl-2.8.1  \
--with-ld-opt="-lrt" 

touch ../../libressl/libressl-2.8.1/.openssl/include/openssl/ssl.h

make

のように、--with-openssl で libressl のソース場所を指定します。
libressl はすでに make install までは完了しているものとします。

そして本当に組み込まれているかを

  • /usr/local/src/nginx-1.15.5/objs/nginx -V 

の出力結果にある、
built with LibreSSL 2.8.1
でもってチェックしてください。

あとは、置き換えるだけです。いろいろありますが、
/usr/local/nginx 以下に nginx があるように /etc/init.d/nginx 等を設定しているので、

/etc/nginx 等 nginx の設定群は念の為バックアップした上で、

sudo/etc/init.d/nginx stop
sudo rm /usr/local/nginx
sudo ln -s /usr/local/nginx-1.15.5  /usr/local/nginx
sudo /etc/init.d/nginx start
のような形で置き換えます。これなら、前のバージョンに戻すことも簡単です。

POSTFIX に LibreSSL を組み込んでアップグレード


ここにあるようなおまじないを posfix ソースにします。
これは OpenSSL が前提で、そのバージョンによって#ifdef している postfix ソースをごまかすためです。

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

とした上で、

ldd src/postfix/postfix | grep ssl 
libssl.so.46 => /usr/local/lib/libssl.so.46

のように、libressl 2.8.1 のライブラリが読み込まれていることを確認します。
これが libressl 2.8.1 かどうかは、そのソースにある
/usr/local/src/libressl-2.8.1/ssl/.libs/libssl.so.46
と同じかどうかで分かります。

/etc/postfix 等 postfix の設定群は念の為バックアップした上で

sudo make upgrade
sudo /etc/init.d/postfix restart

いつもと同じ感じですが、変わらないよっていう備忘録も残す価値はあるかなということで残しておきます。

2018年10月18日 @kimipooh

2017年9月5日火曜日

【備忘録】Postfix 3.2.2 と Nginx 1.13.4 に LibreSSL を組み込んでコンパイルしてアップグレード

Postfix 3.2.0 with LibreSSL 2.4.3 --> Postfix 3.2.2 with Libre 2.5.5
Nginx 1.13.4 with LibreSSL 2.4.3 --> Nginx 1.13.4 with Libre 2.5.5

 にしたときの話です。サーバーは、Redhat EL6です。1点、困ったところがあったのでメモしたものを備忘録がてら公開します。

過去の導入については下記を参考にしてみてください。


LibreSSLの更新


最新版をダウンロードして

tar -xzvf libssl-2.5.5.tar.gz
cd libressl-2.5.5
make ditclean
./configure
make
sudo make install
sudo ldconfig

なんかで普通にインストールできます。
※一点、 ldconfig してライブラリ更新しておかないと、postfix  upgrade 時にエラー(後述)でアップグレードできないので注意。

標準では /usr/local/lib 以下に入ります。筆者は nginx と postfix で LibreSSLを使っています。 

動作中の Postfix への影響なし


ldd /usr/sbin/postfix | grep libssl
libssl.so.39 => /usr/local/lib/libssl.so.39 (◯◯)

と postfix で LibreSSL 2.4.3 (/usr/local/lib/libssl.so.39)を使っていた場合、LibreSSL 2.5.5をインストールしても /usr/local/lib/libssl.so.43 なので影響を受けません。もし、/usr/local/lib/libssl.so にリンクしているものがあれば、最新の 43にかわるので注意が必要です。

動作中の Nginx への影響


コンパイル時に
 --with-openssl=../libressl-2.3.2
のように、明示的に libressl のソースディレクトリを指定して組み込むため、影響を受けません。

というわけで、Postfix と Nginx ならば LibreSSLを更新しただけでは影響を受けませんし、組み込まれません。ので、次の作業が必要です。

Postfix 3.2.2 に LibreSSL 2.5.5 を組み込む

2017年3月3日金曜日

nginx + WEBDAV 経由で画像のアップロードできない

nginx で WEBDAVを構築する方法は世の中に沢山出ているので割愛します。
しかし、画像等一部拡張子ファイルがアップロードできない問題は、検索しても出てこなかったので備忘録を込めてメモっておきます。

WebDAV は、 SSL+BASIC認証でアクセスしている環境下でのテストです。

Not Allow エラー


ファイルパーミッションが問題ないのに、 WordPress のテーマフォルダに PHPファイルはアップロードできるのに画像をアップロードできない〜っていう場合には、location で拡張子を設定してあげてください。nginx では location で明示的に指定されていない拡張子はアクセスできない仕様です。

location ~* ^.+\.(js|css|png|jpg|jpeg|gif|html|swf|flv)$ {
}

など、アップロード許可を与える拡張子を設定するわけですね。
{} 内は記述なしでOKです。ログを残したくなければ、
  • access_log off; log_not_found off
あたりを {} 内に入れておけばよいでしょう。

Bad Request 400 エラー


webdav に対するパスワード制限に加えて、サイトまるごとパスワード制限していないか確認してみてください。

  • Not Allowエラー状態(上部の拡張子を許可していないケース)
  • サイト丸ごとパスワード制限が共有パスワード(よくある公開前の内部閲覧等)
  • webdav はユーザーごとのパスワード
の3条件すべてに合致した場合、nginx では上部のパスワードロックにひっかかって クライアント側で bad request 400 が出るようです。サーバー側ではサイト丸ごとのパスワード制限に引っかかったよとエラーログに出る。

ただこの問題は、Not Allowエラーで説明した拡張子を許可することで解消します。

2017年3月3日 @kimipooh



2017年3月1日水曜日

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

postfix 3.2.0 + LibreSSL は、


の方法ではコンパイルエラーが出ました。修正コンパイルするのに手間取ったので備忘録として残しておきます。

コンパイルエラー


../../lib/libtls.a(tls_dh.o): In function `tls_auto_eecdh_curves':
postfix-3.2.0/src/tls/tls_dh.c:291: undefined reference to `SSL_CTX_set1_curves'
postfix-3.2.0/src/tls/tls_dh.c:307: undefined reference to `SSL_CTX_set1_curves'
collect2: ld returned 1 exit status
make: *** [smtpd] Error 1
make: *** [update] Error 1

修正


src/tls/tls.h

#include <openssl/ssl.h> の下に

#undef OPENSSL_VERSION_NUMBER
#define OPENSSL_VERSION_NUMBER  0x10000002L

を入れること。

このバージョン「0x10000002L」は,

#if OPENSSL_VERSION_NUMBER < 0x10100000L
#if OPENSSL_VERSION_NUMBER >= 0x0090707fL

の2つの条件に当てはまる必要がある模様。 0x10100000L を超えると、OPENSSL_VERSIONが定義されないとエラーがでて、定義してもこんどは別のエラーがでると。。。 他のソースでもバージョンチェックによっていろいろ場合分けが増えたのが原因かなぁと思います。

確認


ldd src/postfix/postfix
libssl.so.39 => /usr/local/lib/libssl.so.39 (0x00007fd811de7000)

のように、  /usr/local/lib 以下のものを使っていれば、自前でしか入れていないので、LibreSSLを使っていると判断できるでしょう。

アップグレード

コンパイルは
を参考にしてみてください。
アップグレードは
  • /etc/postfix (設定)フォルダのバックアップ
  • /etc/init.d/postfix stop
  • make upgrade
  • /etc/init.d/postfix start

LibreSSL と付き合うのは大変ですが、頑張りまーす〜。

2017年3月1日 @kimipooh

2016年10月28日金曜日

【備忘録】SSL Sever Test の Session resumption (caching) を nginx にて Yes にする方法

nginx + LibreSSLでSSL Server TestをA+評価にする にて、SSL Server Testではすでに A+ 評価になっています。しかし人間欲が出るもの、
  • Session resumption (cacheing) : No (IDs assigned but not accepted)
というオレンジ評価が1つ残ったのが気になっていました。
折角なので Yes にしたいものです。

しかしサイトで情報をあさっても、出て来るのは
  • ssl_session_cache shared:SSL:10m;
  • ssl_session_timeout  10m;
の2つの設定をいれておいけば行けるよ!
っていうのばっかりです。 いや、それでもいけないのですが.... さらにディープに調べてみると、
に解決につながる情報を得ました。
でも日本語情報がなさげなので、備忘録としてまとめておきます。

ssl_session_cache shared:SSL:10m; は、 http {} に直接書け!


2016年3月19日土曜日

nginx + LibreSSLでSSL Server TestをA+評価にする

ようやく nginx に リバースプロキシとキャッシュ機能をいれて一息ついていたら、
が目に止まって、それならやってみようと思いました。


まず nginxの標準設定でテスト(Qualys SSL Labs)してみました。



ふむ、B評価か。特にDHキー鍵が 1024bitなのが評価が大きく下がっている所ですね。
設定は

ssl_prefer_server_ciphers  on;
ssl_ciphers  AESGCM:HIGH:!aNULL:!MD5;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  5m;

あたりです。


それをサイトをみて、赤文字を追加し、
  • openssl dhparam 2048 -out dhparam.pem
コマンドで 2048bitの DH鍵を作成すると・・・・

ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_prefer_server_ciphers  on;
ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  5m;  
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';


ふむ、マジでした...


2016年3月18日 @kimipooh


2016年3月16日水曜日

【備忘録】nginx にて phpMyAdminを動作させるには

ちょっとハマったのでメモしておきます。

2016年3月16日  Nginx 1.9.12 + PHP7.0.4 (PHP-FPM) (RedHat EL 6)をソースからコンパイルした環境でのお話です。なお、DBとしては MariaDB 10.1.12を yum からインストールしました。

構築しながらのメモのため、もっとうまい方法があるかしれません。
またサーバー管理者向けのメモという感じです。


がphpMyAdminにログインしたときの、サーバー情報です。
データベースのクライアントのバージョン:libmysql - mysqlnd 5.0.12-dev - 20150407 は、 MariaDBのものが誤認識されてるのかなぁと思います。
yum remove mysql* で削除(rpm -qa |grep -i mysql でパッケージないことを確認)したのですけどねぇ

PHPをyumで入れてるなら


素直に、epelリポジトリでも追加して、 yum install phpMyAdmin して入れるほうがらくです。

何故 yumを使わぬ?

php-mysql とか諸々のライブラリやモジュールがいっしょに入る(/etc/php.d/以下に大体インストールされる)のですが、PHPをソースからコンパイルしている場合、それってどの程度まで影響があるかチェックするの面倒!!だからです。

前提条件

2016年3月15日火曜日

【備忘録】 nginx + LibreSSLのソースからのコンパイルに挑戦

半日苦戦したのでメモっておきます。

2016年3月15日  Nginx 1.9.12 + LibreSSL 2.3.2 (RedHat EL 6)のお話です。

LibreSSL自体は簡単

./configure
make
sudo make install

です。何も苦労はしません。

Nginx 用に LibreSSLソースのカスタマイズ