1. はじめに
Terraformを使用してインフラストラクチャをコード化する際、セキュリティの確保は重要です。手動でのセキュリティレビューは時間がかかり、見落としのリスクもあります。特に、チームの規模が大きくなるにつれて、一貫したセキュリティ基準を維持することが困難になってきます。
このような課題に対して、tfsecは効果的なソリューションを提供します。tfsecは、Terraformコードの静的解析を行い、セキュリティの問題を自動検出するツールです。AWS、Azure、GCPなどの主要なクラウドプロバイダーのベストプラクティスに基づいて、400以上のセキュリティルールをチェックできます。GitHubActionsと組み合わせることで、PRごとに自動的にセキュリティチェックを実行し、問題があれば即座にフィードバックを得ることができます。
今回はtfsec-pr-commenter-actionを使用して、PRへのコメントを自動的に行う方法を解説します。このアクションは、セキュリティ問題を発見した際に、問題の詳細な説明と修正のガイダンスを提供してくれます。
本記事で実現すること
- PRごとの自動セキュリティチェック
- インフラストラクチャコードの変更時に自動実行
- セキュリティ違反の早期発見
- チーム全体での一貫したセキュリティ基準の維持
- セキュリティ問題の自動コメント
- 問題箇所の特定と詳細な説明
- 修正のためのガイダンス提供
- レビュープロセスの効率化
- AWS、Azure、GCPなどのクラウドリソースのセキュリティベストプラクティス違反の検出
- クラウドプロバイダー固有のセキュリティルール
- コンプライアンス要件への適合
- セキュリティベストプラクティスの自動チェック
2. 環境構築
プロジェクト構成
├── .github
│ └── workflows
│ └── validate-tfsec.yml # GitHub Actionsワークフロー定義
├── envs
│ ├── production # 本番環境の設定
│ └── staging # ステージング環境の設定
│ └── main.tf
└── modules # 再利用可能なTerraformモジュールこのプロジェクト構成は、環境ごとの設定を分離し、再利用可能なモジュールを活用する一般的なTerraformプロジェクトの構成を示しています。
GitHubActions ワークフロー設定
name: "Validate TFSec"
on:
pull_request:
paths:
- 'envs/**/*.tf'
- 'modules/**/*.tf'
permissions:
contents: read
pull-requests: write
jobs:
validate-tfsec:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: aquasecurity/tfsec-pr-commenter-action@v1.2.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
working_directory: ''このワークフローの特徴:
- Terraformファイルの変更時のみ実行されるため、不要なワークフロー実行を防止
- PRへのコメント権限を適切に設定し、セキュリティを考慮
- 最新バージョンのtfsecアクションを使用
- シンプルな設定で導入が容易
次章では実際のTerraformコードとtfsecが検出するセキュリティ問題を詳しく解説します。
3.tfsecの実装例
以下は、tfsecがチェックする典型的なセキュリティ問題を含むAzureストレージアカウントの例です。この例を通じて、よくある設定ミスとその対策を学びましょう:
resource "azurerm_storage_account" "insecure_storage" {
name = "insecurestorage"
resource_group_name = "example-resources"
location = "japaneast"
account_tier = "Standard"
account_replication_type = "LRS"
# Security Issue 1: Public network access enabled
public_network_access_enabled = true
# Security Issue 2: No minimum TLS version specified
min_tls_version = "TLS1_0"
# Security Issue 3: No encryption
infrastructure_encryption_enabled = false
network_rules {
# Security Issue 4: Allow access from all networks
default_action = "Allow"
bypass = ["None"]
}
}検出されるセキュリティ問題
パブリックアクセス許可(CRITICAL)
- 問題点:
public_network_access_enabled = trueは全てのパブリックネットワークからのアクセスを許可 - リスク:不正アクセスや情報漏洩の可能性が高まる
- 推奨対策:
- プライベートエンドポイントの使用
- 特定のVNetからのアクセスのみを許可
- 必要最小限のネットワークアクセス制御
- 問題点:
古いTLSバージョン(CRITICAL)
- 問題点:
min_tls_version = "TLS1_0"は既知の脆弱性がある古いプロトコル - リスク:中間者攻撃や暗号化通信の解読リスク
- 推奨対策:
- TLS1.2以上を使用
- 定期的なTLSバージョンの見直し
- セキュリティパッチの適用
- 問題点:
デフォルトのネットワークアクセス(CRITICAL)
- 問題点:
default_action = "Allow"は制限のないアクセスを許可 - リスク:意図しないアクセスによるセキュリティリスク
- 推奨対策:
- デフォルトでDenyに設定
- 必要なIPアドレス範囲のみをホワイトリスト化
- サービスエンドポイントの適切な設定
- 問題点:
セキュアな設定例:
resource "azurerm_storage_account" "secure_storage" {
# ... 基本設定は同じ ...
public_network_access_enabled = false
min_tls_version = "TLS1_2"
infrastructure_encryption_enabled = true
network_rules {
default_action = "Deny"
ip_rules = ["10.0.0.0/24"]
bypass = ["AzureServices"]
virtual_network_subnet_ids = [azurerm_subnet.example.id]
}
}4. GitHub Actionsの設定詳細
パーミッション設定
permissions:
contents: read
pull-requests: write最小権限の原則に従い、必要最小限の権限のみを付与しています。
パス指定
on:
pull_request:
paths:
- 'envs/**/*.tf'
- 'modules/**/*.tf'Terraformファイルの変更時のみワークフローを実行することで、CI/CDパイプラインの効率を向上させています。
PRコメント機能
tfsecのGitHub Actionsは自動的にPRにコメントを残します:

コメントには以下の情報が含まれます:
- 警告レベル(CRITICAL、HIGH、MEDIUM、LOW)
- ルール名(azure-storage-use-secure-tls-policy等)
- 問題の詳細な説明
- 修正のためのガイダンス
- 詳細情報へのリンク
これにより、開発者は以下のメリットを得られます:
- 即座のフィードバック
- 明確な修正指針
- セキュリティ知識の向上
- レビュープロセスの効率化
5. まとめ
tfsecとGitHub Actionsの統合により実現できること:
PRごとの自動セキュリティチェック
- 継続的なセキュリティ監視
- 早期のリスク発見
- 修正コストの削減
セキュリティ違反の即時フィードバック
- 明確な問題提起
- 具体的な修正ガイダンス
- 学習機会の提供
チーム全体のセキュリティ意識向上
- ベストプラクティスの共有
- 知識の標準化
- セキュリティ文化の醸成
GitHubのPRレビュープロセスにセキュリティチェックを組み込むことで、インフラストラクチャのセキュリティが大幅に向上します。また、チーム全体のセキュリティ意識も高まり、より安全なインフラストラクチャの構築が可能になります!