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 に接続することもできます。

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" フラグを cluster create コマンドに渡すことで Kerberos を自動的に構成できます(Dataproc サービスのプロパティをご覧ください)。

REST API

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

Console

新しいクラスタ上で Kerberos を自動的に構成するには、Google Cloud コンソールの Dataproc の[クラスタの作成] ページ上にある [セキュリティの管理] パネルの [Kerberos と Hadoop のセキュアモード] セクションで [有効にする] を選択します。

独自のルート プリンシパル パスワードを使用して Kerberos クラスタを作成する

ルート プリンシパル パスワードを使用する Kerberos クラスタを設定するには、次の手順を行います。

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

Kerberos ルート プリンシパルは、クラスタ上の KDC に対する管理者権限が割り当てられたアカウントです。Kerberos ルート プリンシパルのパスワードを安全に入力するために、ユーザーは鍵管理サービス(KMS)キーを使用して暗号化し、クラスタのサービス アカウントがアクセス権を持つ Google Cloud Storage バケットに保存します。クラスタのサービス アカウントに cloudkms.cryptoKeyDecrypter IAM ロールを付与する必要があります。

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

    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. :
        gsutil 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 クラスタは、clusters.create リクエストの一部として、ClusterConfig.SecurityConfig.KerberosConfig を使用して作成できます。enableKerberos を true に設定し、rootPrincipalPasswordUri フィールドと kmsKeyUri フィールドを設定します。

Console

イメージ バージョン 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: キーストア ファイルのパスワードを格納する 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 セキュアモードの構成には、config ファイル内のプロパティが使用されます。 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 への変更を伝播できるようにします。Kerberos では、リバース DNS を適切に設定する必要があります。 また、ホストベースのサービス プリンシパルの正規化のために、クラスタのネットワークに対してリバース DNS が適切に設定されていることを確認してください。

詳細情報

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