Рубрики
Uncategorized

Обеспечение доступа к учетным записям Google Service от GitLab CI

Blaquiere Guillaume @gblaquiere … Помечено GoogleCloud, Security, DevOps, Gitlab.

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