17 암호화

개요

Zabbix는 암호화 라이브러리에 따라 TLS(Transport Layer Security) 프로토콜 v.1.2 및 1.3을 사용하여 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(또는 더 새로운 버전) 라이브러리 사용을 고려하십시오. GnuTLSOpenSSL 1.1.0 라이브러리는 완전 순방향 보안을 제공하는 PSK 암호화 도구 모음을 지원합니다. OpenSSL 라이브러리의 이전 버전(1.0.1, 1.0.2c)도 PSK를 지원하지만, 사용 가능한 PSK 암호화 도구 모음은 완전 순방향 보안을 제공하지 않습니다.

연결 암호화 관리

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

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 프론트엔드의 데이터 수집 → 호스트에서 에이전트 암호화 열에 표시됩니다. 예를 들어:

예시 호스트에 대한 연결 호스트로부터 허용되는 연결 호스트로부터 거부되는 연결
none\_none.png 암호화되지 않음 암호화되지 않음 암호화됨, 인증서 및 PSK 기반 암호화
cert\_cert.png 암호화됨, 인증서 기반 암호화됨, 인증서 기반 암호화되지 않음 및 PSK 기반 암호화
psk\_psk.png 암호화됨, PSK 기반 암호화됨, PSK 기반 암호화되지 않음 및 인증서 기반 암호화
psk\_none\_psk.png 암호화됨, PSK 기반 암호화되지 않음 및 PSK 기반 암호화 인증서 기반 암호화
cert\_all.png 암호화됨, 인증서 기반 암호화되지 않음, PSK 또는 인증서 기반 암호화 -

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

암호화와 함께 사용하는 zabbix_get과 zabbix_sender

암호화와 함께 사용하는 방법은 zabbix_getzabbix_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_getzabbix_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 serverproxy의 경우:

연결 설정 암호화 구성
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