概要
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パイプラインセキュリティ を参照してください。ここではツールの検出対象と判定ロジックを掘り下げます。
| ツール | 特徴 |
|---|---|
| tfsec | Terraform専用。組み込みルールで暗号化未設定・公開バケット等を検出(現在はTrivyに統合) |
| Checkov | Terraform・CloudFormation・Kubernetes等マルチIaC対応。数百の組み込みポリシーを持つ |
| Terrascan | OPA(Open Policy Agent)ベースのルールエンジンでコンプライアンス基準(CIS等)に対応 |
| cfn-nag / cfn_nag | CloudFormationテンプレート専用のセキュリティチェック |
典型的な検出例:
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コードにはクラウド認証情報・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 Sentinel | Terraform Cloud/Enterprise専用のPolicy as Codeフレームワーク |
| AWS Config Rules / Conftest | クラウド固有・OPA連携でのポリシー適用 |
ポリシーの例(概念):
ポリシー: 「すべてのS3バケットは暗号化を有効化しなければならない」
ポリシー: 「本番環境のセキュリティグループはSSHを0.0.0.0/0に開放してはならない」
ポリシー: 「タグにコスト部門(cost-center)が必須」
→ 違反時は apply を拒否(Hard Mandatory)
→ または警告のみで承認者の例外承認を要求(Advisory)
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変数に渡した値は、実行後のステートファイルに平文で記録される可能性があるため、ステート側の暗号化・アクセス制御も合わせて必要です。
関連用語
- CI/CDパイプラインセキュリティ — IaCスキャンをパイプラインに組み込む実行タイミングと権限管理
- クラウドセキュリティ設計 — 責任共有モデルとIaCによる自動化の位置付け
- クラウドセキュリティ設定ミスとIAM過剰権限 — IaCスキャンが検出する設定ミスの具体例
- 鍵管理 — ステートファイルやシークレットの暗号化鍵管理
重要キーワード
| 用語 | 説明 |
|---|---|
| IaC(Infrastructure as Code) | インフラ構成をコードで定義・管理する手法 |
| tfsec / Checkov | Terraform等のIaCコードを静的解析し設定ミスを検出するスキャンツール |
| ステートファイル(.tfstate) | Terraformの管理対象リソースの現在状態を記録するファイル。機密情報を含む場合がある |
| Policy as Code | 組織のセキュリティ・コンプライアンスルールをコードとして定義し機械的に強制適用する仕組み |
| OPA(Open Policy Agent) | Rego言語でポリシーを記述する汎用ポリシーエンジン |
| State Locking | 複数人の同時applyによるステートファイルの不整合を防ぐ排他制御 |