Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Permissions и безопасность workflow
permissions_security

Permissions и безопасность workflow

GITHUB_TOKEN, OIDC, least privilege, аудит и логирование.

Permissions и безопасность workflow

Безопасность CI/CD пайплайнов критична для защиты кода и инфраструктуры. Изучите GITHUB_TOKEN permissions, OIDC, аудит и лучшие практики.

#GITHUB_TOKEN: Автоматическая аутентификация

#Что такое GITHUB_TOKEN?

GITHUB_TOKEN — автоматически генерируемый токен доступа для GitHub Actions. Выдаётся каждому запуску workflow.

Характеристики:

  • Создаётся автоматически при запуске workflow
  • Уникален для каждого запуска
  • Истекает после завершения workflow
  • Имеет ограниченные права по умолчанию

#Область действия GITHUB_TOKEN

Токен предоставляет доступ к ресурсам репозитория:

┌─────────────────────────────────────────┐
│           GITHUB_TOKEN Scope            │
├─────────────────────────────────────────┤
│  ✅ Чтение/запись репозитория          │
│  ✅ Создание релизов и тегов           │
│  ✅ Управление issues и PR             │
│  ✅ Работа с Packages (GHCR)           │
│  ✅ Trigger workflow_dispatch          │
│  ❌ Доступ к secrets (из fork)         │
│  ❌ Изменение настроек репозитория     │
│  ❌ Доступ к другим репозиториям       │
└─────────────────────────────────────────┘

#Использование GITHUB_TOKEN

Автоматическое использование:

jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # GITHUB_TOKEN доступен автоматически - name: Create Release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Явная передача:

steps: - name: Push changes run: | git config user.name "GitHub Actions" git config user.email "actions@github.com" git add . git commit -m "Auto-update" git push env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

#Permissions: Тонкая настройка прав

#Default Permissions

По умолчанию GitHub устанавливает права в зависимости от настроек организации:

Настройки организации:

  1. Settings → Actions → General
  2. Workflow permissions:
    • Read and write permissions — токены имеют полные права
    • Read repository contents permissions — только чтение

Рекомендация: Всегда явно указывайте permissions в workflow.

#Блок permissions

Синтаксис:

permissions: contents: read # Чтение кода репозитория packages: write # Запись в Packages issues: read # Чтение issues pull-requests: write # Запись в PR id-token: write # OIDC токены actions: read # Чтение информации о workflow security-events: write # Запись security events

Уровни доступа:

  • read — только чтение
  • write — чтение и запись
  • none — доступ запрещён

#Примеры настройки permissions

Только чтение кода:

permissions: contents: read jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm test

Деплой в GHCR:

permissions: contents: read packages: write jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push run: docker push ghcr.io/my-org/my-app:latest

Создание релиза:

permissions: contents: write # Для создания релиза и загрузки артефактов jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Create Release uses: softprops/action-gh-release@v1 with: files: dist/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

OIDC для облака:

permissions: contents: read id-token: write # Обязательно для OIDC jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::123456789012:role/github-actions aws-region: us-east-1

#Job-level permissions

Можно переопределять permissions на уровне job:

permissions: contents: read # Default для всех jobs jobs: test: runs-on: ubuntu-latest # Наследует contents: read steps: - run: npm test deploy: runs-on: ubuntu-latest permissions: contents: write # Переопределение для job id-token: write steps: - run: ./deploy.sh

#Security Best Practices

#1. Principle of Least Privilege

Плохо:

# Слишком широкие права permissions: contents: write packages: write issues: write pull-requests: write actions: write

Хорошо:

# Только необходимые права permissions: contents: read # Только для checkout

#2. Ограничение триггеров

Опасный триггер — pull_request_target:

# ❌ ОПАСНО: workflow имеет доступ к secrets и правам base branch on: pull_request_target: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # Злоумышленник может выполнить код в контексте main

Безопасная альтернатива:

# ✅ Безопасно: workflow запускается в контексте PR on: pull_request: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # Нет доступа к secrets, код выполняется в изоляции

#3. Валидация входных данных

Проверка inputs в workflow_dispatch:

on: workflow_dispatch: inputs: version: description: 'Version to deploy' required: true type: string jobs: deploy: runs-on: ubuntu-latest steps: - name: Validate version run: | if ! [[ "${{ github.event.inputs.version }}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Invalid version format" exit 1 fi shell: bash - name: Deploy run: ./deploy.sh ${{ github.event.inputs.version }}

#4. Защита от Command Injection

Опасно — интерполяция user input:

# ❌ Уязвимо к injection on: issue_comment: types: [created] jobs: deploy: if: github.event.comment.body == '/deploy' steps: - run: ./deploy.sh ${{ github.event.comment.user.login }}

Безопасно — валидация и экранирование:

# ✅ Безопасно jobs: deploy: steps: - name: Validate username run: | USERNAME="${{ github.event.comment.user.login }}" if ! [[ "$USERNAME" =~ ^[a-zA-Z0-9_-]+$ ]]; then echo "Invalid username" exit 1 fi echo "USERNAME=$USERNAME" >> $GITHUB_ENV - run: ./deploy.sh "$USERNAME"

#5. Pin Actions к конкретному хешу

Плохо — использование тегов:

# ❌ Тег может быть перемещён steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4

Хорошо — pin к полному хешу:

# ✅ Полный SHA хеш steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2

Автоматизация через Dependabot:

# .github/dependabot.yml version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly"

#Аудит и логирование

#Audit Log в GitHub

Доступ к audit log:

  1. Organization Settings → Settings → Audit log
  2. Фильтрация по действиям

Полезные фильтры:

# Все действия с секретами
action:secret.created OR action:secret.updated OR action:secret.deleted

# Изменения workflow permissions
action:workflow_permission.changed

# Запуски workflow с elevated permissions
action:workflow_run.created

Экспорт логов:

# Через GitHub CLI gh api /orgs/{org}/audit-log > audit-log.json

#Workflow Run Logs

Просмотр логов:

  1. Actions → Выбрать workflow → Run
  2. Скачать логи: Download log archive

Анализ логов:

# Распаковка логов tar -xzf run-logs.zip # Поиск по логам grep -r "error" *.txt

#Security Events

Интеграция с Security tab:

permissions: security-events: write jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run CodeQL uses: github/codeql-action/analyze@v3 with: upload: true

#Self-hosted Runners: Безопасность

#Риски self-hosted runners

Проблемы:

  • Runner может иметь доступ к внутренней сети
  • Персистентное состояние между запусками
  • Возможность эскалации привилегий

#Best Practices для self-hosted runners

1. Изоляция через контейнеры:

jobs: build: runs-on: self-hosted container: image: node:20-alpine steps: - run: npm test

2. Очистка после выполнения:

# Скрипт очистки runner #!/bin/bash rm -rf /home/runner/work/* docker system prune -af git clean -fdx

3. Ограничение сети:

# Firewall правила для runner iptables -A OUTPUT -d api.github.com -j ACCEPT iptables -A OUTPUT -d registry.npmjs.org -j ACCEPT iptables -A OUTPUT -j DROP

4. Rotation runner tokens:

# Регенерация токена runner ./config.sh remove ./config.sh --url https://github.com/my-org/my-repo --token NEW_TOKEN

#GitLab CI: Permissions и безопасность

#Protected Branches и Tags

Настройка защиты:

  1. Settings → Repository → Protected branches
  2. Выбрать ветку
  3. Allowed to merge: Maintainers
  4. Allowed to push: No one

Использование в .gitlab-ci.yml:

deploy-production: stage: deploy script: - ./deploy.sh only: - main # Защищённая ветка environment: name: production

#Protected Variables

Создание защищённой переменной:

  1. Settings → CI/CD → Variables
  2. Add variable
  3. Включить Protect variable

Использование:

deploy: script: - ./deploy.sh variables: PROD_TOKEN: $PROD_TOKEN # Доступна только на protected branches

#Job Token

Автоматический токен для job:

# Доступ к API GitLab из job deploy: script: - curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \ "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID"

Ограничение доступа Job Token:

  1. Settings → CI/CD → Token Access
  2. Отключить ненужные разрешения

#Сравнение GitHub и GitLab

ФункцияGitHub ActionsGitLab CI
Автоматический токенGITHUB_TOKENCI_JOB_TOKEN
Permissions модельЯвный блок permissionsProtected branches/variables
OIDC✅✅ (с 15.0)
Audit logOrganization levelInstance/Group level
Self-hosted runners✅✅ (gitlab-runner)
Pin actionsSHA hashSHA hash

Далее: Supply chain security