雑記

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|
2007|01|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|09|11|
2009|02|03|05|06|07|08|10|11|12|
2010|01|03|04|05|06|07|08|09|10|
2011|05|06|09|10|
2012|03|07|09|12|
2013|01|02|04|05|07|08|10|11|
2014|04|05|08|10|12|
2015|01|05|
2016|09|

2014-10-17 [長年日記]

[Nagios] SSLv3の監視用プラグイン

SSL POODLE脆弱性の対処として設定でSSLv3を無効にする方法が出回っていますが、何かの拍子に有効化してしまう危険性もあるので、とりあえずNagiosのプラグインを書いて監視するようにしました。opensslコマンドがインストール済みである前提です。

上記ファイルをダウンロードしてNagiosのプラグインディレクトリに保存します。コマンドのパスがFreeBSD前提になっているので、適宜書き換えて下さい。

設定のサンプルです。

コマンドの定義:
define command {
   command_name   check_sslv3
   command_line   $USER1$/check_sslv3 -H $HOSTADDRESS$ -p $ARG1$
   }
サービス定義(共通部):

監視対象が多いので、各サービス監視用の共通定義を書きます。サービスの監視は別にやっているので、チェック間隔は長め(60分)にします。

# HTTPS SSLv3
define service {
   name           generic-https-sslv3
   use               generic-service
   normal_check_interval   60
   service_description  SSLv3 HTTPS
   check_command     check_sslv3!443
   is_volatile       0
   register       0
   }

こんな感じでIMAPS(993), POP3S(995), SMTPS(465), LDAPS(636)あたりの定義も書いておきます。

ホスト毎のサービス監視:

サーバ毎のサービス監視定義を記述します。

# HTTP
define service{
   use         generic-https-sslv3
   host_name   <target.host>
   }
# IMAP
define service{
   use         generic-imaps-sslv3
   host_name   <target.host>
   }

設定が終わったらNagiosを再起動して監視できているか確認します。


2014-10-21 [長年日記]

Courier IMAPのPOODLE対策について

Courier IMAPのimaps/pop3sサーバについて、設定サンプルの記述ミスに起因して効果のない対策が広まってしまっているようです。

Courier IMAPでは、imapd-ssl, pop3d-sslという設定ファイル内のTLS_PROTOCOLという設定項目で使用するプロトコルのバージョンを指定でき、設定ファイルには、

##NAME: TLS_PROTOCOL:0
# 
# TLS_PROTOCOL sets the protocol version.  The possible versions are:
#
# OpenSSL:
#
# SSL3 - SSLv3
# SSL23 - all protocols (including TLS 1.x protocols)
# TLS1 - TLS1
# TLSv1.1 - TLS1.1
# TLSv1.2 - TLS1.2

と記述されています。このコメントに沿って

TLS_PROTOCOL=TLS1

という記述をもってPOODLE対策としているサイトがいくつかあるようです。

ところが、実際のプロトコルを決定するための処理は、

        method=((!protocol || !*protocol)
                ? NULL:
                strcmp(protocol, "SSL3") == 0
                        ? SSLv3_method():
                strcmp(protocol, "SSL23") == 0
                        ? SSLv23_method():
                strcmp(protocol, "TLSv1") == 0
                ? TLSv1_method():
#ifdef HAVE_TLSV1_1_METHOD
                strcmp(protocol, "TLSv1.1") == 0
                ? TLSv1_1_method():
#endif
#ifdef HAVE_TLSV1_2_METHOD
                strcmp(protocol, "TLSv1.2") == 0
                ? TLSv1_2_method():
#endif
                NULL);

        if (!method)
        {
                method=SSLv23_method();
                options|=SSL_OP_NO_SSLv2;
        }

というコードになっており、TLS_PROTOCOLの値が"SSL3", "SSL23", {~orangered:"TLSv1"~}, "TLSv1.1", "TLSv1.2"であればそれらに対応するプロトコル、それ以外、つまりサンプルに記述されている"TLS1"などの場合は"SSL23"相当、つまりSSLv3が有効な状態になってしまいます。

したがって、正しくは当該部分を

TLS_PROTOCOL=TLSv1
TLS_STARTTLS_PROTOCOL=TLSv1

と記述する必要があるようでした。

ちなみに、opensslコマンドで以下のように実行して、handshake failureが返ってくればSSLv3は無効になっている事が確認できます。

% openssl s_client -ssl3 -connect localhost:993
CONNECTED(00000003)
62978:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s3_pkt.c:1106:SSL alert number 40
62978:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s3_pkt.c:543:

こうならずに

* OK [CAPABILITY (略)] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc.  See COPYING for distribution information.

のような表示になったらSSLv3がまだ有効になったままですので、設定を見直す必要があります。