Skip to main content

Infrastructure as Codeにおけるセキュリティ上の懸念事項トップ5

著者

Raphael Mun

feature Cloud Compliance

2023年7月14日

0 分で読めます

Infrastructure as Code(IaC)は、クラウドインフラストラクチャのデプロイと管理の方法を変えました。大規模な運用チームがサーバーやネットワークを手動で設定する代わりに、コードでサービスアーキテクチャを定義できるようになりました。IaCを使えば、インフラストラクチャのデプロイを自動化し、サーバー群全体をスケールさせ、アーキテクチャの変更履歴を記録し、ネットワークへの段階的な変更をテストできます。チームや企業がクラウドサービスを構築・管理する主な方法としてIaCが定着したのも不思議ではありません。

しかし、IaCには多くのメリットがある一方で、セキュリティ上の懸念もあります。IaCにおけるセキュリティ上の懸念事項トップ5と、そのリスクを軽減するために実践できるベストプラクティスを見ていきましょう。

1. IaCテンプレートの設定ミス

IaCにおける大きなセキュリティ上の懸念の一つは、テンプレートの設定ミスです。IaCテンプレートのコードや依存関係にはバグが含まれることがあり、インフラストラクチャを意図せず危険にさらしたり、知識のある攻撃者にシステムを悪用する手段を与えたりする可能性があります。

たとえば、機密性の高いユーザーデータ(金融情報や個人を特定できる情報(PII)など)を含むデータベースのユーザー名とパスワードが、IaCテンプレートに誤ってハードコードされているとします。このテンプレートへの不正アクセスに成功した攻撃者は、データを閲覧し、データベースを操作できてしまいます。

同様に、重要なサーバーのIPアドレスがハードコードされたIaCテンプレートを想像してみてください。そのサーバーはサービス拒否(DoS)攻撃の標的となる可能性があり、迅速な対応やインフラストラクチャの更新が難しくなることもあります。認証情報や機密情報をテンプレートコードから分離するには、パラメーター化された入力機能や環境変数を使用することが不可欠です。

もう一つの例は、古くなった、または非推奨のIaCフレームワークやサードパーティ製依存関係の使用です。攻撃者は古いコードバージョンに新たな脆弱性を見つけ、これまで知られていなかった設定ミスを悪用する可能性があります。同じIaCテンプレートを複数の環境で共有している場合、1つの設定ミスが広範囲に影響するため、リスクはさらに高まります。コードを定期的に保守・更新し、サードパーティ製依存関係を慎重に精査して、確実に最新の状態に保つことが重要です。

IaCテンプレートをさらに安全にするには、堅牢なIaCコードの作成、関数での入力値とパラメーターの検証、テストフレームワークとバージョン管理によるコード変更の検証・追跡など、安全なコーディングプラクティスを取り入れ、エラーにすばやく対処できるようにします。また、デプロイ時と削除時にテンプレートが正しく機能することを確認し、サービスの削除漏れによる予期しないコストを防ぎましょう。

2. シークレットの安全でない保管と送信

シークレット管理も、IaCにおける重要なセキュリティ上の懸念です。パスワードやAPIキーが漏えいすると、リスクにつながります。悪意のある攻撃者は、Webhook URLやIPアドレスなどの機密情報を使ってスパムを送信したり、リソースを使用不能にしたりして、サービスやネットワークを停止させる可能性があります。

IaCテンプレートへの読み取り専用アクセスであっても、攻撃者はインフラストラクチャについて有益な情報を得て、潜在的な設定ミスを見つけることができます。その結果、標的型攻撃の計画や実行が容易になります。

幸い、IaCフレームワークやクラウドプラットフォームを使えば、こうしたシークレットを安全に保管・利用できます。たとえば、Terraform Cloudにはシークレット管理機能があり、機密性の高い値を適切に暗号化して保管できます。また、多くのクラウドサービスではアクセスキーやデータベース接続文字列などのシークレットが環境変数として自動的に提供されるため、ローカル開発時に独自の値で上書きできます。

3. アクセス制御ポリシーの設定ミスと構成ドリフト

Webアプリケーションセキュリティに関する世界的に認知された文書であるOWASP Top 10では、アクセス制御の不備とクラウドの設定ミスが重大な懸念事項として挙げられています。

ハッカーは、サーバーやクラウドデータストレージなどのリソースに対する過度に許容的なアクセス制御ポリシーを悪用して、攻撃を実行したり、非公開情報を取得したりできます。AWS S3バケットの設定ミスは、認証情報、PII、クレジットカード情報などの機密データ漏えいの原因となってきました。

攻撃者は、ネットワークポートの開放、レート制限の未設定、転送中または保存中のデータの暗号化漏れなどを悪用できます。こうした設定ミスを利用し、不正アクセスや機密データの窃取、サービスの妨害を行う可能性があります。

構成ドリフトによって、設定の問題が時間の経過とともに目立たない形で生じることもあります。構成ドリフトとは、インフラストラクチャの変更が記録されていない、または適切に管理されていない状態です。たとえば、変更を記録せずにシステムパッチを適用したり、問題の調査でエンジニアがログインして手動で変更を加え、その変更を元に戻し忘れたりすることがあります。こうした行為により、IaCテンプレートでは把握できない潜在的なリスクの特定や対処が難しくなり、システムが脅威にさらされるおそれがあります。

IaCテンプレートは自動化とバージョン管理によってこうしたリスクの一部を軽減できますが、すべてを解決できるわけではありません。IaCテンプレートのデプロイに長時間待たされた末、権限エラーで失敗したと分かれば、解決のためにフルアクセス権限のポリシーを使いたくなるかもしれません。しかし、この近道は本来なら防げる設定ミスを招きます。

適切なアクセス制御を徹底するには、常に最小権限の原則(PoLP)に従い、権限を可能な限り制限しましょう。厳密に定義された制御ポリシー、自動ローテーションされるキー、一時的なアクセスロールを活用し、必要な場合にのみアクセスを許可します。

Snyk Infrastructure as CodeやSnyk Containerなどのセキュリティ監査ツールは、インフラストラクチャのスキャンと監視にも役立ちます。プロセスを自動化することで、安全な構成とアクセス制御ポリシーを簡単に維持できます。

4. 安全でないステートファイル

ほとんどのIaCフレームワークは、デプロイ済みインフラストラクチャの現在の状態を記録するためにステートファイルを生成します。そのため、ファイルを安全に保ち、クラウドの実際の状態と同期させることが重要です。プレーンテキストのステートファイルには、クラウドリソースのセキュリティに関する詳細情報が含まれることがあります。こうした情報を保護するには、ステートファイルを暗号化し、アクセスを制御する必要があります。

このステートファイルを失うと、IaCテンプレートやコードでデプロイしたインフラストラクチャの状態を記録したものがなくなります。将来のIaC管理に影響しないようにするには、既存のクラウドリソースを永続的なステートファイルに手動でインポートし直さなければなりません。

IaCを自動化されたCI/CDパイプラインで管理している場合、ステートファイルの紛失によってリソースが削除または作成され、システムのダウンタイムやデータ損失につながる可能性があります。同様に、破損したステートファイルや同期が取れていないステートファイルは、手作業でリソースを対応付け、状態を復元しようとすると、すぐに複雑になりかねません。

次のような簡単な対策を講じることで、こうした事態を防げます。

  • 共有やバックアップが容易になるよう、ステートファイルをクラウド上にリモート保存する。

  • ファイルが破損した場合に復元できるよう、バージョン管理を有効にする。

  • 一度にステートファイルをデプロイ・変更できるユーザーを1人に制限するため、ファイルロック機構を利用する。

  • 攻撃者がファイルにアクセスしても解読できないよう、保存時に暗号化する。

  • ステートファイルへのユーザーアクセスを制限し、チームだけがアクセスできるようにします。シークレットを安全に保管し、IaCテンプレートに含めないようにしていても、ステートファイルにはシークレットがプレーンテキストで含まれる場合があります。シークレットの漏えいを防ぐため、ファイルを暗号化し、アクセスを制限することが不可欠です。

5. テストと検証の不足

十分にテスト・検証されていないIaCテンプレートは、安全でないデプロイや設定ミスにつながり、攻撃者にインフラストラクチャを侵害される可能性があります。

IaCの開発ワークフローにテストと検証を組み込むことで、プロセスの早い段階でリスクを特定、軽減し、最小限に抑え、インフラストラクチャを先回りして保護できます。

IaCのテストと検証では、次の点を確認しましょう。

  • IaCテンプレートは正常にデプロイされましたか?

  • アクセス制御と構成はコードと一致していますか?

  • リソースは正しく対応付けられ、参照されていますか?

  • サーバーのアクティビティは適切に監視・記録されていますか?

  • インフラストラクチャは必要なトラフィック負荷に対応できますか?

IaCのテストと検証に関するベストプラクティスは、一般的なコードと同じ原則に基づいています。チーム内にコードレビューのプロセスを導入しましょう。本番環境へのデプロイ前に、ステージング環境でコードをテストします。リンティングツールで構文や書式のエラーを検出し、リソース名や識別子の確認などの単体テストを作成しましょう。Pulumiなどのツールで記述した高レベルのIaCコードを、自動化された静的アプリケーションセキュリティテスト(SAST)ツールでスキャンします。たとえばSnyk Codeを活用できます。

IaCを安全に開発、テスト、検証する最善の方法は、開発プロセスにセキュリティを組み込むことです。その方法の一つが、IaCのテストと検証を強化する専用ツールSnyk Infrastructure as Codeの活用です。開発ツールやワークフローにシームレスに統合できるため、リアルタイムかつ継続的に安全なIaC開発を実現できます。

Snyk Infrastructure as Codeはコードをスキャンし、潜在的な設定ミスやポリシー違反を検出して、見つかった問題に対処するための実践的な分析情報とアドバイスを提供します。この情報を活用すれば、IaC全体のセキュリティ態勢を強化し、コンプライアンスを確保できます。

まとめ

この記事では、IaCを使用する際の5つのセキュリティ上の懸念事項を取り上げました。また、最小権限の原則に従うこと、安全なコーディングプラクティスを実践すること、セキュリティツールをプロセスに組み込むことなど、対処方法も紹介しました。

IaCの安全性を保つためにベストプラクティスを実践する重要性は、どれだけ強調してもしすぎることはありません。特に、安全でないIaCがもたらす影響を考えればなおさらです。ハードコードされた認証情報、適切に管理されていないシークレット、構成ドリフトなどの問題を放置すると、IaCのメリットが損なわれ、データ侵害や不正アクセス、重要なサービスの中断につながるおそれがあります。

IaCの開発プロセスにセキュリティを先回りして組み込み、ベストプラクティスを適用することで、リスクを効果的に軽減し、インフラストラクチャを保護するとともに、自社と顧客を守ることができます。

ソースコードの段階からインフラを保護

Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。