🍊

GitHub CopilotでPRレビュー時のOWASP Risk Rating評価を自動化

に公開

はじめに

Infrastructure as Code(IaC)のセキュリティレビューで「このIAM権限、どれくらい危険?」「0.0.0.0/0で公開するリスクは?」といった疑問に、定量的に答えられていますか?

主なリスク評価手法として下記が挙げられますが、OWASP Risk Rating Methodologyに基づいたPRレビューガイドを作成し、GitHub Copilotで自動化することで、セキュリティリスクを0-9のスコアで定量的に評価できるようにしました。これにより手動入力コストを最小化し、リスク評価の仕組みが形骸化しないようにしました。

リスク評価手法 概要 メリット デメリット
ヒートマップ評価 発生確率と影響度をマトリクスで視覚化 # 直感的でわかりやすい
# 短時間で評価可能
# 経営層への説明が容易
# 主観的な評価になりがち
# 詳細な分析が困難
# 評価基準が曖昧
OWASP Risk Rating Methodology 16項目を評価して総合リスクスコア(0-9)を算出 # バランスの取れた評価(脅威・脆弱性・影響)
# Infrastructure特化の評価基準を追加しやすい
# PRレビューに適した粒度
# 学習コストが低い
# 16項目の評価に時間がかかる
# 金銭的損失の算出は別途必要
CVSS (Common Vulnerability Scoring System) 脆弱性の深刻度を0-10のスコアで評価 # 業界標準として広く採用
# 詳細な評価基準
# ツールサポートが充実
# 既知の脆弱性向け(設計段階では使いにくい)
# ビジネス影響を考慮しない
# Infrastructure特有のリスクに対応しづらい
NIST SP 800-30 Risk Assessment NISTが提唱する包括的なリスク評価フレームワーク # 包括的で体系的
# 政府機関で広く採用
# 詳細なガイドライン
# 複雑で習得に時間がかかる
# 小規模チームには重すぎる
# PRレビューには不向き
FAIR (Factor Analysis of Information Risk) リスクを金銭的損失で定量化 # 経営層への説明が容易
# ROIの算出が可能
# ビジネス視点での評価
# 金銭的損失の算出が困難
# 専門知識が必要
# PRレビューには複雑すぎる

OWASP Risk Rating Methodologyとは

OWASP(Open Web Application Security Project)が提唱する、リスクを定量的に評価する手法です。16項目を0-9のスケールで評価し、総合リスクスコア(0-9)を算出します。
https://owasp.org/www-community/OWASP_Risk_Rating_Methodology

評価する4つのカテゴリ

1. 脅威エージェント要因(4項目)

  • スキルレベル: 攻撃者に必要な技術レベル
  • 動機: 攻撃者の動機の強さ
  • 機会: 攻撃の機会の多さ
  • 規模: 潜在的な攻撃者の数

2. 脆弱性要因(4項目)

  • 発見の容易さ: 脆弱性を見つける難易度
  • 悪用の容易さ: 脆弱性を悪用する難易度
  • 認知度: 脆弱性の既知度
  • 検出可能性: 攻撃の検出難易度

3. 技術的影響(4項目)

  • 機密性: データ漏洩のリスク
  • 完全性: データ改ざんのリスク
  • 可用性: サービス停止のリスク
  • 責任追跡性: 監査証跡への影響

4. ビジネス影響(4項目)

  • 財務的損害: 金銭的損失
  • 評判: ブランド・信頼への影響
  • コンプライアンス: 法令違反のリスク
  • プライバシー: 個人情報保護法違反

計算方法

各カテゴリの平均 = (4項目の合計) / 4 総合リスクスコア = (4カテゴリの平均の合計) / 4

  • 具体的な評価例
    • 0.0.0.0/0のセキュリティグループ
resource "aws_security_group" "web" {
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

効果

  • 定量的効果
    ✅ 評価の一貫性: 標準化された16項目で評価
    ✅ 説明可能性: リスクスコアで定量的に説明
    ✅ 優先順位付け: スコアで対応優先度を判断
    ✅ 教育効果: 新人も評価基準を学べる
  • 定性的効果
    ✅ 共通言語: 「HIGH」「MEDIUM」で議論できる
    ✅ 透明性: リスク評価の根拠が明確
    ✅ 属人化解消: 誰でも同じ基準で評価
    ✅ 意思決定の改善: データに基づく判断

GitHub Copilotによる自動化

さらに、GitHub Copilotを活用して評価を自動化しました。

仕組み

copilot-instructions.mdにOWASP Risk Rating評価の指示を記述すると、PRレビュー時にCopilotのAIが自動的に16項目を評価してコメントします。

  1. エンジニアがPR作成
  2. CopilotのAIが自動評価
  3. PRにリスクスコアをコメント
  4. レビュアーが確認して判断

この仕組みを実現するために、3つの設定ファイルを作成しました。

  1. .github/copilot-instructions.md
    • Copilot自動評価の指示
      • GitHub CopilotのAIに対して、PRレビュー時にOWASP Risk Rating評価を実施するよう指示するファイルです。
    • 役割:
      • 高リスクパターンの検出ルール
      • 16項目の評価基準(Infrastructure特化)
      • リスクスコアの計算方法
      • コメントフォーマット
copilot-instructions.md
# GitHub Copilot Instructions for Security Review

このリポジトリはTerraformコードを管理している。
PRレビュー時にOWASP Risk Rating Methodologyに基づいてセキュリティリスクを評価すること。

## PRレビュー時の評価プロセス

### 1. 高リスクパターンの検出

以下の変更がある場合、詳細なリスク評価を実施:

#### IAM権限
- IAMポリシー、ロール、ユーザーの追加・変更
- ワイルドカード(`*`)の使用
- `Action = "*"` または `Resource = "*"`
- 管理者権限(`AdministratorAccess`等)

#### ネットワーク公開
- セキュリティグループで`0.0.0.0/0`または`::/0`
- `publicly_accessible = true`(RDS、Redshift等)
- パブリックサブネットへの配置
- インターネットゲートウェイへの直接ルート

#### データストア
- 個人情報を扱うS3、RDS、DynamoDB
- 暗号化の無効化(`encryption = false``encrypted = false`
- バージョニング・バックアップの無効化
- パブリックアクセスブロックの無効化

#### ログ・監査
- CloudTrailの無効化・変更
- VPCフローログの無効化・変更
- アクセスログの無効化
- ログ保持期間の短縮

#### シークレット管理
- ハードコードされたパスワード、APIキー
- `sensitive = true`の欠如
- Secrets Manager/Parameter Storeを使わない認証情報

### 2. OWASP Risk Rating評価(16項目)

高リスクパターンが検出された場合、以下の16項目を評価してリスクスコアを計算:

#### カテゴリ1: 脅威エージェント要因(4項目)

**スキルレベル**
- 低(1): 基本的なAWSコンソール操作のみ
- 中(4): AWS CLI、Terraform、スクリプト作成スキル
- 高(9): 高度なセキュリティ知識、エクスプロイト開発

**動機**
- 低(1): 報酬が少ない、興味本位
- 中(4): 金銭的利益、データ窃取
- 高(9): 標的型攻撃、国家支援、競合他社

**機会**
- 低(1): 内部ネットワークのみ、厳格なアクセス制御
- 中(4): VPN経由、特定のIPアドレスから
- 高(9): インターネット公開、認証なし

**規模**
- 低(2): 内部関係者のみ
- 中(5): 認証済みユーザー
- 高(9): 匿名のインターネットユーザー

#### カテゴリ2: 脆弱性要因(4項目)

**発見の容易さ**
- 低(1): 内部ドキュメントのみ、複雑な設定
- 中(3): AWSコンソールで確認可能
- 高(9): 公開されている、自動スキャンで検出

**悪用の容易さ**
- 低(1): 高度なツール・知識が必要
- 中(3): AWS CLI、既存ツールで可能
- 高(9): Webブラウザのみで可能

**認知度**
- 低(1): 未知の脆弱性、独自実装
- 中(4): 一部のセキュリティ専門家に知られている
- 高(9): 公開されている、CIS Benchmarkで指摘

**検出可能性**
- 低(1): CloudTrail、GuardDutyで即座に検出
- 中(3): ログ分析で検出可能
- 高(9): ログなし、検出困難

#### カテゴリ3: 技術的影響(4項目)

**機密性**
- なし(0): 公開情報のみ
- 低(2): 限定的な非機密データ
- 中(6): 重要なビジネスデータ
- 高(9): 個人情報、機密情報、全データ

**完全性**
- なし(0): 読み取り専用
- 低(2): 限定的なデータ変更
- 中(6): 重要データの変更可能
- 高(9): 全データの改ざん・削除可能

**可用性**
- なし(0): 影響なし
- 低(2): 一部機能の停止
- 中(6): 主要サービスの停止
- 高(9): 全サービスの停止

**責任追跡性**
- なし(0): 完全に記録される
- 低(2): 一部ログが記録される
- 中(6): ログの改ざん可能
- 高(9): ログの削除可能、証跡なし

#### カテゴリ4: ビジネス影響(4項目)

**財務的損害**
- なし(0): 影響なし
- 低(1): 軽微な損失(< 100万円)
- 中(3): 中程度の損失(100万円 - 1000万円)
- 高(9): 重大な損失(> 1000万円)

**評判**
- なし(0): 影響なし
- 低(1): 内部のみ
- 中(4): 顧客への通知が必要
- 高(9): 報道、ブランド毀損

**コンプライアンス**
- なし(0): 影響なし
- 低(2): 軽微な違反
- 中(5): 重要な違反、報告義務
- 高(9): 重大な違反、罰則(個人情報保護法等)

**プライバシー**
- なし(0): 個人情報なし
- 低(3): 限定的な個人情報
- 中(5): 多数の個人情報
- 高(9): 機微な個人情報、大規模漏洩

### 3. リスクスコア計算

総合リスクスコア = (脅威エージェント要因の平均 + 脆弱性要因の平均 + 技術的影響の平均 + ビジネス影響の平均) / 4


各カテゴリの平均:
- 脅威エージェント要因 = (スキルレベル + 動機 + 機会 + 規模) / 4
- 脆弱性要因 = (発見の容易さ + 悪用の容易さ + 認知度 + 検出可能性) / 4
- 技術的影響 = (機密性 + 完全性 + 可用性 + 責任追跡性) / 4
- ビジネス影響 = (財務的損害 + 評判 + コンプライアンス + プライバシー) / 4

### 4. リスクレベル判定

- **0-2.9**: LOW(低リスク)
- **3.0-5.9**: MEDIUM(中リスク)
- **6.0-8.9**: HIGH(高リスク)
- **9.0**: CRITICAL(重大リスク)

## レビューコメントのフォーマット

高リスクパターンが検出された場合、以下の形式でコメント:

```markdown
## 🔒 セキュリティリスク評価

### 検出された高リスクパターン
- [具体的なパターン]

### OWASP Risk Rating評価

**脅威エージェント要因**
- スキルレベル: [低/中/高] ([スコア])
- 動機: [低/中/高] ([スコア])
- 機会: [低/中/高] ([スコア])
- 規模: [低/中/高] ([スコア])
- 平均: [X.X]

**脆弱性要因**
- 発見の容易さ: [低/中/高] ([スコア])
- 悪用の容易さ: [低/中/高] ([スコア])
- 認知度: [低/中/高] ([スコア])
- 検出可能性: [低/中/高] ([スコア])
- 平均: [X.X]

**技術的影響**
- 機密性: [なし/低/中/高] ([スコア])
- 完全性: [なし/低/中/高] ([スコア])
- 可用性: [なし/低/中/高] ([スコア])
- 責任追跡性: [なし/低/中/高] ([スコア])
- 平均: [X.X]

**ビジネス影響**
- 財務的損害: [なし/低/中/高] ([スコア])
- 評判: [なし/低/中/高] ([スコア])
- コンプライアンス: [なし/低/中/高] ([スコア])
- プライバシー: [なし/低/中/高] ([スコア])
- 平均: [X.X]

---

## 📊 評価結果

| 項目 | 値 |
|------|-----|
| **総合リスクスコア** | **[X.X] / 9** |
| **リスクレベル** | ![RISK-LEVEL](https://img.shields.io/badge/RISK-[LEVEL]-[COLOR]?style=for-the-badge) |

**リスクレベル別のバッジカラー:**
- CRITICAL (9.0): `https://img.shields.io/badge/RISK-CRITICAL-critical?style=for-the-badge`
- HIGH (6.0-8.9): `https://img.shields.io/badge/RISK-HIGH-red?style=for-the-badge`
- MEDIUM (3.0-5.9): `https://img.shields.io/badge/RISK-MEDIUM-orange?style=for-the-badge`
- LOW (0-2.9): `https://img.shields.io/badge/RISK-LOW-green?style=for-the-badge`

### 🎯 推奨アクション

[リスクレベルに応じた具体的な推奨アクション]

### ⚠️ 対応方針

リスクレベルに応じて、PR作成者に適切な対応を依頼してください。

具体的な評価例

例1: パブリックS3バケット

resource "aws_s3_bucket" "public_data" {
  bucket = "company-public-data"
}

resource "aws_s3_bucket_public_access_block" "public_data" {
  bucket = aws_s3_bucket.public_data.id
  
  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

評価:

  • 脅威エージェント: 高(7.5) - インターネットから誰でもアクセス可能
  • 脆弱性: 高(7.5) - 公開設定は容易に発見・悪用可能
  • 技術的影響: 中(4.25) - データの種類による
  • ビジネス影響: 中(3.75) - データの内容による
  • 総合スコア: 5.69 (MEDIUM)

推奨アクション:

  • パブリックアクセスが本当に必要か確認
  • 必要な場合、CloudFront + OAI/OACの使用を検討
  • 機密データが含まれないことを確認

例2: 0.0.0.0/0のセキュリティグループ

resource "aws_security_group" "web" {
  name = "web-server"
  
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

評価:

  • 脅威エージェント: 高(8.25) - 全インターネットから攻撃可能
  • 脆弱性: 高(7.5) - SSHポートの公開は既知の脆弱性
  • 技術的影響: 高(6.75) - サーバーへの完全アクセス可能
  • ビジネス影響: 高(5.25) - データ漏洩、サービス停止のリスク
  • 総合スコア: 6.94 (HIGH)

推奨アクション:

  • SSHポートは特定IPアドレスのみに制限
  • Session Managerの使用を検討
  • 多要素認証の実装

例3: 暗号化なしのRDS

resource "aws_db_instance" "main" {
  identifier        = "main-db"
  engine            = "postgres"
  instance_class    = "db.t3.micro"
  storage_encrypted = false
}

評価:

  • 脅威エージェント: 中(4.5) - 内部ネットワークからのアクセス
  • 脆弱性: 中(5.0) - 暗号化なしは検出可能
  • 技術的影響: 高(6.75) - データベース全体へのアクセス
  • ビジネス影響: 高(6.0) - 個人情報保護法違反の可能性
  • 総合スコア: 5.56 (MEDIUM)

推奨アクション:

  • storage_encrypted = trueに変更
  • KMS CMKの使用を検討
  • バックアップも暗号化されることを確認

例4: 過剰なIAM権限

resource "aws_iam_policy" "app" {
  name = "app-policy"
  
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = "*"
      Resource = "*"
    }]
  })
}

評価:

  • 脅威エージェント: 中(5.5) - 認証済みユーザー
  • 脆弱性: 高(6.5) - 過剰権限は既知の問題
  • 技術的影響: 高(8.25) - 全AWSリソースへのアクセス
  • ビジネス影響: 高(7.5) - 全システムへの影響
  • 総合スコア: 6.94 (HIGH)

推奨アクション:

  • 最小権限の原則に従って権限を制限
  • 必要なActionとResourceのみを指定
  • IAM Access Analyzerで権限を検証

ベストプラクティスチェック

低リスクの変更でも、以下のベストプラクティスを確認:

IAM

  • 最小権限の原則に従っているか
  • ワイルドカード(*)は本当に必要か
  • IAMロールを使っているか(IAMユーザーではなく)

ネットワーク

  • パブリックアクセスは必要か
  • セキュリティグループは必要最小限か
  • 0.0.0.0/0は本当に必要か

データ保護

  • 暗号化しているか(S3, RDS, EBS, EFS等)
  • バックアップ・バージョニング設定しているか
  • S3のパブリックアクセスブロック有効か

シークレット管理

  • シークレットをハードコードしていないか
  • パスワードはrandom_passwordかSecrets Manager使っているか
  • センシティブな変数にsensitive = true付けているか

ログ・監査

  • CloudTrail有効か
  • アクセスログ有効か
  • CloudWatch Logsに出力しているか

参考資料

  1. SECURITY_REVIEW_GUIDE.md
    • レビュアー向けリファレンス
      • レビュアーがセキュリティリスクを評価する際の参考資料です。
    • 役割:
      • 高リスクパターンの一覧
      • 16項目の詳細な評価基準
      • リスクレベル別の対応方針
      • ベストプラクティス
SECURITY_REVIEW_GUIDE.md

セキュリティレビューガイド

PRレビュー時のOWASP Risk Rating評価ガイド。

このリポジトリについて

AWSリソースをTerraformで管理してる。
IaCのセキュリティリスクを定量的に評価して、適切に対処することが重要。

レビューの流れ

1. GitHub Copilotによる自動評価

PRを作成すると、GitHub CopilotのAIが自動的にセキュリティリスク評価を実施:

  • 高リスクパターンの検出
  • OWASP Risk Rating 16項目の評価
  • リスクスコアの計算(0-9)
  • PRへのコメント投稿

2. 高リスクの変更をチェック

Copilotの評価を参考に、以下の変更を確認:

高リスクのパターン

  • IAM権限: ポリシー、ロール、ユーザーの追加・変更、ワイルドカード(*)
  • ネットワーク公開: セキュリティグループで0.0.0.0/0、publicly_accessible = true
  • データストア: 個人情報を扱うS3/RDS/DynamoDB、暗号化の無効化
  • ログ・監査: CloudTrail、VPCフローログの無効化・変更
  • シークレット: ハードコードされたパスワード、APIキー

低リスクのパターン

  • タグの追加・変更
  • CloudWatch Alarmの追加
  • ドキュメントの更新
  • スケーリング設定変更(セキュリティ設定は適切な場合)

3. PRテンプレートのチェック

PRテンプレートのチェックリストを確認:

  • IAM権限は最小権限か
  • パブリックアクセスは必要か
  • 暗号化は有効か
  • シークレットはハードコードされてないか
  • ログは有効か

OWASP Risk Rating Methodology

リスク評価Issueで使う16項目の評価基準。

カテゴリ1: 脅威エージェント要因

スキルレベル

  • 低(1): 基本的なAWSコンソール操作のみ
  • 中(4): AWS CLI、Terraform、スクリプト作成スキル
  • 高(9): 高度なセキュリティ知識、エクスプロイト開発

動機

  • 低(1): 報酬が少ない、興味本位
  • 中(4): 金銭的利益、データ窃取
  • 高(9): 標的型攻撃、国家支援、競合他社

機会

  • 低(1): 内部ネットワークのみ、厳格なアクセス制御
  • 中(4): VPN経由、特定のIPアドレスから
  • 高(9): インターネット公開、認証なし

規模

  • 低(2): 内部関係者のみ
  • 中(5): 認証済みユーザー
  • 高(9): 匿名のインターネットユーザー

カテゴリ2: 脆弱性要因

発見の容易さ

  • 低(1): 内部ドキュメントのみ、複雑な設定
  • 中(3): AWSコンソールで確認可能
  • 高(9): 公開されている、自動スキャンで検出

悪用の容易さ

  • 低(1): 高度なツール・知識が必要
  • 中(3): AWS CLI、既存ツールで可能
  • 高(9): Webブラウザのみで可能

認知度

  • 低(1): 未知の脆弱性、独自実装
  • 中(4): 一部のセキュリティ専門家に知られている
  • 高(9): 公開されている、CIS Benchmarkで指摘

検出可能性

  • 低(1): CloudTrail、GuardDutyで即座に検出
  • 中(3): ログ分析で検出可能
  • 高(9): ログなし、検出困難

カテゴリ3: 技術的影響

機密性

  • なし(0): 公開情報のみ
  • 低(2): 限定的な非機密データ
  • 中(6): 重要なビジネスデータ
  • 高(9): 個人情報、機密情報、全データ

完全性

  • なし(0): 読み取り専用
  • 低(2): 限定的なデータ変更
  • 中(6): 重要データの変更可能
  • 高(9): 全データの改ざん・削除可能

可用性

  • なし(0): 影響なし
  • 低(2): 一部機能の停止
  • 中(6): 主要サービスの停止
  • 高(9): 全サービスの停止

責任追跡性

  • なし(0): 完全に記録される
  • 低(2): 一部ログが記録される
  • 中(6): ログの改ざん可能
  • 高(9): ログの削除可能、証跡なし

カテゴリ4: ビジネス影響

財務的損害

  • なし(0): 影響なし
  • 低(1): 軽微な損失(< 100万円)
  • 中(3): 中程度の損失(100万円 - 1000万円)
  • 高(9): 重大な損失(> 1000万円)

評判

  • なし(0): 影響なし
  • 低(1): 内部のみ
  • 中(4): 顧客への通知が必要
  • 高(9): 報道、ブランド毀損

コンプライアンス

  • なし(0): 影響なし
  • 低(2): 軽微な違反
  • 中(5): 重要な違反、報告義務
  • 高(9): 重大な違反、罰則(個人情報保護法等)

プライバシー

  • なし(0): 個人情報なし
  • 低(3): 限定的な個人情報
  • 中(5): 多数の個人情報
  • 高(9): 機微な個人情報、大規模漏洩

リスクレベル別の対応

CRITICAL (9.0) / HIGH (6.0-8.9)

  • セキュリティチームによるレビュー必須
  • 複数人によるコードレビュー
  • terraform planの詳細確認
  • 段階的ロールアウト計画
  • ロールバック手順の文書化
  • 監視・アラート設定の確認

MEDIUM (3.0-5.9)

  • コードレビュー必須
  • terraform planの確認
  • ドキュメント更新

LOW (0-2.9)

  • 通常のレビュープロセス

ベストプラクティス

IAM

  • 最小権限の原則に従ってるか
  • ワイルドカード(*)は本当に必要か
  • IAMロール使ってるか(IAMユーザーじゃなくて)

ネットワーク

  • パブリックアクセスは必要か
  • セキュリティグループは必要最小限か
  • 0.0.0.0/0は本当に必要か

データ保護

  • 暗号化してるか(S3, RDS, EBS, EFS等)
  • バックアップ・バージョニング設定してるか
  • S3のパブリックアクセスブロック有効か

シークレット管理

  • シークレットをハードコードしてないか
  • パスワードはrandom_passwordかSecrets Manager使ってるか
  • センシティブな変数にsensitive = true付けてるか

ログ・監査

  • CloudTrail有効か
  • アクセスログ有効か
  • CloudWatch Logsに出力してるか

参考

  1. pull_request_template.md
    • PRテンプレート
      • PR作成時に自動的に表示されるテンプレートです。
    • 役割:
      • セキュリティチェックリスト
      • -Copilot自動評価の説明
      • terraform plan結果の記載欄
pull_request_template.md

変更内容

影響範囲

  • IAM(権限・ロール・ポリシー)
  • ネットワーク(VPC・セキュリティグループ・NACL)
  • データストア(S3・RDS・DynamoDB)
  • コンピュート(EC2・Lambda・ECS)
  • セキュリティサービス(GuardDuty・SecurityHub・Config)
  • ログ・監査(CloudTrail・CloudWatch)
  • その他:

セキュリティチェックリスト(Terraform/IaC)

IAM・権限

  • IAM権限は最小権限の原則に従っている
  • ワイルドカード(*)の使用は正当化される
  • IAMロールを使用している(IAMユーザーではなく)
  • AssumeRoleポリシーは適切に制限されている

ネットワーク

  • パブリックアクセスが必要な場合、正当な理由がある
  • セキュリティグループは必要最小限のポート・ソースのみ許可
  • 0.0.0.0/0からのアクセスは正当化される
  • VPCフローログが有効化されている

データ保護

  • 暗号化が有効化されている(S3, RDS, EBS, EFS等)
  • KMSキーの自動ローテーションが有効
  • バックアップ・バージョニングが設定されている
  • S3バケットのパブリックアクセスブロックが有効

シークレット管理

  • シークレットがハードコードされていない
  • パスワードはrandom_passwordまたはSecrets Managerを使用
  • センシティブな変数にsensitive = trueが設定されている

ログ・監査

  • CloudTrailが有効化されている
  • アクセスログが有効化されている(S3, ALB, CloudFront等)
  • CloudWatch Logsへのログ出力が設定されている

GitHub Copilotによる自動評価

PRを作成すると、GitHub CopilotのAIが自動的にセキュリティリスク評価を実施します。
Copilotのコメントを確認して、指摘された項目に対応してください。

評価内容:

  • 高リスクパターンの検出
  • OWASP Risk Rating 16項目の評価
  • リスクスコアの計算(0-9)
  • リスクレベルの判定(CRITICAL/HIGH/MEDIUM/LOW)

terraform plan結果

Plan: X to add, Y to change, Z to destroy.

定量的効果(試算)

前提条件:

  • 月間PR数: 100件
  • 手動レビュー時間: 1件あたり10分
  • 自動化後: 1件あたり2分(Copilotの評価確認のみ)

削減効果:

  • レビュー時間削減: 月13時間
  • セキュリティリスク評価実施率: 0% → 100%
  • 評価の一貫性: 標準化された16項目で評価
  • 見落とし防止: 高リスクパターンを自動検出

実際の出力


まとめ

OWASP Risk Rating Methodologyを導入することで、セキュリティリスクを「なんとなく」ではなく、定量的に評価できるようになりました。

さらにGitHub Copilotで自動化することで、全PRで漏れなくセキュリティリスク評価を実施できるようになりました。セキュリティは「やらなければならないこと」ですが、定量的な評価基準と自動化によって「自然にできること」に変えられます。

ぜひ、あなたのチームでも試してみてください。

参考資料

OWASP Risk Rating Methodology
OWASP SAMM
CIS AWS Foundations Benchmark

Discussion