Dataproc クラスタを作成するとき、Kerberos による Hadoop セキュアモードを有効にすることで、Dataproc クラスタ内でユーザー認証、分離、暗号化によってマルチテナンシーを実現できます。
ユーザー認証とその他の Google Cloud Platform サービス。Kerberos によるユーザーごとの認証はクラスタ内でのみ適用されます。Cloud Storage などの他の Google Cloud サービスとのやり取りは、クラスタのサービス アカウントとして引き続き認証されます。
Kerberos を使用して Hadoop セキュアモードを有効にする
クラスタで Kerberos と Hadoop のセキュアモードを有効にすると、MIT の Kerberos ディストリビューションが組み込まれ、Apache Hadoop YARN、HDFS、Hive、Spark と、Kerberos を認証に使用する関連コンポーネントが構成されます。
Kerberos を有効にすると、サービス プリンシパルとルート プリンシパルを含むクラスタ上の鍵配布センター(KDC)が作成されます。ルート プリンシパルは、クラスタ上の KDC に対する管理者権限が割り当てられたアカウントです。また、標準のユーザー プリンシパルを含めることも、領域間の信頼を介してユーザー プリンシパルを含む別の KDC に接続することもできます。
Kerberos クラスタを作成する
Google Cloud CLI、Dataproc API、またはGoogle Cloud コンソールを使用して、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"
フラグをクラスタ作成コマンドに渡すことで、Kerberos を自動的に構成できます(Dataproc サービスのプロパティをご覧ください)。
REST API
Kerberos クラスタは、clusters.create リクエストの一部として、ClusterConfig.SecurityConfig.KerberosConfig を使用して作成できます。enableKerberos
を true
に設定する必要があります。
コンソール
新しいクラスタ上で Kerberos を自動的に構成するには、 Google Cloud コンソールで Dataproc の[クラスタの作成] ページにある [セキュリティの管理] パネルの [Kerberos と Hadoop のセキュアモード] セクションで [有効にする] を選択します。
独自の root プリンシパル パスワードで Kerberos クラスタを作成する
Kerberos ルート プリンシパルのパスワードを設定してから、クラスタを作成します。
Kerberos ルート プリンシパルのパスワードを設定する
Kerberos ルート プリンシパルは、クラスタ上の KDC に対する管理者権限が割り当てられたアカウントです。Kerberos ルート プリンシパルのパスワードを安全に入力するために、ユーザーは鍵管理サービス(KMS)キーを使用して暗号化し、クラスタのサービス アカウントがアクセス権を持つ Google Cloud Storage バケットに保存します。クラスタのサービス アカウントに cloudkms.cryptoKeyDecrypter
IAM ロールを付与する必要があります。
クラスタのサービス アカウントに Cloud KMS CryptoKey の暗号化 / 復号のロールを付与します。
gcloud projects add-iam-policy-binding project-id \ --member serviceAccount:project-number-compute@developer.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyDecrypter
キーリングを作成します。
gcloud kms keyrings create my-keyring --location global
キーリングに鍵を作成します。
gcloud kms keys create my-key \ --location global \ --keyring my-keyring \ --purpose encryption
Kerberos ルート プリンシパルのパスワードを暗号化します。
echo "my-password" | \ gcloud kms encrypt \ --location=global \ --keyring=my-keyring \ --key=my-key \ --plaintext-file=- \ --ciphertext-file=kerberos-root-principal-password.encrypted
- 暗号化したパスワードをプロジェクトの Cloud Storage バケットにアップロードします。
- 例:
gcloud storage cp kerberos-root-principal-password.encrypted gs://my-bucket
- 例:
- 暗号化したパスワードをプロジェクトの Cloud Storage バケットにアップロードします。
クラスタを作成する
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 クラスタを作成できます。
- 構成ファイルを作成します(ファイルに含めることができる追加の構成設定については、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
- 次の
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
フィールドを設定します。
コンソール
イメージ バージョン 1.3 以降でクラスタを作成する場合は、 Google Cloud コンソールの Dataproc の [クラスタの作成] ページにある [セキュリティの管理] パネルの [Kerberos と Hadoop のセキュアモード] セクションで [有効にする] を選択してから、セキュリティ オプションを完了します(以降のセクションで説明します)。
OS Login
クラスタ上の KDC を管理するには、Kerberos ルート ユーザー プリンシパルを使用するか、sudo kadmin.local
を使用して、kadmin
コマンドを実行します。スーパーユーザー コマンドを実行できるユーザーを制御するには、OS Login を有効化します。
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 との領域間の信頼を有効にする手順は次のとおりです。
リモート KDC の
/etc/krb5.conf
ファイルに次の内容を追加します。[realms] DATAPROC.REALM = { kdc = MASTER-NAME-OR-ADDRESS admin_server = MASTER-NAME-OR-ADDRESS }
信頼ユーザーを作成します。
kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
プロンプトが表示されたら、ユーザーのパスワードを入力します。パスワードは、暗号化された共有パスワード ファイルの内容と一致している必要があります。
Active Directory との領域間の信頼を有効にするには、PowerShell で管理者として次のコマンドを実行します。
Active Directory 内に KDC 定義を作成します。
ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
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 のネイティブではリアルタイム レプリケーションやフェイルオーバーがサポートされません。手動フェイルオーバーを行うには、次の操作を行います。
- すべての KDC マシンで、
/etc/krb5.conf
内のadmin_server
を新しいマスターの FQDN(完全修飾ドメイン名)に変更します。KDC リストから古いマスターを削除します。 - 新しいマスター KDC 上で、データベースの内容を伝播する cron ジョブを設定します。
- 新しいマスター KDC で、admin_server プロセス(
krb5-admin-server
)を再起動します。 - すべての KDC マシンで、KDC プロセス(
krb5-kdc
)を再起動します。
ネットワークの構成
ワーカーノードが、マスターで実行中の KDC と Kerberos 管理サーバーと通信できるようにするには、VPC ファイアウォール ルールでポート 88 での上り(内向き)TCP または UDP トラフィックが許可され、マスターのポート 749 での上り(内向き)TCP トラフィックが許可されていることを確認します。高可用性モードでは、VPC ファイアウォール ルールでマスターのポート 754 での上り(内向き)TCP トラフィックを許可し、マスター KDC への変更を伝播できるようにします。Kerberos では、リバース DNS を適切に設定する必要があります。また、ホストベースのサービス プリンシパルの正規化のために、リバース DNS がクラスタのネットワークに対して適切に設定されていることを確認してください。
次のステップ
- MIT の Kerberos ドキュメントを確認する。