17 암호화
원본 보기17 암호화
개요
Zabbix는 TLS(Transport Layer Security) 프로토콜 v.1.2 및 1.3을 사용하여 Zabbix 구성 요소 간의 암호화된 통신을 지원합니다(암호화 라이브러리에 따라 다름). 인증서 기반 및 사전 공유 키 기반 암호화가 지원됩니다.
다음 연결에 대해 암호화를 구성할 수 있습니다:
- Zabbix server, Zabbix proxy, Zabbix agent, Zabbix web service, zabbix_sender 및 zabbix_get 유틸리티 간
- Zabbix frontend 및 server/proxy에서 Zabbix 데이터베이스로
암호화는 선택사항이며 개별 구성 요소에 대해 구성할 수 있습니다:
- 일부 proxy와 agent는 서버와 인증서 기반 암호화를 사용하도록 구성할 수 있고, 다른 것들은 사전 공유 키 기반 암호화를 사용할 수 있으며, 또 다른 것들은 (이전과 같이) 암호화되지 않은 통신을 계속 사용할 수 있습니다
- Server(proxy)는 서로 다른 호스트에 대해 서로 다른 암호화 구성을 사용할 수 있습니다
Zabbix 데몬 프로그램은 암호화된 연결과 암호화되지 않은 들어오는 연결에 대해 하나의 수신 포트를 사용합니다. 암호화를 추가해도 방화벽에서 새 포트를 열 필요가 없습니다.
제한사항
- 개인 키는 시작 시 Zabbix 구성 요소가 읽을 수 있는 파일에 평문으로 저장됩니다
- 사전 공유 키는 Zabbix 프런트엔드에 입력되어 Zabbix 데이터베이스에 평문으로 저장됩니다
- 내장 암호화는 다음 통신을 보호하지 않습니다:
- Zabbix 프런트엔드를 실행하는 웹 서버와 사용자 웹 브라우저 간
- Zabbix 프런트엔드와 Zabbix 서버 간
- 현재 각 암호화된 연결은 전체 TLS 핸드셰이크로 시작되며, 세션 캐싱 및 티켓은 구현되지 않았습니다
- 암호화 추가는 네트워크 지연 시간에 따라 아이템 검사 및 액션 시간을 증가시킵니다:
- 예를 들어, 패킷 지연이 100ms인 경우 TCP 연결을 열고 암호화되지 않은 요청을 보내는 데 약 200ms가 소요됩니다. 암호화를 사용하면 TLS 연결 설정을 위해 약 1000ms가 추가됩니다;
- 타임아웃을 늘려야 할 수 있으며, 그렇지 않으면 에이전트에서 원격 스크립트를 실행하는 일부 아이템과 액션이 암호화되지 않은 연결에서는 작동하지만 암호화된 연결에서는 타임아웃으로 실패할 수 있습니다.
- 암호화는 네트워크 디스커버리에서 지원되지 않습니다. 네트워크 디스커버리로 수행되는 Zabbix 에이전트 검사는 암호화되지 않으며, Zabbix 에이전트가 암호화되지 않은 연결을 거부하도록 구성된 경우 이러한 검사는 성공하지 않습니다.
암호화 지원으로 Zabbix 컴파일하기
암호화를 지원하려면 Zabbix를 지원되는 암호화 라이브러리 중 하나와 함께 컴파일하고 링크해야 합니다:
- GnuTLS - 버전 3.1.18부터
- OpenSSL - 버전 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x
- LibreSSL - 버전 2.7.4, 2.8.2로 테스트됨:
- LibreSSL 2.6.x는 지원되지 않습니다
- LibreSSL은 OpenSSL의 호환 대체품으로 지원됩니다;
새로운
tls_*()LibreSSL 전용 API 함수는 사용되지 않습니다. LibreSSL로 컴파일된 Zabbix 구성 요소는 PSK를 사용할 수 없으며, 인증서만 사용할 수 있습니다.
Zabbix 프론트엔드를 위한 SSL 설정에 대한 자세한 내용은 이 모범 사례를 참조하세요.
라이브러리는 "configure" 스크립트에 해당 옵션을 지정하여 선택됩니다:
--with-gnutls[=DIR]--with-openssl[=DIR](LibreSSL에도 사용됨)
예를 들어, OpenSSL로 서버와 에이전트용 소스를 구성하려면 다음과 같이 사용할 수 있습니다:
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl
서로 다른 Zabbix 구성 요소는 서로 다른 암호화 라이브러리로 컴파일될 수 있습니다 (예: 서버는 OpenSSL로, 에이전트는 GnuTLS로).
사전 공유 키(PSK)를 사용할 계획이라면, PSK를 사용하는 Zabbix 구성 요소에서 GnuTLS 또는 OpenSSL 1.1.0 (또는 더 새로운 버전) 라이브러리 사용을 고려하세요. GnuTLS와 OpenSSL 1.1.0 라이브러리는 완전 순방향 보안성을 제공하는 PSK 암호화 모음을 지원합니다. 이전 버전의 OpenSSL 라이브러리 (1.0.1, 1.0.2c)도 PSK를 지원하지만, 사용 가능한 PSK 암호화 모음은 완전 순방향 보안성을 제공하지 않습니다.
연결 암호화 관리
Zabbix의 연결은 다음을 사용할 수 있습니다:
- 암호화 없음 (기본값)
- RSA 인증서 기반 암호화
- PSK 기반 암호화
Zabbix 구성 요소 간의 암호화를 지정하는 데 사용되는 두 가지 중요한 매개변수가 있습니다:
- TLSConnect - 나가는 연결에 사용할 암호화를 지정합니다 (암호화되지 않음, PSK 또는 인증서)
- TLSAccept - 들어오는 연결에 허용되는 연결 유형을 지정합니다 (암호화되지 않음, PSK 또는 인증서). 하나 이상의 값을 지정할 수 있습니다.
TLSConnect는 Zabbix 프록시(활성 모드에서 서버 연결만 지정)와 Zabbix 에이전트(능동 점검용)의 구성 파일에서 사용됩니다. Zabbix 프런트엔드에서 TLSConnect와 동등한 것은
데이터 수집 → 호스트 → <특정 호스트> → 암호화 탭의
호스트로의 연결 필드와 관리 → 프록시 → <특정 프록시> → 암호화 탭의 프록시로의 연결 필드입니다. 구성된 연결 암호화 유형이 실패하면 다른 암호화 유형은 시도되지 않습니다.
TLSAccept는 Zabbix 프록시(수동 모드에서 서버로부터의 연결만 지정)와 Zabbix 에이전트(수동 점검용)의 구성 파일에서 사용됩니다. Zabbix 프런트엔드에서 TLSAccept와 동등한 것은
데이터 수집 → 호스트 → <특정 호스트> → 암호화 탭의
호스트로부터의 연결 필드와 관리 → 프록시 → <특정 프록시> → 암호화 탭의 프록시로부터의 연결 필드입니다.
일반적으로 들어오는 연결에 대해서는 한 가지 암호화 유형만 구성합니다. 하지만 최소한의 다운타임과 롤백 가능성을 가지고 암호화 유형을 전환하고 싶을 수 있습니다. 예를 들어 암호화되지 않은 상태에서 인증서 기반으로 전환하는 경우입니다. 이를 달성하려면:
- 에이전트 구성 파일에서
TLSAccept=unencrypted,cert를 설정하고 Zabbix 에이전트를 재시작합니다 - 인증서를 사용하여 zabbix_get으로 에이전트에 대한 연결을 테스트합니다. 작동하면 Zabbix 프런트엔드의 데이터 수집 → 호스트 → <특정 호스트> → 암호화 탭에서 호스트로의 연결을 "Certificate"로 설정하여 해당 에이전트의 암호화를 재구성할 수 있습니다.
- 서버 구성 캐시가 업데이트되고 (호스트가 프록시에 의해 모니터링되는 경우 프록시 구성도 업데이트됨) 해당 에이전트로의 연결이 암호화됩니다
- 모든 것이 예상대로 작동하면 에이전트 구성 파일에서
TLSAccept=cert를 설정하고 Zabbix 에이전트를 재시작할 수 있습니다. 이제 에이전트는 암호화된 인증서 기반 연결만 허용합니다. 암호화되지 않은 연결과 PSK 기반 연결은 거부됩니다.
서버와 프록시에서도 비슷한 방식으로 작동합니다. Zabbix 프런트엔드의 호스트 구성에서 호스트로부터의 연결이 "Certificate"로 설정되면 에이전트(능동 점검)와 zabbix_sender(트래퍼 아이템)로부터 인증서 기반 암호화 연결만 허용됩니다.
대부분의 경우 들어오는 연결과 나가는 연결이 동일한 암호화 유형을 사용하거나 전혀 암호화를 사용하지 않도록 구성할 것입니다. 하지만 기술적으로는 비대칭적으로 구성하는 것도 가능합니다. 예를 들어 들어오는 연결에는 인증서 기반 암호화를, 나가는 연결에는 PSK 기반 암호화를 사용하는 것입니다.
각 호스트의 암호화 구성은 Zabbix 프런트엔드의 데이터 수집 → 호스트에서 에이전트 암호화 열에 표시됩니다. 예를 들어:
| 예시 | 호스트로의 연결 | 호스트로부터 허용되는 연결 | 호스트로부터 거부되는 연결 |
|---|---|---|---|
![]() |
암호화되지 않음 | 암호화되지 않음 | 암호화됨, 인증서 및 PSK 기반 암호화 |
![]() |
암호화됨, 인증서 기반 | 암호화됨, 인증서 기반 | 암호화되지 않음 및 PSK 기반 암호화 |
![]() |
암호화됨, PSK 기반 | 암호화됨, PSK 기반 | 암호화되지 않음 및 인증서 기반 암호화 |
![]() |
암호화됨, PSK 기반 | 암호화되지 않음 및 PSK 기반 암호화 | 인증서 기반 암호화 |
![]() |
암호화됨, 인증서 기반 | 암호화되지 않음, PSK 또는 인증서 기반 암호화 | - |
연결은 기본적으로 암호화되지 않습니다. 각 호스트와 프록시에 대해 개별적으로 암호화를 구성해야 합니다.
암호화를 사용하는 zabbix_get과 zabbix_sender
암호화와 함께 사용하는 방법은 zabbix_get과 zabbix_sender 매뉴얼 페이지를 참조하세요.
암호화 제품군
암호화 제품군은 기본적으로 Zabbix 시작 시 내부적으로 구성됩니다.
또한 GnuTLS와 OpenSSL에 대해 사용자 구성 암호화 제품군이 지원됩니다. 사용자는 보안 정책에 따라 암호화 제품군을 구성할 수 있습니다. 이 기능을 사용하는 것은 선택 사항입니다 (내장된 기본 암호화 제품군도 여전히 작동합니다).
기본 설정으로 컴파일된 암호화 라이브러리의 경우 Zabbix 내장 규칙은 일반적으로 다음과 같은 암호화 제품군을 생성합니다 (높은 우선순위에서 낮은 우선순위 순으로):
| 라이브러리 | 인증서 암호화 제품군 | PSK 암호화 제품군 |
|---|---|---|
| GnuTLS 3.1.18 | TLS_ECDHE_RSA_AES_128_GCM_SHA256 TLS_ECDHE_RSA_AES_128_CBC_SHA256 TLS_ECDHE_RSA_AES_128_CBC_SHA1 TLS_RSA_AES_128_GCM_SHA256 TLS_RSA_AES_128_CBC_SHA256 TLS_RSA_AES_128_CBC_SHA1 |
TLS_ECDHE_PSK_AES_128_CBC_SHA256 TLS_ECDHE_PSK_AES_128_CBC_SHA1 TLS_PSK_AES_128_GCM_SHA256 TLS_PSK_AES_128_CBC_SHA256 TLS_PSK_AES_128_CBC_SHA1 |
| OpenSSL 1.0.2c | ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-SHA256 AES128-SHA |
PSK-AES128-CBC-SHA |
| OpenSSL 1.1.0 | ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA |
ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA |
| OpenSSL 1.1.1d | TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA |
TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA |
User-configured ciphersuites
The built-in ciphersuite selection criteria can be overridden with user-configured ciphersuites.
User-configured ciphersuites is a feature intended for advanced users who understand TLS ciphersuites, their security and consequences of mistakes, and who are comfortable with TLS troubleshooting.
The built-in ciphersuite selection criteria can be overridden using the following parameters:
| Override scope | Parameter | Value | Description |
|---|---|---|---|
| Ciphersuite selection for certificates | TLSCipherCert13 | Valid OpenSSL 1.1.1 cipher strings for TLS 1.3 protocol (their values are passed to the OpenSSL function SSL_CTX_set_ciphersuites()). |
Certificate-based ciphersuite selection criteria for TLS 1.3 Only OpenSSL 1.1.1 or newer. |
| TLSCipherCert | Valid OpenSSL cipher strings for TLS 1.2 or valid GnuTLS priority strings. Their values are passed to the SSL_CTX_set_cipher_list() or gnutls_priority_init() functions, respectively. |
Certificate-based ciphersuite selection criteria for TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Ciphersuite selection for PSK | TLSCipherPSK13 | Valid OpenSSL 1.1.1 cipher strings for TLS 1.3 protocol (their values are passed to the OpenSSL function SSL_CTX_set_ciphersuites()). |
PSK-based ciphersuite selection criteria for TLS 1.3 Only OpenSSL 1.1.1 or newer. |
| TLSCipherPSK | Valid OpenSSL cipher strings for TLS 1.2 or valid GnuTLS priority strings. Their values are passed to the SSL_CTX_set_cipher_list() or gnutls_priority_init() functions, respectively. |
PSK-based ciphersuite selection criteria for TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) | |
| Combined ciphersuite list for certificate and PSK | TLSCipherAll13 | Valid OpenSSL 1.1.1 cipher strings for TLS 1.3 protocol (their values are passed to the OpenSSL function SSL_CTX_set_ciphersuites()). |
Ciphersuite selection criteria for TLS 1.3 Only OpenSSL 1.1.1 or newer. |
| TLSCipherAll | Valid OpenSSL cipher strings for TLS 1.2 or valid GnuTLS priority strings. Their values are passed to the SSL_CTX_set_cipher_list() or gnutls_priority_init() functions, respectively. |
Ciphersuite selection criteria for TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL) |
To override the ciphersuite selection in zabbix_get and zabbix_sender utilities - use the command-line parameters:
--tls-cipher13--tls-cipher
The new parameters are optional. If a parameter is not specified, the internal default value is used. If a parameter is defined it cannot be empty.
If the setting of a TLSCipher* value in the crypto library fails then the server, proxy or agent will not start and an error is logged.
It is important to understand when each parameter is applicable.
Outgoing connections
The simplest case is outgoing connections:
- For outgoing connections with certificate - use TLSCipherCert13 or TLSCipherCert
- For outgoing connections with PSK - use TLSCipherPSK13 or TLSCipherPSK
- In case of zabbix_get and zabbix_sender utilities the command-line
parameters
--tls-cipher13or--tls-ciphercan be used (encryption is unambiguously specified with a--tls-connectparameter)
Incoming connections
It is a bit more complicated with incoming connections because rules are specific for components and configuration.
For Zabbix agent:
| Agent connection setup | Cipher configuration |
|---|---|
| TLSConnect=cert | TLSCipherCert, TLSCipherCert13 |
| TLSConnect=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert | TLSCipherCert, TLSCipherCert13 |
| TLSAccept=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert,psk | TLSCipherAll, TLSCipherAll13 |
For Zabbix server and proxy:
| Connection setup | Cipher configuration |
|---|---|
| Outgoing connections using PSK | TLSCipherPSK, TLSCipherPSK13 |
| Incoming connections using certificates | TLSCipherAll, TLSCipherAll13 |
| Incoming connections using PSK if server has no certificate | TLSCipherPSK, TLSCipherPSK13 |
| Incoming connections using PSK if server has certificate | TLSCipherAll, TLSCipherAll13 |
Some pattern can be seen in the two tables above:
- TLSCipherAll and TLSCipherAll13 can be specified only if a combined list of certificate- and PSK-based ciphersuites is used. There are two cases when it takes place: server (proxy) with a configured certificate (PSK ciphersuites are always configured on server, proxy if crypto library supports PSK), agent configured to accept both certificate- and PSK-based incoming connections
- in other cases TLSCipherCert* and/or TLSCipherPSK* are sufficient
The following tables show the TLSCipher* built-in default values. They
could be a good starting point for your own custom values.
| Parameter | GnuTLS 3.6.12 |
|---|---|
| TLSCipherCert | NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509 |
| TLSCipherPSK | NONE:+VERS-TLS1.2:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL |
| TLSCipherAll | NONE:+VERS-TLS1.2:+ECDHE-RSA:+RSA:+ECDHE-PSK:+PSK:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+SHA1:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509 |
| Parameter | OpenSSL 1.1.1d 1 |
|---|---|
| TLSCipherCert13 | |
| TLSCipherCert | EECDH+aRSA+AES128:RSA+aRSA+AES128 |
| TLSCipherPSK13 | TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 |
| TLSCipherPSK | kECDHEPSK+AES128:kPSK+AES128 |
| TLSCipherAll13 | |
| TLSCipherAll | EECDH+aRSA+AES128:RSA+aRSA+AES128:kECDHEPSK+AES128:kPSK+AES128 |
1 Default values are different for older OpenSSL versions (1.0.1, 1.0.2, 1.1.0), for LibreSSL and if OpenSSL is compiled without PSK support.
Examples of user-configured ciphersuites
See below the following examples of user-configured ciphersuites:
암호화 문자열 테스트 및 PFS 암호화 모음만 허용하기
선택된 암호화 모음을 확인하려면 설정 파일에서
'DebugLevel=4'를 설정하거나, zabbix_sender에 -vv 옵션을 사용해야 합니다.
원하는 암호화 모음을 얻기 전에 TLSCipher* 매개변수를 실험해볼 필요가 있을 수 있습니다. 단지 TLSCipher*
매개변수를 조정하기 위해 Zabbix 서버, 프록시 또는 에이전트를 여러 번 재시작하는 것은 불편합니다. 더 편리한 옵션은 zabbix_sender나
openssl 명령을 사용하는 것입니다. 두 가지 방법을 모두 보여드리겠습니다.
1. zabbix_sender 사용하기.
예를 들어 /home/zabbix/test.conf 같은 테스트 설정 파일을 만들어 보겠습니다.
zabbix_agentd.conf 파일 구문을 사용합니다:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=cert
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/agent.crt
TLSKeyFile=/home/zabbix/agent.key
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agent.psk
이 예제에는 유효한 CA와 에이전트 인증서 및 PSK가 필요합니다. 환경에 맞게 인증서와 PSK 파일 경로 및 이름을 조정하십시오.
인증서를 사용하지 않고 PSK만 사용하는 경우, 더 간단한 테스트 파일을 만들 수 있습니다:
Hostname=nonexisting
ServerActive=nonexisting
TLSConnect=psk
TLSPSKIdentity=nonexisting
TLSPSKFile=/home/zabbix/agentd.psk
zabbix_sender를 실행하여 선택된 암호화 모음을 확인할 수 있습니다(예제는 OpenSSL 1.1.d로 컴파일됨):
$ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
zabbix_sender [41271]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
여기서 기본값으로 선택된 암호화 모음을 확인할 수 있습니다. 이러한 기본값은 구버전 OpenSSL(1.0.1부터)을 사용하는 시스템에서 실행되는 Zabbix 에이전트와의 상호 운용성을 보장하기 위해 선택되었습니다.
최신 시스템에서는 몇 개의 암호화 모음만 허용하여 보안을 강화할 수 있습니다.
예를 들어 PFS(Perfect Forward Secrecy)가 있는 암호화 모음만 허용하는 것입니다. TLSCipher* 매개변수를 사용하여
PFS가 있는 암호화 모음만 허용해 보겠습니다.
PSK를 사용하는 경우 OpenSSL 1.0.1과 1.0.2를 사용하는 시스템과는 상호 운용되지 않습니다. 인증서 기반 암호화는 작동해야 합니다.
test.conf 설정 파일에 두 줄을 추가하십시오:
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
그리고 다시 테스트하십시오:
$ zabbix_sender -vv -c /home/zabbix/test.conf -k nonexisting_item -o 1 2>&1 | grep ciphersuites
zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
zabbix_sender [42892]: DEBUG: zbx_tls_init_child() PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificate and PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA AES128-GCM-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
"certificate ciphersuites"와 "PSK ciphersuites" 목록이 변경되었습니다
- 예상대로 TLS 1.3 암호화 모음과 TLS 1.2 ECDHE-* 암호화 모음만 포함하여 이전보다 짧아졌습니다.
2. TLSCipherAll과 TLSCipherAll13은 zabbix_sender로 테스트할 수 없습니다. 위 예제에서 보여진 "certificate and PSK ciphersuites" 값에 영향을 주지 않습니다. TLSCipherAll과 TLSCipherAll13을 조정하려면 에이전트, 프록시 또는 서버로 실험해야 합니다.
따라서 PFS 암호화 모음만 허용하려면 최대 3개의 매개변수를 추가해야 할 수 있습니다
TLSCipherCert=EECDH+aRSA+AES128
TLSCipherPSK=kECDHEPSK+AES128
TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128
각각이 설정된 인증서를 가지고 있고 에이전트가 PSK도 가지고 있다면 zabbix_agentd.conf, zabbix_proxy.conf 및 zabbix_server_conf에 추가하십시오.
Zabbix 환경에서 PSK 기반 암호화만 사용하고 인증서를 사용하지 않는 경우, 하나만 추가하면 됩니다:
TLSCipherPSK=kECDHEPSK+AES128
이제 작동 방식을 이해했으므로 openssl 명령으로 Zabbix 외부에서도 암호화 모음
선택을 테스트할 수 있습니다. 세 가지 TLSCipher* 매개변수 값을 모두 테스트해 보겠습니다:
$ openssl ciphers EECDH+aRSA+AES128 | sed 's/:/ /g'
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
$ openssl ciphers kECDHEPSK+AES128 | sed 's/:/ /g'
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
$ openssl ciphers EECDH+aRSA+AES128:kECDHEPSK+AES128 | sed 's/:/ /g'
TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
더 자세한 출력을 위해 -V 옵션과 함께 openssl ciphers를 사용하는 것을
선호할 수도 있습니다:
$ openssl ciphers -V EECDH+aRSA+AES128:kECDHEPSK+AES128
0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
0xC0,0x13 - ECDHE-RSA-AES128-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
0xC0,0x37 - ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA256
0xC0,0x35 - ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA1
마찬가지로, GnuTLS의 우선순위 문자열을 테스트할 수 있습니다:
$ gnutls-cli -l --priority=NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
Cipher suites for NONE:+VERS-TLS1.2:+ECDHE-RSA:+AES-128-GCM:+AES-128-CBC:+AEAD:+SHA256:+CURVE-ALL:+COMP-NULL:+SIGN-ALL:+CTYPE-X.509
TLS_ECDHE_RSA_AES_128_GCM_SHA256 0xc0, 0x2f TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA256 0xc0, 0x27 TLS1.2
Protocols: VERS-TLS1.2
Ciphers: AES-128-GCM, AES-128-CBC
MACs: AEAD, SHA256
Key Exchange Algorithms: ECDHE-RSA
Groups: GROUP-SECP256R1, GROUP-SECP384R1, GROUP-SECP521R1, GROUP-X25519, GROUP-X448, GROUP-FFDHE2048, GROUP-FFDHE3072, GROUP-FFDHE4096, GROUP-FFDHE6144, GROUP-FFDHE8192
PK-signatures: SIGN-RSA-SHA256, SIGN-RSA-PSS-SHA256, SIGN-RSA-PSS-RSAE-SHA256, SIGN-ECDSA-SHA256, SIGN-ECDSA-SECP256R1-SHA256, SIGN-EdDSA-Ed25519, SIGN-RSA-SHA384, SIGN-RSA-PSS-SHA384, SIGN-RSA-PSS-RSAE-SHA384, SIGN-ECDSA-SHA384, SIGN-ECDSA-SECP384R1-SHA384, SIGN-EdDSA-Ed448, SIGN-RSA-SHA512, SIGN-RSA-PSS-SHA512, SIGN-RSA-PSS-RSAE-SHA512, SIGN-ECDSA-SHA512, SIGN-ECDSA-SECP521R1-SHA512, SIGN-RSA-SHA1, SIGN-ECDSA-SHA1
AES128에서 AES256으로 전환
Zabbix는 데이터에 대한 내장 기본값으로 AES128을 사용합니다. 인증서를 사용하고 있고 OpenSSL 1.1.1에서 AES256으로 전환하려고 한다고 가정해 봅시다.
이는 zabbix_server.conf에 해당 매개변수를 추가하여 달성할 수 있습니다:
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/server.crt
TLSKeyFile=/home/zabbix/server.key
TLSCipherCert13=TLS_AES_256_GCM_SHA384
TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384
TLSCipherPSK13=TLS_CHACHA20_POLY1305_SHA256
TLSCipherPSK=kECDHEPSK+AES256:-SHA1
TLSCipherAll13=TLS_AES_256_GCM_SHA384
TLSCipherAll=EECDH+aRSA+AES256:-SHA1:-SHA384
인증서 관련 암호화 모음만 사용되지만, 더 넓은 상호 운용성을 위해 덜 안전한 암호를 포함하는 기본값을 피하기 위해 TLSCipherPSK* 매개변수도 정의되었습니다. PSK 암호화 모음은 서버/프록시에서 완전히 비활성화할 수 없습니다.
그리고 zabbix_agentd.conf에서:
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/home/zabbix/ca.crt
TLSCertFile=/home/zabbix/agent.crt
TLSKeyFile=/home/zabbix/agent.key
TLSCipherCert13=TLS_AES_256_GCM_SHA384
TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384




