SnykとAzure PipelinesでDevSecOpsを実現!!

こんにちは、サイオステクノロジー武井(@noriyukiyakei)です。今回はSnykとAzure PipelinesでDevSecOpsをしてみたいと思います。

DevSecOpsってなに?

DevOpsにセキュリティ対策も絡めようという試みです。例えば、GitHubなどのリポジトリにソースコードをアップしたり、Docker HubなどのDockerリポジトリにDockerイメージをプッシュしたら、ソースコードやDockerイメージの脆弱性検査も合わせて自動的に行うといったものです。

DevOpsによるビルド・テスト・リリースの自動化に加えて、脆弱性検査も自動化してしまえば、ソフトウェアのリリースサイクルの中で早期に脆弱性を発見出来ます。

DevOpsについての詳細は以下をご覧ください。

コンテナ時代のDevOps 〜Azure Web Apps for Containers + Docker + Jenkins + SeleniumでイマドキのCI/CDをやってみる [理論編]〜

Snykってなに?

SnykはSaaS型の脆弱性診断サービスです。様々な環境に対応しています。Visual Studio Codeなどの開発環境に組み込む事もできますし、GitHub ActionsやAzure PipelinesなどのCI/CDパイプラインに組み込むこともできます。

詳細は以下のURLにてご覧になれます。

https://snyk.io

早速実践!!

エンジニアは手を動かしてナンボなので、早速実践してみたいと思います。SnykとAzure Pipelinesを連携させてみます。

Azure PipelinesにSnykのエクステンションをインストールすることが出来ますので、以下のような構成でDevSecOps環境を作ってみます。

  1. システム開発者はGitHubにソースコードをPushします。
  2. GitHubはソースコードがPushされたことをAzure Pipelinesに通知します。
  3. Azure PipelinesはGitHubからソースコードをPullします。
  4. Snykがソースコードの脆弱性チェックをします。
  5. Azureのサービスにデプロイします。

SnykのAzure Pipelinesのエクステンションは、アプリケーションの依存関係をチェックすることで脆弱性を発見します。つまりアプリケーションが利用しているライブラリのバージョンが何らかの脆弱性を含むものかをチェックします。Javaでしたら、Mavenのpom.xmlに記載されているdependencyのバージョンをチェックして、もし脆弱性を含むものがあった場合には、パイプラインを止めることが出来ます。

Snykのアカウント作成

まずSnykのアカウントを作りましょう。https://snyk.ioにアクセスして、画面右上部の「SIGN UP」をクリックします。

 

以下のサービスの中からお好きなものを選んで、そのアカウントでサインアップを行います。

 

正常にサインアップが完了すると以下の画面になります。これだけです。特にここではGitHubなどのリポジトリの脆弱性検査をすぐにはしません。なので「list of integrations」をクリックします。

 

以下のような画面になれば、サインアップは成功しています。簡単ですね!!

APIトークンの取得

Azure PipelinesとSnykの連携に必要なAPIトークンを取得します。画面右上のアイコンをクリックして、「Account settings」をクリックします。

 

「Auth Token」のところに表示してある「KEY」の値をメモします。

Extensionのインストール

ここからはAzure Pipelinesの設定に入ります。SnykのExtensionをインストールしましょう。Azure DevOpsのポータル(https://dev.azure.com/)にアクセスして、「Organization settings」をクリックします。

 

「Extensions」をクリックします。

 

「Browse marketplace」をクリックします。

 

テキストボックスに以下のように「snyk」を入力してエンターしますと、「Snyk Security Scan」のExtensionが表示されますのでクリックします。

 

「Get it free」をクリックします。

 

インストール対象の組織を選択して「Install」 をクリックします。

 

インストールが完了すると以下のような画面になります。

SnykとAzure Pipelinesの連携設定

SnykとAzure Pipelinesを連携出来るようにします。Azure DevOpsのポータル(https://dev.azure.com/)にアクセスして、SnykのExtensionを使いたいプロジェクトを選択して、「Project Settings」をクリックします。

 

「Create service connection」をクリックします。

 

以下のように「snyk」と入力すると、「Snyk Authentication」が表示されますので、チェックして「Next」をクリックします。

 

「Sync API Token」のところに、先程メモしたAPIトークンを入力します。「Service connection name」には、この接続を一意に識別する名前を入力します。「Grant access permission to all pipelines」にチェックをして、最後に「Save」をクリックします。

Snykのタスクを追加

パイプラインにSnykのタスクを追加してみます。Snykのタスクを追加したいパイプラインを表示して、「Show assistant」をクリックします。

 

すると、「Snyk Security Scan」というタスクが表示されますので、クリックします。

 

「Sync API token」のところには、先程作成した接続名を選択します。「What do you want to test?」には「Application」か「Container」を選択できます。前者はアプリケーション、後者はコンテナの脆弱性をチェックします。今回は「Application」を選択します。その他は下図のように設定して、最後に「Add」をクリックします。

 

すると、Azure Pipelinesの編集画面に以下のタスクが挿入されます。

パイプラインを動かしてみよう

では準備が整ったところで、GitHubのリポジトリになにか適当なものをPushして、パイプラインを動かしてみます。

パイプラインの進捗画面を見てみますと、以下のようにモリモリ動いています。このアプリはmMavenによるビルドを想定したJavaのソースで構成されています。下から2つ目に「SnykSecurityScan」がありますが、これがSnykによる脆弱性検査のタスクです。

 

問題なければ、以下のようにパイプランのステータスがOKとなります。

わざと脆弱性を入れてみる

では、意図的に脆弱性のあるコードを組み入れてみます。

以下のようにpom.xmlにlogbackの脆弱性のあるバージョンを指定してみます。

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.1.3</version>
    </dependency>

 

ソースをコミットして、パイプラインの進捗を見守っていますと、たしかに失敗してパイプラインが止まります。ログを見るとlogbackをアップグレードする必要があるって書いてあります。すごい!!

まとめ

いかがでしたでしょうか?SnykによってDevOpsのパイプラインの中に脆弱性検査を組み込むことにより、うっかりソースの中に脆弱性を含んだものをリリースしちゃったなんてことがなくなりますね!!ヤハリこれからはなんでも自動化の時代!!自動化して早めに仕事を切り上げて、ハナキンはベルサッサ出来るようにしましょう。No Snyk, No Life!!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です