CI/CDパイプラインのセキュリティを強化する方法
2023年7月12日
0 分で読めますDevSecOpsとは、DevOpsのプロセスにセキュリティ対策を組み込むことです。開発サイクルが高速化する現代では、セキュリティ対策を最後まで後回しにはできません。あらゆる段階に組み込む必要があります。
継続的インテグレーション/継続的デリバリー(CI/CD)のセキュリティは、DevSecOpsの重要な要素です。パイプラインを保護し、CI/CDの実装に使う自動化システムが攻撃に対して脆弱でない状態を保つことが不可欠です。
この記事では、CI/CDパイプラインを脅かすセキュリティリスクについて解説します。また、攻撃に強いパイプラインの構築方法と、セキュリティを検証するためのテスト方法も紹介します。
CI/CDパイプラインを保護する必要がある理由
セキュリティについて考えるとき、通常はWebアプリケーションや外部に公開されているサービスが注目されます。パイプラインのような一見ニッチな対象は、セキュリティ対策から漏れがちですが、それは間違いです。CI/CDのセキュリティが不十分だと、深刻な結果を招くおそれがあります。
パイプラインが侵害されると、ハッカーにシステムへのアクセスを許すことになります。コードや貴重なデータ、クライアントの秘密情報などにアクセスされる可能性があります。パイプラインの一部が侵害されれば、パイプライン全体が危険にさらされます。
悪意あるコードの注入もリスクの一つです。これは巧妙でありながら、非常に深刻な攻撃です。パイプラインにアクセスできる攻撃者は、独自のコードを挿入し、それを気づかれないまま最終ビルドに組み込むことができます。その結果、デプロイしたアプリケーションが侵害され、攻撃者はあなたやユーザーのデータを自由に盗めるようになります。
さらに、ビルドチェーンが侵害されると、シークレットが漏えいするおそれもあります。ツールの認証に使うパスワードや認証情報が盗まれ、システムのほかの部分へのアクセスに悪用される可能性があります。盗まれた認証情報によって大きな被害が生じるため、安全に管理することが不可欠です。
また、古いコンポーネントは攻撃に対して特に脆弱な場合があるため、使用には注意が必要です。新たな攻撃手法は常に発見されており、それらを取り除くためにソフトウェアは更新・修正されますが、古いソフトウェアは保護されないままです。
ソフトウェアを最新バージョンに更新することには、セキュリティ以外にも多くのメリットがあります。ツールチェーンを最新の状態に保つことは、セキュリティ戦略の中核に据えるべきです。
安全なCI/CDパイプラインを構築する
幸い、攻撃から身を守るためにできることはたくさんあります。実施できる対策をいくつか見ていきましょう。
ロールベースのアクセス制御を導入する
ロールベースのアクセス制御(RBAC)を使うと、システムの各部分へのアクセスを制限できます。ユーザーの役割に応じてアクセス権を付与できます。これにより、アクセスレベルごとに安全なルールを設定し、すばやく適用しやすくなります。
ユーザーごとにアクセスを管理すれば安全に思えますが、実際には古いアカウントの見落としや、必要以上に長い権限付与といった問題につながります。RBACでは、まとめて付与・取り消しできる固定のルールセットを適用できます。
脆弱性をスキャンする
脆弱性のスキャンには、自動化ツールが欠かせません。幸い、問題をすばやく効率的に見つけるためのセキュリティスキャンシステムは数多くあります。システムを攻撃にさらす可能性のあるコーディングエラーや設定上の問題を検出できます。
外部の第三者にセキュリティ監査を依頼し、見落とした問題を指摘してもらう方法もあります。プロジェクトに深く関わっていない人なら、あなたが気づかなかった盲点を見つけられるかもしれません。
シークレット管理ツールを使う
シークレット管理ツールは、認証情報やキーなどの機密データを保管し、アクセスを管理するためのツールです。こうしたデータを誰が、どこから、どのように利用できるかを制限すれば、漏えいの可能性を大幅に減らせます。さらに、優れたシークレット管理ツールは保存時と転送時の両方でデータを暗号化するため、漏えいした場合の影響も抑えられます。
多くのCIプラットフォームには、シークレット/認証情報を管理する機能が組み込まれており、一般的な外部のシークレット管理システムと連携できるものもあります。
ネットワークへの露出を管理する
ネットワークアクセスを制限しないと、CI/CDシステムが外部の攻撃者から攻撃を受ける(イングレス)可能性があるだけでなく、データも容易に持ち出される(エグレス)おそれがあります。パイプラインに不要なアクセスを遮断してネットワークへの露出を管理することで、安全性を高められます。
たとえば、開放するポートは必要最小限にし、不要になったら閉じましょう。また、必要のないリモート機能は必ず無効にしてください。DockerソケットやAPIなど、システムが外部と通信するあらゆる手段を厳重に保護する必要があります。
信頼境界を制限する
リスクを軽減するもう一つの方法は、可能な限り信頼境界を制限することです。外部のシステムやユーザーとの通信はすべて保護する必要があります。許可する対象は必要なものだけに限定し、できれば特定の期間だけアクセスを付与しましょう。
チェーンを構成する各部分から漏れる情報を最小限にすることも、ハッキングの難易度を高めます。エラーメッセージなどのテキスト出力が、システムの外部公開部分に含まれることがあります。そうした情報からインフラストラクチャの詳細な構成を推測され、攻撃の標的を定める手がかりにされる可能性があります。
これを防ぐために、場合によっては出力を最小限にしてコマンドを実行できます。そうすれば、ログや出力メッセージが漏えいしても、システムに関する情報をできるだけ少なくできます。
たとえば、Bashのwgetコマンドはさまざまな情報を出力します。次のようにqフラグを指定すると、その出力を抑制できます。
ハッカーはツールチェーンに沿って作業を進めながらシステムに関する情報を集めることがよくあります。出力を最小限にすれば、情報を集める機会も減らせます。他のコマンドにも同様のフラグを適用できます。
CI/CDパイプラインのセキュリティを自動化する方法
幸い、こうした問題の多くは、Snykのようにビルドパイプラインの一部として実行するセキュリティ製品を使って対処できます。問題をすばやく検出して対応できるようになります。
たとえば、パイプラインで脆弱性スキャナーを実行すれば、古いコンポーネントに起因する問題を検出できます。Snykなら、こうした問題を検出して特定できます。ターミナルから問題を見つけるには、次のように入力します。
GitHubなどのソースコード管理ツールをSnykと連携させると、依存関係、コンテナ、またはInfrastructure as Codeのポリシーに新たに持ち込まれた脆弱性を検出するPRチェックを自動的に追加できます。

SnykとPRチェックの連携について詳しくは、Snykのサポートドキュメントをご覧ください。
CI/CDパイプラインにセキュリティテストを組み込む方法
セキュリティテストはパイプラインに組み込めます。テストで確認すべきことはいくつかあるため、すべてを網羅するようにしましょう。
RBAC
前述のとおり、RBACはシステムの各部分を保護する優れた方法です。定期的にテストすれば、安全な状態が保たれていることを確認できます。自動チェックを使って、ユーザーが自分の役割に対応するリソースにのみアクセスしているかを検証できます。たとえば、匿名ユーザーによるテストでは、認証済みユーザーに限定したいリソースにアクセスできないことを確認します。ソフトウェアを更新して設定が変わり、以前適用した設定変更が反映されなくなった場合などに、このテストが失敗することがあります。
API
APIテストも自動化できます。ここでもセキュリティの観点から、適切な認証情報があれば成功し、なければ失敗するテストを組み合わせる必要があります。
適切な認証情報がないのにリソースへのアクセスに成功するのは、セキュリティ上の問題です。自動APIテストを使えば、これを定期的かつ迅速に確認できます。また、APIが想定どおりの結果を返すことや、セキュリティを侵害しようとする不正なリクエストに適切に応答することも確認できます。
シークレット
シークレットのテストでは、シークレットがどの段階でも露出していないかを確認できます。パイプラインではパスワードやトークンを管理する必要があり、チェーン内のツールにはそれぞれの役割を果たすための適切な権限が必要です。
テストでシークレットが漏えいするとアクセスされるおそれがあるため、注意してください。Snykを使えば、コードやスクリプトにハードコードされたシークレットを検出し、問題を修正できます。
SnykでJenkinsのCI/CDパイプラインを保護する方法
Snykを使い始めるには、アカウントを登録し、クライアントをローカルにインストールします。インストール手順はこちらで確認できます。たとえばnpmを使っている場合は、次のコードを実行します。
Snykは主要なクラウドプロバイダーのほか、多数のCI/CDツールとも連携でき、連携を簡単にするSnykプラグインも数多くあります。たとえばJenkinsで使うには、JenkinsのダッシュボードからManage Pluginsに移動します。次にAvailableタブでSnyk Securityを探します。プラグインを登録し、アカウントに接続するのを忘れないでください。
Snykを連携したら、パイプラインにsnykSecurityのエントリーを追加し、ステージとして実行できます。
Snykの動作を制御するために、次の追加コマンドも使用できます。
failOnIssuesとfailOnError: これらのコマンドを使うと、いずれかの条件に該当したときにスクリプトを停止できます。これにより、Snykが検出した問題がデプロイに持ち込まれるのを防げます。CI/CDで本番環境へのデプロイを自動化している場合は、特に有効な対策です。
severity: Snykが調査する問題の重大度を指定できます。重大度の低い問題を無視し、軽微な問題のみが検出された場合はビルドを続行することもできます。問題の重大度に応じて動作を変える別のビルドステップを実行することも可能です。
ビルドを実行すると、Snykのコンソールで問題の有無を確認できます。また、ログの詳細を調べて、修正が必要な内容を把握できます。
以上がJenkinsでSnykを設定する方法です。ほかにも、SnykとGitHubの連携や、Amazon Web Services(AWS)やAzureなどのクラウドプロバイダーとの連携も可能です。
まとめ
CI/CDパイプラインはセキュリティに欠かせない一方で、見落とされやすい要素です。ハッカーに悪用される手段は数多くあるため、あらゆる攻撃経路を軽減する対策が不可欠です。
防御を固め、システムの侵害を狙う相手の一歩先を行く必要があります。セキュリティ更新、自動テスト、ロール管理など、システムを強化して攻撃者を締め出す方法はいくつもあります。
Snykは、パイプラインを管理できる心強いツールです。Webサイトをチェックして、利用を始め、CI/CDのセキュリティを守りましょう。Snykなら、安全を簡単に維持できます。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。



