こんにちは、サイオステクノロジー武井(@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にてご覧になれます。
早速実践!!
エンジニアは手を動かしてナンボなので、早速実践してみたいと思います。SnykとAzure Pipelinesを連携させてみます。
Azure PipelinesにSnykのエクステンションをインストールすることが出来ますので、以下のような構成でDevSecOps環境を作ってみます。
- システム開発者はGitHubにソースコードをPushします。
- GitHubはソースコードがPushされたことをAzure Pipelinesに通知します。
- Azure PipelinesはGitHubからソースコードをPullします。
- Snykがソースコードの脆弱性チェックをします。
- 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!!