Dataproc のセキュリティ構成

Dataproc クラスタを作成するときに、Kerberos 経由で Hadoop セキュアモードを有効にして、Dataproc クラスタ内でユーザー認証、分離、暗号化によってマルチテナンシーを実現できます。

ユーザー認証とその他の Google Cloud Platform サービス。 Kerberos を使用したユーザーごとの認証は、クラスタ内でのみ適用されます。 Cloud Storage などの他の Google Cloud サービスとのやり取りは、クラスタのサービス アカウントとして引き続き認証されます。

Kerberos による Hadoop セキュアモードの有効化

クラスタで Kerberos と Hadoop のセキュアモードを有効にすると、MIT の Kerberos ディストリビューションが組み込まれ、Apache Hadoop YARNHDFSHiveSpark と、Kerberos を認証に使用する関連コンポーネントが構成されます。

Kerberos を有効にすると、サービス プリンシパルとルート プリンシパルを含むクラスタ上の鍵配布センター(KDC)が作成されます。ルート プリンシパルは、クラスタ上の KDC に対する管理者権限が割り当てられたアカウントです。また、標準のユーザー プリンシパルを含めることも、領域間の信頼を介してユーザー プリンシパルを含む別の KDC に接続することもできます。

クラスタ上の KDC に対する管理者権限が割り当てられているアカウントである Kerberos ルート プリンシパルには、パスワードを指定する必要があります。パスワードを安全に指定するには、パスワードを鍵管理サービス(KMS)の鍵で暗号化したうえで、クラスタのサービス アカウントがアクセスできる Google Cloud Storage バケットに保管しておく必要があります。クラスタのサービス アカウントに cloudkms.cryptoKeyDecrypter IAM 役割を付与する必要があります。

Kerberos ルート プリンシパルのパスワードを設定する

  1. クラスタのサービス アカウントに Cloud KMS 暗号鍵の暗号化 / 復号化の役割を付与します。

        gcloud projects add-iam-policy-binding project-id \  
            --member serviceAccount:service-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. :
            gsutil cp kerberos-root-principal-password.encrypted gs://my-bucket
            

Kerberos クラスタを作成する

gcloud コマンドまたは Dataproc API を使用して、Dataproc イメージ バージョン 1.3以降を使用するクラスタで Kerberos を有効にします。Dataproc イメージの各リリースに含まれる Kerberos のバージョンについては、サポートされている Cloud Dataproc のバージョンをご覧ください。

gcloud コマンド

kerberos Dataproc クラスタ(イメージ バージョン 1.3 以降)を作成するには、gcloud dataproc clusters create コマンドを使用します。

    gcloud dataproc clusters create cluster-name \  
        --image-version=1.3 \  
        --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 \
            --kerberos-config-file=local path to config-file \
            --image-version=1.3
        

セキュリティに関する考慮事項 Dataproc はルート プリンシパルを KDC に追加した後、復号された形式のパスワードを破棄します。セキュリティ保護のため、クラスタを作成した後、パスワード ファイル、シークレットの復号に使用した鍵を削除し、サービス アカウントを kmsKeyDecrypter から削除できます。

REST API

Kerberos クラスタは、clusters.create リクエストの一部として、ClusterConfig.SecurityConfig.KerberosConfig を使用して作成できます。enableKerberos を true に設定し、rootPrincipalPasswordUrikmsKeyUri の必須フィールドを設定する必要があります。

コンソール

イメージ バージョン 1.3 以降を使用してクラスタを作成する場合は、[高度なセキュリティ] セクションの [詳細オプション] パネルで、[Kerberos と Hadoop のセキュアモードを有効にする] を選択し、セキュリティ オプションを設定します(以降のセクションで説明します)。

OS ログイン

クラスタ上の KDC を管理するには、ルート Kerberos ユーザー プリンシパルを使用して kadmin コマンドを実行するか、sudo kadmin.local を使用します。 スーパーユーザー コマンドを実行できるユーザーを制御するには、OS ログインを有効化します。

SSL 証明書

Hadoop セキュアモードを有効にする際、Dataproc はクラスタの SSL 暗号化を有効にする自己署名証明書を作成します。 または、Kerberos クラスタを作成する際に、構成ファイルに次の設定を追加して、クラスタの SSL 暗号化に使用する証明書を指定することもできます。

  • ssl:keystore_password_uri: キーストア ファイルのパスワードを格納する KMS 暗号化ファイルが存在する Cloud Storage 内の場所。
  • ssl:key_password_uri: キーストア ファイルの鍵のパスワードを格納する KMS 暗号化ファイルが存在する Cloud Storage 内の場所。
  • ssl:keystore_uri: クラスタノードによって使用されるワイルドカード証明書と秘密鍵を格納するキーストア ファイルが存在する Cloud Storage 内の場所
  • ssl:truststore_password_uri: トラストストア ファイルのパスワードを格納する KMS 暗号化ファイルが存在する Cloud Storage 内の場所。
  • 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: KDC データベース マスター鍵を格納する KMS 暗号化ファイルが存在する Cloud Storage 内の場所。

このプロパティが設定されていない場合は、Dataproc によってマスター鍵が生成されます。

チケットを付与するチケットの最大存続時間(時間数)を指定するには、Kerberos 構成ファイルに次のプロパティを追加して Kerberos クラスタを作成します。

  • tgt_lifetime_hours: チケットを付与するチケットの最大存続時間(時間数)。

このプロパティが設定されていない場合は、Dataproc によりチケットを付与するチケットの存続時間が 10 時間に設定されます。

領域間の信頼

クラスタ上の KDC には当初、ルート管理者プリンシパルとサービス プリンシパルのみが格納されます。ユーザー プリンシパルは、手動で、またはユーザー プリンシパルを保持する外部 KDC や Active Directory サーバーとの領域間の信頼を確立するという方法で追加できます。オンプレミス KDC / Active Directory への接続には、Cloud VPN または Cloud Interconnectをおすすめします。

領域間の信頼をサポートする 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: KMS 暗号化共有パスワードが存在する 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
    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 クラスタは、マスターごとに 1 つずつの、計 3 つの KDC を使用します。「最初の」マスター($CLUSTER_NAME-m-0)上で稼働する KDC がマスター KDC になり、管理サーバーとしても機能します。マスター KDC のデータベースは cron ジョブを通じて 5 分間隔で 2 つのスレーブ KDC に同期され、3 つの KDC で読み込みトラフィックに対処します。

マスター KDC が停止した場合に、Kerberos のネイティブではリアルタイム レプリケーションやフェイルオーバーがサポートされません。手動フェイルオーバーを行うには、次の手順に従います。

  1. すべての KDC マシンで、/etc/krb5.conf 内の admin_server を新しいマスターのFQDN(完全修飾ドメイン名)に変更します。KDC リストから古いマスターを削除します。
  2. 新しいマスター KDC 上で、データベースの内容を伝播する cron ジョブを設定します。
  3. 新しいマスター KDC で、admin_server プロセス(krb5-admin-server)を再起動します。
  4. すべての KDC マシンで、KDC プロセス(krb5-kdc)を再起動します。

ネットワーク構成

ワーカーノードが、マスターで実行中の KDC と Kerberos 管理サーバーと通信できるようにするには、VPC ファイアウォール ルールがポート 88 で 内向きの TCP または UDP トラフィックを許可し、マスターのポート 749 で 内向きの TCP トラフィックを許可することを確認します。 高可用性モードでは、VPC ファイアウォール ルールがマスターのポート 754 で 内向き TCP トラフィックを許可し、マスター KDC への変更を伝播できるようにします。

詳細情報

MIT の Kerberos ドキュメントをご覧ください。