Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、2019年7月19日にSysdigのDale Rodriguezが投稿したブログ(https://sysdig.com/blog/gitlab-ci-cd-image-scanning/)を元に日本語に翻訳・再構成した内容となっております。
このブログでは、Sysdig Secureを使用してGitlab CI / CDプラットフォームでDockerイメージスキャンを実行する方法について説明します。Sysdig Secure内で定義しているセキュリティポリシーを満たしていないコンテナのイメージが本番Dockerレジストリにプッシュされる前に、ビルドパイプラインをストップ、ブレイキングします。
Gitlab CI/CDは、Gitlabソフトウェア開発およびコラボレーションプラットフォームと統合されたオープンソースの継続的な統合およびデリバリーサーバーです。
リポジトリ用にGitlab CI/CDを構成すると、デベロッパーがトラックされたリポジトリブランチにコミットをプッシュするたびに、パイプラインスクリプトが自動的にトリガーされます。
これらのパイプラインを使用して、多くのプロセスを自動化できます。 一般的なタスクには、QAテスト、ソフトウェア配布アーティファクト(DockerイメージやLinuxパッケージなど)の構築、またはこの記事の場合のようにセキュリティポリシーへの準拠の確認が含まれます。
ITのほとんどのものと同様に、コンテナのセキュリティ問題を早期に検出するほど、それ以上の影響なしに問題を簡単に修正できます。
ビルドパイプラインにコンテナセキュリティを組み込むことは、いくつかの理由からベストプラクティスです。
Sysdig Secureは、ランタイムの脅威検出、フォレンジック、コンプライアンス、監査などの多くのコンテナセキュリティ機能の中でも特に、フル機能のコンテナイメージスキャンサービスを提供しています。 Sysdig SecureイメージスキャンサービスをGitlabと連携させる方法を見てみましょう。
Dockerコンテナの構築に必要なすべてのファイルを含むGitlabリポジトリがあります。 新しいコミットがあるたびに新しいコンテナイメージを自動的に構築するパイプラインが必要であり、組織で実施されているセキュリティポリシーに従ってそのイメージを自動的にスキャンすることも必要です。
このブログ記事の手順を再現するには、次のものが必要です。
実際の例を用いて、これら2つのプラットフォームを非常に簡単なプロセスで統合する方法を示します。これにより、Sysdig Secure Imageスキャニングを数分で実行できるようになります。
Gitlab CI/CDパイプラインは、Sysdig Secureバックエンドと通信するためにアクセス認証情報を必要とします。これを実現するには、Sysdig UI設定 -> User profileからAPIアクセストークンをコピーします
次に、Gitlabプロジェクトの新しいグローバル変数を構成します。
同様に、Gitlabレジストリ認証情報をSysdig Secureに追加して、イメージをフェッチおよびスキャンできるようにする必要があります。 Sysdig Secure UIからScanning->Registry credentials->レジストリを追加し、Gitlabアカウント認証情報を入力します。
最初に、ビルドするイメージを定義するDockerfileが必要になります。 任意のDockerfileをプロジェクトにアップロードするか、単純な例を書くこともできます。
FROM python:stretch CMD python -c "print('Hello, I\'m a Docker container!')"
次に、プロジェクトルートに新しい.gitlab-ci.ymlファイルを作成する必要があります。このファイルは、環境に必要なすべてのビルドステップ(ステージ)を含むマスタービルドファイルとして機能します。 このファイルを使用すると、ビルドに必要な数のステージを作成できます。
ここからこのブログに使用したGitlab CI / CDファイルをダウンロードできます。
このパイプラインには3つの段階があります。
ファイルの最初のセクションを以下に挙げます。 プロジェクト名に基づいてスキャンするイメージの変数を設定し、ビルドステージを設定します:
次に、個々のステージを見ていきます。
ビルドステージには、プロジェクトからdockerイメージをビルドしてプッシュするために必要なコマンドと機能が含まれています。
次の段階は、コンテナスキャンステージです。 このステージでは、イメージの脆弱性をスキャンし、スキャンのレポート(成果物)を生成します。 これらの脆弱性レポートは、成功したか失敗したかに関係なく、ビルドの実行後に成果物として利用できます。
変数を確認してください。
ANCHORE_FAIL_ON_POLICY: "true"
trueに設定すると、イメージ内にポリシーで設定された停止条件(たとえば、重大な脆弱性)が含まれている場合、Sysdig Secureはこのステージのエラーコードを返します。 したがって、パイプラインを停止し、次のタスクが実行されないようにします。
脆弱なイメージを最終のリポジトリにプッシュしないように、デフォルトでtrueに設定されています。
container_scanステージが成功した結果は次のとおりです。
以下は同じイメージスキャンですが、結果としては失敗しています。
container_scanが失敗または成功すると、成果物(レポート)はcontainer_scanステージで表示可能になります。 イメージにデータが含まれていない(つまり、Javaパッケージがないなど)ため、一部のレポートが空になる場合があります。
Reports:
image-details.json - Details about Image scanned image-gem.json - Details about ruby gems in scanned image image-java.json - Details about java packages in scanned image image-npm.json - Details about npm packages in scanned image image-packages.json - List of packages contained in image image-policy.json - Sysdig Secure Policy image used for image evaluation image-python.json - List of python packages contained in image image-vulnerabilties.json - List of vulnerabilities contained in image
脆弱性スキャンが成功すると、ビルドパイプラインのこの段階でレジストリにイメージがアップロードされます。
成功したプッシュの例を次に示します。
GitlabのネイティブDocker互換性とSysdig SecureコンテナーイメージスキャンAPIのおかげで、両者を連携させるのは簡単です。
ソフトウェアの脆弱性を見つけ、コンテナセキュリティのベストプラクティス、Dockerfileの内容、ホワイトリストまたはブラックリスト固有のパッケージ、Java JAR/WARファイルのように手動でインストールされたサードパーティライブラリ、またはSysdig Secureのソフトウェアライセンスでもnpm、pip、gemなどのパッケージマネージャーを確認します 。
まず失敗し、コンテナ作成者に即座に通知し、即座に対処し、デフォルトで保護されたコンテナセキュリティポリシーを作成しましょう!
Atlassian Bamboo CI/CDとの統合の記事もぜひご覧ください。
Jenkins CI/CDセキュリティにおけるDockerスキャニングをSysdig Secureプラグインを用いて行うの記事もぜひご覧ください。
Integrate Image Scanning into Development Pipelineには、Sysdig Secureのマニュアルがあります。