こんにちは!日々のデプロイメント、本当にお疲れ様です。
「コードを書くのは楽しいけれど、リリース前のセキュリティチェックでいつも冷や汗をかく……」そんな経験はありませんか?
開発スピードを落とさず、かつプロダクトの安全性を担保する。これは現代のエンジニアにとって永遠のテーマです。特に、npmやpip、Mavenなどを通じて何気なくインポートしているサードパーティ製のライブラリ(依存関係)には、私たちが知らないうちに深刻な脆弱性が潜んでいることが少なくありません。
今回は、自動化サーバーの代名詞である Jenkins と、モダンな脆弱性スキャナーである Snyk(スニーク) をガッチリと組み合わせて、CI/CDパイプラインに「絶対に破れないセキュリティ・ゲート」を構築する方法を徹底解説します。
これをマスターすれば、脆弱性を含んだコードが本番環境へデプロイされるのを自動でブロックできるようになり、毎日のリリース作業が劇的に安心で楽しいものになりますよ。さあ、一緒に扉を開きましょう!
—
1. そもそも、なぜJenkinsとSnykを連携させるのか?
まずは、「なぜこの組み合わせが最強なのか」という基本のキからお話ししますね。
- Jenkinsの役割: コードのビルド、テスト、デプロイという一連のライフサイクルを自動化する「司令塔」。
- Snykの役割: プロジェクトが依存している外部ライブラリの脆弱性をミリ秒単位でスキャンし、具体的な修正パッチやアップグレードパスを教えてくれる「敏腕セキュリティ・ガードマン」。
これらを連携させることで、「開発者がコードをプッシュ ➔ Jenkinsがビルドを開始 ➔ Snykが依存関係を検査 ➔ 深刻な脆弱性が見つかったら即座にビルドを中断(ゲート封鎖)」という自動防衛システムが完成します。人手によるチェック漏れを完全にゼロにできるのが、このフローの最大の強みです。
—
2. 基礎セットアップ:環境の準備
それでは、実際に手を動かしていきましょう。今回は最も一般的な Jenkins(Declarative Pipeline) をベースに解説します。
ステップ①:SnykアカウントとAPIトークンの取得
1. [Snyk公式サイト](https://snyk.io/)でアカウントを作成(無料枠で十分試せます)。
2. アカウント設定画面から API Token を取得します。
ステップ②:JenkinsへのSnykトークンの登録
取得したAPIトークンを、Jenkinsの安全なクレデンシャル機能に登録します。
1. Jenkinsのダッシュボード ➔ [認証情報 (Credentials)] ➔ [システム] ➔ [グローバル認証情報の追加] へ移動。
2. 種類: `Secret text`
3. シークレット: 先ほど取得したSnykのAPIトークンを貼り付け。
4. ID: `snyk-api-token` (後ほどPipelineからこのIDで呼び出します)
ステップ③:JenkinsエージェントへのSnyk CLIのインストール
Jenkinsが動いているノード(またはDockerコンテナ)に、Snykを操作するためのCLIツールをインストールします。一番手っ取り早いのは、シェルから直接インストールする方法です。
Snyk CLIのグローバルインストール
npm install -g snyk
※ Jenkinsのビルドコンテナ(Dockerなど)を使う場合は、あらかじめSnyk CLIが含まれている公式イメージを使うか、ビルドの初期ステップでインストールするようにしてください。
—
3. 【動作確認】HelloWorld的!シンプルな脆弱性スキャン
まずは、Snykが正しく動くか試す「HelloWorld」的なPipelineを書いてみましょう。
適当なプロジェクトの `Jenkinsfile` を開くか、新規のパイプラインジョブを作成し、以下のコードを貼り付けてみてください。
pipeline {
agent any
// ステップ②で登録したクレデンシャルを環境変数としてバインド
environment {
SNYK_TOKEN = credentials(‘snyk-api-token’)
}
stages {
stage(‘Checkout’) {
steps {
// Gitからソースコードを取得
checkout scm
}
}
stage(‘Install Dependencies’) {
steps {
// 例:Node.jsプロジェクトの場合の依存関係インストール
sh ‘npm install’
}
}
stage(‘Snyk Security Scan’) {
steps {
script {
// Snykへの認証をとおす
sh ‘snyk auth $SNYK_TOKEN’
// プロジェクト全体の依存関係をスキャン
sh ‘snyk test’
}
}
}
}
}
これでビルドを実行してみてください。コンソール出力に、プロジェクトが抱える脆弱性のリスト(もしあれば)が表示されれば、基本の連携は大成功です!
—
4. 本番の肝:セキュリティ・ゲートの自動化とビルド中断
ここからが本題です。「脆弱性が見つかったら、どうするか?」というポリシーを設定します。
ただ警告を出すだけでは、誰もログを見なくなってしまいますよね。そこで、「深刻度(Severity)がHigh以上の脆弱性が見つかったら、容赦なくビルドを失敗させる(=ゲートを閉じる)」という設定を組み込みます。
Snyk CLIには `–severity-threshold` という非常に便利なオプションがあります。これを利用した高度なPipelineを見てみましょう。
pipeline {
agent any
environment {
SNYK_TOKEN = credentials(‘snyk-api-token’)
}
stages {
stage(‘Checkout’) {
steps {
checkout scm
}
}
stage(‘Install Dependencies’) {
steps {
sh ‘npm install’
}
}
stage(‘Security Gate (Snyk Test)’) {
steps {
script {
sh ‘snyk auth $SNYK_TOKEN’
// 匠のテクニック:
// –severity-threshold=high を指定することで、
// 「High」または「Critical」な脆弱性がある場合のみ、コマンドが非ゼロの終了コード(エラー)を返します。
// これによりJenkinsのビルドが自動的に中断されます。
try {
sh ‘snyk test –severity-threshold=high’
} catch (Exception e) {
currentBuild.result = ‘FAILURE’
error(“🚨 セキュリティ・ゲート防衛発動: 深刻な脆弱性が検出されたため、ビルドを中断しました。”)
}
}
}
}
}
}
この記述により、安全でないコードがパイプラインの関所を通り抜けるのを完全にシャットアウトできるようになります。「テストは通ったのに、セキュリティで弾かれた!」という開発者からのフィードバックが、チーム全体のエコシステムをよりセキュアに育てていく原動力になります。
—
5. レポートのHTML化とJenkins上での可視化
「ビルドが落ちたのは分かったけれど、具体的にどのパッケージの何が原因なの?」
それを黒いコンソール画面だけで探すのは、エンジニアにとってストレスですよね。
Snykの結果をHTMLレポートとして出力し、Jenkins上で綺麗に閲覧できるようにしましょう。Snykには結果をJSONやHTMLで出力する機能があります(※`snyk-to-html` ツールを使用)。
追加の準備(Jenkinsエージェント上)
npm install -g snyk-to-html
レポート生成を組み込んだ最終形Pipeline
pipeline {
agent any
environment {
SNYK_TOKEN = credentials(‘snyk-api-token’)
}
stages {
stage(‘Checkout’) {
steps {
checkout scm
}
}
stage(‘Install Dependencies’) {
steps {
sh ‘npm install’
}
}
stage(‘Security Scan & Report’) {
steps {
script {
sh ‘snyk auth $SNYK_TOKEN’
// snyk testの結果をJSONで保存しつつ、snyk-to-htmlで美しいレポートに変換する
// 終了コードを変数に保持するため、 || true を挟むのがハックのコツです
sh ”’
snyk test –json > snyk-result.json || true
snyk-to-html -i snyk-result.json -o snyk-report.html
”’
}
}
}
stage(‘Security Gate Check’) {
steps {
script {
// 再度エラー判定用にテストを実行し、ビルド成否を決定
def snykExitCode = sh(script: ‘snyk test –severity-threshold=high’, returnStatus: true)
if (snykExitCode != 0) {
currentBuild.result = ‘FAILURE’
error(“🚨 セキュリティ・ゲートに抵触しました。詳細は成果物のHTMLレポートをご確認ください。”)
}
}
}
}
}
post {
always {
// 生成したHTMLレポートをJenkinsの成果物(Artifacts)として保存
archiveArtifacts artifacts: ‘snyk-report.html’, fingerprint: true
// (オプション)HTML Publisherプラグインを使えば、Jenkinsの画面上に直接レポートを描画できます
// publishHTML(target: [
// reportDir: ‘.’,
// reportFiles: ‘snyk-report.html’,
// reportName: ‘Snyk Security Report’
// ])
}
}
}
—
おわりに:安全なデプロイメントのその先へ
お疲れ様でした! ここまで設定できれば、あなたのJenkinsは単なる自動化サーバーから、「組織のセキュリティを守る屈強な要塞」へと生まれ変わります。
- 依存関係の脆弱性をビルド時に自動検知
- 深刻度に応じたセキュリティ・ゲートによるビルドの自動中断
- 美しいHTMLレポートによる迅速な原因特定
これを導入したその日から、チーム全体のセキュリティ意識は驚くほど高まります。「自分の書いたコードだけでなく、サプライチェーン全体に責任を持つ」というプロフェッショナルな開発体験を、ぜひあなたの現場でも味わってみてください。
あなたのCI/CDパイプラインが、今日も安全に、そして高速に回り続けることを心から応援しています!