この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
Snykは、ソースコードをスキャンしてOSSやコードなどに含まれる脆弱性を独自のデータベースやインテリジェンスをもとに検出することができるセキュリティプラットフォームです。
今回は、GitHub ActionsでSnyk Node Actionを使ってCI Workflow上でNodeプロジェクトの脆弱性のチェックをしてみました。
やってみた
Snyk Tokenの取得、設定
GitHub ActionsからSnykに接続するためのTokenを取得および設定します。
SnykのAccount Settingsを開きます。TokenのKEYを控えます。
GitHubのSecretsにSnyk Tokenを設定します。ここではRepositoryのSecretsにSNYK_TOKEN
という名前で設定しました。
Snyk Node Actionで脆弱性をスキャンする
Snyk Node Actionを使えば、SnykによるNodeプロジェクトのスキャンをGitHub Actions Workflowに設定できます。
snyk/actions/node
を次のように使用します。
.github/workflows/ci.yml
name: Example workflow for Node using Snyk
on: push
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Run Snyk to check for vulnerabilities
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
CommitをPushするとWorkflowが実行されました。今回は脆弱性が検出されなかったため実行が成功しました。
次に同じWorkflowで脆弱性を含むDependencyをRepositoryに含めてみます。
npm i firebase-admin
added 169 packages, and audited 171 packages in 15s
9 packages are looking for funding
run `npm fund` for details
2 high severity vulnerabilities
To address all issues, run:
npm audit fix
Run `npm audit` for details.
CommitをPushしてWorkflowを実行すると、今度はFailしました。
Snykのスキャンで1件の脆弱性が検出されています。
Testing /github/workspace...
Tested 164 dependencies for known issues, found 1 issue, 1 vulnerable path.
Issues with no direct upgrade or patch:
✗ Denial of Service (DoS) [High Severity][https://snyk.io/vuln/SNYK-JS-DICER-2311764] in dicer@0.3.1
introduced by firebase-admin@10.2.0 > dicer@0.3.1
No upgrade or patch available
Organization: cm-rwakatsuki
Package manager: npm
Target file: package-lock.json
Project name: test220608
Open source: no
Project path: /github/workspace
Licenses: enabled
記載されているURLを開くと、Snykのデータベースで脆弱性の詳細な情報を確認できます。この脆弱性はDoSに対する脆弱性があるようです。
これにより脆弱性があればCIを失敗させて、解消されるまではPull RequestのMergeやDeployをさせないようにするWorkflowが組めそうですね。
一定のSeverity以上の場合のみFailさせる
検出された脆弱性のSeverity Levelが一定以上の場合のみWorkflowをFailさせることも可能です。
SnykのSeverity Levelには次の4段階があります。
- low
- medium
- high
- critical
critical
以上の場合のみFailするようにしてみます。args
で--severity-threshold=critical
と指定します。
.github/workflows/ci.yml
name: Example workflow for Node using Snyk
on: push
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Run Snyk to check for vulnerabilities
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=critical
先ほどと同じDependencyを利用してWorkflowを実行しましたが、今度は実行が成功しました。
プロジェクトの脆弱性を継続的に監視する
プロジェクトをSnykに登録することにより、CI実行以降にも脆弱性を継続的に監視し、新しく脆弱性が検出された時に通知を行うこともできます。
プロジェクトのSnykへの登録は、command
でmonitor
と指定します。
.github/workflows/ci.yml
name: Example workflow using Snyk
on: push
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Run Snyk to check for vulnerabilities
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
command: monitor
Workflowを実行すると、Workflowの実行自体は成功します。
Snykのコンソールを見ると、プロジェクト一覧にWorkflowを実行したRepositoryおよびプロジェクトが登録されています。
プロジェクト内に含まれている脆弱性の詳細も確認可能です。
また脆弱性が検出された際には下記のようなメールが届いて脆弱性の検出を通知してくれます。
おわりに
GitHub ActionsでSnyk Node Actionを使ってCI Workflow上で脆弱性のチェックをしてみました。
今回はDependency(OSS)の検出だけでしたが、コード自体の脆弱性やIaC、ライセンス違反などもチェックすることができます。SnykをCI/CDに組み込んで常にセキュアなプロダクトをデリバリーできるようにしてみてはいかがでしょうか。
参考
- snyk/actions: A set of GitHub actions for checking your projects for vulnerabilities
- Severity levels - Snyk User Docs
以上