Azure HDInsight에서 비 ESP Apache Kafka 클러스터에 대해 TLS 암호화 및 인증 설정

이 문서에서는 Apache Kafka 클라이언트와 Apache Kafka broker 간에 이전에는 SSL(Secure Sockets Layer) 암호화라고 했던 TLS(전송 계층 보안) 암호화를 설정하는 방법을 보여 줍니다. 또한 클라이언트의 인증을 설정하는 방법을 보여 줍니다(양방향 TLS라고도 함).

Important

Kafka 애플리케이션에 사용할 수 있는 두 개의 클라이언트는 Java 클라이언트 및 콘솔 클라이언트입니다. Java 클라이언트 ProducerConsumer.java만 생산과 소비를 위해 TLS를 사용할 수 있습니다. 콘솔 생산자 클라이언트 console-producer.sh는 TLS를 사용하지 않습니다.

Apache Kafka broker 설정

Kafka TLS broker 설정은 다음 방식으로 네 개의 HDInsight 클러스터 VM을 사용합니다.

  • 헤드 노드 0 - CA(인증 기관)
  • 작업자 노드 0, 1, 2 - broker

참고 항목

이 가이드에서는 자체 서명된 인증서를 사용하지만 가장 안전한 솔루션은 신뢰할 수 있는 CA에서 발급한 인증서를 사용하는 것입니다.

Broker 설치 프로세스의 요약은 다음과 같습니다.

  1. 세 개의 작업자 노드에서 각각 다음 단계가 반복됩니다.

    1. 인증서를 생성합니다.
    2. 인증서 서명 요청을 만듭니다.
    3. 인증서 서명 요청을 CA(인증 기관)로 보냅니다.
    4. CA에 로그인하고 요청에 서명합니다.
    5. SCP를 통해 서명된 인증서를 다시 작업자 노드에 보냅니다.
    6. SCP를 통해 CA의 퍼블릭 인증서를 작업자 노드에 보냅니다.
  2. 인증서가 모두 있으면 인증서를 인증서 저장소에 넣습니다.

  3. Ambari로 이동하고 구성을 변경합니다.

    다음 자세한 지침을 사용하여 broker 설정을 완료합니다.

    Important

    다음 코드 조각에서 wnX는 세 개의 작업자 노드 중 하나에 대한 약어이며, wn0, wn1 또는 wn2로 적절하게 대체되어야 합니다. WorkerNode0_NameHeadNode0_Name은 각 머신의 이름으로 대체되어야 합니다.

  4. HDInsight의 경우 CA(인증 기관)의 역할을 채우는 헤드 노드 0에서 초기 설정을 수행합니다.

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  5. 각 broker(작업자 노드 0, 1, 2)에서 동일한 초기 설정을 수행합니다.

    # Create a new directory 'ssl' and change into it
    mkdir ssl
    cd ssl
    
  6. 각 작업자 노드에서 코드 조각을 사용하여 다음 단계를 실행합니다.

    1. 키 저장소를 만들고 새 프라이빗 인증서로 채웁니다.
    2. 인증서 서명 요청을 만듭니다.
    3. SCP를 통해 인증서 서명 요청을 CA(헤드 노드 0)에 보냅니다.
    keytool -genkey -keystore kafka.server.keystore.jks -keyalg RSA -validity 365 -storepass "MyServerPassword123" -keypass "MyServerPassword123" -dname "CN=FQDN_WORKER_NODE" -ext SAN=DNS:FQDN_WORKER_NODE -storetype pkcs12
    keytool -keystore kafka.server.keystore.jks -certreq -file cert-file -storepass "MyServerPassword123" -keypass "MyServerPassword123"
    scp cert-file sshuser@HeadNode0_Name:~/ssl/wnX-cert-sign-request
    

    참고 항목

    FQDN_WORKER_NODE는 작업자 노드 머신의 정규화된 도메인 이름입니다. 헤드 노드의 /etc/hosts 파일에서 해당 세부 정보를 가져올 수 있습니다.

    예를 들면 다음과 같습니다.

    wn0-espkaf.securehadooprc.onmicrosoft.com
    wn0-kafka2.zbxwnwsmpcsuvbjqbmespcm1zg.bx.internal.cloudapp.net
    

    호스트 파일 출력을 보여주는 스크린샷.

  7. CA 머신에서 다음 명령을 실행하여 ca-cert 및 ca-key 파일을 만듭니다.

    openssl req -new -newkey rsa:4096 -days 365 -x509 -subj "/CN=Kafka-Security-CA" -keyout ca-key -out ca-cert -nodes
    
  8. CA 머신으로 변경하고 받은 모든 인증서 서명 요청에 서명합니다.

    openssl x509 -req -CA ca-cert -CAkey ca-key -in wn0-cert-sign-request -out wn0-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123"
    openssl x509 -req -CA ca-cert -CAkey ca-key -in wn1-cert-sign-request -out wn1-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123"
    openssl x509 -req -CA ca-cert -CAkey ca-key -in wn2-cert-sign-request -out wn2-cert-signed -days 365 -CAcreateserial -passin pass:"MyServerPassword123"
    
  9. 서명된 인증서를 CA(헤드 노드 0)의 작업자 노드로 다시 보냅니다.

    scp wn0-cert-signed sshuser@WorkerNode0_Name:~/ssl/cert-signed
    scp wn1-cert-signed sshuser@WorkerNode1_Name:~/ssl/cert-signed
    scp wn2-cert-signed sshuser@WorkerNode2_Name:~/ssl/cert-signed
    
  10. CA의 퍼블릭 인증서를 각 작업자 노드에 보냅니다.

    scp ca-cert sshuser@WorkerNode0_Name:~/ssl/ca-cert
    scp ca-cert sshuser@WorkerNode1_Name:~/ssl/ca-cert
    scp ca-cert sshuser@WorkerNode2_Name:~/ssl/ca-cert
    
  11. 각 작업자 노드에서 신뢰 저장소 및 키 저장소에 CA 퍼블릭 인증서를 추가합니다. 그런 다음, 작업자 노드의 자체 서명 인증서를 키 저장소에 추가합니다.

    keytool -keystore kafka.server.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt
    keytool -keystore kafka.server.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt
    keytool -keystore kafka.server.keystore.jks -import -file cert-signed -storepass "MyServerPassword123" -keypass "MyServerPassword123" -noprompt
    
    

TLS를 사용하도록 Kafka 구성 업데이트 및 broker 다시 시작

키 저장소 및 신뢰 저장소를 사용하여 각 Kafka broker를 설정하고 올바른 인증서를 가져왔습니다. 다음으로, Ambari를 사용하여 관련된 Kafka 구성 속성을 수정하고 Kafka 브로커를 다시 시작합니다.

구성 수정을 완료하려면 다음 단계를 수행합니다.

  1. Azure Portal에 로그인하고 Azure HDInsight Apache Kafka 클러스터를 선택합니다.

  2. 클러스터 대시보드에서 Ambari 홈을 클릭하여 Ambari UI로 이동합니다.

  3. Kafka 브로커에서 수신기 속성을 PLAINTEXT://localhost:9092,SSL://localhost:9093로 설정합니다.

  4. 고급 kafka-broker에서 security.inter.broker.protocol 속성을 SSL로 설정합니다.

    Ambari에서 Kafka SSL 구성 속성 편집.

  5. 사용자 지정 kafka-broker에서 ssl.client.auth 속성을 required로 설정합니다.

    참고 항목

    참고: 이 단계는 인증 및 암호화를 설정하는 경우에만 필요합니다.

    Ambari에서 Kafka SSL 구성 속성 편집.

  6. 다음은 이 변경 내용이 있는 Ambari 구성 UI를 보여주는 스크린샷입니다.

    참고 항목

    1. ssl.keystore.location 및 ssl.truststore.location은 인증 기관(hn0)의 키 저장소, truststore 위치의 전체 경로입니다.
    2. ssl.keystore.password 및 ssl.truststore.password는 키 저장소 및 트러스트 저장소에 설정된 암호입니다. 이 경우 예를 들면 다음과 같습니다. MyServerPassword123
    3. ssl.key.password는 키 저장소 및 트러스트 저장소에 대한 키 집합입니다. 이 경우 예를 들면 다음과 같습니다. MyServerPassword123
  7. Kafka에서 TLS 1.3을 사용하려면

    Ambari의 kafka 구성에 다음 구성을 추가합니다.

    1. ssl.enabled.protocols=TLSv1.3
    2. ssl.protocol=TLSv1.3

    Important

    1. TLS 1.3은 HDI 5.1 kafka 버전에서만 작동합니다.
    2. 서버 쪽에서 TLS 1.3을 사용하는 경우 클라이언트에서도 TLS 1.3 구성을 사용해야 합니다.
  8. HDI 버전 4.0 또는 5.0의 경우

    1. 인증 및 암호화를 설정하는 경우 스크린샷은 다음과 같습니다.

    Ambari 4에서 kafka-env 템플릿 속성 편집.

    1. 암호화만 설정하는 경우 스크린샷은 다음과 같습니다.

    암호화 전용으로 Ambari에서 kafka-env 템플릿 속성 필드를 편집하는 방법을 보여주는 스크린샷.

  9. 모든 Kafka 브로커를 다시 시작합니다.

클라이언트 설정(인증 제외)

인증이 필요하지 않은 경우 TLS 암호화만 설정하는 단계의 요약은 다음과 같습니다.

  1. CA(활성 헤드 노드)에 로그인합니다.
  2. CA 머신(wn0)에서 클라이언트 머신으로 CA 인증서를 복사합니다.
  3. 클라이언트 머신(hn1)에 로그인하고 ~/ssl 폴더로 이동합니다.
  4. CA 인증서를 신뢰 저장소로 가져옵니다.
  5. CA 인증서를 키 저장소로 가져옵니다.

이 단계는 다음 코드 조각에서 자세히 설명합니다.

  1. CA 노드에 로그인합니다.

    ssh sshuser@HeadNode0_Name
    cd ssl
    
  2. CA 인증서를 클라이언트 머신에 복사합니다.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
  3. 클라이언트 머신(대기 헤드 노드)에 로그인합니다.

    ssh sshuser@HeadNode1_Name
    cd ssl
    
  4. CA 인증서를 신뢰 저장소로 가져옵니다.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  5. CA 인증서를 키 저장소로 가져옵니다.

    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  6. 클라이언트 컴퓨터(hn1)에서 client-ssl-auth.properties 파일을 만듭니다. 파일에 다음 줄이 있어야 합니다.

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    
    1. TLS 1.3을 사용하려면 다음 구성을 파일 client-ssl-auth.properties에 추가합니다.
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    
  7. 생산자 및 소비자 옵션으로 관리자 클라이언트를 시작하여 생산자 및 소비자가 둘 다 포트 9093에서 작동하는지 확인합니다. 콘솔 생산자/소비자를 사용하여 설정을 확인하는 데 필요한 단계는 확인 섹션을 참조하세요.

클라이언트 설정(인증 포함)

참고 항목

다음 단계는 TLS 암호화 인증을 둘 다 설정하는 경우에만 필요합니다. 암호화만 설정하는 경우 클라이언트 설정(인증 제외)을 참조하세요.

다음 4개 단계에서는 클라이언트 설정을 완료하는 데 필요한 작업을 요약합니다.

  1. 클라이언트 머신(대기 헤드 노드)에 로그인합니다.
  2. Java 키 저장소를 만들고 서명된 브로커용 인증서를 가져옵니다. 그런 다음, CA가 실행 중인 VM에 인증서를 복사합니다.
  3. CA 머신(활성 헤드 노드)으로 전환하여 클라이언트 인증서에 서명합니다.
  4. 클라이언트 머신(대기 헤드 노드)으로 이동하고 ~/ssl 폴더로 이동합니다. 서명된 인증서를 클라이언트 머신에 복사합니다.

각 단계의 세부 정보가 제공됩니다.

  1. 클라이언트 머신(대기 헤드 노드)에 로그인합니다.

    ssh sshuser@HeadNode1_Name
    
  2. 기존 SSL 디렉터리를 제거합니다.

    rm -R ~/ssl
    mkdir ssl
    cd ssl
    
  3. Java 키 저장소를 만들고 인증서 서명 요청을 만듭니다.

    keytool -genkey -keystore kafka.client.keystore.jks -validity 365 -storepass "MyClientPassword123" -keypass "MyClientPassword123" -dname "CN=HEADNODE1_FQDN" -storetype pkcs12
    
    keytool -keystore kafka.client.keystore.jks -certreq -file client-cert-sign-request -storepass "MyClientPassword123" -keypass "MyClientPassword123"
    
  4. 인증서 서명 요청을 CA에 복사합니다.

    scp client-cert-sign-request sshuser@HeadNode0_Name:~/ssl/client-cert-sign-request
    
  5. CA 머신(활성 헤드 노드)으로 전환하고 클라이언트 인증서에 서명합니다.

    ssh sshuser@HeadNode0_Name
    cd ssl
    openssl x509 -req -CA ca-cert -CAkey ca-key -in ~/ssl/client-cert-sign-request -out ~/ssl/client-cert-signed -days 365 -CAcreateserial -passin pass:MyClientPassword123
    
  6. 서명된 클라이언트 인증서를 CA(활성 헤드 노드)에서 클라이언트 머신으로 복사합니다.

    scp client-cert-signed sshuser@HeadNode1_Name:~/ssl/client-signed-cert
    
  7. CA 인증서를 클라이언트 머신에 복사합니다.

    scp ca-cert sshuser@HeadNode1_Name:~/ssl/ca-cert
    
    1. 클라이언트 머신(대기 헤드 노드)에 로그인하고 SSL 디렉터리로 이동합니다.
    ssh sshuser@HeadNode1_Name
    cd ssl
    
  8. 서명된 인증서를 사용하여 클라이언트 저장소를 만들고 CA 인증서를 클라이언트 머신(hn1)의 키 저장소 및 신뢰 저장소로 가져옵니다.

    keytool -keystore kafka.client.truststore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
    keytool -keystore kafka.client.keystore.jks -alias CARoot -import -file ca-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
    keytool -keystore kafka.client.keystore.jks -import -file client-signed-cert -storepass "MyClientPassword123" -keypass "MyClientPassword123" -noprompt
    
  9. 클라이언트 머신(hn1)에 client-ssl-auth.properties 파일을 만듭니다. 파일에 다음 줄이 있어야 합니다.

    security.protocol=SSL
    ssl.truststore.location=/home/sshuser/ssl/kafka.client.truststore.jks
    ssl.truststore.password=MyClientPassword123
    ssl.keystore.location=/home/sshuser/ssl/kafka.client.keystore.jks
    ssl.keystore.password=MyClientPassword123
    ssl.key.password=MyClientPassword123
    
    1. TLS 1.3을 사용하려면 다음 구성을 파일 client-ssl-auth.properties에 추가합니다.
    ssl.enabled.protocols=TLSv1.3
    ssl.protocol=TLSv1.3
    

확인

클라이언트 머신에서 다음 단계를 실행합니다.

참고 항목

HDInsight 4.0 및 Kafka 2.1이 설치된 경우 콘솔 생산자/소비자를 사용하여 설정을 확인할 수 있습니다. 그렇지 않으면 포트 9092에서 Kafka 생산자를 실행하고 토픽에 메시지를 보낸 다음, TLS를 사용하는 포트 9093에서 Kafka 소비자를 사용합니다.

Kafka 2.1 이상

  1. 토픽이 없는 경우 토픽을 만듭니다.

    /usr/hdp/current/kafka-broker/bin/kafka-topics.sh --zookeeper <ZOOKEEPER_NODE>:2181 --create --topic topic1 --partitions 2 --replication-factor 2
    
  2. 콘솔 생산자를 시작하고 client-ssl-auth.properties의 경로를 생산자의 구성 파일로 제공합니다.

    /usr/hdp/current/kafka-broker/bin/kafka-console-producer.sh --broker-list <FQDN_WORKER_NODE>:9093 --topic topic1 --producer.config ~/ssl/client-ssl-auth.properties
    
  3. 클라이언트 머신에 대한 또 다른 SSH 연결을 열고, 콘솔 소비자를 시작하고, client-ssl-auth.properties의 경로를 소비자의 구성 파일로 제공합니다.

    /usr/hdp/current/kafka-broker/bin/kafka-console-consumer.sh --bootstrap-server <FQDN_WORKER_NODE>:9093 --topic topic1 --consumer.config ~/ssl/client-ssl-auth.properties --from-beginning
    

다음 단계