IAM を使用したリソースへのアクセスの保護
Kubernetes ユーザーとサービス アカウントには、Config Connector リソースを管理するための権限が必要です。Config Connector を使用すると、Kubernetes のロールベース アクセス制御(RBAC)を使用する ID で、プロジェクトのコントロール プレーンを管理できます。また、Identity and Access Management(IAM)ポリシーを参照することもできます。
IAMPolicy と IAMPolicyMember を参照できるリソースは、リソース リファレンスに一覧表示されています。これらのリソースには、「IAMPolicy / IAMPolicyMember によって参照可能」というプロパティがあります。
このトピックでは、Identity and Access Management を使用して Google Cloud リソースへのアクセスを保護する方法について説明します。
始める前に
クラスタに Config Connector をインストールします。
RBAC によるコントロール プレーン アクセスの保護
この例では、サービス アカウントを作成し、PubSubTopic を管理する権限を付与します。このサービス アカウントは、他のタイプの Config Connector リソースを管理できません。
次の内容のファイルを
pubsub-topic-service-account.yamlという名前で作成します。apiVersion: v1 kind: ServiceAccount metadata: name: pubsub-topic-service-account namespace: defaultこれを適用して
pubsub-topic-service-accountサービス アカウントを作成します。kubectl apply -f pubsub-topic-service-account.yaml --namespace CC_NAMESPACE
CC_NAMESPACEは、リソースを管理するNamespace Config Connector に置き換えます。次のコマンドの出力に
noが含まれていることを確認して、pubsub-topic-service-accountがPubSubTopicリソースを作成できないことを確認します。kubectl auth can-i get pubsubtopics --as=system:serviceaccount:default:pubsub-topic-service-account
次に、Pub/Sub トピックの作成を可能にする
ClusterRoleを作成します。ClusterRole は、
rules.apiGroupsとrules.resourcesで指定された値があるリソースのみを管理できます。apiGroupsとresourcesの値を確認するには、リソースのリファレンスをご覧ください。次の内容のファイルを
pubsub-topic-editor-role.yamlという名前で作成します。apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: creationTimestamp: null name: pubsub-topic-editor rules: - apiGroups: - pubsub.cnrm.cloud.google.com resources: - pubsubtopics verbs: - get - list - watch - create - update - patch - deletepubsub-topic-editor.yamlを適用してClusterRoleを作成します。kubectl apply -f pubsub-topic-editor-role.yaml --namespace CC_NAMESPACE
CC_NAMESPACEは、リソースを管理するNamespace Config Connector に置き換えます。次に、ClusterRole とサービス アカウント間で RoleBinding を作成します。次の内容のファイルを
pubsub-topic-editor-rolebinding.yamlという名前で作成します。apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pubsub-topic-editor-rolebinding. subjects: - kind: ServiceAccount name: pubsub-topic-service-account roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: pubsub-topic-editorクラスタに
pubsub-topic-editor-rolebinding.yamlを適用します。kubectl apply -f pubsub-topic-editor-rolebinding.yaml --namespace CC_NAMESPACE
CC_NAMESPACEは、リソースを管理するNamespace Config Connector に置き換えます。次のコマンドの出力が
yesであることを確認して、pubsub-topic-service-accountがPubSubTopicリソースの作成を許可されていることを確認します。kubectl auth can-i get pubsubtopics \ --as=system:serviceaccount:default:pubsub-topic-service-account
クリーンアップ
kubectl delete を使用して、サービス アカウント、IAM ロール、ロール バインディングを削除します。
kubectl delete -f pubsub-topic-editor-rolebinding.yaml --namespace CC_NAMESPACE
kubectl delete -f pubsub-topic-editor-role.yaml --namespace CC_NAMESPACE
kubectl delete -f pubsub-topic-service-account.yaml --namespace CC_NAMESPACE
CC_NAMESPACE は、リソースを管理するNamespace Config Connector に置き換えます。
IAM ポリシーを使用したデータプレーンの保護
この例では、以前に付与された権限を使用して PubSubTopic を作成し、IAMPolicyMember リソースを使用してアクセスを制限します。
次の内容で
pubsub-topic-sample.yamlという名前のファイルを作成します。apiVersion: pubsub.cnrm.cloud.google.com/v1beta1 kind: PubSubTopic metadata: name: pubsubtopic-samplekubectlを使用してpubsub-topic-sample.yamlを適用します。kubectl apply -f pubsub-topic-sample.yaml --namespace CC_NAMESPACE
CC_NAMESPACEは、リソースを管理するNamespace Config Connector に置き換えます。次の内容で
iampolicymember.yamlという名前のファイルを作成します。EMAIL_ADDRESSは、 Google Cloud アカウントのメールアドレスに置き換えます。apiVersion: iam.cnrm.cloud.google.com/v1beta1 kind: IAMPolicyMember metadata: name: iampolicymember-sample spec: resourceRef: apiVersion: pubsub.cnrm.cloud.google.com/v1beta1 kind: PubSubTopic name: pubsubtopic-sample role: roles/pubsub.admin member: "user:EMAIL_ADDRESS"iampolicymember.yamlを適用します。kubectl apply -f iampolicymember.yaml --namespace CC_NAMESPACE
CC_NAMESPACEは、リソースを管理するNamespace Config Connector に置き換えます。次のコマンドを実行して、ポリシーが Google Cloud に適用されていることを確認します。出力でメールアドレスを探します。
PROJECT_IDはプロジェクト ID に置き換えます。gcloud beta pubsub topics get-iam-policy projects/PROJECT_ID/topics/pubsubtopic-sample
Pub/Sub トピックへのアクセスは、IAMPolicyMember で保護されています。
クリーンアップ
kubectl delete を使用して、 Google Cloud プロジェクトから Pub/Sub トピックと IAMPolicyMember を削除します。
kubectl delete -f iampolicymember.yaml --namespace CC_NAMESPACE
kubectl delete -f pubsub-topic-sample.yaml --namespace CC_NAMESPACE
マルチテナント分離のセキュリティに関するベスト プラクティス
不正な権限昇格を防止し、テナントの分離を適用するには、次のベスト プラクティスに従ってください。
名前空間モードを適用する: マルチテナント環境ではクラスタモードを避けます。クラスタモードでは、すべての Namespace が 1 つの IAM サービス アカウントを共有します。任意の Namespace で Config Connector リソースを作成できるユーザーは、そのサービス アカウントの完全な IAM 権限で操作できます。
IAM リソースの RBAC を制限する: Kubernetes のロールベース アクセス制御(RBAC)を使用して、
IAMPolicy、IAMPartialPolicy、IAMPolicyMemberリソースの作成権限と変更権限を制限します。デベロッパーがこれらのリソースに対する広範な書き込みアクセス権を持っている場合、 Google Cloud IAM バインディングを変更できます。Workload Identity Federation for GKE の IAM バインディングのスコープを設定する: これらのバインディングは、特定の Namespace 内の指定された Kubernetes ServiceAccount に対してのみ構成します。Namespace が指定されたモードでは、各 IAM サービス アカウントをその Namespace の Config Connector Kubernetes ServiceAccount にのみバインドします。
gcloud iam service-accounts add-iam-policy-binding \ GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member="serviceAccount:PROJECT_ID.svc.id.goog[cnrm-system/cnrm-controller-manager-CC_NAMESPACE]" \ --role="roles/iam.workloadIdentityUser"次のように置き換えます。
GSA_NAME: Config Connector が Namespace に使用する IAM サービス アカウントの名前。PROJECT_ID: クラスタと IAM サービス アカウントを含むプロジェクトの ID。CC_NAMESPACE: Config Connector がリソースを管理する Namespace。
cnrm-systemNamespace 内のすべての Pod など、プリンシパル セットにroles/iam.workloadIdentityUserロールを付与しないでください。名前空間モードでは、すべての名前空間の Config Connector コントローラがcnrm-systemで実行されるため、このタイプのバインディングにより、すべての名前空間のコントローラが IAM サービス アカウントになりすますことができます。
次のステップ
Secret を使用して、 Google Cloud リソースに情報を安全に渡します。