In this article
コンテナセキュリティを始めるために知っておきたいことすべて
開発者のためのコンテナセキュリティ
ここ数年で、コンテナの利用は飛躍的に拡大しました。コンテナ技術自体は数十年前から存在していましたが、2013年のDockerの登場により、組織がコンテナファーストの開発・運用モデルを導入しやすくなりました。
その成長に伴い、セキュリティリスクも増大しています。選択肢となるイメージが何百万もある中、コンテナのセキュリティ対策は専門的な取り組みとなっています。コンテナには、次のような複数のセキュリティレイヤーがあります。
コンテナイメージとその中のソフトウェア
コンテナ、ホストOS、ホスト上の他のコンテナ間の相互作用
ホストOS
コンテナのネットワークとストレージリポジトリ
多くの場合、Kubernetesクラスター上にあるランタイム環境
各レイヤーにはそれぞれ個別のガイドが必要なため、ここでは最初の要素であるイメージとコードに焦点を当てます。1つのコンテナイメージに何百、何千もの脆弱性が含まれている場合があり、組織はセキュリティインシデント(侵害など)や生産性の低下にさらされる可能性があります。利用するイメージが増えるにつれ、脆弱性のトリアージや評価にかかる時間も増加します。
コンテナセキュリティとは?
従来、アプリケーションセキュリティは専任のセキュリティチームが担っていました。しかし、コンテナの定義やビルドの方法が変化したことで、その責任は開発者やDevSecOpsチームにますます委ねられるようになっています。
この責任の変化に加え、コンテナを迅速に更新・デプロイできるようになったことで、実用的なセキュリティ手法が求められています。CIでコンテナをスキャンし、イメージのベストプラクティスに従うだけでは不十分です。スキャンで何百もの脆弱性が見つかった場合にも対処できる必要があります。
コンテナセキュリティとは?
コンテナセキュリティとは、コンテナベースのシステムやワークロードを強固に保護するためのセキュリティツールとプロセスを導入することです。対象には、コンテナイメージや実行中のコンテナに加え、イメージの作成から実行環境へのデプロイまでに必要なすべての工程が含まれます。
以前、Dockerのコンテナセキュリティに関するガイドを公開しました。実践的な手順については、コンテナイメージを保護する3つの実践的なステップをご覧ください。この記事では、組織がより安全なコンテナイメージや実行中のコンテナを構築するために活用しているDevSecOpsの実践方法を概説し、開発からランタイムまで包括的にコンテナを保護するSnyk Container、Snyk IaC、そしてSysdigとのパートナーシップなどの技術ツールをご紹介します。
コンテナセキュリティが重要な理由
コンテナイメージには、最終的にアプリケーションを実行するすべてのコンポーネントが含まれているため、コンテナセキュリティは重要です。コンテナイメージに潜在的な脆弱性があると、本番環境でセキュリティ問題が発生するリスクと、その深刻度が高まります。そのため、本番環境も監視する必要があります。脆弱性や過剰な権限のないイメージを作成できたとしても、ランタイムで何が起きているかを監視することが大切です。
さまざまなエコシステムにおけるコンテナセキュリティの概要
Dockerコンテナのセキュリティ
数千万人のユーザーと数千億回に及ぶイメージのプルが示すように、Dockerの膨大なユーザーベースは、コンテナ化がアプリケーションの構築方法を変えていることを物語っています。セキュリティの責任は、ますます開発者に移っています。Docker Hubなどのレジストリにイメージをプッシュする前に、Dockerイメージをスキャンして、Linuxパッケージ、ユーザー権限、ネットワーク設定、オープンソースツール、アクセス管理に関する脆弱性を見つけ、修正することが重要です。こうしたスキャンにより、リリース前にアプリケーションやインフラの脆弱性を発見し、対処できます。
Kubernetesコンテナのセキュリティ
Kubernetesには、クラスター、ワークロード、コンテナをより安全にするための多様なセキュリティ制御機能があります。ただし、Kubernetesをデプロイした時点ではセキュリティ制御は設定されていないため、手動で設定する必要があります。また、安全なクラスターの構築に役立つ制御機能や機能が用意されているものの、デフォルトのセキュリティ設定だけでは不十分なことがよくあります。ワークロードを安全にデプロイするには、Kubernetesに関する専門知識が必要です。詳しくは、Kubernetesセキュリティのベストプラクティスをご覧ください。
GKEコンテナのセキュリティ
Google Kubernetes Engine(GKE)には、ワークロードを保護するためのツールが多数用意されています。アクセス制御やワークロードなどのセキュリティ機能を設定し、多層的にGKEを保護することをおすすめします。GKEには、基盤インフラを自分で管理するスタンダードモードと、GKEがインフラをプロビジョニングして管理するオートパイロットモードがあります。Snyk ContainerのKubernetesインテグレーションを使えば、スタンダードモードとオートパイロットモードのどちらでもGKE上のワークロードを保護し、コンテナイメージとアプリケーションコードの脆弱性を発見できます。また、Kubernetesの設定をスキャンして問題を検出できます。
AKSコンテナのセキュリティ
Microsoft Azure Kubernetes Service(AKS)にはGKEと同様、Azure Policyとの統合や継続的な迅速なアップデート/パッチ適用など、堅牢なセキュリティ機能が備わっています。ただし、クラスターのコンポーネントを新しいバージョンにアップグレードするには、半手動のプロセスが必要です。また、クラスターの作成時にネットワークポリシーを有効にする必要があります。GKEと同様に、SnykでKubernetesの設定やコンテナをスキャンし、AKSリソースのデプロイ時に自動監視を有効にできます。
EKSコンテナのセキュリティ
Amazon Elastic Kubernetes Service(Amazon EKS)には、デフォルトで充実したセキュリティ機能が備わっており、コンテナセキュリティの各要素に対する責任の所在を定めたAWSの共有責任モデルに基づいて運用されます。通常、AWSはクラウド「の」セキュリティを担い、お客様はクラウド「内」のセキュリティを担います。上記の他のKubernetesサービスと同様に、SnykはAmazon EKSおよびAmazon Elastic Container Registry(Amazon ECR)と簡単に連携し、Kubernetesの設定やコンテナをスキャンできます。また、Amazon EKSへのデプロイ時に自動監視を有効にできます。
Snyk Containerによるコンテナの保護
世の中には何百万ものコンテナ脆弱性が存在しており、脆弱性の発見、優先順位付け、修正は開発者にとって大きな負担になりかねません。Snyk Containerは、一般的な脆弱性レポートのノイズを取り除き、アプリケーションとコンテナの脆弱性をまとめて検出・修正します。コンテナ内で実行されている元のソースコードにアクセスできない場合でも対応できます。
Snyk Containerは新たな脆弱性を継続的にスキャンし、コンテキストや悪用可能性に基づいて修正の優先順位を付け、オープンソースの依存関係にある問題を検出します。また、脆弱性とDockerfileのコマンドを関連付け、開発者が修正を取り込みやすくします。2021年には、Snyk Containerを使って1億3,000万件を超えるコンテナテストが実施され、ユーザーは5,600万件の脆弱性を修正しました。
コンテナの設定を保護するSnyk Infrastructure as Codeと連携するSnyk Containerは、AKSやGKEなどのKubernetesプラットフォーム、Docker Hub、GCR、Quayなどのコンテナレジストリ、Amazon LinuxやUbuntuなどのコンテナベースOSと統合できます。さらに、その他多数に対応しています。統合された脆弱性スキャンにより、開発者は適切で最小限のベースイメージを特定して利用でき、更新プロセスを自動化して脆弱性をすばやく排除できます。
Snykプラットフォームの他の製品と同様、Snyk Containerも開発者ファーストのアプローチで構築されており、DevSecOps文化を支援します。IDEに統合してマージ前にプルリクエストをスキャンし、修正方法を案内するとともに、CI/CDパイプラインに自動テストを適用できます。コンテナの実行後は、既知の脆弱性や新たに公開された脆弱性への露出を継続的に監視します。アラートはSlack、Jira、メールなどで送信され、DevSecOpsチームが脆弱性を迅速に特定して修正できるよう支援します。
SnykとSysdigのパートナーシップが実現するコンテナランタイムセキュリティ
Snyk Containerによる早期のイメージフィードバックで、脆弱性の70%以上を取り除ける可能性があります。しかし、ランタイムの脆弱性のうち最大30%は見逃される可能性があります。こうした脆弱性は、何千ものコンテナや多数のクラスターで何百件にも及ぶことがあります。見つけて修正するのは容易ではありません。実行中のコンテナでどのパッケージが使われているか、また、ランタイムで実行されているパッケージにどの脆弱性が影響するかを判断するのは困難です。稼働中の環境を管理するセキュリティチームや運用チームは、脆弱性を発見した後、開発チームに修正を依頼しなければなりません。また、開発者にはシステムの専門知識が不足しているため、従来型の脆弱性ツールでは問題の発見と修正に何か月もかかることがあります。
SnykはSysdigとパートナーシップを結び、ランタイム環境に影響している問題に関するコンテキストを提供することで、ランタイム環境の問題解決を支援しています。このパートナーシップにより、DevOpsプロセス全体をカバーするセキュリティソリューションが実現します。SnykとSysdigのプラットフォームを組み合わせることで、開発環境のコードからクラスターを実行するインフラまで、すべてを保護できます。
SnykとSysdigのパートナーシップがコンテナセキュリティをランタイム環境にまで拡張する方法については、こちらのお知らせ記事をご覧ください。
コンテナセキュリティのまとめ
コンテナセキュリティは幅広いテーマであり、ベースイメージのセキュリティに範囲を絞っても、考慮すべき課題は数多くあります。イメージを保護するうえで、押さえておきたいポイントをいくつかご紹介します。
信頼できるプロバイダーのベースイメージから始め、デジタル署名で真正性を確認しましょう。
基本的なOSパッケージと選択したフレームワークだけを含む最小限のベースイメージを選び、そこから必要なものを追加しましょう。
イメージの脆弱性を早期かつ定期的にチェックしましょう。
デスクトップ、CI、レジストリに保存されたイメージ、クラスターで実行中のコンテナなど、ソフトウェアライフサイクル全体を通じてスキャンしましょう。
基本的な表計算形式の脆弱性レポートにとどまらず、緩和策のアドバイスやベースイメージの推奨、問題修正に役立つ開発者向け情報を提供し、必要に応じてセキュリティゲートを設定できる柔軟なスキャンツールを選びましょう。
ライフサイクル全体を通じてコンテナイメージを保護したい場合、Snyk Containerは開発者ファーストの方法でコンテナセキュリティを自動化します。セキュリティと生産性の適切なバランスを実現し、より安全なイメージと実行中のコンテナを構築できるよう支援します。
コンテナセキュリティ用語集
コンテナスキャン:コンテナイメージ内のパッケージや依存関係をスキャンして、コンテナ内の脆弱性を見つけるプロセス
コンテナ監視:コンテナ化されたアプリケーションやアーキテクチャのメトリクスを収集し、状態を追跡すること
Kubernetes:クラスター全体でコンテナ化されたアプリケーションをオーケストレーションするために、Googleが開発したオープンソースシステム。
K8s:Kubernetesの略称。
Docker:世界で最も広く使われているコンテナプラットフォーム。Dockerは、コンテナの作成と実行に関するツールやプロセスを誰もが利用できるようにし、開発者がこれらの技術を簡単に使えるようにしました。
Dockerfile:Dockerイメージのビルドに必要な設定を記述したテキストファイル。
Google Kubernetes Engine(GKE):Google Cloud上でKubernetesワークロードを実行するための、Googleが提供するマネージドサービス。
AKS:Microsoft AzureのマネージドKubernetesサービス。もともとはAzure Container Serviceという汎用サービスでしたが、Kubernetesが主要なコンテナオーケストレーションプラットフォームになると、AKSへと進化しました。
AWS EKS:AWS上でKubernetesワークロードを実行するための、Amazon Web ServicesのマネージドKubernetesサービス。AWS EKSは単独で利用することも、AWS Fargateなどの他のサービスと組み合わせて利用することもできます。AWS Fargateを使うとKubernetesインフラがほぼ隠蔽されるため、ユーザーは自身のKubernetesポッドに専念できます。
コンテナイメージ:実行中のコンテナを作成するための一連の手順を含む静的ファイル
コンテナレジストリ:コンテナイメージを簡単に保存・共有できる、コンテナイメージのリポジトリ兼管理ツール。
コンテナランタイム:ホストOS上でコンテナを作成、実行、管理するソフトウェア。
シフトレフト:開発者のワークフローにセキュリティを組み込む文化とツール群
DevSecOps:Development(開発)、Security(セキュリティ)、Operations(運用)を組み合わせた言葉で、ソフトウェアのデリバリーライフサイクルにおけるセキュリティを自動化するアプローチです。
コンテナセキュリティに関するよくある質問
コンテナは安全ですか?
安全にできますが、デフォルトで安全とは限りません。従来のインフラで使われていたプロセスやツールでは、コンテナを十分に保護できない場合があります。コンテナによって分散システムのあり方が変わったため、コンテナを保護するには新たな手法が必要です。コンテナ化されたワークロードを可能な限り強固に保護するために、幅広いコンテナセキュリティソリューションを活用できます。また、活用すべきです。
コンテナのセキュリティ脆弱性を修正するにはどうすればよいですか?
コンテナのセキュリティ脆弱性は、4つのステップで修正できます。まず、コードと依存関係にある脆弱性に対処します。次に、必要最小限のベースイメージを選びましょう。最小構成から始め、必要に応じて追加します。続いて、追加するツールやパッケージを評価します。コンテナを本番環境に近づけるにつれて、追加要素はゼロにするのが理想です。最後に、コンテナが可能な限り少ない権限で実行されるよう設定します。
Dockerコンテナイメージを保護するには?
Dockerコンテナイメージを保護するには、rootとして実行するなどのセキュリティ上のアンチパターンを採用しなくても正常に動作するよう、対策を講じる必要があります。Dockerのドキュメントは、特に信頼性に関する内容から始めるのに最適です。プライベートレジストリでも信頼性を管理できます。ベースイメージに含まれるパッケージと依存関係を最小限に抑え、スキャンツールで脆弱性を監視することで、Dockerイメージの保護をさらに強化できます。
コンテナスキャンとは何ですか?
コンテナスキャンとは、コンテナをスキャンして潜在的なセキュリティ侵害を検出するツールやプロセスのことです。コンテナ化されたパッケージを保護するための基本的なステップです。スキャンツールでは、コード、推移的依存関係、コンテナの設定、コンテナのランタイム設定などをスキャンできます。