
KubeLinterは、KubernetesのYAMLファイルとHelmチャートを検査し、それらで表現されたアプリケーションがベストプラクティスに準拠していることを確認する静的解析ツールです。
Kubernetes向け静的解析
KubeLinterは、KubernetesのYAMLファイル、Helmチャート、Kustomizeマニフェストを解析し、本番稼働への備えとセキュリティに重点を置いたさまざまなベストプラクティスに照らしてチェックします。
KubeLinterは、KubernetesのYAMLファイル、Helmチャート、Kustomizeマニフェストに関する有用な情報を提供するように設計された、妥当なデフォルトチェックを実行します。これは、チームがセキュリティの誤設定やDevOpsのベストプラクティスを早期に、そして頻繁にチェックできるようにするためです。一般的な例としては、コンテナを非rootユーザーとして実行する、最小権限を強制する、機密情報をシークレットのみに格納する、などがあります。
KubeLinterは設定可能で、組織内で適用したいポリシーに応じて、チェックの有効化・無効化や独自のカスタムチェックの作成ができます。
lintチェックが失敗すると、KubeLinterは潜在的な問題を解決するための推奨事項を報告し、非ゼロの終了コードを返します。
KubeLinterのインストール、使用方法、設定に関する詳細なドキュメントは、https://docs.kubelinter.io を参照してください。
Kube-linterのバイナリは、https://github.com/stackrox/kube-linter/releases/latest にあります。
Goを使用してインストールするには、次のコマンドを実行します。
go install golang.stackrox.io/kube-linter/cmd/kube-linter@latest
あるいは、Releases から最新のバイナリをダウンロードして、PATHに追加してください。
HomebrewまたはLinuxBrewを使用してインストールするには、次のコマンドを実行します。
brew install kube-linter
nix-shell -p kube-linter
docker pull stackrox/kube-linter:latest
KubeLinterをソースからインストールする手順は、次のとおりです。
最初に、KubeLinterリポジトリをクローンします。
git clone [email protected]:stackrox/kube-linter.git
次に、ソースコードをコンパイルします。これにより、各プラットフォーム向けのkube-linterバイナリファイルが作成され、.gobinフォルダに配置されます。
make build
最後に、KubeLinterを使用する準備が整います。バージョンを確認して、KubeLinterが正常にインストールされたことを確認してください。
.gobin/kube-linter version
テストにはいくつかの層があります。各層は合格することが期待されています。
goユニットテスト:
make test
エンドツーエンド統合テスト:
make e2e-test
そして最後に、bats-coreを使用したエンドツーエンド統合テスト:
make e2e-bats
KubeLinterイメージは、cosignによって署名されています。使用する前にイメージを検証することをお勧めします。
cosignをインストールしたら、KubeLinter公開鍵を使用して、次のコマンドでKubeLinterイメージを検証できます。
cat kubelinter-cosign.pub
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEl0HCkCRzYv0qH5QiazoXeXe2qwFX
DmAszeH26g1s3OSsG/focPWkN88wEKQ5eiE95v+Z2snUQPl/mjPdvqpyjA==
-----END PUBLIC KEY-----
cosign verify --key kubelinter-cosign $IMAGE_NAME
KubeLinterは、cosignキーレス署名も提供しています。
次のコマンドでKubeLinterイメージを検証できます。
# NOTE: Keyless signatures are NOT PRODUCTION ready.
COSIGN_EXPERIMENTAL=1 cosign verify $IMAGE_NAME
KubeLinterを使用してYAMLファイルをLintするには、最も基本的な形式では2つのステップだけが必要です。
セキュリティと本番準備のベストプラクティスをテストしたいYAMLファイルを特定します。
次のコマンドを実行します。
kube-linter lint /path/to/your/yaml.yaml
次のサンプルのPod仕様ファイルpod.yamlを考えてみましょう。このファイルには、本番準備に関する問題が2つと、セキュリティに関する問題が1つあります。
セキュリティの問題:
本番準備:
コンテナのメモリ制限が設定されていないため、過剰なメモリを消費する可能性があります。
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox
resources:
requests:
memory: "64Mi"
cpu: "250m"
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
上記のYAMLをpod.yamlにコピーし、次のコマンドを実行してこのファイルをlintします。
kube-linter lint pod.yaml
KubeLinterはデフォルトのチェックを実行し、推奨事項を報告します。以下は、前のコマンドの出力です。
pod.yaml: (object: <no namespace>/security-context-demo /v1, Kind=Pod) The container "sec-ctx-demo" is using an invalid container image, "busybox". Please use images that are not blocked by the `BlockList` criteria : [".*:(latest)$" "^[^:]*$" "(.*/[^:]+)$"] (check: latest-tag, remediation: Use a container image with a specific tag other than latest.)
pod.yaml: (object: <no namespace>/security-context-demo /v1, Kind=Pod) container "sec-ctx-demo" does not have a read-only root file system (check: no-read-only-root-fs, remediation: Set readOnlyRootFilesystem to true in the container securityContext.)
pod.yaml: (object: <no namespace>/security-context-demo /v1, Kind=Pod) container "sec-ctx-demo" has memory limit 0 (check: unset-memory-requirements, remediation: Set memory limits for your container based on its requirements. Refer to https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits for details.)
Error: found 3 lint errors
KubeLinterは、1回の実行で複数の出力形式を生成できます。これは、人間が読めるレポートと機械が読めるレポートを同時に生成する場合に役立ちます。
kube-linter lint \
--format sarif --output kube-linter.sarif \
--format json --output kube-linter.json \
--config .kube-linter.yaml \
pod.yaml
このコマンドでは、次のことが行われます:
kube-linter.sarifにSARIF形式のレポートを生成するkube-linter.jsonにJSON形式のレポートを生成する注: 複数の形式を指定する場合は、明示的な--outputフラグが必要です。単一形式をstdoutに出力する場合は、--outputなしで--formatフラグを1つだけ使用します。
複数の出力形式の使用に関する詳細は、ドキュメントを参照してください。
KubeLinterの使用と設定について詳しくは、ドキュメントページを参照してください。
以下は、ユーザーによって書かれたKubeLinterのチュートリアルです。このリストに追加したいものがあれば、PRを送ってください!
KubeLinterは、Apache License 2.0の下でライセンスされています。
メンテナや他のユーザーを含むKubeLinterコミュニティに参加したい場合は、こちらのSlackワークスペースに参加できます。
コマンドの使用方法、フラグ、設定ファイルの形式には、将来、破壊的な変更が加えられる可能性があります。ただし、KubeLinterを使用して環境のYAMLファイルをテストし、何が壊れるかを確認し、貢献することをお勧めします。
注意として、KubeLinterコミュニティへのすべての参加は、行動規範に従うものとします。