Dataproc 보안 구성

Dataproc 클러스터를 만들 때 Kerberos를 통해 Hadoop 보안 모드를 사용 설정하면 Dataproc 클러스터 내에서 사용자 인증, 격리, 암호화를 통해 다중 테넌트를 제공할 수 있습니다.

사용자 인증 및 기타 Google Cloud Platform 서비스 Kerberos를 통한 사용자당 인증은 클러스터 내에서만 적용됩니다. Cloud Storage와 같은 다른 Google Cloud 서비스와의 상호 작용은 클러스터의 서비스 계정으로 계속 인증됩니다.

Kerberos를 통해 Hadoop 보안 모드 사용 설정

클러스터에 Kerberos 및 Hadoop 보안 모드를 사용 설정하면 Kerberos의 MIT 배포를 포함하며, Apache Hadoop YARN, HDFS, Hive, Spark, 관련 구성요소를 구성하여 인증을 사용할 수 있습니다.

Kerberos를 사용 설정하면 서비스 주 구성원과 루트 주 구성원이 포함된 클러스터 내 KDC(키 배포 센터)가 생성됩니다. 루트 주 구성원은 클러스터 내 KDC에 대한 관리자 권한이 있는 계정입니다. 또한 표준 사용자 주 구성원을 포함하거나 교차 영역 트러스트를 통해 사용자 주 구성원을 포함하는 다른 KDC에 연결할 수 있습니다.

Kerberos 클러스터 만들기

Google Cloud CLI, Dataproc API, Google Cloud Console을 사용하여 Dataproc 이미지 버전 1.3 이상을 사용하는 클러스터에서 Kerberos를 사용 설정할 수 있습니다.

gcloud 명령어

새 Kerberos Dataproc 클러스터(이미지 버전 1.3 이상)를 자동으로 구성하려면 gcloud dataproc clusters create 명령어를 사용합니다.

gcloud dataproc clusters create cluster-name \
    --image-version=2.0 \
    --enable-kerberos

클러스터 속성: 위에 나온 --enable-kerberos 플래그를 사용하는 대신 --properties "dataproc:kerberos.beta.automatic-config.enable=true" 플래그를 clusters create 명령어에 전달하여 Kerberos를 자동으로 구성할 수 있습니다(Dataproc 서비스 속성 참조).

REST API

Kerberos 클러스터는 ClusterConfig.SecurityConfig.KerberosConfig 요청의 일부로 clusters.create를 통해 만들 수 있습니다. enableKerberostrue로 설정해야 합니다.

콘솔

Google Cloud 콘솔의 Dataproc 클러스터 만들기 페이지에 있는 보안 관리 패널의 Kerberos 및 Hadoop 보안 모드 섹션에서 '사용 설정'을 선택하여 새 클러스터에서 Kerberos를 자동으로 구성할 수 있습니다.

고유한 루트 주 비밀번호로 Kerberos 클러스터 만들기

루트 주 구성원 비밀번호를 사용하는 Kerberos 클러스터를 설정하려면 아래의 단계를 따르세요.

Kerberos 루트 주 구성원 비밀번호 설정

Kerberos 루트 주 구성원은 클러스터 내 KDC에 대한 관리자 권한이 있는 계정입니다. Kerberos 루트 주 구성원의 비밀번호를 안전하게 제공하기 위해 사용자는 키 관리 서비스(KMS) 키를 사용하여 암호화한 다음 이를 클러스터 서비스 계정이 액세스할 수 있는 Google Cloud Storage 버킷에 저장할 수 있습니다. 클러스터 서비스 계정에 cloudkms.cryptoKeyDecrypter IAM 역할을 부여해야 합니다.

  1. 클러스터 서비스 계정에 Cloud KMS CryptoKey 암호화/복호화 역할을 부여합니다.

    gcloud projects add-iam-policy-binding project-id \
        --member serviceAccount:project-number-compute@developer.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyDecrypter
    

  2. 키링 만들기

    gcloud kms keyrings create my-keyring --location global
    

  3. 키링에 키를 만듭니다.

    gcloud kms keys create my-key \
        --location global \
        --keyring my-keyring \
        --purpose encryption
    

  4. Kerberos 루트 주 구성원 비밀번호를 암호화합니다.

    echo "my-password" | \
      gcloud kms encrypt \
        --location=global \
        --keyring=my-keyring \
        --key=my-key \
        --plaintext-file=- \
        --ciphertext-file=kerberos-root-principal-password.encrypted
    

    1. 암호화된 비밀번호를 프로젝트의 Cloud Storage 버킷에 업로드합니다.
      1. :
        gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
        

클러스터 만들기

gcloud 명령어 또는 Dataproc API를 사용하여 고유한 루트 주 비밀번호로 클러스터에 Kerberos를 사용 설정할 수 있습니다.

gcloud 명령어

kerberos Dataproc 클러스터(이미지 버전 1.3 이상)를 만들려면 gcloud dataproc clusters create 명령어를 사용합니다.

gcloud dataproc clusters create cluster-name \
    --region=region \
    --image-version=2.0 \
    --kerberos-root-principal-password-uri=gs://my-bucket/kerberos-root-principal-password.encrypted \
    --kerberos-kms-key=projects/project-id/locations/global/keyRings/my-keyring/cryptoKeys/my-key

YAML(또는 JSON) 구성 파일을 사용합니다. 위와 같이 kerberos-* 플래그를 gcloud 명령어에 전달하는 대신 kerberos 설정을 YAML(또는 JSON) 구성 파일에 배치한 다음 구성 파일을 참조하여 kerberos 클러스터를 만들 수 있습니다.

  1. 구성 파일을 만듭니다(파일에 포함될 수 있는 추가 구성 설정에 대해서는 SSL 인증서, 추가 Kerberos 설정, 교차 영역 트러스트 참조).
    root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
    kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
  2. 다음 gcloud 명령어를 사용하여 kerberos 클러스터를 만듭니다.
    gcloud dataproc clusters create cluster-name \
        --region=region \
        --kerberos-config-file=local path to config-file \
        --image-version=2.0
    

보안 고려사항 Dataproc은 루트 주 구성원을 KDC에 추가한 후 복호화된 비밀번호 양식을 삭제합니다. 보안을 위해 클러스터를 만든 후 비밀번호 파일, 보안 비밀을 복호화하는 데 사용되는 키를 삭제하고 kmsKeyDecrypter 역할에서 서비스 계정을 삭제할 수 있습니다. 비밀번호 파일, 키, 서비스 계정 역할이 필요한 클러스터를 수직 확장하려는 경우에는 이 작업을 수행하지 마세요.

REST API

Kerberos 클러스터는 ClusterConfig.SecurityConfig.KerberosConfig 요청의 일부로 clusters.create를 통해 만들 수 있습니다. enableKerberos를 true로 설정하고 rootPrincipalPasswordUrikmsKeyUri 필드를 설정합니다.

콘솔

이미지 버전 1.3 이상에서 클러스터를 만들 때 Google Cloud 콘솔의 Dataproc 클러스터 만들기 페이지에 있는 보안 관리 패널의 Kerberos 및 Hadoop 보안 모드 섹션에서 '사용 설정'을 선택한 후 보안 옵션을 완료합니다(다음 섹션에서 설명).

OS 로그인

클러스터의 KDC 관리는 루트 Kerberos 사용자 주 구성원 또는 sudo kadmin.local를 사용하여 kadmin 명령어로 수행할 수 있습니다. OS 로그인을 사용 설정하면 수퍼유저 명령어를 실행할 수 있는 사용자를 제어할 수 있습니다.

SSL 인증서

Hadoop 보안 모드를 사용 설정하면 Dataproc가 자체 서명 인증서를 만들어 클러스터 SSL 암호화를 사용 설정합니다. 또는 Kerberos 클러스터를 만들 때 다음 설정을 구성 파일에 추가하여 클러스터 SSL 암호화를 위한 인증서를 제공할 수 있습니다.

  • ssl:keystore_password_uri: Cloud Storage 내에서 키 저장소 파일의 비밀번호가 포함된 KMS로 암호화된 파일의 위치입니다.
  • ssl:key_password_uri: Cloud Storage 내에서 키 저장소 파일에 있는 키의 비밀번호가 포함된 KMS로 암호화된 파일의 위치입니다.
  • ssl:keystore_uri: Cloud Storage 내에서 와일드 카드 인증서와 클러스터 노드에서 사용하는 비공개 키가 포함된 키 저장소 파일의 위치입니다.
  • ssl:truststore_password_uri: Cloud Storage 내에서 트러스트 저장소 파일의 비밀번호가 포함된 KMS로 암호화된 파일의 위치입니다.
  • ssl:truststore_uri: Cloud Storage 내에서 신뢰할 수 있는 인증서가 포함된 트러스트 저장소 파일의 위치입니다.

샘플 구성 파일:

root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
ssl:
  key_password_uri: gs://bucket/key_password.encrypted
  keystore_password_uri: gs://bucket/keystore_password.encrypted
  keystore_uri: gs://bucket/keystore.jks
  truststore_password_uri: gs://bucket/truststore_password.encrypted
  truststore_uri: gs://bucket/truststore.jks

추가 Kerberos 설정

Kerberos 영역을 지정하려면 Kerberos 구성 파일에 다음 속성을 추가하여 Kerberos 클러스터를 만듭니다.

  • realm: 클러스터 내 Kerberos 영역의 이름입니다.

이 속성을 설정하지 않으면 호스트 이름의 도메인(대문자)이 영역이 됩니다.

KDC 데이터베이스의 마스터 키를 지정하려면 Kerberos 구성 파일에 다음 속성을 추가하여 Kerberos 클러스터를 만듭니다.

  • kdc_db_key_uri: Cloud Storage 내에서 KDC 데이터베이스 마스터 키가 포함된 KMS로 암호화된 파일의 위치입니다.

이 속성을 설정하지 않으면 Dataproc이 마스터 키를 생성합니다.

TGT(Ticket-Granting Ticket)의 최대 수명을 시간 단위로 지정하려면 Kerberos 구성 파일에 다음 속성을 추가하여 kerberos 클러스터를 만듭니다.

  • tgt_lifetime_hours: TGT(Ticket-Granting Ticket)의 최대 수명을 시간 단위로 나타낸 것입니다.

이 속성을 설정하지 않으면 Dataproc은 TGT(Ticket-Granting Ticket)의 수명을 10시간으로 설정합니다.

교차 영역 트러스트

클러스터의 KDC에는 처음에 루트 관리자 주 구성원과 서비스 주 구성원만 포함됩니다. 사용자 주 구성원을 수동으로 추가할 수도 있고 사용자 주 구성원이 있는 외부 KDC 또는 Active Directory 서버에서 교차 영역 트러스트를 설정할 수도 있습니다. Cloud VPN 또는 Cloud Interconnect를 온프레미스 KDC/Active Directory에 연결하는 것이 좋습니다.

교차 영역 트러스트를 지원하는 kerberos 클러스터를 만들려면 Kerberos 클러스터를 만들 때 Kerberos의 구성 파일에 아래 설정을 추가합니다. KMS로 공유 비밀번호를 암호화하고 클러스터 서비스 계정이 액세스할 수 있는 Cloud Storage 버킷에 저장합니다.

  • cross_realm_trust:admin_server: 원격 관리 서버의 호스트 이름/주소입니다.
  • cross_realm_trust:kdc: 원격 KDC의 호스트 이름/주소입니다.
  • cross_realm_trust:realm: 신뢰할 수 있는 원격 영역의 이름입니다.
  • cross_realm_trust:shared_password_uri: Cloud Storage 내에서 KMS로 암호화된 공유 비밀번호의 위치입니다.

샘플 구성 파일:

root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
cross_realm_trust:
  admin_server: admin.remote.realm
  kdc: kdc.remote.realm
  realm: REMOTE.REALM
  shared_password_uri: gs://bucket/shared_password.encrypted

교차 영역 트러스트를 원격 KDC에 사용 설정하는 방법은 다음과 같습니다.

  1. 원격 KDC의 /etc/krb5.conf 파일에 다음을 추가합니다.

    [realms]
    DATAPROC.REALM = {
      kdc = MASTER-NAME-OR-ADDRESS
      admin_server = MASTER-NAME-OR-ADDRESS
    }

  2. 트러스트 사용자를 만듭니다.

    kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
    

  3. 메시지가 표시되면 사용자 비밀번호를 입력합니다. 비밀번호는 암호화된 공유 비밀번호 파일의 콘텐츠와 일치해야 합니다.

Active Directory에서 교차 영역 트러스트를 사용 설정하려면 PowerShell에서 다음 명령어를 관리자로 실행합니다.

  1. Active Directory에서 KDC 정의를 만듭니다.

    ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
    

  2. Active Directory에서 트러스트를 만듭니다.

    netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
    
    비밀번호는 암호화된 공유 비밀번호 파일의 콘텐츠와 일치해야 합니다.

dataproc 주 구성원

Dataproc jobs API를 통해 Dataproc kerberos 클러스터에 작업을 제출하면 작업은 클러스터의 kerberos 렐름에서 dataproc kerberos 주 구성원으로 실행됩니다.

다중 테넌트는 SSH를 통해 클러스터에 작업을 직접 제출할 경우 Dataproc kerberos 클러스터 내에서 지원됩니다. 하지만 작업이 Cloud Storage와 같은 다른 Google Cloud 서비스를 읽거나 쓰는 경우 작업은 클러스터의 서비스 계정 역할을 합니다.

기본 및 커스텀 클러스터 속성

Hadoop 보안 모드는 구성 파일의 속성을 사용하여 구성합니다. Dataproc은 이러한 속성의 기본값을 설정합니다.

gcloud dataproc clusters create --properties 플래그를 사용하거나 clusters.create API를 호출하고 SoftwareConfig 속성을 설정하여 클러스터를 만들 때 기본 속성을 재정의할 수 있습니다(클러스터 속성 예시 참조).

고가용성 모드

고가용성(HA) 모드에서 kerberos 클러스터는 각 마스터에 3개의 KDC가 있습니다. '첫 번째' 마스터($CLUSTER_NAME-m-0)에서 실행되는 KDC는 마스터 KDC이며 관리 서버 역할도 합니다. 마스터 KDC의 데이터베이스는 크론 작업을 통해 5분 간격으로 2개의 복제본 KDC와 동기화되고 3개의 KDC는 읽기 트래픽을 제공합니다.

마스터 KDC가 다운되어도 Kerberos는 기본적으로 실시간 복제 또는 자동 장애 조치를 지원하지 않습니다. 수동 장애 조치를 수행하는 방법은 다음과 같습니다.

  1. /etc/krb5.conf의 모든 KDC 시스템에서 admin_server를 새 마스터의 FQDN(정규화된 도메인 이름)으로 변경합니다. KDC 목록에서 이전 마스터를 삭제합니다.
  2. 새로운 마스터 KDC에서 크론 작업을 설정하여 데이터베이스를 전파합니다.
  3. 새 마스터 KDC에서 admin_server 프로세스를 다시 시작합니다(krb5-admin-server).
  4. 모든 KDC 시스템에서 KDC 프로세스를 다시 시작합니다(krb5-kdc).

네트워크 구성

워커 노드가 마스터에서 실행되는 KDC 및 Kerberos Admin Server와 통신할 수 있도록 VPC 방화벽 규칙이 포트 88에서 인그레스 TCP 및 UDP 트래픽을 허용하고 마스터의 포트 749에서 인그레스 TCP 트래픽을 허용하는지 확인합니다. 고가용성 모드에서는 VPC 방화벽 규칙이 마스터의 포트 754에서 인그레스 TCP 트래픽을 허용하여 마스터 KDC의 변경사항 전파를 허용하는지 확인합니다. Kerberos를 사용하려면 역방향 DNS를 올바르게 설정해야 합니다. 또한 호스트 기반 서비스 주 구성원 표준화의 경우 클러스터 네트워크에 역방향 DNS가 올바르게 설정되어 있는지 확인합니다.

추가 정보

MIT Kerberos 문서 확인하기