5장. 보안 연결 구성


Kafka 클러스터와 클라이언트 애플리케이션 간의 연결을 보호하면 클러스터와 클라이언트 간의 통신의 기밀성, 무결성 및 신뢰성을 보장할 수 있습니다.

보안 연결을 위해 인증, 암호화 및 권한 부여와 관련된 구성을 도입할 수 있습니다.

인증
인증 메커니즘을 사용하여 클라이언트 애플리케이션의 ID를 확인합니다.
암호화
SSL/TLS 암호화를 사용하여 클라이언트와 브로커 간 전송 중 데이터 암호화를 활성화합니다.
권한 부여
클라이언트 애플리케이션의 인증된 ID를 기반으로 Kafka 브로커에서 허용된 클라이언트 액세스 및 작업을 제어합니다.

권한 부여는 인증 없이 사용할 수 없습니다. 인증이 활성화되지 않은 경우 클라이언트의 ID를 확인할 수 없으므로 권한 부여 규칙을 적용할 수 없습니다. 즉, 권한 부여 규칙이 정의되어 있어도 인증없이 적용되지 않습니다.

AMQ Streams에서 리스너는 Kafka 브로커와 클라이언트 간의 네트워크 연결을 구성하는 데 사용됩니다. 리스너 구성 옵션은 브로커가 들어오는 클라이언트 연결을 청취하는 방법과 보안 액세스 관리 방법을 결정합니다. 필요한 정확한 구성은 선택한 인증, 암호화 및 권한 부여 메커니즘에 따라 다릅니다.

보안 기능을 활성화하도록 Kafka 브로커 및 클라이언트 애플리케이션을 구성합니다. Kafka 클러스터에 대한 클라이언트 연결을 보호하는 일반적인 개요는 다음과 같습니다.

  1. Kafka 클러스터를 포함하여 AMQ Streams 구성 요소를 설치합니다.
  2. TLS의 경우 각 브로커 및 클라이언트 애플리케이션에 대한 TLS 인증서를 생성합니다.
  3. 보안 연결을 위해 브로커 구성에서 리스너를 구성합니다.
  4. 보안 연결을 위해 클라이언트 애플리케이션을 구성합니다.

Kafka 브로커와 안전하고 인증된 연결을 구축하기 위해 사용하는 메커니즘에 따라 클라이언트 애플리케이션을 구성합니다. Kafka 브로커가 사용하는 인증, 암호화 및 권한은 연결 클라이언트 애플리케이션에서 사용하는 인증, 암호화 및 권한과 일치해야 합니다. 클라이언트 애플리케이션 및 브로커는 보안 통신을 수행하기 위해 보안 프로토콜 및 구성에 동의해야 합니다. 예를 들어 Kafka 클라이언트와 Kafka 브로커는 동일한 TLS 버전 및 암호화 제품군을 사용해야 합니다.

참고

클라이언트와 브로커 간의 보안 구성이 일치하지 않으면 연결에 실패하거나 잠재적인 보안 취약점이 발생할 수 있습니다. 브로커 및 클라이언트 애플리케이션을 신중하게 구성하고 테스트하여 올바르게 보호하고 안전하게 통신할 수 있는지 확인하는 것이 중요합니다.

5.1. 보안 액세스를 위해 브로커 설정

보안 액세스를 위해 클라이언트 애플리케이션을 구성하려면 먼저 사용하려는 보안 메커니즘을 지원하도록 Kafka 클러스터의 브로커를 설정해야 합니다. 보안 연결을 활성화하려면 보안 메커니즘에 대한 적절한 구성으로 리스너를 생성합니다.

5.1.1. RHEL에서 실행되는 Kafka 클러스터에 대한 보안 연결 설정

RHEL에서 AMQ Streams를 사용하는 경우 Kafka 클러스터에 대한 클라이언트 연결을 보호하는 일반적인 개요는 다음과 같습니다.

  1. RHEL 서버에 Kafka 클러스터를 포함한 AMQ Streams 구성 요소를 설치합니다.
  2. TLS의 경우 Kafka 클러스터의 모든 브로커에 대한 TLS 인증서를 생성합니다.
  3. 브로커 구성 속성 파일에서 리스너를 구성합니다.

    • TLS 또는 SASL SCRAM-SHA-512와 같은 Kafka 클러스터 리스너에 대한 인증을 구성합니다.
    • Kafka 클러스터에서 활성화된 모든 리스너(예: 간단한 권한 부여)에 대한 권한을 구성합니다.
  4. TLS의 경우 각 클라이언트 애플리케이션에 대한 TLS 인증서를 생성합니다.
  5. config.properties 파일을 생성하여 클라이언트 애플리케이션에서 사용하는 연결 세부 사항 및 인증 자격 증명을 지정합니다.
  6. Kafka 클라이언트 애플리케이션을 시작하고 Kafka 클러스터에 연결합니다.

    • config.properties 파일에 정의된 속성을 사용하여 Kafka 브로커에 연결합니다.
  7. 클라이언트가 Kafka 클러스터에 성공적으로 연결하고 메시지를 안전하게 소비하고 생성할 수 있는지 확인합니다.

브로커 설정에 대한 자세한 내용은 RHEL에서 AMQ Streams 사용을 참조하십시오.

5.1.2. RHEL에서 Kafka 클러스터의 보안 리스너 구성

구성 속성 파일을 사용하여 Kafka에서 리스너를 구성합니다. Kafka 브로커에 대한 보안 연결을 구성하려면 이 파일에서 TLS, SASL 및 기타 보안 관련 구성에 대한 관련 속성을 설정합니다.

다음은 PKCS#12 형식의 키 저장소 및 신뢰 저장소를 사용하여 Kafka 브로커의 server.properties 구성 파일에 지정된 TLS 리스너 구성의 예입니다.

server.properties의 리스너 구성 예

listeners = listener_1://0.0.0.0:9093, listener_2://0.0.0.0:9094
listener.security.protocol.map = listener_1:SSL, listener_2:PLAINTEXT
ssl.keystore.type = PKCS12
ssl.keystore.location = /path/to/keystore.p12
ssl.keystore.password = <password>
ssl.truststore.type = PKCS12
ssl.truststore.location = /path/to/truststore.p12
ssl.truststore.password = <password>
ssl.client.auth = required
authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer.
super.users = User:superuser

listeners 속성은 각 리스너 이름을 지정하고 브로커가 수신 대기하는 IP 주소와 포트를 지정합니다. 프로토콜 맵은 listener_1 리스너가 TLS 암호화를 사용하는 클라이언트에 대해 SSL 프로토콜을 사용하도록 지시합니다. listener_2 는 TLS 암호화를 사용하지 않는 클라이언트에 대해 PLAINTEXT 연결을 제공합니다. 키 저장소에는 브로커의 개인 키와 인증서가 포함되어 있습니다. 신뢰 저장소에는 클라이언트 애플리케이션의 ID를 확인하는 데 사용되는 신뢰할 수 있는 인증서가 포함되어 있습니다. ssl.client.auth 속성은 클라이언트 인증을 적용합니다.

Kafka 클러스터는 간단한 권한 부여를 사용합니다. 작성자는 SimpleAclAuthorizer 로 설정됩니다. 단일 슈퍼 사용자는 모든 리스너에 대한 제약되지 않은 액세스에 대해 정의됩니다. AMQ Streams는 Kafka SimpleAclAuthorizer 및 사용자 정의 인증 관리자 플러그인을 지원합니다.

구성 속성 앞에 listener.name.<name_of_listener >를 지정하면 구성이 해당 리스너와 관련이 있습니다.

이는 샘플 구성일 뿐입니다. 일부 구성 옵션은 리스너 유형에 따라 다릅니다. OAuth 2.0 또는OPA(Open Policy Agent)를 사용하는 경우 특정 리스너에서 권한 부여 서버 또는 OPA 서버에 대한 액세스도 구성해야 합니다. 특정 요구 사항 및 환경에 따라 리스너를 생성할 수 있습니다.

리스너 구성에 대한 자세한 내용은 Apache Kafka 설명서 를 참조하십시오.

ACL을 사용하여 액세스 세부 조정

ACL(액세스 제어 목록)을 사용하여 Kafka 클러스터에 대한 액세스를 미세 조정할 수 있습니다. ACL(액세스 제어 목록)을 생성하고 관리하려면 kafka-acls.sh 명령줄 도구를 사용합니다. ACL은 클라이언트 애플리케이션에 액세스 규칙을 적용합니다.

다음 예에서 첫 번째 ACL은 my-topic 이라는 특정 항목에 대한 읽기 및 설명 권한을 부여합니다. resource.patternType리터럴 로 설정되며, 이는 리소스 이름이 정확히 일치해야 함을 의미합니다.

두 번째 ACL은 my-group 이라는 특정 소비자 그룹에 대해 읽기 권한을 부여합니다. resource.patternType접두사 로 설정되어 리소스 이름이 접두사와 일치해야 함을 의미합니다.

ACL 구성 예

bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add \
--allow-principal User:my-user --operation Read --operation Describe --topic my-topic --resource-pattern-type literal \
--allow-principal User:my-user --operation Read --group my-group --resource-pattern-type prefixed

5.1.3. OpenShift에서 실행되는 Kafka 클러스터에 대한 보안 연결 설정

OpenShift에서 AMQ Streams를 사용하는 경우 Kafka 클러스터에 대한 클라이언트 연결을 보호하는 일반적인 개요는 다음과 같습니다.

  1. Cluster Operator를 사용하여 OpenShift 환경에 Kafka 클러스터를 배포합니다. Kafka 사용자 지정 리소스를 사용하여 클러스터를 구성 및 설치하고 리스너를 생성합니다.

    • TLS 또는 SASL SCRAM-SHA-512와 같은 리스너에 대한 인증을 구성합니다. Cluster Operator는 Kafka 브로커의 ID를 확인하기 위해 클러스터 CA 인증서가 포함된 보안을 생성합니다.
    • 간단한 권한 부여와 같이 활성화된 모든 리스너에 대한 권한 부여를 구성합니다.
  2. User Operator를 사용하여 클라이언트를 나타내는 Kafka 사용자를 생성합니다. KafkaUser 사용자 지정 리소스를 사용하여 사용자를 구성하고 생성합니다.

    • 리스너의 인증 메커니즘과 일치하는 Kafka 사용자(클라이언트)에 대한 인증을 구성합니다. User Operator는 클라이언트가 Kafka 클러스터와의 인증에 사용할 클라이언트 인증서 및 개인 키가 포함된 보안을 생성합니다.
    • 리스너의 권한 부여 메커니즘과 일치하는 Kafka 사용자(클라이언트)의 권한을 구성합니다. 권한 부여 규칙을 사용하면 Kafka 클러스터에서 특정 작업을 수행할 수 있습니다.
  3. config.properties 파일을 생성하여 클러스터에 연결하기 위해 클라이언트 애플리케이션에 필요한 연결 세부 정보 및 인증 자격 증명을 지정합니다.
  4. Kafka 클라이언트 애플리케이션을 시작하고 Kafka 클러스터에 연결합니다.

    • config.properties 파일에 정의된 속성을 사용하여 Kafka 브로커에 연결합니다.
  5. 클라이언트가 Kafka 클러스터에 성공적으로 연결하고 메시지를 안전하게 소비하고 생성할 수 있는지 확인합니다.

브로커 설정에 대한 자세한 내용은 OpenShift에서 AMQ Streams 구성을 참조하십시오.

5.1.4. OpenShift에서 Kafka 클러스터의 보안 리스너 구성

AMQ Streams를 사용하여 Kafka 사용자 정의 리소스를 배포할 때 Kafka 사양에 리스너 구성을 추가합니다. Kafka에서 연결 보안을 위해 리스너 구성을 사용합니다. Kafka 브로커에 대한 보안 연결을 구성하려면 리스너 수준에서 TLS, SASL 및 기타 보안 관련 구성의 관련 속성을 설정합니다.

외부 리스너는 OpenShift 클러스터 외부에서 Kafka 클러스터에 대한 클라이언트 액세스를 제공합니다. AMQ Streams는 구성 기반 Kafka 클러스터에 액세스할 수 있도록 리스너 서비스 및 부트스트랩 주소를 생성합니다. 예를 들어 다음 연결 메커니즘을 사용하는 외부 리스너를 생성할 수 있습니다.

  • 노드 포트
  • 로드 밸런서
  • OpenShift 경로

다음은 Kafka 리소스에 대한 노드 포트 리스너 구성의 예입니다.

Kafka 리소스의 리스너 구성 예

apiVersion: {KafkaApiVersion}
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    # ...
    listeners:
      - name: plaintext
        port: 9092
        type: internal
        tls: false
        configuration:
          useServiceDnsDomain: true
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external
        port: 9094
        type: route
        tls: true
        authentication:
          type: tls
    authorization:
      type: simple
      superUsers:
        - CN=superuser
  # ...

listeners 속성은 일반 텍스트 ,tls 외부의 세 개의 리스너로 구성됩니다. 외부 리스너는 nodeport 유형이며 암호화 및 인증에 TLS를 사용합니다. Cluster Operator를 사용하여 Kafka 클러스터를 생성하면 CA 인증서가 자동으로 생성됩니다. 클라이언트 애플리케이션의 신뢰 저장소에 클러스터 CA를 추가하여 Kafka 브로커의 ID를 확인합니다. 또는 브로커 또는 리스너 수준에서 자체 인증서를 사용하도록 AMQ Streams를 구성할 수 있습니다. 클라이언트 애플리케이션에 다른 보안 구성이 필요한 경우 리스너 수준에서 인증서를 사용해야 할 수 있습니다. 리스너 수준에서 인증서를 사용하면 추가 제어 및 보안 계층도 추가됩니다.

작은 정보

구성 공급자 플러그인을 사용하여 구성 데이터를 생산자 및 소비자 클라이언트에 로드합니다. 구성 공급자 플러그인은 시크릿 또는 ConfigMap에서 구성 데이터를 로드합니다. 예를 들어 Strimzi 시크릿에서 인증서를 자동으로 가져오도록 공급자에게 지시할 수 있습니다. 자세한 내용은 OpenShift에서 실행하기 위한 AMQ Streams 설명서를 참조하십시오.

Kafka 클러스터는 간단한 권한 부여를 사용합니다. 권한 부여 속성 유형은 simple 로 설정됩니다. 단일 슈퍼 사용자는 모든 리스너에 대한 제약되지 않은 액세스에 대해 정의됩니다. AMQ Streams는 Kafka SimpleAclAuthorizer 및 사용자 정의 인증 관리자 플러그인을 지원합니다.

이는 샘플 구성일 뿐입니다. 일부 구성 옵션은 리스너 유형에 따라 다릅니다. OAuth 2.0 또는OPA(Open Policy Agent)를 사용하는 경우 특정 리스너에서 권한 부여 서버 또는 OPA 서버에 대한 액세스도 구성해야 합니다. 특정 요구 사항 및 환경에 따라 리스너를 생성할 수 있습니다.

리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조 를 참조하십시오.

참고

OpenShift에서 Kafka 클러스터에 대한 클라이언트 액세스에 대해 경로 유형 리스너를 사용하는 경우 TLS 패스스루 기능이 활성화됩니다. OpenShift 경로는 HTTP 프로토콜과 함께 작동하도록 설계되었지만 Apache Kafka에서 사용하는 Kafka 프로토콜을 포함하여 다른 프로토콜의 네트워크 트래픽을 프록시하는 데 사용할 수도 있습니다. 클라이언트는 경로에 대한 연결을 설정하고 경로는 TLS 서버 이름 표시(SNI) 확장을 사용하여 대상 호스트 이름을 가져오는 OpenShift 클러스터에서 실행 중인 브로커로 트래픽을 전달합니다. SNI 확장을 사용하면 경로가 각 연결에 대한 대상 브로커를 올바르게 식별할 수 있습니다.

ACL을 사용하여 액세스 세부 조정

ACL(액세스 제어 목록)을 사용하여 Kafka 클러스터에 대한 액세스를 미세 조정할 수 있습니다. ACL(액세스 제어 목록)을 추가하려면 KafkaUser 사용자 정의 리소스를 구성합니다. KafkaUser 를 생성하면 AMQ Streams에서 자동으로 ACL 생성 및 업데이트를 관리합니다. ACL은 클라이언트 애플리케이션에 액세스 규칙을 적용합니다.

다음 예에서 첫 번째 ACL은 my-topic 이라는 특정 항목에 대한 읽기 및 설명 권한을 부여합니다. resource.patternType리터럴 로 설정되며, 이는 리소스 이름이 정확히 일치해야 함을 의미합니다.

두 번째 ACL은 my-group 이라는 특정 소비자 그룹에 대해 읽기 권한을 부여합니다. resource.patternType접두사 로 설정되어 리소스 이름이 접두사와 일치해야 함을 의미합니다.

KafkaUser 리소스의 ACL 구성 예

apiVersion: {KafkaUserApiVersion}
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  # ...
  authorization:
    type: simple
    acls:
      - resource:
          type: topic
          name: my-topic
          patternType: literal
        operations:
          - Read
          - Describe
      - resource:
          type: group
          name: my-group
          patternType: prefix
        operations:
          - Read

참고

Kafka 사용자를 구성할 때 tls-external 을 인증 옵션으로 지정하는 경우 User Operator에서 생성한 클라이언트 인증서 대신 자체 클라이언트 인증서를 사용할 수 있습니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.