- 記事作成日: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
入れましたが、うまく動かず。残念。
公式の画像を見るとわかりやすく教えてくれるので、開発者体験が良さそうです。