Infrastructure as Code(IaC)は、現代のテクノロジー環境におけるゲームチェンジャーとして急速に台頭しています。インフラストラクチャのプロビジョニングと管理プロセスをコード化することで、開発者はバージョン管理と再現性を獲得し、潜在的な脆弱性が低減されます。しかし、その普及に伴い、潜在的な脆弱性問題も生じています。
GitLab IaCスキャン は、IaC 設定内の設定ミスやセキュリティギャップを発見し、それらから保護する効果的かつ効率的な手段として際立っています。このガイドでは、その価値、設定プロセス、および IaC 構成を強化するためのベストプラクティスについて深く掘り下げます。

Infrastructure as Code (IaC) とは?
インフラストラクチャ・アズ・コード(IaC)とは、インフラストラクチャのプロビジョニング、管理、構成タスクを手動プロセスやカスタムスクリプトではなくコードとして記述するアプローチです。サーバー、データベース、ネットワークインフラストラクチャコンポーネントのプロビジョニングを手動プロセスに依存する代わりに、IaCは標準的なコードテンプレートを活用します。
IaCの普及は、アプリケーションのデプロイやスケーリングにおける俊敏性の必要性が絶えず高まっていることに起因します。従来のインフラ管理では、人的ミスを招きやすい時間のかかる設定が必要でした。IaCはソフトウェアコードと同様にインフラをバージョン管理することで、一貫性、再現性、迅速な更新プロセスを実現します。これにより、バージョン管理された再現可能なインフラ構築が、人的監視やエラーなしに継続的に実行可能になります。&
DevOpsの実践はIaCの実践とも相乗効果を発揮し、開発と運用の間の隔たりを埋めるのに役立ちます。IaCにより、インフラの変更はアプリケーション開発と並行して実施できるため、デプロイ時間の短縮とよりスムーズなパイプライン管理が可能になります。これらの取り組みの相乗効果により、組織はデプロイプロセスにおける効率性と信頼性の向上を実現します。
なぜIaCスキャンが不可欠なのか?
Infrastructure as Code(IaC)は新たな脆弱性の可能性を開きました。インフラデプロイを自動化するスクリプトを書く開発者は、意図せずインフラデプロイプロセスに重大なセキュリティギャップを導入する可能性があります。IaCスキャンは、こうしたセキュリティホールが本番環境に到達する前に検出するために不可欠となります。
現代のクラウドネイティブインフラストラクチャは非常に動的で複雑な環境となり得る。設定ミスは、コード定義を精査してセキュリティベストプラクティスに違反しデータ漏洩やインフラ脆弱性によるシステム侵害を引き起こす可能性のある設定ミスを検出するために、コード定義を精査する必要はありません。IaCスキャンツールは、人工知能をサービスとして提供する技術(AIC)を採用しています。これにより、データ漏洩やシステム侵害を引き起こすインフラ脆弱性に関連するリスクを劇的に低減します。
コンプライアンスとデータ保護基準が強化される中、企業は法的・評判上の影響を回避するため、初期段階から安全なインフラを実装する必要があります。IaCスキャンは、インフラが業界規制に準拠していることを保証することで、企業がこの規範を順守し、法的影響から身を守ることを支援します。
GitLab IaCスキャンの理解
GitLabのInfrastructure as Code(IaC)スキャン機能は、IaC構成ファイルを潜在的な脆弱性に対して体系的に検証するアプローチを提供します。これにより、インフラストラクチャのプロビジョニングと管理を行う構成が堅牢で安全、かつコンプライアンスに準拠していることが保証されます。サポート対象は、Terraform、Ansible、AWS CloudFormation、Kubernetesなど、一般的なものを含む様々なIaC構成ファイルに及びます。
- 要件と互換性
- サポート対象ファイルとカスタマイズ
- 構成とルールのカスタマイズ
- 脆弱性の自動解決
1.要件と互換性
効果的な IaCスキャン を有効にするには、テストステージ内で動作させる必要があります。これは、このステージの.gitlab-ci.ymlファイルに含める必要があるためです。
- パフォーマンスを最大化するには、最低4GBのRAMが必要です。
- デフォルトでは、DockerまたはKubernetes実行環境を備えたGitLab Runnerが必須です(GitLab.comユーザーには自動的に有効化されます)。ただし、IaCスキャニングアナライザは非amd64 CPUアーキテクチャと互換性がない可能性があり、これらのジョブにはDockerバージョン19.03.0の使用を避けることが推奨されます。&8217;これらのジョブではDockerバージョン19.03.0の使用を避けることを強く推奨します。
2. サポート対象ファイルとカスタマイズ
GitLab IaCスキャンは、KICSツールを通じて包括的なサポートを提供します。Ansible、AWS CloudFormation、Azure Resource Manager、Dockerfile、Google Deployment Manager、Kubernetes、OpenAPI、Terraformなどの構成ファイルがサポート対象です。結果を確認する際には、JSON形式のAzure Resource Managerテンプレートが必須であることや、カスタムレジストリのTerraformモジュールがサポートされていないといった特定の要件も考慮する必要があります。
GitLabはこの機能においてもオープン性を追求し、すべてのオープンソース(OSS)アナライザーをGitLab Free tierで利用可能にしています。SAST_IMAGE_SUFFIX変数を操作することで、標準版とFIPS版のイメージを切り替えることができます。
3. 設定とルールのカスタマイズ
プロジェクトでのIaCスキャンの設定は比較的簡単です。SAST-IaC.gitlab-ci.ymlテンプレートを手動で含めることで設定できます。このテンプレートを含めると、CI/CDパイプライン内でIaCスキャンジョブが生成されます。あるいは、マージリクエストを通じて自動的に設定することも可能です。スキャン完了後、IaCスキャンジョブの結果はSASTレポートアーティファクトとして保存されます。スキャンプロセスを強化したいチームは、デフォルトルールをカスタマイズするオプションがあります。この機能には以下が含まれます:事前定義ルールを無効化。
スキャンプロセスを特定のアナライザバージョンに関連付けることも可能です。これにより、更新による後退や望ましくない変更が発生した場合に保護されます。
4. 自動脆弱性解決
GitLab IaC Scanningはレポート内の不要なノイズ排除を重視しています。関連性を維持し現在の脆弱性に焦点を当てるため、システムは特定の自動処理を実行します:
1.ルールの無効化: 1つ以上のルールがプロジェクトに不要と判断し明示的に無効化した場合、それらが報告していた脆弱性は自動的に解決されます。
2. ルール削除: GitLabがデフォルトルールの一部または全部が時代遅れである、あるいは誤検知が多すぎると判断した場合、それらのルールは削除される可能性が高く、そのようなルールによってフラグが立てられた脆弱性は自動的に解決されます。
3. 履歴記録: 監査証跡の維持は極めて重要です。GitLabの脆弱性管理システムはコメントを追加し、自動化・解決された過去の脆弱性を把握し続けることを保証します。
4. ルール再有効化: 無効化されていたルールを再有効化すると、自動解決済みだった検出結果が再分類対象となり、過去の脆弱性が見逃されるのを防ぎます。
レポート:JSON形式の理解
GitLabのIaCスキャンツールは、SASTレポート形式に準拠した構造化JSONレポートとして検出結果を出力し、ユーザーに包括的な結果を提供します:
1. 標準化: この形式により、様々なプロジェクトやスキャン間の統合や比較が容易になります。
2. アクセシビリティ:ユーザーはCIパイプラインページやマージリクエストパイプラインから、アーティファクト: pathsディレクティブを「gl-sast-report.json」に設定することで、レポートを迅速かつ簡単に直接ダウンロードできます。この操作を容易にするには、アーティファクト: paths ディレクティブを「gl-sast-report.json」に設定してください。
3.スキーマリファレンス:GitLab は、詳細なスキーマドキュメントを提供しており、このレポートを深く掘り下げたり、他のシステムと統合したりすることに関心のある方が、そのすべての部分に簡単かつ包括的にアクセスできるようにしています。
GitLab IaCスキャンの設定
プロジェクト向けにGitLab IaCスキャンを設定する方法を見ていきましょう。
GitLab IaC スキャンの設定手順は以下の通りです–
- 前提条件
- GitLab CI/CD の統合
- カスタム設定(オプション)
- スキャンの実行
- 結果の確認
1.前提条件
- GitLab バージョン: GitLab バージョン 12.10 以降を使用していることを確認してください。
- リポジトリの設定:インフラストラクチャ・アズ・コードファイル(Terraform、CloudFormation、Kubernetes設定ファイルなど)はリポジトリの一部である必要があります。
2. GitLab CI/CDの統合
IaCスキャンを設定するには、GitLab CI/CDパイプラインとの統合が必要です。
リポジトリのルートディレクトリで .gitlab-ci.yml を作成または更新します。
以下の設定を追加します:
Include:
template: Security/Infrastructure-Scanning.gitlab-ci.yml
このインクルードにより、CI/CDパイプライン内でIaCスキャンジョブが有効になります。
3. カスタム設定(オプション)
特定の要件を持つプロジェクトでは、スキャンプロセスをカスタマイズできます:
- カスタムルール:GitLab IaCスキャンでは、カスタムルールの定義や既存ルールの変更が可能です。これらはリポジトリのルートディレクトリにある.iac-custom-rulesディレクトリに追加できます。
- ディレクトリの除外: スキャナに特定のディレクトリをスキップさせたい場合、CI/CD設定の変数でそれらを定義できます:
変数:
IAC_PATHS: “infrastructure/*,!infrastructure/legacy/”
上記の場合、スキャナーはinfrastructureディレクトリ内のファイルのみを分析し、legacyサブディレクトリは除外します。
4.スキャンの実行
設定が完了したら、CI/CD パイプラインの実行を開始します。IaC スキャンジョブが Infrastructure as Code ファイルを分析し、潜在的な脆弱性に関するインサイトを提供します。
5.結果の確認
分析後、脆弱性(存在する場合)は以下で確認できます:
- マージリクエスト内(スキャンがマージリクエストによってトリガーされた場合)。
- プロジェクトの「セキュリティとコンプライアンス」セクション。
ここでは以下の操作が可能です:
- 脆弱性の詳細を確認する。
- 解決済みとしてマークするか、追跡用の課題を作成する。
- オプションで、脆弱性の深刻度や種類に基づく自動アクションを設定する。
セキュアなIaC(Infrastructure as Code)設定のベストプラクティス
セキュアなIaC(Infrastructure as Code)構成のためのベストプラクティスは以下の通りです–
- 最小権限の原則(PoLP Principle)
- バージョン管理と変更追跡の維持
- 依存関係の定期的なスキャンと更新
- シークレットの保護
- 構成の効率的な検証と評価
1.PoLP 原則 (最小権限の原則)
最小権限の原則 は、エンティティ(ユーザー、システム、プロセスなど)が、そのタスクを実行するために必要な権限のみを受け取り、それ以上の権限は受け取らないことを保証するために設計された、重要なセキュリティの概念です。この原則は、プログラムで権限を割り当てられるIaC環境においてさらに重要性を増します。権限が誤って付与されたり、広範囲に付与されたりすると、リソースが不必要なリスクに晒される可能性があるためです。
IaC環境における最小権限原則の要件を満たすには、各サービスや機能が要求するリソースのみにアクセスできるよう権限を慎重にスクリプト化する必要があります。AWSのようなクラウドインフラでは、すべてのストレージリソースに対する包括的な権限付与ではなく、S3バケットへの読み取り専用権限付与などが該当します。インフラストラクチャの進化に伴い、権限が厳格に保たれるようIaCスクリプトを継続的に見直す必要があります。
2. バージョン管理と変更追跡の維持
バージョン管理は従来のソフトウェア開発だけでなく、IaC環境におけるインフラ管理においても不可欠な役割を果たします。変更の追跡、設定のロールバック、インフラ調整の理解は、IaCインフラ管理において安全かつ安定した環境を維持するために重要です。p>
IaC構成のためのGitLabやGitHubプラットフォームは、変更追跡ツールだけでなく、本番環境にデプロイする前に提案された変更をチームメンバーとレビューするための共同作業機能も提供します。このピアレビュープロセスにより、重要な変更がIaC環境に導入される前に、セキュリティ上の懸念が考慮され、ベストプラクティスへの準拠が確保されます。&
3. 依存関係のスキャンと更新を定期的に実施する
ソフトウェア開発と同様に、インフラストラクチャ・アズ・コード(IaC)構成は、インフラストラクチャの展開を効率化するためにサードパーティのテンプレートやモジュールに依存することが多い。こうした依存関係は展開を簡素化する一方で、古くなったり侵害されたりすると潜在的な脆弱性をもたらす。
依存関係を継続的にスキャンすることで、既知のセキュリティ脆弱性がインフラに導入されるのを防ぎます。このタスク用に設計された専用ツールが、古くなったモジュールや脆弱なモジュールを自動的に検知し、必要に応じて更新を促します。これはソフトウェアと同様です。– ソフトウェアと同様です。パッチ管理と同様の仕組みですが、インフラモジュールに特化して適用されることで、最大限の保護と回復力を実現します。
4. 秘密の保護
デジタル環境では、秘密が暴露され、深刻な侵害につながるという警告的な事例が散見されます。IaCのプログラム的な性質は、プログラマーが機密情報をスクリプトに直接ハードコードする誘因となります。これは常に避けるべき無責任な慣行です。
組織は、HashiCorp VaultやAWS Secrets Managerなどの専用のシークレット管理ソリューションを採用し、シークレットを暗号化された状態で保護することで、IaCスクリプトへの直接埋め込みを避けるべきです。これにより、設定ファイルが公開されてもシークレットの保護が保証されます。
5. 構成の効率的な検証と評価
IaCスクリプトの機能性と安全性を確保することは、定期的な評価を必要とする継続的な取り組みです。構成が変更されたりIT環境が変化したりすると、新たな脆弱性が生じ、以前は機能していたスクリプトが動作しなくなったり、完全に破損したりする可能性があります。
組織は、この状況を回避するために、手動介入なしに定期的なチェックを行う自動テストツールを使用し、IaC構成が業界のベンチマークやベストプラクティスに常に準拠していることを確認する必要があります。本番環境に変更を展開する前に、ステージング環境やテスト環境を活用することは極めて重要です。これらは予期せぬ問題の早期発見に役立ち、本番環境において安全かつ稼働可能なインフラストラクチャを確保するのに貢献します。
IaCにおけるよくある落とし穴とその回避策
GitLab IaCスキャンのよくある落とし穴とその回避策?
- インフラコードを単発スクリプトとして扱う
- テストの軽視
- シークレットや認証情報のハードコーディング
- IaCスクリプトの過度な複雑化
- 廃止予定のツールやライブラリをバイパスする
1.インフラストラクチャコードを単発スクリプトとして扱う
インフラストラクチャコード(IaC)に関するよくある誤解の一つは、一度書いてほとんど見直さない単発スクリプトのように扱うことです。しかし、単発スクリプトとは異なり、IaCはソフトウェアコードと同様に定期的なメンテナンス更新や改訂が必要です。
防止策:GitLab IaC Scanningなどのツールを活用し、IaC構成を継続的にスキャンする定期的なコードレビューと更新を実施する。これによりコードは最新の状態を保ち、関連性を維持し、潜在的な脆弱性を排除できる。
2. テストの怠慢
迅速なデプロイを優先するあまり、IaCスクリプトの徹底的なテストを省略するチームが存在します。実行されればすべて問題ない」と考えるためです。これにより、プロビジョニングされたインフラストラクチャで予期せぬ動作やセキュリティ脆弱性が発生する可能性があります。この見落としは、予期せぬ動作を未然に防げないままにしたり、デプロイ時に即時パッチ適用を必要とするセキュリティホールを生じさせたりする恐れがあります。
防止策:アプリケーションコードと同様に、ステージング環境などの非本番環境でIaC構成をテストすることは、本番環境での設定ミスや潜在的な落とし穴を回避するために不可欠です。GitLab IaCスキャンは、本番環境へ直接影響を与える前に設定ミスを特定できる重要なサービスを提供します。
3.シークレットと認証情報のハードコーディング
ハードコーディングはIaCスクリプトにおける明らかな落とし穴となり得ます。データセキュリティ保護のため、常に回避すべきです。シークレットや認証情報をコード内に直接埋め込むハードコーディングは、軽視すべきでない重大なセキュリティ脅威をもたらす可能性があります。
防止策: スクリプトにシークレットを直接含める代わりに、専用のシークレット管理ツールを使用してください。GitLab IaCスキャンツールは、スキャンプロセスの一環としてこのような慣行を検出することができ、例えば設定ファイル内のハードコードされた認証情報について開発者に警告します。
4. IaCスクリプトの過度な複雑化
あらゆるシナリオを網羅する単一のソリューションを構築しようとするあまり、IaCスクリプトの記述が過度に複雑化するエンジニアがいます。これにより様々な状況を効率的にカバーできる反面、不要な複雑さや潜在的な障害点をIaCソリューションに生み出すことになります。
防止策:GitLab IaC Scanningを活用し、複雑な構成を管理可能なモジュールに分割することで、シンプルさと明瞭さを優先する。これらのモジュールを定期的にGitLab IaC Scanningで検査し、効果的・安全・機能的な状態を維持する。
5. 非推奨ツールやライブラリの回避
IaCはサードパーティ製ツールやライブラリに依存することが多いが、これらの外部リソースが開発される過程で特定の機能や機能が非推奨となる場合がある。古い手法を使用すると、機能面とセキュリティ面の両方で脆弱性が生じる可能性がある。
防止策: IaC構成が依存するサードパーティ製ツールやライブラリを常に監視し、更新版や推奨事項を反映してスクリプトを定期的に更新するとともに、GitLab IaC Scanningなどのスキャンツールを使用して、時代遅れの機能や依存関係を特定してください。
結論
GitLab IaCスキャンはセキュリティ上の脆弱性を検出でき、依存関係を管理します。誤検知を排除し、カスタムルールを設定し、監査証跡を維持できます。また、レポート作成が大幅に簡素化され、GitLab IaCスキャンをCI/CDパイプラインに容易に統合して最適な結果を得られます。GitLab IaCスキャナーでシークレットを保護し、バージョン管理と変更追跡を維持し、最小権限の原則を適用しましょう。これにより、インフラ管理を円滑に行うための構成を効率的に評価・管理できます。
GitLab IaC スキャンに関するよくある質問
GitLab IaCスキャンは、Terraform、CloudFormation、Ansible、Dockerfile、KubernetesマニフェストなどのInfrastructure as Codeファイルを、設定ミスや既知の脆弱性について検査する組み込みのCI/CD機能です。パイプラインのテスト段階で実行され、JSON形式のSASTレポートを生成し、マージリクエスト内で問題をハイライト表示します。これにより、デプロイ前にリスクのある設定を修正できます。
IaCスキャンは2021年6月にリリースされたGitLab 14.5で初登場しました。このバージョン以降、プロジェクト内のサポート対象のIaC構成ファイルは、.gitlab-ci.yml にIaCテンプレートを含めることで、CIパイプライン中に適切なKICSベースのアナライザーを自動的にトリガーします。
GitLabのIaCスキャンは、KICSによって駆動される幅広い設定ファイルをサポートしています:
- Ansibleプレイブック
- AWS CloudFormation (YAML/JSON)
- Azure Resource Manager (JSON)
- Dockerfiles
- Google Deployment Manager
- Kubernetes マニフェスト
- OpenAPI 定義
Terraform HCLBicepを使用する場合は、スキャン前にJSONにコンパイルしてください。また、カスタムレジストリのTerraformモジュールはまだスキャン対象外であることに注意してください。
GitLab のすべての IaC スキャニングアナライザーは、豊富なルールセットに対して IaC ファイルをチェックするオープンソースエンジンである KICS (Keep It Configuration Scanner) を基盤としています。KICSはサポートされているフォーマットを自動的に検出し、適切なチェックを適用します。CI変数やカスタムルールディレクトリを介して、ルールのカスタマイズ、無効化、またはバージョン固定が可能です。
IaCスキャンを有効にするには、プロジェクトの .gitlab-ci.yml の先頭に公式テンプレートを追加します:
次の行を追加します:
- template: Jobs/SAST-IaC.gitlab-ci.yml
これによりテストステージにiacsジョブが挿入されます。GitLab.com または共有ランナーを使用した自己管理環境では、追加のランナー設定は不要です。パイプライン実行後、スキャン結果はジョブアーティファクトとして、またマージリクエスト内および [Security & Compliance](https://docs.gitlab.com/ja/security/security-and-compliance) の下で確認できます。

