문서
원본 보기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 프론트엔드 및 server/proxy에서 Zabbix 데이터베이스로
암호화는 선택 사항이며 개별 구성 요소에 대해 구성할 수 있습니다:
- 일부 프록시와 에이전트는 서버와 인증서 기반 암호화를 사용하도록 구성할 수 있고, 다른 것들은 사전 공유 키 기반 암호화를 사용할 수 있으며, 또 다른 것들은 (이전과 같이) 암호화되지 않은 통신을 계속할 수 있습니다
- 서버(프록시)는 서로 다른 호스트에 대해 다른 암호화 구성을 사용할 수 있습니다
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 |
사용자 구성 암호화 스위트
내장된 암호화 스위트 선택 기준은 사용자 구성 암호화 스위트로 재정의할 수 있습니다.
사용자 구성 암호화 스위트는 TLS 암호화 스위트와 그 보안성 및 실수의 결과를 이해하고 TLS 문제 해결에 능숙한 고급 사용자를 위한 기능입니다.
내장된 암호화 스위트 선택 기준은 다음 매개변수를 사용하여 재정의할 수 있습니다:
| 재정의 범위 | 매개변수 | 값 | 설명 |
|---|---|---|---|
| 인증서용 암호화 스위트 선택 | TLSCipherCert13 | TLS 1.3 프로토콜용 유효한 OpenSSL 1.1.1 암호 문자열 (값은 OpenSSL 함수 SSL_CTX_set_ciphersuites()에 전달됨). |
TLS 1.3용 인증서 기반 암호화 스위트 선택 기준 OpenSSL 1.1.1 이상만 지원. |
| TLSCipherCert | TLS 1.2용 유효한 OpenSSL 암호 문자열 또는 유효한 GnuTLS 우선순위 문자열. 값은 각각 SSL_CTX_set_cipher_list() 또는 gnutls_priority_init() 함수에 전달됨. |
TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)용 인증서 기반 암호화 스위트 선택 기준 | |
| PSK용 암호화 스위트 선택 | TLSCipherPSK13 | TLS 1.3 프로토콜용 유효한 OpenSSL 1.1.1 암호 문자열 (값은 OpenSSL 함수 SSL_CTX_set_ciphersuites()에 전달됨). |
TLS 1.3용 PSK 기반 암호화 스위트 선택 기준 OpenSSL 1.1.1 이상만 지원. |
| TLSCipherPSK | TLS 1.2용 유효한 OpenSSL 암호 문자열 또는 유효한 GnuTLS 우선순위 문자열. 값은 각각 SSL_CTX_set_cipher_list() 또는 gnutls_priority_init() 함수에 전달됨. |
TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)용 PSK 기반 암호화 스위트 선택 기준 | |
| 인증서와 PSK용 통합 암호화 스위트 목록 | TLSCipherAll13 | TLS 1.3 프로토콜용 유효한 OpenSSL 1.1.1 암호 문자열 (값은 OpenSSL 함수 SSL_CTX_set_ciphersuites()에 전달됨). |
TLS 1.3용 암호화 스위트 선택 기준 OpenSSL 1.1.1 이상만 지원. |
| TLSCipherAll | TLS 1.2용 유효한 OpenSSL 암호 문자열 또는 유효한 GnuTLS 우선순위 문자열. 값은 각각 SSL_CTX_set_cipher_list() 또는 gnutls_priority_init() 함수에 전달됨. |
TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)용 암호화 스위트 선택 기준 |
zabbix_get 및 zabbix_sender 유틸리티에서 암호화 스위트 선택을 재정의하려면 다음 명령줄 매개변수를 사용하십시오:
--tls-cipher13--tls-cipher
새로운 매개변수들은 선택사항입니다. 매개변수가 지정되지 않으면 내부 기본값이 사용됩니다. 매개변수가 정의된 경우 비어있을 수 없습니다.
암호화 라이브러리에서 TLSCipher* 값 설정이 실패하면 서버, 프록시 또는 에이전트가 시작되지 않고 오류가 기록됩니다.
각 매개변수가 언제 적용되는지 이해하는 것이 중요합니다.
발신 연결
가장 간단한 경우는 발신 연결입니다:
- 인증서를 사용하는 발신 연결의 경우 - TLSCipherCert13 또는 TLSCipherCert를 사용합니다
- PSK를 사용하는 발신 연결의 경우 - TLSCipherPSK13 또는 TLSCipherPSK를 사용합니다
- zabbix_get 및 zabbix_sender 유틸리티의 경우 명령행 매개변수
--tls-cipher13또는--tls-cipher를 사용할 수 있습니다 (암호화는--tls-connect매개변수로 명확하게 지정됩니다)
수신 연결
수신 연결의 경우 규칙이 구성 요소와 구성에 따라 달라지기 때문에 조금 더 복잡합니다.
Zabbix agent의 경우:
| Agent 연결 설정 | 암호화 구성 |
|---|---|
| TLSConnect=cert | TLSCipherCert, TLSCipherCert13 |
| TLSConnect=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert | TLSCipherCert, TLSCipherCert13 |
| TLSAccept=psk | TLSCipherPSK, TLSCipherPSK13 |
| TLSAccept=cert,psk | TLSCipherAll, TLSCipherAll13 |
Zabbix server와 proxy의 경우:
| 연결 설정 | 암호화 구성 |
|---|---|
| PSK를 사용한 발신 연결 | TLSCipherPSK, TLSCipherPSK13 |
| 인증서를 사용한 수신 연결 | TLSCipherAll, TLSCipherAll13 |
| 서버에 인증서가 없는 경우 PSK를 사용한 수신 연결 | TLSCipherPSK, TLSCipherPSK13 |
| 서버에 인증서가 있는 경우 PSK를 사용한 수신 연결 | TLSCipherAll, TLSCipherAll13 |
위의 두 테이블에서 몇 가지 패턴을 볼 수 있습니다:
- TLSCipherAll과 TLSCipherAll13은 인증서 및 PSK 기반 암호화 제품군의 결합된 목록이 사용되는 경우에만 지정할 수 있습니다. 이런 경우가 발생하는 두 가지 상황이 있습니다: 구성된 인증서가 있는 서버(proxy) (암호 라이브러리가 PSK를 지원하는 경우 PSK 암호화 제품군은 항상 서버, proxy에 구성됨), 인증서 및 PSK 기반 수신 연결을 모두 수락하도록 구성된 agent
- 다른 경우에는 TLSCipherCert*와/또는 TLSCipherPSK*로 충분합니다
다음 표는 TLSCipher* 내장 기본값을 보여줍니다. 이는 사용자 정의 값을 위한 좋은 시작점이 될 수 있습니다.
| 매개변수 | 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 |
| 매개변수 | 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 기본값은 구형 OpenSSL 버전(1.0.1, 1.0.2, 1.1.0), LibreSSL 및 OpenSSL이 PSK 지원 없이 컴파일된 경우에 다릅니다.
사용자 구성 암호화 제품군 예제
아래에서 사용자 구성 암호화 제품군의 다음 예제들을 확인하세요:
암호화 문자열 테스트 및 PFS 암호화 제품군만 허용
선택된 암호화 제품군을 확인하려면 설정 파일에서
'DebugLevel=4'를 설정하거나 zabbix_sender에 -vv 옵션을 사용해야 합니다.
원하는 암호화 제품군을 얻기 전에 TLSCipher* 매개변수로
실험이 필요할 수 있습니다. TLSCipher* 매개변수를 조정하기 위해
Zabbix 서버, 프록시 또는 에이전트를 여러 번 재시작하는 것은 불편합니다.
더 편리한 방법은 zabbix_sender 또는 openssl 명령을 사용하는 것입니다.
두 가지 방법을 모두 보여드리겠습니다.
1. zabbix_sender 사용.
zabbix_agentd.conf 파일의 구문으로 테스트 설정 파일을
만들어봅시다. 예를 들어, /home/zabbix/test.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 암호화 제품군만 허용하려면 최대 세 개의 매개변수를 추가해야 할 수 있습니다
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



