1314 Words
7 Minutes
GitHub Actionsにtfsecを導入してTerraformのセキュリティチェックを自動化する

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"]
  }
}

検出されるセキュリティ問題#

  1. パブリックアクセス許可(CRITICAL)

    • 問題点:public_network_access_enabled = trueは全てのパブリックネットワークからのアクセスを許可
    • リスク:不正アクセスや情報漏洩の可能性が高まる
    • 推奨対策:
      • プライベートエンドポイントの使用
      • 特定のVNetからのアクセスのみを許可
      • 必要最小限のネットワークアクセス制御
  2. 古いTLSバージョン(CRITICAL)

    • 問題点:min_tls_version = "TLS1_0"は既知の脆弱性がある古いプロトコル
    • リスク:中間者攻撃や暗号化通信の解読リスク
    • 推奨対策:
      • TLS1.2以上を使用
      • 定期的なTLSバージョンの見直し
      • セキュリティパッチの適用
  3. デフォルトのネットワークアクセス(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にコメントを残します:

tfsec comment

コメントには以下の情報が含まれます:

  • 警告レベル(CRITICAL、HIGH、MEDIUM、LOW)
  • ルール名(azure-storage-use-secure-tls-policy等)
  • 問題の詳細な説明
  • 修正のためのガイダンス
  • 詳細情報へのリンク

これにより、開発者は以下のメリットを得られます:

  • 即座のフィードバック
  • 明確な修正指針
  • セキュリティ知識の向上
  • レビュープロセスの効率化

5. まとめ#

tfsecとGitHub Actionsの統合により実現できること:

  • PRごとの自動セキュリティチェック

    • 継続的なセキュリティ監視
    • 早期のリスク発見
    • 修正コストの削減
  • セキュリティ違反の即時フィードバック

    • 明確な問題提起
    • 具体的な修正ガイダンス
    • 学習機会の提供
  • チーム全体のセキュリティ意識向上

    • ベストプラクティスの共有
    • 知識の標準化
    • セキュリティ文化の醸成

GitHubのPRレビュープロセスにセキュリティチェックを組み込むことで、インフラストラクチャのセキュリティが大幅に向上します。また、チーム全体のセキュリティ意識も高まり、より安全なインフラストラクチャの構築が可能になります!