Сколько клавиш API хранятся в день в качестве переменных в конфигурации Gitlab CI?
Когда Ключ API Scaleway Elements
Сохраняется в Gitlab, мы сталкиваемся со всеми проблемами безопасности хранения учетных данных за пределами облачной инфраструктуры: ключевое вращение, возраст, разрушение, местоположение и т. Д.
У разработчиков есть 2 общие причины хранить учетные данные GCP в Gitlab CI:
- Они используют
Общие бегуны
Анкет - Они используют
Конкретные/групповые бегуны
развернуто вScaleway Kubernetes Kapsule
кластер, но не используйте (или не знают о) Gitlab Дополнительные конфигурации Анкет
Альтернатива, которую Gitlab CI предлагает для пользователей, заключается в том, чтобы установить секретный объем для стручков бегуна, которые создаются для каждой сборки.
Установите следующие инструменты:
И создайте 2 проекта в вашей организации Scaleway:
- DevOps
- разработка
Первым шагом является создание кластера Kapsule Devops и настройка нашей среды [1].
Создайте ключ API для DevOps
проект. Вы можете создать один, следуя документации Как генерировать ключ API Анкет
scw init scw k8s cluster create name=kapsule-devops
Давайте создадим бассейн для работы бегуна:
scw k8s pool create cluster-id=$(scw k8s cluster list | grep kapsule-devops | awk '{ print $1 }') name=dev node-type=GP1_XS size=2
Добавьте распределение
kubectl taint nodes gitlab-runner-jobs-dev-reserved=true:NoSchedule --selector=k8s.scaleway.com/pool-name=dev
- Настройка
kubectl
общаться с кластером:
scw k8s kubeconfig install kapsule-devops
- Создайте пространство имен для Dev Runner:
kubectl create namespace dev
- Создайте учетную запись службы Kubernetes для использования для конкретного бегуна:
kubectl create serviceaccount --namespace dev app-deployer
- Генерировать API -ключ Для конкретного бегуна.
Примечание. Для облегчения видимости и аудита я рекомендую централизованно хранить ключи API в специальном проекте и во внешних инструментах, таких как хранилище.
- Чтобы разрешить конкретному бегуну выдать себя за ключ API, нам нужно хранить учетные данные в секрете Kubernetes.
kubectl create secret generic dev-api-key --from-file ~/.config/scw/config.yaml -n dev
Следующий шаг — установить секрет как объем данных [4].
- Начните с установки 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:
helm repo add gitlab https://charts.gitlab.io
- Настройка бегуна:
Создайте файл Значения.yaml
:
imagePullPolicy: IfNotPresent gitlabUrl: https://gitlab.com/ unregisterRunners: true terminationGracePeriodSeconds: 3600 concurrent: 10 checkInterval: 30 rbac: create: true metrics: enabled: true runners: image: ubuntu:18.04 config: | [[runners]] [runners.kubernetes] [[runners.kubernetes.volumes.secret]] name = "dev-api-key" mount_path = "/root/.config/scw" read_only = true locked: true pollTimeout: 360 protected: true serviceAccountName: app-deployer privileged: false secret: dev-runner-tokens namespace: dev builds: cpuRequests: 100m memoryRequests: 128Mi services: cpuRequests: 100m memoryRequests: 128Mi helpers: cpuRequests: 100m memoryRequests: 128Mi tags: "k8s-dev-runner" nodeSelector: k8s.scaleway.com/pool-name: dev nodeTolerations: - key: "gitlab-runner-jobs-dev-reserved" operator: "Equal" value: "true" effect: "NoSchedule"
Вы можете найти описание каждого атрибута в репозитории графиков Gitlab Runner [2]
- Получить токен регистрации Gitlab от
Project -> Настройки -> CI/CD -> Runners
вНастройка конкретного бегуна вручную
раздел и создайте следующий секрет:
kubectl create secret generic dev-runner-tokens --from-literal=runner-token='' --from-literal=runner-registration-token='' -n dev
- Установите бегуна:
helm install -n dev app-dev-runner -f values.yaml gitlab/gitlab-runner
Создать трубопровод .gitlab-ci.yml
:
stages: - dev infra: stage: dev image: name: scaleway/cli:v2.3.1 script: - /scw k8s cluster create name=kapsule-dev - /scw k8s pool create cluster-id=$(/scw k8s cluster list | grep kapsule-dev | awk '{ print $1 }') name=apps node-type=DEV1_M size=2 tags: - k8s-dev-runner only: - main
Работа создаст кластер Kapsule в Развитие
проект. Мы можем выполнить те же шаги для Производство
Окружающая среда.
Если вы хотите изменить ключ API, вам просто нужно удалить и воссоздать dev-api-key
секрет
Вы можете выполнить те же шаги, чтобы подключиться к кластеру Kapsule с работы Gitlab.
- Создайте секрет:
kubectl create secret generic dev-kapsule-config --from-file ~/.kube/config -n dev
- и установить его как объем данных:
[[runners.kubernetes.volumes.secret]] name = "dev-kapsule-config" mount_path = "/root/.kube" read_only = true
В этом примере мы использовали kubeconfig с доступом к администратору. Вы должны использовать RBAC Чтобы ограничить доступ только к конкретным ресурсам Kubernetes, которые нуждаются в бегуне.
Окружающие ветви с потоком Gitlab это стратегия ветвления и рабочий процесс. Предположим, у вас есть дополнительные среды, такие как предварительная среда и производственная среда. Разверните основной филиал в вашу среду разработки. Чтобы развернуть в предварительном производстве, создайте запрос на слияние [3] от основной ветви в филиал Pre-Prod. Живите, объединив филиал Pre-Prod в производственный филиал.
Добавьте следующий скрипт ./utils/AutomerGereQuest.sh
:
#!/bin/bash [[ $CI_PROJECT_URL =~ ^https?://[^/]+ ]] && CI_PROJECT_URL="${BASH_REMATCH[0]}/api/v4/projects/" BODY="{ \"id\": ${CI_PROJECT_ID}, \"source_branch\": \"${CI_COMMIT_REF_NAME}\", \"target_branch\": \"${TARGET_BRANCH}\", \"remove_source_branch\": false, \"title\": \"Deployment to ${TARGET_BRANCH}\", \"assignee_id\":\"${GITLAB_USER_MAILINGLIST_ID}\" }"; LISTMR=`curl --silent "${CI_PROJECT_URL}${CI_PROJECT_ID}/merge_requests?state=opened" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}"`; COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${CI_COMMIT_REF_NAME}\"" | wc -l`; if [ ${COUNTBRANCHES} -eq "0" ]; then curl -X POST "${CI_PROJECT_URL}${CI_PROJECT_ID}/merge_requests" \ --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \ --header "Content-Type: application/json" \ --data "${BODY}"; echo "Opened a new merge request: Deployment to ${TARGET_BRANCH} and assigned to you"; exit; fi echo "No new merge request opened";
Это общий шаблон для получения запроса о слиянии из списка рассылки. Создайте пользователя Gitlab с этим списком рассылки и добавьте переменную CI/CD Gitlab_user_mailinglist_id
с идентификатором пользователя. Вы можете получить идентификатор, используя URL https://gitlab.com/api/v4/users?username=
Анкет
Добавьте переменную CI/CD Private_token
, вы можете создать один из Настройки> Токены доступа к проекту
Анкет
Пример gitlab-ci.yml
:
stages: - build - dev - preprod - prod build: stage: build script: - echo 'build' - TARGET_BRANCH=main ./utils/autoMergeRequest.sh only: - /^feature\/*/ - /^hotfix\/*/ dev: stage: dev script: - echo 'deploy dev' - TARGET_BRANCH=preprod ./utils/autoMergeRequest.sh tags: - k8s-dev-runner only: - main preprod: stage: preprod script: - echo 'deploy preprod' - TARGET_BRANCH=prod ./utils/autoMergeRequest.sh tags: - k8s-preprod-runner only: - preprod prod: stage: prod script: - echo 'deploy prod' tags: - k8s-prod-runner only: - prod
Преподобный
и Prod
Ветви должны быть отмечены как защищенные. Перейти к Настройки> Репозиторий> Защищенные ветви
Анкет
В этом посте мы создали кластер DevOps, мы установили файл config.yml для конкретного бегуна, и в итоге мы развернули наши элементы масштабирования и ресурсы Kubernetes в проекте окружающей среды.
Этот механизм гарантирует сквозную безопасность для ваших ресурсов API Keys в элементах масштабирования.
Если у вас есть какие -либо вопросы или отзывы, не стесняйтесь оставить комментарий.
В противном случае, я надеюсь, что я убедил вас удалить свои клавиши API из переменных Gitlab CI.
Кстати, не стесняйтесь делиться со сверстниками 😊
Спасибо за чтение!
[1] https://www.scaleway.com/en/docs/compute/kubernetes/api-cli/creating-danaging-kubernetes-lifecycle-cliv2/ [2] https://gitlab.com/gitlab-org/charts/gitlab-runner/-/blob/main/values.yaml [3] https://about.gitlab.com/blog/2017/09/05/how-to-automaty-create-a-new-mr-on-gitlab-with-gitlab-ci/ [4] https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod
Оригинал: «https://dev.to/stack-labs/securing-access-to-scaleway-elements-api-keys-from-gitlab-ci-3p1h»