solutions/client-project-setup/namespaces/project-id-tier3.yaml (208 lines of code) (raw):
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#########
# GCP Service Account for tier3
# AC-1 - Implementation of access control
# AC-3(7), AC-3, AC-16(2) - This service account possesses limited privileges(permissions) and is restricted to performing only the necessary operations for resources within the designated namespace. The service account is associated with the namespace and is assigned roles as required.
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMServiceAccount
metadata:
name: project-id-tier3-sa # kpt-set: ${project-id}-tier3-sa
namespace: client-name-config-control # kpt-set: ${client-name}-${management-namespace}
annotations:
cnrm.cloud.google.com/project-id: project-id # kpt-set: ${project-id}
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
# AC-3(7), AC-3, AC-16(2)
resourceID: tier3-sa
displayName: tier3-sa
---
# Grant GCP role IAM service account admin to GCP SA on Service Project
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: project-id-tier3-sa-serviceaccountadmin-project-id-permissions # kpt-set: ${project-id}-tier3-sa-serviceaccountadmin-${project-id}-permissions
namespace: client-name-projects # kpt-set: ${client-name}-projects
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
resourceRef:
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
name: project-id # kpt-set: ${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
role: roles/iam.serviceAccountAdmin
member: "serviceAccount:tier3-sa@project-id.iam.gserviceaccount.com" # kpt-set: serviceAccount:tier3-sa@${project-id}.iam.gserviceaccount.com
---
# Grant GCP role Security Admin to GCP SA on Service Project
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: project-id-tier3-sa-securityadmin-project-id-permissions # kpt-set: ${project-id}-tier3-sa-securityadmin-${project-id}-permissions
namespace: client-name-projects # kpt-set: ${client-name}-projects
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
resourceRef:
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
name: project-id # kpt-set: ${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
role: roles/iam.securityAdmin
member: "serviceAccount:tier3-sa@project-id.iam.gserviceaccount.com" # kpt-set: serviceAccount:tier3-sa@${project-id}.iam.gserviceaccount.com
---
# Grant GCP role Tier3 DNS Record Admin to GCP SA on Client DNS Project
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: project-id-tier3-sa-tier3-dnsrecord-admin-dns-project-id-permissions # kpt-set: ${project-id}-tier3-sa-tier3-dnsrecord-admin-${dns-project-id}-permissions
namespace: client-name-projects # kpt-set: ${client-name}-projects
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
resourceRef:
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
name: dns-project-id # kpt-set: ${dns-project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
role: organizations/org-id/roles/tier3.dnsrecord.admin # kpt-set: organizations/${org-id}/roles/tier3.dnsrecord.admin
member: "serviceAccount:tier3-sa@project-id.iam.gserviceaccount.com" # kpt-set: serviceAccount:tier3-sa@${project-id}.iam.gserviceaccount.com
---
# Grant GCP role Compute Public IP Admin to tier3-sa GCP SA
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: project-id-tier3-sa-compute-public-ip-admin-project-id-permissions # kpt-set: ${project-id}-tier3-sa-compute-public-ip-admin-${project-id}-permissions
namespace: client-name-projects # kpt-set: ${client-name}-projects
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
resourceRef:
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
name: project-id # kpt-set: ${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
role: roles/compute.publicIpAdmin
member: "serviceAccount:tier3-sa@project-id.iam.gserviceaccount.com" # kpt-set: serviceAccount:tier3-sa@${project-id}.iam.gserviceaccount.com
---
# Grant GCP role Compute Security Admin to tier3-sa GCP SA
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: project-id-tier3-sa-compute-security-admin-project-id-permissions # kpt-set: ${project-id}-tier3-sa-compute-security-admin-${project-id}-permissions
namespace: client-name-projects # kpt-set: ${client-name}-projects
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
resourceRef:
apiVersion: resourcemanager.cnrm.cloud.google.com/v1beta1
kind: Project
name: project-id # kpt-set: ${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
role: roles/compute.securityAdmin
member: "serviceAccount:tier3-sa@project-id.iam.gserviceaccount.com" # kpt-set: serviceAccount:tier3-sa@${project-id}.iam.gserviceaccount.com
---
# K8S SA
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPartialPolicy
metadata:
name: project-id-tier3-sa-workload-identity-binding # kpt-set: ${project-id}-tier3-sa-workload-identity-binding
namespace: client-name-config-control # kpt-set: ${client-name}-${management-namespace}
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
resourceRef:
name: project-id-tier3-sa # kpt-set: ${project-id}-tier3-sa
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMServiceAccount
namespace: client-name-config-control # kpt-set: ${client-name}-${management-namespace}
# AC-1, AC-3(7), AC-3, AC-16(2)
bindings:
- role: roles/iam.workloadIdentityUser
members:
- member: serviceAccount:management-project-id.svc.id.goog[cnrm-system/cnrm-controller-manager-project-id-tier3] # kpt-set: serviceAccount:${management-project-id}.svc.id.goog[cnrm-system/cnrm-controller-manager-${project-id}-tier3]
---
# K8S namespace
apiVersion: v1
kind: Namespace
metadata:
name: project-id-tier3 # kpt-set: ${project-id}-tier3
annotations:
cnrm.cloud.google.com/project-id: project-id # kpt-set: ${project-id}
cnrm.cloud.google.com/ignore-clusterless: "true"
---
# Link GCP SA to K8S namespace
apiVersion: core.cnrm.cloud.google.com/v1beta1
kind: ConfigConnectorContext
metadata:
name: configconnectorcontext.core.cnrm.cloud.google.com
namespace: project-id-tier3 # kpt-set: ${project-id}-tier3
annotations:
cnrm.cloud.google.com/ignore-clusterless: "true"
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
spec:
# AC-3(7), AC-3, AC-16(2)
googleServiceAccount: tier3-sa@project-id.iam.gserviceaccount.com # kpt-set: tier3-sa@${project-id}.iam.gserviceaccount.com
---
# Give KCC, for this namespace, permission to read KCC resources in the client-name-projects namespace.
# This allows to reference the project resources in the client-name-projects namespace from the tier3 namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cnrm-viewer-project-id-tier3 # kpt-set: cnrm-viewer-${project-id}-tier3
namespace: client-name-projects # kpt-set: ${client-name}-projects
annotations:
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
roleRef:
name: cnrm-viewer
kind: ClusterRole
apiGroup: rbac.authorization.k8s.io
subjects:
- name: cnrm-controller-manager-project-id-tier3 # kpt-set: cnrm-controller-manager-${project-id}-tier3
namespace: cnrm-system
kind: ServiceAccount
---
# Give KCC, for this namespace, permission to read KCC resources in the client-name-networking namespace.
# This allows to reference the network resources in the client-name-networking namespace from the tier3 namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cnrm-viewer-project-id-tier3 # kpt-set: cnrm-viewer-${project-id}-tier3
namespace: client-name-networking # kpt-set: ${client-name}-networking
annotations:
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
roleRef:
name: cnrm-viewer
kind: ClusterRole
apiGroup: rbac.authorization.k8s.io
subjects:
- name: cnrm-controller-manager-project-id-tier3 # kpt-set: cnrm-controller-manager-${project-id}-tier3
namespace: cnrm-system
kind: ServiceAccount
---
# Give KCC, for this namespace, permission to read KCC resources in the client-name-logging namespace.
# This allows to reference the pubsub topic resources in the client-name-logging namespace from the tier3 namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cnrm-viewer-project-id-tier3 # kpt-set: cnrm-viewer-${project-id}-tier3
namespace: client-name-logging # kpt-set: ${client-name}-logging
annotations:
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
roleRef:
name: cnrm-viewer
kind: ClusterRole
apiGroup: rbac.authorization.k8s.io
subjects:
- name: cnrm-controller-manager-project-id-tier3 # kpt-set: cnrm-controller-manager-${project-id}-tier3
namespace: cnrm-system
kind: ServiceAccount
---
# Give KCC, for this namespace, permission to read KCC resources in the tier4 namespace.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cnrm-viewer-project-id-tier3 # kpt-set: cnrm-viewer-${project-id}-tier3
namespace: project-id-tier4 # kpt-set: ${project-id}-tier4
annotations:
config.kubernetes.io/depends-on: resourcemanager.cnrm.cloud.google.com/namespaces/client-name-projects/Project/project-id # kpt-set: resourcemanager.cnrm.cloud.google.com/namespaces/${client-name}-projects/Project/${project-id}
# AC-1, AC-3(7), AC-3, AC-16(2)
roleRef:
name: cnrm-viewer
kind: ClusterRole
apiGroup: rbac.authorization.k8s.io
subjects:
- name: cnrm-controller-manager-project-id-tier3 # kpt-set: cnrm-controller-manager-${project-id}-tier3
namespace: cnrm-system
kind: ServiceAccount
---
# Repo sync role binding requirement
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: syncs-repo
namespace: project-id-tier3 # kpt-set: ${project-id}-tier3
subjects:
- kind: ServiceAccount
name: ns-reconciler-project-id-tier3 # kpt-set: ns-reconciler-${project-id}-tier3
namespace: config-management-system
# AC-1, AC-3(7), AC-3, AC-16(2)
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io