シークレット管理
ストーリー
「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) ││ │
│ │ └────────────────────────────┘│ │
│ └────────────────────────────────┘ │
└──────────────────────────────────────┘
| レベル | 設定場所 | 用途 |
|---|---|---|
| Organization | Settings > Secrets | 全リポジトリ共通の認証情報 |
| Repository | Settings > Secrets > Actions | リポジトリ固有の認証情報 |
| Environment | Settings > Environments > Secrets | 環境別の認証情報 |
Secretsの設定方法
- リポジトリの Settings > Secrets and variables > Actions
- 「New repository secret」をクリック
- 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 の権限
| 権限 | デフォルト | 推奨 |
|---|---|---|
| contents | read/write | read |
| pull-requests | read/write | 必要時のみwrite |
| issues | read/write | 必要時のみwrite |
| packages | read/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 Credentials | OIDC |
|---|---|---|
| シークレット管理 | 必要 | 不要 |
| 有効期間 | 長期(手動ローテーション) | 短期(自動失効) |
| 漏洩リスク | 高い | 低い |
| セットアップ | 簡単 | やや複雑 |
シークレット管理のベストプラクティス
| プラクティス | 説明 |
|---|---|
| 最小権限の原則 | 必要最小限の権限のみ付与 |
| 定期ローテーション | 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分