Сколько ключей учетной записи службы хранится в день в качестве переменных в конфигурации 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»