Как GitHub Actions получает доступ к секретным ключам (secrets)?

«Как GitHub Actions получает доступ к секретным ключам (secrets)?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

GitHub Actions обеспечивает безопасный доступ к секретам через встроенную систему управления секретами. Секреты хранятся зашифрованными и никогда не выводятся в открытом виде в логах выполнения workflow — GitHub автоматически маскирует их.

Механизм работы:

  1. Хранение: Секреты (API_KEY, DB_PASSWORD, AWS_ACCESS_KEY_ID) настраиваются в настройках репозитория (Settings > Secrets and variables > Actions) или на уровне организации/окружения (environment).
  2. Доступ в Workflow: Секреты передаются в job через контекст secrets и могут быть установлены как переменные окружения или входные параметры для действий.
  3. Безопасность: Секреты не доступны для workflow, запущенных из форков репозитория (если не настроено иначе).

Практические примеры использования:

  • Как переменная окружения:

    jobs:
    deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to Production
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          # Ключи доступны как env-переменные, их значения маскируются в логах
          ./deploy-script.sh
  • Как входной параметр для официального действия:

      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
  • Использование секретов окружения (environment): Для доступа к секретам, привязанным к конкретному окружению (например, production), job должен явно ссылаться на это окружение:

    jobs:
    deploy:
    environment: production # Секреты этого окружения станут доступны
    steps:
      - run: echo "Deploying to ${{ vars.ENV_NAME }}"

    В наших пайплайнах это позволяет безопасно выполнять развертывание, аутентификацию в облачных провайдерах и публикацию пакетов без хранения чувствительных данных в коде репозитория.