Рубрики
Uncategorized

Обеспечивание доступа к клавишам API API Scaleway от Gitlab CI

Сколько клавиш API хранятся в день в качестве переменных в конфигурации Gitlab CI? Когда масштаб … Tagged Scaleway, Security, DevOps, Gitlab.

Сколько клавиш 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»