Linux

nagios SSL 握手

  • November 18, 2018

我有nagios客戶端在升級後突然出現錯誤。我重新安裝nagios-pluginnrpe再次代理但無法解決錯誤。此版本使用nrpe.xinetd

# /usr/local/nagios/libexec/check_nrpe -H localhost
CHECK_NRPE: Error - Could not complete SSL handshake.

# netstat -plan | grep :5666
tcp        0      0 :::5666                     :::*                        LISTEN      20265/xinetd

Nagios-server-IP 10.10.3.30

# cat /etc/xinetd.d/nrpe | grep -i only_from
       only_from       = 127.0.0.1 10.10.3.30


# cat /etc/xinetd.d/nrpe
# default: on
# description: NRPE (Nagios Remote Plugin Executor)
service nrpe
{
       flags           = REUSE
       socket_type     = stream
       port            = 5666
       wait            = no
       user            = nagios
       group           = nagios
       server          = /usr/local/nagios/bin/nrpe
       server_args     = -c /usr/local/nagios/etc/nrpe.cfg --inetd
       log_on_failure  += USERID
       disable         = no
       only_from       = 127.0.0.1 10.10.3.30
}

無法從客戶端遠端登錄到伺服器

# telnet 10.10.3.30 5666
Trying 10.10.3.30...
Connected to 10.10.3.30.
Escape character is '^]'.
Connection closed by foreign host.

NRPE 幾年沒有更新( 2013 年9 月),這就是它在伺服器端所做的

SSL_library_init();
SSLeay_add_ssl_algorithms();
meth=SSLv23_server_method();
...
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
...
SL_CTX_set_cipher_list(ctx,"ADH");
dh=get_dh512();

和客戶端(check_nrpe在 Nagios 伺服器上)

SSL_library_init();
SSLeay_add_ssl_algorithms();
meth=SSLv23_client_method();
...
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
...
SSL_CTX_set_cipher_list(ctx,"ADH");

這些SSLv23_xxx函式曾經是連接到任何 SSLv2 或 SSLv3.x 系統的最兼容方式。以上兩者均已棄用。雖然程式碼禁用了協議版本 2.0 和 3.0(僅保留 TLS),但客戶端連接將以 SSLv2 ClientHello 開始。

小於 1024 的 DH 素數現在被認為是不安全的(儘管在某些版本的 OpenSSL 中可能是 768)。這解釋了為什麼您無法連接到自己,OpenSSL 客戶端 (check_nrpe) 將拒絕短 DH 密鑰。(使用 ADH 是因為它不需要證書,因此是“匿名的”,在不受信任的網路中不是一個好的計劃,但可以用於此目的。)

我懷疑您可能還會遇到連接到新系統的第二個問題。可能發生的情況是客戶端(NSCA 伺服器)已更新為使用最近的 OpenSSL,SSLv2 最近已預設禁用,儘管一些發行版多年來一直這樣做。在大多數情況下,協議/密碼套件仍應存在重疊,但禁用 SSLv2 的 TLS 伺服器(在這種情況下為 nrpe 守護程序)拒絕 SSLv2 ClientHello握手數據包是可能且常見的,即使客戶端在握手(這裡的技術細節:https ://security.stackexchange.com/questions/59367/what-exactly-determines-what-version-of-ssl-tls-is-used-when-accessing-a-site )

要解決此問題,您可能需要在更新的系統上降級 OpenSSL,或安裝沒有這些(明智的!)預防措施的並行舊 OpenSSL 版本。聽起來都不是好選擇…

如果您nrpe自己建構,則應該足夠了,您需要替換對get_dh512()with的呼叫get_dh1024() 用新的靜態 1024 位密鑰重新編譯它——為此,您需要通過修改硬-在configure(第 6748 行)中編碼 512並重新執行它,或使用

opensl dhparam -C 1024 | awk '/^-----/{exit} {print}' > include/dh.h

然後make重建。您可能還需要將呼叫替換為SSLv23_client_method()TLSv1_client_method(),以便不會嘗試 SSLv2“兼容”ClientHello 並check_nrpe在 Nagios 伺服器上重新編譯。由於您冒著中斷與其他客戶端連接的風險,因此您可能需要第二個check_nrpe_new二進製文件用於“升級”伺服器,並在您的模板中使用它 commandcheck_command但我認為這不應該發生)。

(作為最後的手段,您可能會做一些不愉快的事情socatstunnel彌補任何不匹配,這是一種方法:https ://security.stackexchange.com/a/108850/18555 。)

更準確的答案將需要 OpenSSL 版本(openssl version -a或相關的包管理器輸出)和您的分發版本。

引用自:https://unix.stackexchange.com/questions/268447