Сколько ключей учетной записи службы хранится в день в качестве переменных в конфигурации GitLab CI?
Когда Ключ службы Google Service
Сохраняется в Gitlab, мы сталкиваемся со всеми вопросами безопасности хранения учетных данных за пределами облачной инфраструктуры: ключевое вращение, возраст, разрушение, местоположение и т. Д.
Существует 2 общего причина для разработчиков для хранения учетных данных GCP в GitLab CI:
- Они используют
Общие бегуны
Отказ - Они используют
Конкретные бегуны
развернут вGoogle Kubernetes Engine
кластер, но не используйте (или не знаю) Рабочая идентификация дополнения.
Вы можете продолжать использовать клавиши GSA в GitLab CI и закрепите ключи с внешними инструментами, такими как Vault и foreti, но это добавит дополнительные инструменты для управления.
Альтернативность, что Google Cloud предлагает клиентам, состоит в том, чтобы включить надстройки рабочей нагрузки.
Надстройка идентификатора рабочей нагрузки, предусмотренная в двигателе Google Kubernetes позволяет связать Сервисная учетная запись Kubernetes
связано с определенным бегуном к Учетная запись Google Service.
.
Примечание. На момент написания этого поста при включении Рабочая идентификация
Вы не сможете использовать некоторые надстройки GKE, как ISTIO
, Config Connector
или Менеджер приложений
на по умолчанию Nodepool
потому что они зависят от Вычислить Engine Metadata Server
И рабочая активность использует GKE Metadata Server
.
По этой причине я часто рекомендую иметь специальную кластер GKE для бегунов Gitlab, чтобы избежать любых ошибок для вашей рабочей нагрузки бизнеса.
Первый шаг состоит в том, чтобы создать и настроить нашу кластер GKE DEVOPS.
- Начнем с создания нашего кластера GKE [1]:
gcloud projects create mycompany-core-devops gcloud config set project mycompany-core-devops gcloud services enable containerregistry.googleapis.com gcloud container clusters create devops \ --workload-pool=mycompany-core-devops.svc.id.goog
Давайте создадим NodePool для рабочих мест бегуна:
gcloud container node-pools create gitlab-runner-jobs-dev \ --cluster=devops \ --node-taints=gitlab-runner-jobs-dev-reserved=true:NoSchedule \ --node-labels=nodepool=dev \ --min-nodes=0 --max-nodes=3
- Настроить
kubectl
Общаться с кластером:
gcloud container clusters get-credentials devops
- Создайте пространство имен, чтобы использовать для учетной записи службы Kubernetes.
kubectl create namespace dev
- Создайте учетную запись службы Kubernetes для использования для определенного бегуна:
kubectl create serviceaccount --namespace dev app-deployer
- Создайте учетную запись Google Service для конкретного бегуна
gcloud projects create mycompany-core-security gcloud config set project mycompany-core-security gcloud iam service-accounts create app-dev-deployer
Примечание. Для облегчения видимости и аудита рекомендую централизованно создавать учетные записи обслуживания в специальных проектах.
- Разрешить учетную запись службы Kubernetes осимулировать учетную запись Google Service, создав привязку политики IAM между двумя. Это связывание позволяет учетной записи службы Kubernetes действовать в качестве учетной записи службы Google.
gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:mycompany-core-devops.svc.id.goog[dev/app-deployer]" \ app-dev-deployer@mycompany-core-security.iam.gserviceaccount.com
- Добавьте
IAm.gke.io/gcp-service-account=app-dev-deployer@mycompany-core-security.iam.gserviceаccount.com
Аннотация к учетной записи службы Kubernetes, используя адрес электронной почты учетной записи Google Service.
kubectl annotate serviceaccount \ --namespace dev \ app-deployer \ iam.gke.io/gcp-service-account=app-dev-deployer@mycompany-core-security.iam.gserviceaccount.com
Следующим шагом является назначение KSA нашего GitLab Runner.
- Начните с установки HELM:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
- Добавить Gitlab Helm Package:
helm repo add gitlab https://charts.gitlab.io
- Настроить бегун:
Создайте файл Values.yaml.
:
imagePullPolicy: IfNotPresent gitlabUrl: https://gitlab.com/ runnerRegistrationToken: "<>" unregisterRunners: true terminationGracePeriodSeconds: 3600 concurrent: 10 checkInterval: 30 rbac: create: true metrics: enabled: true runners: image: ubuntu:18.04 locked: true pollTimeout: 360 protected: true serviceAccountName: app-deployer privileged: false namespace: dev builds: cpuRequests: 100m memoryRequests: 128Mi services: cpuRequests: 100m memoryRequests: 128Mi helpers: cpuRequests: 100m memoryRequests: 128Mi tags: "k8s-dev-runner" nodeSelector: nodepool: dev nodeTolerations: - key: "gitlab-runner-jobs-dev-reserved" operator: "Equal" value: "true" effect: "NoSchedule"
Вы можете найти описание каждого атрибута в репозитории диаграммы GitLab Runner [2]
Получите регистрационный токен GitLab из
Проект -> Настройки -> CI/CD -> Бегуны
вНастройка определенного бегуна вручную
раздел.Установите бегун:
helm install -n dev app-dev-runner -f values.yaml gitlab/gitlab-runner
Перед запуском нашего первого трубопровода в GitLab CI, давайте создадим новый бизнес-проект и добавьте разрешение администратора кластера Kubernetes на GSA, который мы создали ранее.
gcloud projects create mycompany-business-dev gcloud config set project mycompany-business-dev gcloud projects add-iam-policy-binding mycompany-business-dev \ --role roles/container.clusterAdmin \ --member "serviceAccount:app-dev-deployer@mycompany-core-security.iam.gserviceaccount.com"
Теперь мы можем запустить наш трубопровод .gitlab-ci.yml
:
stages: - dev infra: stage: dev image: name: google/cloud-sdk script: - gcloud config set project mycompany-business-dev - gcloud services enable containerregistry.googleapis.com - gcloud container clusters create business tags: - k8s-dev-runner
Работа создаст кластер GKE в MyCompany-Business-Dev
проект. Мы можем выполнить те же шаги для прод
окружающая обстановка.
Мы можем пойти дальше и позволить нашему GSA создавать Kubernetes, проявляющиеся в определенном пространстве имен нашего бизнес-кластера.
Создать файл rbac-dev.yaml.
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: app name: devops-app rules: - apiGroups: [""] resources: ["pods", "pods/exec", "secrets"] verbs: ["get", "list", "watch", "create", "patch", "delete"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: devops-app-binding namespace: app subjects: - kind: User name: app-dev-deployer@mycompany-core-security.iam.gserviceaccount.com roleRef: kind: Role name: devops-app apiGroup: rbac.authorization.k8s.io
Создать RBAC
gcloud config set project mycompany-business-dev gcloud container clusters get-credentials business kubectl create namespace app kubectl apply -f rbac-dev.yaml
И не забудьте назначить разрешения для создания ресурсов Kubernetes:
gcloud projects add-iam-policy-binding mycompany-business-dev \ --role roles/container.developer \ --member "serviceAccount:app-dev-deployer@mycompany-core-security.iam.gserviceaccount.com"
Давайте создадим новый POD в бизнес кластере:
manifests: stage: dev image: name: google/cloud-sdk script: - gcloud config set project mycompany-business-dev - gcloud container clusters get-credentials business - kubectl run nginx --image=nginx -n app tags: - k8s-dev-runner
Если вы попытаетесь создать POD NGINX в пространстве имен по умолчанию, он не удастся с ошибкой несанкционированного доступа.
В этом посте мы создали кластер DEVOPS, мы централизовали наш GSA в определенном проекте GCP, и мы получили развертывание наших ресурсов GCP и Kubernetes в бизнес-проекте.
Этот механизм гарантирует конец ценной безопасности для ваших ресурсов GSA. Вы можете легко создать работу CRON, которая отключает GSA вечером и повторно включить их утром рабочего дня.
Если у вас есть какие-либо вопросы или отзывы, пожалуйста, не стесняйтесь оставить комментарий.
В противном случае, я надеюсь, что убедил вас с удалением ваших клавиш GSA из переменных GitLab CI и используйте определенные бегуны в GKE с включенной идентификацией рабочей нагрузки.
Кстати, не стесняйтесь делиться со сверстниками 😊
Спасибо за чтение!
[1] https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#authentication_to [2] https://gitlab.com/gitlab-org/charts/gitlab-runner/-/blob/main/values.yaml.
Оригинал: «https://dev.to/stack-labs/securing-access-to-google-service-accounts-from-gitlab-ci-3a9l»