In this article
DevSecOps時代のInfrastructure as Code
この記事では、Infrastructure as Code(IaC)とは何か、そして実環境でIaCを使用する際のセキュリティ上の影響について解説します。
Infrastructure as Codeとは?
Infrastructure as Code(IaC)とは、AWS、GCP、Azureなどのパブリッククラウド上のリソースを、インフラのリソース構成をどのように、どこにデプロイするかを記述した編集可能なテキストファイル群を通じて、プロビジョニングおよび管理するプロセスです。
これらの入力スクリプトはInfrastructure as Codeツールに読み込まれ、IaCファイルで定義された状態にクラウドインフラを準拠させるため、リソースの作成、更新、削除が自動的に行われます。IaCツールは、クラウドインフラのリソース間にある暗黙的および明示的な依存関係を管理するよう設計されています。そのため、リソースの作成、維持、削除を論理的に実行し、リソース間の依存関係を考慮できます。
Infrastructure as Code(IaC)が登場する以前は、リソースは通常、手作業か、せいぜいシェルスクリプトやPythonなどの簡単なスクリプトでプロビジョニングされていました。構成管理ツールは、稼働中のインスタンスを設定するうえでは非常に効率的でしたが、そもそもインスタンスを作成する機能には課題がありました。
IaCは、リソースのプロビジョニングを自動化することでこの課題を解消し、スノーフレークサーバーからの脱却を促しました。望ましい状態を定義する高水準の宣言型言語と、その宣言を自動的に実装するIaCツールの登場は、業界にとって大きな前進でした。
Infrastructure as Code(IaC)には、次のような多くのメリットがあります。
スピードと標準化:望ましい状態をスクリプトに記述することで、完全な再現性を実現できます。
バージョン管理:スクリプトをGitに保存できるため、アプリケーションコードと同様に、インフラの変更履歴を管理できます。
ドキュメント化:スクリプトをドキュメントとして活用し、信頼できる唯一の情報源にできます。
効率性:継続的デプロイの対象を、リソース自体のプロビジョニングと管理にまで広げられます。
主要な3つのパブリッククラウドプロバイダーは、それぞれ自社のプラットフォーム専用のIaCソリューションを提供しています。
Amazon Web ServicesはAWS CloudFormationを提供しています。
Microsoft AzureのプラットフォームはAzure Resource Managerです。
Google Cloud PlatformではGoogle Cloud Deployment Managerを使用します。
Terraformは、クラウドに依存しないIaCソフトウェアとして最も広く利用されており、多くのクラウドベンダーに対応している点が特長です。実際、DigitalOceanやRackspaceなどの小規模なクラウドプロバイダーは、自社開発のIaC製品ではなくTerraformを利用する傾向があります。
Puppet、Chef、Ansibleなどの構成管理ソフトウェアベンダーも、機能の拡張に取り組んでおり、現在ではパブリッククラウド上のリソースの作成、更新、削除をある程度サポートしています。ただし、これらはIaCとして一から設計されたものではありません。
IaCセキュリティとは?
Infrastructure as Code(IaC)セキュリティとは、IaCファイルとクラウドへのデプロイをスキャンし、コード化されたルールセットへの準拠を確認することで、クラウド、インフラ、アプリケーションの構成を保護する取り組みです。
IaCセキュリティによって、設定ミスが本番のクラウド環境に入り込むのを防ぎ、データ侵害、ダウンタイム、デプロイ失敗のリスクを低減できます。セキュリティ原則に従わないIaCスクリプトは、機密データをさらす保護されていないストレージバケットや、誤ってパブリックアクセス可能になり、ハッカーの攻撃経路となるインスタンスなど、深刻な結果を招く可能性があります。
IaCセキュリティのベストプラクティスには、最小権限の原則、リソースと関連する依存関係をプライベートサブネット内で保護するためのネットワークセグメンテーション、そして転送中および保存中のデータの暗号化などがあります。
最小権限の原則は、構成が不適切なリソースや悪意を持って変更されたスクリプトによる被害を抑えるうえで重要です。Infrastructure as Code(IaC)では、次の3つのレベルに適用されます。
スクリプトの実行を許可するユーザーと許可しないユーザーを定義する。
許可されたユーザーの権限を制限する**IaC**ユーザーがタスクの遂行に必要な範囲に限定します。
IaCスクリプトでは、作成する各リソースに付与する権限を、処理の実行に必要な範囲に制限する必要があります。
その他のIaCセキュリティの多くは、スクリプト自体が作成するリソースに関するものです。たとえば、適切にセグメント化されたネットワークアーキテクチャは、内部または外部からの攻撃による被害を抑えられます。Infrastructure as Code(IaC)スクリプトに「encrypt = true」の行を追加すれば保存データを保護でき、AWS Certificate Managerなどのマネージドサービスを呼び出せば転送中のデータを保護できます。また、Webアプリケーションファイアウォールなど、DDoSや一般的なHTTP攻撃に対する標準的な保護対策も導入しましょう。
DevSecOpsにおけるIaCとは?
Infrastructure as Codeの文脈におけるDevOpsとは、開発者とDevOpsエンジニアが緊密に連携し、継続的デプロイの一環としてIaCを活用することです。「DevSecOps」とも呼ばれる「シフトレフトアプローチ」は、DevOpsにセキュリティを組み込むことを指します。IaCにおけるDevSecOpsでは、プロジェクトの開始時点からセキュリティを組み込み、常にセキュリティを徹底します。また、ワークロードに適したツールを使い、セキュリティを自動化すること(「セキュリティ・アズ・コード」と呼ばれる場合もあります)も意味します。

DevSecOpsの導入:CI/CDパイプラインへのセキュリティの統合
DevSecOpsは、テクノロジーだけでなく、組織文化(特に、多様なチーム間で情報を自由に共有すること)も重視します。文化とテクノロジーが融合するDevOpsの世界におけるDevSecOpsは、あらゆるレベルでの自動化を推進します。IaCはデプロイ全体の自動化を目指すため、DevOpsの重要な要素です。IaCにおけるDevSecOpsとは、セキュリティのベストプラクティスを自動化し、ワークロードに適したツールを使ってセキュリティを強化することです。
Infrastructure as Code向けセキュリティツール
実際のところ、DevSecOpsのInfrastructure as Codeレベルでセキュリティのベストプラクティスを適用するために、特別に設計されたセキュリティツールはほとんどありません。DataDog、Splunk、Jaegerなどのサードパーティ製セキュリティツールは、IaCスクリプトの外部で利用できます。また、IaCスクリプトから有効化できるクラウドネイティブのセキュリティサービス(Amazon GuardDuty、Amazon Macie、Amazon Inspectorなど)もあります。
一方、Snyk IaC Securityは、開発者とセキュリティチームの両方を念頭に置いて設計された数少ないツールの1つで、Terraform、Kubernetes、CloudFormation、Azure Resource Manager(ARM)などを保護します。

Snyk IaCは、開発者のワークフローにシームレスに統合し、コードからクラウドまでIaCセキュリティのベストプラクティスポリシーを徹底することで、インフラのライフサイクル全体を通じて構成を保護します。
セキュリティのベストプラクティスとコンプライアンスを確立:業界のベストプラクティス、CISベンチマーク、Snykセキュリティによる脅威モデリングを基に、進化し続ける組み込みルールセットを提供します。セキュリティを組み込み、コードレビューをスムーズに進めましょう。
開発者が使い慣れたワークフローを維持:CLIを使ったローカルでのテストに加え、IDE、ソースコード管理(GitHub、GitLabなど)、Terraform Cloudとのインテグレーションを通じて、IaCの設定ミスを継続的にテストします。開発者の導入を促進し、ダウンタイムや作業の妨げを最小限に抑えます。
リスクの高い問題をより迅速に修正:問題の深刻度と影響を示し、構造化された修正ガイダンスをコード内に表示することで、開発者は問題をすばやく修正し、安全な構成を常に維持できます。
固有のシナリオに合わせて保護:Open Policy Agentの高水準言語Regoでカスタムルールを作成またはインポートし、定義済みルールの深刻度設定を調整できます。
インフラのライフサイクル全体を通じて保護:稼働中のクラウド環境におけるインフラのドリフトや未管理リソースの問題を検出します。リソースの状況を含めて問題をエンジニアに直接報告することで、迅速な修正を促し、未管理リソースを制御下に置きます。
Snyk Infrastructure as CodeはSnykプラットフォームの中核をなす製品です。Infrastructure as Codeに加え、オープンソース、コンテナ、Kubernetesを含むクラウドネイティブアプリケーションスタック全体で、セキュリティのベストプラクティスを組み込み、徹底します。
まとめ
Infrastructure as Codeはオーケストレーションレイヤーの最上位に位置するため、セキュリティの管理と維持が容易になります。IaCで有効化できるソリューションは数多くありますが、IaCレベルでセキュリティのベストプラクティスを適用できるものはごくわずかです。適切なツールを見つけることに加え、チーム間の連携を促すスタッフのトレーニングと教育も重要です。Terraform、Kubernetes、CloudFormation、Azure Resource Manager(ARM)などを使用する際は、IaCコードにセキュリティのベストプラクティスを適用しましょう。無料登録して、Snykでプロジェクトを保護しましょう。