암호화

Zabbix v7.4번역일: 2026-09-09원본 보기

개요

Zabbix는 Transport Layer Security(TLS) 프로토콜 v.1.2, 1.3(암호화 라이브러리에 따라 다름)을 사용해 Zabbix 컴포넌트 간 암호화된 통신을 지원합니다. 인증서 기반과 사전 공유 키(pre-shared key) 기반 암호화를 모두 지원합니다.

다음 연결에 대해 암호화를 구성할 수 있습니다:

  • Zabbix server, Zabbix proxy, Zabbix agent, Zabbix web service, zabbix_sender, zabbix_get 유틸리티 간
  • Zabbix frontend 및 server/proxy에서 Zabbix 데이터베이스로
  • Zabbix frontend와 Zabbix server 간

암호화는 선택 사항이며 개별 컴포넌트별로 구성할 수 있습니다:

  • 일부 proxy와 agent는 server와 인증서 기반 암호화를 사용하도록 구성하고, 다른 일부는 사전 공유 키 기반 암호화를 사용하며, 또 다른 일부는(기존과 동일하게) 암호화 없이 통신을 계속할 수 있습니다.
  • Server(proxy)는 호스트마다 다른 암호화 구성을 사용할 수 있습니다.

Zabbix 데몬 프로그램은 암호화된 연결과 암호화되지 않은 수신 연결 모두에 하나의 리스닝 포트를 사용합니다. 암호화를 추가해도 방화벽에서 새 포트를 열 필요가 없습니다.

제한 사항

  • 개인 키(private key)는 시작 시 Zabbix 컴포넌트가 읽을 수 있는 파일에 평문으로 저장됩니다.
  • 사전 공유 키는 Zabbix frontend에서 입력되며 Zabbix 데이터베이스에 평문으로 저장됩니다.
  • 내장 암호화는 Zabbix frontend를 실행하는 웹 서버와 사용자 웹 브라우저 간의 통신은 보호하지 않습니다.
  • 현재 각 암호화 연결은 전체 TLS 핸드셰이크로 열리며, 세션 캐싱과 티켓은 구현되어 있지 않습니다.
  • 암호화를 추가하면 네트워크 지연 시간에 따라 항목 점검과 액션 처리 시간이 늘어납니다:
    • 예를 들어 패킷 지연이 100ms인 경우 TCP 연결을 열고 암호화되지 않은 요청을 보내는 데 약 200ms가 걸립니다. 암호화를 사용하면 TLS 연결을 수립하는 데 약 1000ms가 추가됩니다.
    • 타임아웃을 늘려야 할 수도 있습니다. 그렇지 않으면 agent에서 원격 스크립트를 실행하는 일부 항목과 액션이 암호화되지 않은 연결에서는 동작하지만, 암호화된 연결에서는 타임아웃으로 실패할 수 있습니다.
  • 네트워크 디스커버리는 암호화를 지원하지 않습니다. 네트워크 디스커버리가 수행하는 Zabbix agent 점검은 암호화되지 않은 상태로 진행되며, Zabbix agent가 암호화되지 않은 연결을 거부하도록 구성되어 있으면 이러한 점검은 성공하지 못합니다.

암호화를 지원하는 Zabbix 컴파일

암호화를 지원하려면 Zabbix를 다음 지원 암호화 라이브러리 중 하나로 컴파일하고 링크해야 합니다:

  • GnuTLS - 버전 3.1.18 이상
  • OpenSSL - 버전 1.0.1, 1.0.2, 1.1.0, 1.1.1, 3.0.x - 3.5.x
  • LibreSSL - 버전 2.7.4, 2.8.2에서 테스트됨:
    • LibreSSL 2.6.x는 지원되지 않습니다
    • LibreSSL은 OpenSSL의 호환 대체재로 지원됩니다. LibreSSL 전용 신규 tls_*() API 함수는 사용되지 않습니다. LibreSSL로 컴파일된 Zabbix 컴포넌트는 PSK를 사용할 수 없으며 인증서만 사용할 수 있습니다.

Zabbix frontend용 SSL 설정에 관한 자세한 내용은 다음 모범 사례를 참고하세요.

라이브러리는 "configure" 스크립트에 해당 옵션을 지정해 선택합니다:

  • --with-gnutls[=DIR]
  • --with-openssl[=DIR](LibreSSL에도 사용됨)

예를 들어 OpenSSL을 사용해 server와 agent용 소스를 구성하려면 다음과 같이 사용할 수 있습니다:

./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

서로 다른 Zabbix 컴포넌트는 서로 다른 암호화 라이브러리로 컴파일될 수 있습니다 (예: server는 OpenSSL, agent는 GnuTLS).

사전 공유 키(PSK)를 사용할 계획이라면, PSK를 사용하는 Zabbix 컴포넌트에서 GnuTLS 또는 OpenSSL 1.1.0(또는 이후 버전) 라이브러리 사용을 고려하세요. GnuTLS와 OpenSSL 1.1.0 라이브러리는 완전 순방향 비밀성(Perfect Forward Secrecy)을 지원하는 PSK 암호 스위트를 지원합니다. 이전 버전의 OpenSSL 라이브러리(1.0.1, 1.0.2c)도 PSK를 지원하지만, 사용 가능한 PSK 암호 스위트는 완전 순방향 비밀성을 제공하지 않습니다.

연결 암호화 관리

Zabbix에서 연결은 다음을 사용할 수 있습니다:

Zabbix 컴포넌트 간 암호화를 지정하는 데 사용되는 중요한 매개변수 두 가지가 있습니다:

  • TLSConnect - 나가는(outgoing) 연결에 사용할 암호화를 지정합니다(암호화 없음, PSK 또는 인증서)
  • TLSAccept - 들어오는(incoming) 연결에 허용되는 연결 종류를 지정합니다 (암호화 없음, PSK 또는 인증서). 하나 이상의 값을 지정할 수 있습니다.

TLSConnect는 Zabbix proxy(능동 모드에서는 server로의 연결만 지정) 및 Zabbix agent(능동 점검용) 구성 파일에서 사용됩니다. Zabbix frontend에서 TLSConnect에 해당하는 항목은 Data collection → Hosts → <일부 host> → Encryption 탭의 Connections to host 필드와 Administration → Proxies → <일부 proxy> → Encryption 탭의 Connections to proxy 필드입니다. 연결에 구성된 암호화 유형이 실패하면 다른 암호화 유형은 시도되지 않습니다.

TLSAccept는 Zabbix proxy(수동 모드에서는 server로부터의 연결만 지정) 및 Zabbix agent(수동 점검용) 구성 파일에서 사용됩니다. Zabbix frontend에서 TLSAccept에 해당하는 항목은 Data collection → Hosts → <일부 host> → Encryption 탭의 Connections from host 필드와 Administration → Proxies → <일부 proxy> → Encryption 탭의 Connections from proxy 필드입니다.

일반적으로 들어오는 연결에는 하나의 암호화 유형만 구성합니다. 하지만 다운타임을 최소화하고 롤백 가능성을 확보하면서 암호화 유형을 전환(예: 암호화 없음에서 인증서 기반으로)하고 싶을 수 있습니다. 이를 위해:

  • agent 구성 파일에 TLSAccept=unencrypted,cert를 설정하고 Zabbix agent를 재시작합니다
  • 인증서를 사용해 zabbix_get으로 agent와의 연결을 테스트합니다. 정상 동작하면 Zabbix frontend의 Data collection → Hosts → <일부 host> → Encryption 탭에서 Connections to host를 "Certificate"로 설정해 해당 agent의 암호화를 재구성할 수 있습니다.
  • server 구성 캐시가 갱신되면(호스트가 proxy로 모니터링되는 경우 proxy 구성도 갱신되면) 해당 agent와의 연결이 암호화됩니다
  • 예상대로 모두 동작하면 agent 구성 파일에 TLSAccept=cert를 설정하고 Zabbix agent를 재시작할 수 있습니다. 이제 agent는 암호화된 인증서 기반 연결만 수락합니다. 암호화되지 않은 연결과 PSK 기반 연결은 거부됩니다.

server와 proxy에서도 유사한 방식으로 동작합니다. Zabbix frontend의 호스트 구성에서 Connections from host가 "Certificate"로 설정되어 있으면, agent(능동 점검)와 zabbix_sender(트래퍼 항목)에서 오는 연결 중 인증서 기반으로 암호화된 연결만 수락됩니다.

대부분의 경우 들어오는 연결과 나가는 연결에 동일한 암호화 유형 또는 암호화 없음을 사용하도록 구성하게 됩니다. 하지만 기술적으로는 비대칭으로 구성하는 것도 가능합니다. 예를 들어 들어오는 연결은 인증서 기반, 나가는 연결은 PSK 기반으로 암호화하는 식입니다.

각 호스트의 암호화 구성은 Zabbix frontend의 Data collection > Hosts에서 Agent encryption 열에 표시됩니다. 예를 들면:

예시 Connections to host Allowed connections from host Rejected connections from host
none_none.png 암호화되지 않음 암호화되지 않음 암호화됨, 인증서 및 PSK 기반 암호화
cert_cert.png 암호화됨, 인증서 기반 암호화됨, 인증서 기반 암호화되지 않음, PSK 기반 암호화
psk_psk.png 암호화됨, PSK 기반 암호화됨, PSK 기반 암호화되지 않음, 인증서 기반 암호화
psk_none_psk.png 암호화됨, PSK 기반 암호화되지 않음, PSK 기반 암호화 인증서 기반 암호화
cert_all.png 암호화됨, 인증서 기반 암호화되지 않음, PSK 또는 인증서 기반 암호화 -

연결은 기본적으로 암호화되지 않습니다. 암호화는 호스트와 proxy별로 개별적으로 구성해야 합니다.

암호화와 함께 사용하는 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* 값 설정이 실패하면 server, proxy 또는 agent는 시작되지 않으며 오류가 기록됩니다.

각 매개변수가 언제 적용되는지 이해하는 것이 중요합니다.

나가는 연결

가장 단순한 경우는 나가는 연결입니다:

  • 인증서를 사용하는 나가는 연결의 경우 - 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
server에 인증서가 없을 때 PSK를 사용하는 들어오는 연결 TLSCipherPSK, TLSCipherPSK13
server에 인증서가 있을 때 PSK를 사용하는 들어오는 연결 TLSCipherAll, TLSCipherAll13

위 두 표에서 다음과 같은 패턴을 확인할 수 있습니다:

  • TLSCipherAll과 TLSCipherAll13은 인증서 및 PSK 기반 암호 스위트의 결합 목록을 사용하는 경우에만 지정할 수 있습니다. 이런 경우는 두 가지입니다: 인증서가 구성된 server(proxy)(암호화 라이브러리가 PSK를 지원하면 PSK 암호 스위트는 server, 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, PSK 지원 없이 컴파일된 OpenSSL의 경우 다릅니다.

사용자 구성 암호 스위트 예시

아래에서 사용자 구성 암호 스위트의 다음 예시를 확인하세요:

암호 문자열 테스트와 PFS 암호 스위트만 허용하기

어떤 암호 스위트가 선택되었는지 확인하려면 구성 파일에 'DebugLevel=4'를 설정하거나 zabbix_sender에 -vv 옵션을 사용해야 합니다.

원하는 암호 스위트를 얻기까지 TLSCipher* 매개변수를 이것저것 실험해봐야 할 수도 있습니다. TLSCipher* 매개변수를 조정하기 위해 Zabbix server, proxy 또는 agent를 여러 번 재시작하는 것은 번거롭습니다. 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와 agent 인증서, 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 agent와의 상호 운용성을 보장하도록 선택된 것입니다.

더 최신 시스템에서는 소수의 암호 스위트만 허용해 보안을 강화하도록 선택할 수 있습니다. 예를 들어 PFS(완전 순방향 비밀성)를 갖춘 암호 스위트만 허용하는 식입니다. 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을 조정하려면 agent, proxy 또는 server로 실험해야 합니다.

따라서 PFS 암호 스위트만 허용하려면 최대 세 개의 매개변수를 추가해야 할 수 있습니다

  TLSCipherCert=EECDH+aRSA+AES128
  TLSCipherPSK=kECDHEPSK+AES128
  TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128

각각 인증서가 구성되어 있고 agent에도 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

더 자세한 출력을 원한다면 openssl ciphers에 -V 옵션을 사용할 수 있습니다:

  $ 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 암호 스위트는 server/proxy에서 완전히 비활성화할 수 없습니다.

그리고 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