概要

IaC(Infrastructure as Code)は、サーバ・ネットワーク・IAMなどのインフラ構成をTerraformやCloudFormationのようなコードで定義し、バージョン管理・レビュー・自動適用の対象にする手法です。手作業によるコンソール操作を排することで再現性を高める一方、コード化されたインフラは「コードとして」新たな攻撃対象になります。設定ミスのコード化・シークレットの埋め込み・ステートファイルの漏洩・変更の無審査適用が典型的なリスクです。SC試験ではIaC特有のセキュリティ実践(スキャン・シークレット管理・Policy as Code)が問われます。

仕組みと動作原理

IaCのセキュリティ上の意味

IaCは「インフラの設定ミスを人手で見つける」問題を「コードの誤りを機械的に検出する」問題に変換します。これによりコードレビュー・静的解析・自動テストといったソフトウェア開発の手法をインフラ設定にも適用できます。

従来(手動運用)IaC
コンソール操作で構成変更コードで構成を宣言し apply で反映
変更履歴が残りにくいGitの差分・PRレビューで変更が可視化される
環境ごとに設定がズレる(構成ドリフト)コードが単一の真実源(Single Source of Truth)
設定ミスは本番適用後に発覚しやすいapply前にスキャン・レビューで事前検出できる

IaCスキャンによる設定ミスの事前検出

IaCスキャンツールはTerraform/CloudFormation等のコードを静的解析し、apply前に危険な設定を検出します。CI/CDパイプラインへの組み込み方や実行タイミングそのものは CI/CDパイプラインセキュリティ を参照してください。ここではツールの検出対象と判定ロジックを掘り下げます。

ツール特徴
tfsecTerraform専用。組み込みルールで暗号化未設定・公開バケット等を検出(現在はTrivyに統合)
CheckovTerraform・CloudFormation・Kubernetes等マルチIaC対応。数百の組み込みポリシーを持つ
TerrascanOPA(Open Policy Agent)ベースのルールエンジンでコンプライアンス基準(CIS等)に対応
cfn-nag / cfn_nagCloudFormationテンプレート専用のセキュリティチェック

典型的な検出例:

resource "aws_s3_bucket" "data" {
  bucket = "company-data"
  # 暗号化設定なし → スキャンツールが警告
  # public-read 設定 → スキャンツールがCRITICALで検出
}

resource "aws_security_group_rule" "ssh" {
  type        = "ingress"
  from_port   = 22
  to_port     = 22
  cidr_blocks = ["0.0.0.0/0"]  # 全世界に22番ポート開放 → 検出対象
}

これらはapply前の静的解析段階で検出でき、本番環境に誤設定が反映される前に修正できます。

IaCスキャンによる設定ミスの事前検出フロー
1
開発者
IaCコードを記述
Terraform/CloudFormation
2
ローカル/CI
IaCスキャン実行
tfsec・Checkov等
3
スキャン結果
危険な設定を検出
公開バケット・暗号化未設定等
4
レビュー
修正 or 例外承認
apply前にブロック

シークレットのハードコード防止

IaCコードにはクラウド認証情報・DBパスワードなどを直接書きたくなる誘惑がありますが、これはGitリポジトリに機密情報を残す最悪のパターンです。

リスクのある書き方対策
password = "P@ssw0rd123" とコードに直書きシークレットマネージャ(Vault・AWS Secrets Manager)から動的取得
APIキーを変数のデフォルト値に設定変数はデフォルト値なしで宣言し、実行時に外部から注入
.tfvarsファイルをコミット.gitignoreで除外し、CI/CDのシークレットストアで管理
シークレットスキャン未導入git-secrets・truffleHog・Checkovのシークレット検出ルールを併用

IaCコード自体はシークレットの「値」を持たず、実行時に外部サービスから取得する参照だけを持つのが原則です。

ステートファイルの機密性管理

Terraformの.tfstateファイルは、管理対象リソースの現在の構成をすべて記録した内部データです。ここにはIDやARNだけでなく、リソースによってはパスワード・APIキー・TLS秘密鍵などの機密情報が平文で含まれることがあります。

terraform.tfstate に記録される情報の例:
- リソースID・ARN
- セキュリティグループのルール
- RDSのマスターパスワード(resourceの属性として)
- 生成されたTLS証明書の秘密鍵

ステートファイルのリスクと対策:

リスク対策
ローカルに平文で保存され誤ってGit管理下にリモートバックエンド(S3・Terraform Cloud等)を使用し.gitignoreに追加
リモートバックエンドが公開設定バケットの非公開化・暗号化(SSE-KMS)を必須化
複数人が同時にapplyし状態が破損State Locking(DynamoDB等)で排他制御
ステートファイルへの無制限アクセスIAMポリシーで読み取り権限を最小化

Policy as Code(OPA/Sentinel)

IaCスキャンが「ベストプラクティス違反を警告する」のに対し、Policy as Codeは組織のルールを強制的に適用する仕組みです。ポリシーをコードとして定義し、apply前に機械的に合否判定します。

ツール特徴
OPA(Open Policy Agent)Rego言語でポリシーを記述するCNCFのオープンソースエンジン。Terraform・Kubernetes等汎用的に利用可能
HashiCorp SentinelTerraform Cloud/Enterprise専用のPolicy as Codeフレームワーク
AWS Config Rules / Conftestクラウド固有・OPA連携でのポリシー適用

ポリシーの例(概念):

ポリシー: 「すべてのS3バケットは暗号化を有効化しなければならない」
ポリシー: 「本番環境のセキュリティグループはSSHを0.0.0.0/0に開放してはならない」
ポリシー: 「タグにコスト部門(cost-center)が必須」

→ 違反時は apply を拒否(Hard Mandatory)
→ または警告のみで承認者の例外承認を要求(Advisory)
Policy as Code による適用フロー
IaCコード
Terraform plan
ポリシーエンジン
Rego / Sentinelルール評価
Hard Mandatory
違反時はapply拒否
Advisory
警告 + 例外承認フロー
監査ログ
誰が何を承認したか記録
Policy as Code
OPA / Sentinel

IaCスキャン(tfsec/Checkov)が「開発者への助言」であるのに対し、Policy as Codeは「組織として強制するガードレール」という位置付けの違いを理解しておくことが重要です。

SC試験での頻出ポイント

  • IaCスキャンの実行タイミングapply(実環境への反映)前に静的解析で検出することで、被害の未然防止コストを下げられる
  • シークレットをIaCコードに直書きしない理由:Gitの履歴に残り削除が困難。値を持たず外部シークレットマネージャへの参照のみを持たせるのが原則
  • ステートファイルが機密情報である理由:管理リソースの属性(パスワード・秘密鍵等)を平文で保持する場合があり、アクセス制御・暗号化・リモート管理が必須
  • IaCスキャンとPolicy as Codeの違い:スキャンは既知の設定ミスパターンを検出する助言、Policy as Codeは組織ポリシーを強制適用するガードレール
  • State Lockingの目的:複数人の同時applyによるステートファイルの不整合・破損を防止する排他制御

よくある誤問・ひっかけパターン

誤り① 「IaCコードはインフラの設定を記述するだけなので、コード自体に機密情報は含まれない」→ 。ステートファイルにはリソースの実際の属性値(パスワード・秘密鍵等)が記録される場合があり、コード・ステート両方に機密性管理が必要です。

誤り② 「IaCスキャンで警告が出なければ本番適用しても安全」→ 。スキャンツールは既知のパターンしか検出できません。組織固有のルールを強制するにはPolicy as Codeによるガードレールが別途必要です。

誤り③ 「シークレットはCI/CDの環境変数に設定すればIaCコードには一切残らない」→ 不完全。環境変数からTerraform変数に渡した値は、実行後のステートファイルに平文で記録される可能性があるため、ステート側の暗号化・アクセス制御も合わせて必要です。

関連用語

重要キーワード

用語説明
IaC(Infrastructure as Code)インフラ構成をコードで定義・管理する手法
tfsec / CheckovTerraform等のIaCコードを静的解析し設定ミスを検出するスキャンツール
ステートファイル(.tfstate)Terraformの管理対象リソースの現在状態を記録するファイル。機密情報を含む場合がある
Policy as Code組織のセキュリティ・コンプライアンスルールをコードとして定義し機械的に強制適用する仕組み
OPA(Open Policy Agent)Rego言語でポリシーを記述する汎用ポリシーエンジン
State Locking複数人の同時applyによるステートファイルの不整合を防ぐ排他制御