フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【新規ツール探し】Iacやコンテナ、アプリの脆弱性チェックができる「Snyk」を触った

  • 記事作成日:2022/12/16

情報

名前 URL
Github https://github.com/snyk/cli
公式サイト https://docs.snyk.io/
デモサイト demo
開発母体 snyk
version
言語
価格 有料 (一部無料)
ライセンス Apache-2.0 license

何ができるもの?

Snyk(スニーク) には以下のプロダクトがあるようです。

プロダクト名 内容
Snyk Open Source 各言語のパッケージマネージャーに対するチェック
Snyk Code コードやフレームワークに対するスキャン。ディープコード、セマンティックコード分析エンジンをベースにしており、AIを使用して、グローバル開発コミュニティの数十億行のコードと数億件のコード修正から継続的に学習します
Snyk Container Linux Distribution をベースとしたコンテナイメージのスキャン。
Snyk Infrastructure as Code IaC の設定に対するチェック。
Snyk Cloud AWS / GCP の設定チェック

インフラ〜アプリのさまざまな側面でのセキュリティチェックをしてくれる横断的なプロダクトを色々出しています。

利用シーン

  • コンテナ、アプリ、ライブラリ、インフラ Iac、クラウド設定 に対して脆弱性スキャンをしたいとき

登場背景

by DeepL

開発者は現在、プロプライエタリなコードとオープンソースのコードを組み合わせてアプリケーションを組み立て、そのコードをコンテナで実行し、KubernetesやTerraformなどの技術を使ってインフラストラクチャー・アズ・コード構成でデプロイしています。

優れたセキュリティ・プロセスは、これらのコンポーネントが構築され維持される場所で、それぞれを保護します。Snyk は DevOps プロセスに統合され、業界のベスト プラクティスに従いつつ、各開発者が好む方法を使用して開発者と連携します。Snyk は、IDE、ワークフロー、自動化パイプラインに直接統合し、セキュリティの専門知識をツールキットに追加します。

所感

  • それぞれの分野において使えるツールは色々あるが、全ての領域をカバーしているのは珍しい
  • WebUI で一元的にチェックできるので一つ契約して入れればいいのは楽ちん
  • IDE でのリアルタイムでのコード指摘はとても便利
  • 外部通信しているのでコードを外部に持っていってスキャンしている??(要確認)
  • CLI / Web UI / API / IDE と選択肢があるので、devops パイプラインに仕込みやすい
  • 今回は manifest のチェックをしたが、これだけなら別のツールでもいいかな と思った。というのも、無課金の範囲だとテスト回数の上限があるため。
    • IaC / コンテナ / アプリコード、ライブラリ など複数のチェックを行うなら月1万円ぐらいなので良さそう

Plans and Pricing | Free plan | Snyk

使い方

いろんな機能があって把握しきれないので、今回はシンプルな CLI を使ってみる。 aqua で入れてみます。

❯ aqua init`

aqua.yaml が生成されます。

---
# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
# checksum:
#   # https://aquaproj.github.io/docs/reference/checksum/
#   enabled: true
#   require_checksum: true
registries:
- type: standard
  ref: v3.105.0 # renovate: depName=aquaproj/aqua-registry
packages:
  # snyk
  - name: snyk/cli@v1.1071.0

snyk を追加

❯ aqua i

INFO[0000] create a symbolic link                        aqua_version=1.25.0 command=snyk env=darwin/arm64 program=aqua
INFO[0000] download and unarchive the package            aqua_version=1.25.0 env=darwin/arm64 package_name=snyk/cli package_version=v1.1071.0 program=aqua registry=standard

❯ snyk -v

1.1071.0

このままだと使えないので、ログインします。

❯ snyk auth


Now redirecting you to our auth page, go ahead and log in,
and once the auth is complete, return to this prompt and you'll
be ready to start using snyk.

snyk auth を叩くとブラウザが起動し、Google or GitHub でのログインが求められるので GitHub を選んでみます。あとは、ぽちぽちしていくと

Your account has been authenticated. Snyk is now ready to be used.

この表示が出てきて完了です。

kubernetes manifest のチェック

適当な manifest を用意します

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

これをスキャンします。

❯ snyk iac test


Snyk Infrastructure as Code

✔ Test completed.

Issues

Low Severity Issues: 5

  [Low] Container is running without memory limit
  Info:    Memory limit is not defined. Containers without memory limits are
           more likely to be terminated when the node runs out of memory
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-4
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           resources > limits > memory
  File:    deployment.yaml
  Resolve: Set `resources.limits.memory` value

  [Low] Container is running without liveness probe
  Info:    Liveness probe is not defined. Kubernetes will not be able to detect
           if application is able to service requests, and will not restart
           unhealthy pods
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-41
  Path:    [DocId: 0] > spec > template > spec > containers[nginx] >
           livenessProbe
  File:    deployment.yaml
  Resolve: Add `livenessProbe` attribute

  [Low] Container could be running with outdated image
  Info:    The image policy does not prevent image reuse. The container may run
           with outdated or unauthorized image
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-42
  Path:    [DocId: 0] > spec > template > spec > containers[nginx] >
           imagePullPolicy
  File:    deployment.yaml
  Resolve: Set `imagePullPolicy` attribute to `Always`

  [Low] Container has no CPU limit
  Info:    Container has no CPU limit. CPU limits can prevent containers from
           consuming valuable compute time for no benefit (e.g. inefficient
           code) that might lead to unnecessary costs. It is advisable to also
           configure CPU requests to ensure application stability.
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-5
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           resources > limits > cpu
  File:    deployment.yaml
  Resolve: Add `resources.limits.cpu` field with required CPU limit value

  [Low] Container is running with writable root filesystem
  Info:    `readOnlyRootFilesystem` attribute is not set to `true`. Compromised
           process could abuse writable root filesystem to elevate privileges
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-8
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           securityContext > readOnlyRootFilesystem
  File:    deployment.yaml
  Resolve: Set `securityContext.readOnlyRootFilesystem` to `true`

Medium Severity Issues: 3

  [Medium] Container is running without root user control
  Info:    Container is running without root user control. Container could be
           running with full administrative privileges
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-10
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           securityContext > runAsNonRoot
  File:    deployment.yaml
  Resolve: Set `securityContext.runAsNonRoot` to `true`

  [Medium] Container does not drop all default capabilities
  Info:    All default capabilities are not explicitly dropped. Containers are
           running with potentially unnecessary privileges
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-6
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           securityContext > capabilities > drop
  File:    deployment.yaml
  Resolve: Add `ALL` to `securityContext.capabilities.drop` list, and add only
           required capabilities in `securityContext.capabilities.add`

  [Medium] Container is running without privilege escalation control
  Info:    `allowPrivilegeEscalation` attribute is not set to `false`. Processes
           could elevate current privileges via known vectors, for example SUID
           binaries
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-9
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           securityContext > allowPrivilegeEscalation
  File:    deployment.yaml
  Resolve: Set `securityContext.allowPrivilegeEscalation` to `false`

-------------------------------------------------------

Test Summary

  Organization: lirlia
  Project name: snyk

✔ Files without issues: 0
✗ Files with issues: 1
  Ignored issues: 0
  Total issues: 8 [ 0 critical, 0 high, 3 medium, 5 low ]

-------------------------------------------------------

Tip

  New: Share your test results in the Snyk Web UI with the option --report

すると、いくつか問題点を出してくれました。

  [Low] Container is running without memory limit
  Info:    Memory limit is not defined. Containers without memory limits are
           more likely to be terminated when the node runs out of memory
  Rule:    https://snyk.io/security-rules/SNYK-CC-K8S-4
  Path:    [DocId: 0] > input > spec > template > spec > containers[nginx] >
           resources > limits > memory
  File:    deployment.yaml
  Resolve: Set `resources.limits.memory` value

例えば、これは memory に対して limits が設定されてない問題ですね。

ちなみに、Helm や kustomize も対応しているとのことでした。

Web UI にアップする

snyk iac test --report とするとアップされます。

これはOSSのツールではない機能ですね。みやすいです。

VSCode Plugin を試す

Snyk Security - Code, Open Source Dependencies, IaC Configurations - Visual Studio Marketplace

入れましたが、うまく動かず。残念。

公式の画像を見るとわかりやすく教えてくれるので、開発者体験が良さそうです。