CI/CDの自動化は、言ってみれば「あなたの代わりに、信頼できるロボットに鍵を渡して作業させる」ようなものです。しかし、その鍵の管理を怠れば、ロボットは悪意ある第三者の手先にもなり得ます。
今日は、GitHub Actionsを安全かつ最強のツールにするための「守りの極意」を伝授します。初心者のあなたも、今日から「セキュリティを理解したエンジニア」の第一歩を踏み出しましょう。
—
1. GitHub Actionsにおける「Secrets」の正体
まず基本です。APIキーやデプロイ用のパスワードをコードに直書きするのは、玄関の鍵を道端に落とすのと同じです。GitHubには「Secrets」という暗号化された保管場所があります。
- どこにある?: リポジトリの `Settings > Secrets and variables > Actions`
- 役割: ここに登録した値は、ログ上に表示される際に自動的に “ に置き換わります。
【極意】Secretsを「環境変数」として流し込む
Workflowファイル(YAML)でSecretsを使う際は、必ず環境変数経由で渡してください。
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: デプロイ実行
env:
# secrets.API_KEY を環境変数 API_KEY にマッピング
API_KEY: ${{ secrets.API_KEY }}
run: |
# 実行スクリプト内で $API_KEY として安全に呼び出す
./deploy.sh –key $API_KEY
なぜこうするのか?:直接 `run: ./deploy.sh ${{ secrets.API_KEY }}` と書くと、稀にエラーログに機密情報が露呈するリスクがあるからです。環境変数を経由させるのは、プロの基本作法です。
—
2. 「OIDC認証」という革命:鍵を渡す時代は終わった
これまで、AWSのアクセスキーをSecretsに保存していませんでしたか? それはもう古いやり方です。現在はOIDC(OpenID Connect)を使うのが世界標準です。
- 従来の欠点: アクセスキーが漏れたら終わり。定期的なローテーションが面倒。
- OIDCの強み: 「GitHubが発行する一時的なトークン」をAWS側が検証する。「鍵」そのものをGitHub上に保存する必要がありません。
実践:AWSとの連携例
AWS側で「GitHubリポジトリからのアクセスのみ許可するロール」を作成し、Workflowでこう書きます。
permissions:
id-token: write # OIDCトークン発行に必要な権限
contents: read
jobs:
aws-deploy:
runs-on: ubuntu-latest
steps:
- name: AWS認証
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/my-github-role
aws-region: ap-northeast-1
これだけで、漏洩リスクのある「静的なパスワード」をGitHubから排除できます。これぞ、現代のDevOpsです。
—
3. 権限の最小化(Principle of Least Privilege)
GitHub Actionsには、デフォルトでリポジトリを操作する強力な権限が与えられています。しかし、多くのジョブは「コードを読んでビルドするだけ」ですよね?
権限を縛り上げる
Workflowのトップレベルで `permissions` を設定し、不必要な権限を剥奪しましょう。
name: CI
on: push
全ての権限をデフォルトで無効化
permissions: read-all
jobs:
test:
runs-on: ubuntu-latest
permissions:
contents: read # コードを読む権限だけ許可
steps:
- uses: actions/checkout@v4
- run: npm test
これを設定するだけで、万が一CI上のスクリプトが改ざんされても、勝手にコードを書き換えたりIssueを作成したりする攻撃を防げます。
—
4. 初めての安全なHello World(動作確認)
最後に、今日学んだ知識を組み合わせた、最も安全なHelloWorldを作ってみましょう。
`.github/workflows/security-demo.yml`
name: Security Demo
on: [push]
最小限の権限設定
permissions:
contents: read
jobs:
echo-secret:
runs-on: ubuntu-latest
steps:
- name: 安全なシークレット出力
env:
# Settingsで登録したMY_SECRETを呼び出し
MY_SECRET: ${{ secrets.MY_SECRET }}
run: |
# ログを確認しても、値は と表示されるはずです
echo “シークレットの長さ: ${#MY_SECRET}”
最後に:先輩からのアドバイス
セキュリティ対策は「面倒だ」と感じるかもしれません。しかし、「設定していない」ことの代償は、設定する手間の100万倍重いのです。
まずは今日、あなたのリポジトリの `permissions` を `read-all` に書き換えてみてください。それだけで、あなたは他の初心者とは一線を画す「責任あるエンジニア」への階段を一段登ったことになります。
毎日の作業が少しずつ、でも確実に強固になっていく。その感覚を楽しんでくださいね!応援しています。