コンテナの「中身」を覗いてる?CI/CDで実現する最強の防犯対策
こんにちは!セキュリティの現場で日々、防御の最前線に立っているエンジニアです。
皆さんは、Webサービスを動かす「コンテナ」という技術をご存知でしょうか?簡単に言えば、アプリケーションとそれを動かすための部品を一つの「箱」に詰め込んだものです。運びやすくて便利なのですが、実はこの箱、「中身が腐っていないか」「中に泥棒が隠れていないか」をチェックせずにデプロイしてしまうと、大変なことになります。
今日は、開発の自動化プロセス(CI/CD)の中に、この「検品」の仕組みを組み込む方法を、身近な例えを交えて一緒に学んでいきましょう!
—
1. コンテナの脆弱性は「開けっ放しの裏口」と同じ
まず、なぜコンテナのスキャンが必要なのか。それは「コンテナイメージが、実は賞味期限切れの部品で作られているかもしれないから」です。
想像してみてください。家を建てる際、古いカタログに載っていた「鍵のかかりにくい欠陥ドア」を何気なく使ってしまったらどうなるでしょう?泥棒(攻撃者)は、そのドアの弱点(CVE:共通脆弱性識別子)を知っています。彼らはその弱点を通って、皆さんの大切なデータにアクセスしようとします。
コンテナの世界では、この「欠陥ドア」がイメージの中に紛れ込んでいます。これを防ぐのが「脆弱性スキャン」です。
—
2. CI/CDパイプラインに「番人」を置こう
開発の現場では、コードを書いてからリリースするまでを自動化する「CI/CDパイプライン」を使いますよね。このパイプラインの途中に、「Trivy」という強力な番人を配置しましょう。
Trivyは、コンテナの中に「壊れた部品(脆弱性)」が含まれていないかを瞬時に検出し、もし見つかったら「この箱は出荷してはいけません!」とパイプラインを止めてくれるツールです。
TrivyをCI/CD(GitHub Actions)で動かす例
GitHub Actionsを使っているなら、設定は驚くほど簡単です。以下の設定ファイルを`.github/workflows/scan.yml`として作成してみてください。
name: Security Scan
on: [push]
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- name: コードをチェックアウト
uses: actions/checkout@v3
- name: コンテナイメージをビルド
run: docker build -t my-app:latest .
- name: Trivyでスキャンを実行!
uses: aquasecurity/trivy-action@master
with:
image-ref: ‘my-app:latest’
format: ‘table’
# 重要:重大(CRITICAL)な脆弱性が見つかったらビルドを失敗させる設定
exit-code: ‘1’
severity: ‘CRITICAL,HIGH’
この設定の肝は `exit-code: ‘1’` です。これを入れることで、危険な脆弱性がある場合に「強制的にお届けをストップ」させることができます。これが「ゲート制御」と呼ばれる、セキュリティの防波堤です。
—
3. なぜ「今」この対策が必要なのか?
「面倒くさいな、スキャンなしでリリースしちゃダメ?」と思うかもしれません。でも、現代のサイバー攻撃は、公開されたばかりの脆弱性をわずか数時間で悪用してきます。
皆さんがせっせとコードを書いている間に、使っているライブラリに新しい穴が見つかっている……なんてことは日常茶飯事です。だからこそ、「人間が手作業でチェックする」のではなく、「機械(CI/CD)に自動でチェックさせる」ことが、現代のエンジニアにとっての必須スキルなんです。
—
4. 一歩ずつ、今日から始めるセキュリティ
セキュリティと聞くと難しく感じるかもしれませんが、まずは以下の3ステップから始めてみてください。
1. まずはスキャンする: `trivy image <イメージ名>` を手元のPCで実行してみる。
2. ゲートを設ける: パイプラインにTrivyを組み込み、重大な脆弱性がある場合はリリースできないようにする。
3. 定期的にメンテナンスする: 脆弱性がゼロになることは稀です。出たものに対して「いつ修正するか」というルールをチームで決める。
セキュリティは「一度やって終わり」の作業ではありません。家の鍵を毎日かけるのと同じで、「当たり前のことを、自動で、毎日続ける」ことが、あなたのサービスとユーザーを守る一番の近道です。
さあ、今日からあなたのコンテナにも「番人」を置いて、安全な開発ライフを楽しみましょう!またわからないことがあれば、いつでも聞きに来てくださいね。

コメント