LESSON 30分

シークレット管理

ストーリー

「CI/CDパイプラインからAWSにデプロイする時、 アクセスキーが必要になる。これをどう管理するかが重要だ」

木村先輩が過去のインシデントレポートを見せた。

「去年、あるプロジェクトでAWSのアクセスキーをGitHubに ハードコードしてpushしてしまった。30分後にはマイニングBotに アカウントを乗っ取られて、数十万円の請求が来た」

「怖い......」

「だからシークレット管理は絶対に手を抜くな。 GitHub Secretsの正しい使い方を教えよう」


シークレットとは

CI/CDパイプラインで使用する機密情報のことです。

シークレットの種類
クラウド認証情報AWS Access Key, GCP Service Account Key
API キーSlack Webhook URL, SendGrid API Key
データベース接続情報DB パスワード, 接続文字列
レジストリ認証Docker Hub Token, npm Token
SSH キーデプロイ用SSH鍵

絶対にやってはいけないこと

NG パターン(絶対にやらない)

# ソースコードにハードコード
const AWS_KEY = "AKIAIOSFODNN7EXAMPLE"     ← 漏洩!

# ワークフローにハードコード
env:
  AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE   ← 漏洩!

# .envファイルをコミット
git add .env                                 ← 漏洩!

GitHub Secrets

Secretsの種類

GitHub Secrets の階層

┌── Organization Secrets ──────────────┐
│  組織全体で共有                         │
│  例: SLACK_WEBHOOK_URL                │
│                                        │
│  ┌── Repository Secrets ──────────┐  │
│  │  リポジトリ固有                    │  │
│  │  例: AWS_ACCESS_KEY_ID           │  │
│  │                                    │  │
│  │  ┌── Environment Secrets ─────┐│  │
│  │  │  環境ごとに異なる値           ││  │
│  │  │  例: DB_PASSWORD (staging)  ││  │
│  │  │  例: DB_PASSWORD (prod)     ││  │
│  │  └────────────────────────────┘│  │
│  └────────────────────────────────┘  │
└──────────────────────────────────────┘
レベル設定場所用途
OrganizationSettings > Secrets全リポジトリ共通の認証情報
RepositorySettings > Secrets > Actionsリポジトリ固有の認証情報
EnvironmentSettings > Environments > Secrets環境別の認証情報

Secretsの設定方法

  1. リポジトリの Settings > Secrets and variables > Actions
  2. 「New repository secret」をクリック
  3. Name と Value を入力して保存

ワークフローでの使用

yaml
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: Deploy to S3
        run: aws s3 sync dist/ s3://my-bucket/

Environment Secrets

環境ごとに異なるシークレットを管理します。

環境の設定

yaml
jobs:
  deploy-staging:
    runs-on: ubuntu-latest
    environment: staging                    # staging環境のシークレットを使用
    steps:
      - name: Deploy
        env:
          DB_PASSWORD: ${{ secrets.DB_PASSWORD }}    # staging用のパスワード
        run: echo "Deploying to staging..."

  deploy-production:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production                 # production環境のシークレットを使用
    steps:
      - name: Deploy
        env:
          DB_PASSWORD: ${{ secrets.DB_PASSWORD }}    # production用のパスワード
        run: echo "Deploying to production..."

環境の保護ルール

保護ルール説明
Required reviewersデプロイ前に指定された人の承認が必要
Wait timerデプロイ前に指定時間の待機が必要
Branch policies特定ブランチからのみデプロイ可能

GITHUB_TOKEN

GitHub Actionsで自動的に提供される認証トークンです。

yaml
permissions:
  contents: read
  pull-requests: write
  issues: write

jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
      - name: Comment on PR
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'CI passed!'
            })

GITHUB_TOKEN の権限

権限デフォルト推奨
contentsread/writeread
pull-requestsread/write必要時のみwrite
issuesread/write必要時のみwrite
packagesread/write必要時のみwrite
yaml
# ワークフローレベルで最小権限を指定(推奨)
permissions:
  contents: read

# ジョブレベルで必要な権限を追加
jobs:
  deploy:
    permissions:
      contents: read
      id-token: write        # OIDC 認証に必要

OIDC(OpenID Connect)による認証

シークレットを使わない、より安全な認証方法です。

従来の方法(Static Credentials)

  GitHub Actions → AWS Access Key → AWS
                   (長期有効)
                   ↑
              漏洩リスクあり

OIDC による方法

  GitHub Actions → OIDC Token → AWS STS → 一時認証情報 → AWS
                   (短期有効)             (15分〜1時間)
                   ↑
              漏洩しても短期で無効化
yaml
permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::123456789012:role/github-actions-role
          aws-region: ap-northeast-1
          # アクセスキーは不要!
比較項目Static CredentialsOIDC
シークレット管理必要不要
有効期間長期(手動ローテーション)短期(自動失効)
漏洩リスク高い低い
セットアップ簡単やや複雑

シークレット管理のベストプラクティス

プラクティス説明
最小権限の原則必要最小限の権限のみ付与
定期ローテーション90日ごとにシークレットを更新
環境の分離staging/production で異なるシークレットを使用
監査ログシークレットの使用履歴を監視
OIDC優先可能な場合はOIDC認証を使用
.gitignore.env ファイルを必ず除外

.gitignore の必須設定

# .gitignore
.env
.env.local
.env.*.local
*.pem
*.key
credentials.json
service-account.json

まとめ

ポイント内容
GitHub Secretsリポジトリ/環境レベルでシークレットを安全に管理
Environment環境ごとに異なるシークレットと保護ルールを設定
GITHUB_TOKEN自動提供される認証トークン、最小権限で使用
OIDCシークレット不要の認証方式、推奨

チェックリスト

  • GitHub Secretsの3つのレベル(Organization/Repository/Environment)を理解した
  • ワークフローでシークレットを安全に使用する方法を把握した
  • GITHUB_TOKENの権限設定方法を理解した
  • OIDCによるシークレットレス認証の概念を理解した

次のステップへ

次のセクションでは、CIパイプラインの実行速度を改善するキャッシュとアーティファクトについて学びます。


推定読了時間: 30分