manifests/google-service-account-template.yaml (55 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 # # https://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. # Create the mapping between the GSA running the CloudRun instance and the namespace. # This must be applied after the GSA has been created and before deploying the service. # # The GSA must also be granted "roles/container.clusterViewer" - "Kubernetes Engine Viewer" - which allows listing # the clusters in the project and read-only access. # # Current recommendation is to have one GSA per namespace, named k8s-NAMESPACE - it is used to keep permissions # isolated ( namespace is the main unit of isolation in k8s) and to simplify setup. # If using another GSA naming scheme or a shared account, the workload must set "WORKLOAD_NAMESPACE" env variable. # If the 'k8s-NAMESPACE naming is used, the namespace is based on the name of the GSA. apiVersion: networking.istio.io/v1alpha3 kind: WorkloadGroup metadata: name: gsa-${PROJECT_ID} namespace: ${WORKLOAD_NAMESPACE} spec: metadata: labels: cr-google-service-account: "k8s-${WORKLOAD_NAMESPACE}.${PROJECT_ID}" annotations: security.cloud.google.com/IdentityProvider: google template: serviceAccount: k8s-${WORKLOAD_NAMESPACE}@${PROJECT_ID}.iam.gserviceaccount.com --- # This config allows a Google Service Account to impersonate a Kubernetes Service Account by # calling the 'TokenRequest' API to get audience-bound tokens equivalent with the tokens created # by secret mounts. # It also has permissions needed to get the configmaps for connecting to Istiod. # In turn, the tokens can be used to access Istio and other services using KSA. # The role is limited to the 'default' service account in the namespace. apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: ${WORKLOAD_NAMESPACE} name: gsa-${PROJECT_ID} rules: # Allows 'downscoping' - getting tokens with audience - without mounting. - apiGroups: [ "" ] resources: - "serviceaccounts/token" resourceNames: - "default" verbs: - "create" - "get" # Access to a pernamespace mesh-env. If not found, istio-system is used (mesh-env in istio-system is visible to all # authenticated users. - apiGroups: [ "" ] resources: - "configmaps" resourceNames: - "mesh-env" verbs: - "get" - apiGroups: [ "" ] resources: - "secrets" resourceNames: - "sshdebug" verbs: - "get" --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: ${WORKLOAD_NAMESPACE} name: gsa-${PROJECT_ID} roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: gsa-${PROJECT_ID} subjects: - kind: User name: k8s-${WORKLOAD_NAMESPACE}@${PROJECT_ID}.iam.gserviceaccount.com