scanning-kubernetes-manifests-with-kubesec について
KubesecでKubernetesマニフェストをスキャンするチーム向けのオープンソースセキュリティスキルです。リスクスコアと具体的な強化チェックを、CLI、Docker、kubectl、API、CI/CD、アドミッションWebhookで使う方法を扱います。
主な機能
- 01Kubernetesリソースのリスク評価
- 02特権とケイパビリティの検査
- 03ボリュームマウントとリソース制限の検査
- 04セキュリティコンテキストの検査
- 05CLI、Docker、APIでのスキャン
- 06CI/CDとアドミッションWebhookへの統合
活用シーン
- 01Kubernetesマニフェストの監査
- 02CI/CDで設定をスキャン
- 03デプロイ時に危険なマニフェストを拒否
- 04稼働中クラスターのリソースを確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill scanning-kubernetes-manifests-with-kubesecインストール後、Claude Code で/scanning-kubernetes-manifests-with-kubesecを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Kubesec で Kubernetes マニフェストをスキャンする
概要
Kubesec は ControlPlane が開発したオープンソースのセキュリティリスク分析ツールです。Kubernetes リソースのマニフェストを検査し、権限昇格、書き込み可能なホストマウント、過剰なケイパビリティなど、悪用される可能性のある一般的なリスクを特定します。各リソースに数値のセキュリティスコアを付け、セキュリティ強化に向けた具体的な推奨事項を提示します。Kubesec は、CLI バイナリ、Docker コンテナ、kubectl プラグイン、アドミッション Webhook、または REST API エンドポイントとして利用できます。
使用する場面
- Kubesec で Kubernetes マニフェストをスキャンするセキュリティ評価を実施する場合
- 関連するセキュリティイベントに対するインシデント対応手順に従う場合
- 定期的なセキュリティテストや監査を実施する場合
- 実践的なテストを通じてセキュリティ制御を検証する場合
前提条件
- Deployment、Pod、DaemonSet、StatefulSet の Kubernetes マニフェストファイル(YAML/JSON)
- ローカルインストール用の Docker または Go ランタイム
- ライブクラスタのリソースをスキャンするための kubectl アクセス
- 自動スキャンを統合するための CI/CD パイプラインへのアクセス
基本概念
セキュリティスコアリングシステム
Kubesec は、セキュリティチェックに基づいて各 Kubernetes リソースにスコアを付けます。
- 正のスコア:セキュリティを強化する設定(readOnlyRootFilesystem、runAsNonRoot)に付与されます
- ゼロまたは負のスコア:セキュリティ制御の欠如や危険な設定を示します
- 重大なアドバイザリ:差し迫ったセキュリティリスクとなる設定にフラグを付けます
チェックカテゴリー
- 権限制御:特権コンテナ、ホスト PID/ネットワークへのアクセス、root での実行をチェックします
- ケイパビリティ:過剰な Linux ケイパビリティ(SYS_ADMIN、NET_RAW)を特定します
- ボリュームマウント:危険なホストパスマウントや、書き込み可能な機密パスを検出します
- リソース制限:CPU/メモリのリソース制約が設定されていることを検証します
- セキュリティコンテキスト:seccomp プロファイル、AppArmor アノテーション、SELinux コンテキストを検証します
インストール
バイナリのインストール
# Linux/macOS
curl -sSL https://github.com/controlplaneio/kubesec/releases/latest/download/kubesec_linux_amd64.tar.gz | \
tar xz -C /usr/local/bin/ kubesec
# Verify installation
kubesec version
Docker のインストール
docker pull kubesec/kubesec:v2
# Scan a manifest file
docker run -i kubesec/kubesec:v2 scan /dev/stdin < deployment.yaml
kubectl プラグイン
kubectl krew install kubesec-scan
kubectl kubesec-scan pod mypod -n default
実践的なスキャン
単一のマニフェストをスキャンする
# Scan a deployment manifest
kubesec scan deployment.yaml
# Scan with JSON output
kubesec scan -o json deployment.yaml
# Scan from stdin
cat pod.yaml | kubesec scan -
出力例
[
{
"object": "Pod/web-app.default",
"valid": true,
"fileName": "pod.yaml",
"message": "Passed with a score of 3 points",
"score": 3,
"scoring": {
"passed": [
{
"id": "ReadOnlyRootFilesystem",
"selector": "containers[] .securityContext .readOnlyRootFilesystem == true",
"reason": "An immutable root filesystem prevents applications from writing to their local disk",
"points": 1
},
{
"id": "RunAsNonRoot",
"selector": "containers[] .securityContext .runAsNonRoot == true",
"reason": "Force the running image to run as a non-root user",
"points": 1
},
{
"id": "LimitsCPU",
"selector": "containers[] .resources .limits .cpu",
"reason": "Enforcing CPU limits prevents DOS via resource exhaustion",
"points": 1
}
],
"advise": [
{
"id": "ApparmorAny",
"selector": "metadata .annotations .\"container.apparmor.security.beta.kubernetes.io/nginx\"",
"reason": "Well defined AppArmor policies reduce the attack surface of the container",
"points": 3
},
{
"id": "ServiceAccountName",
"selector": ".spec .serviceAccountName",
"reason": "Service accounts restrict Kubernetes API access and should be configured",
"points": 3
}
]
}
}
]
複数のリソースをスキャンする
# Scan all YAML files in a directory
for file in manifests/*.yaml; do
echo "=== Scanning $file ==="
kubesec scan "$file"
done
# Scan multi-document YAML
kubesec scan multi-resource.yaml
HTTP API を使用する
# Scan via the public API
curl -sSX POST --data-binary @deployment.yaml \
https://v2.kubesec.io/scan
# Run a local API server
kubesec http --port 8080 &
# Scan against local server
curl -sSX POST --data-binary @deployment.yaml \
http://localhost:8080/scan
CI/CD との統合
GitHub Actions
name: Kubesec Scan
on: [pull_request]
jobs:
kubesec:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Kubesec
run: |
curl -sSL https://github.com/controlplaneio/kubesec/releases/latest/download/kubesec_linux_amd64.tar.gz | \
tar xz -C /usr/local/bin/ kubesec
- name: Scan Manifests
run: |
FAIL=0
for file in k8s/*.yaml; do
SCORE=$(kubesec scan "$file" | jq '.[0].score')
echo "$file: score=$SCORE"
if [ "$SCORE" -lt 0 ]; then
echo "FAIL: $file has critical issues (score: $SCORE)"
FAIL=1
fi
done
exit $FAIL
GitLab CI
kubesec-scan:
stage: security
image: kubesec/kubesec:v2
script:
- |
for file in k8s/*.yaml; do
kubesec scan "$file" > /tmp/result.json
SCORE=$(cat /tmp/result.json | jq '.[0].score')
if [ "$SCORE" -lt 0 ]; then
echo "CRITICAL: $file scored $SCORE"
cat /tmp/result.json | jq '.[0].scoring.critical'
exit 1
fi
done
artifacts:
paths:
- kubesec-results/
アドミッション Webhook
Kubesec を ValidatingWebhookConfiguration としてデプロイし、デプロイ時に安全でないマニフェストを拒否します。
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: kubesec-webhook
webhooks:
- name: kubesec.controlplane.io
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods"]
- apiGroups: ["apps"]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["deployments", "daemonsets", "statefulsets"]
clientConfig:
service:
name: kubesec-webhook
namespace: kube-system
path: /scan
failurePolicy: Fail
sideEffects: None
admissionReviewVersions: ["v1"]
セキュリティチェックのリファレンス
重大なチェック(負のスコア)
| チェック | セレクター | リスク |
|---|---|---|
| 特権 | securityContext.privileged == true | ホストへの完全なアクセス |
| HostPID | spec.hostPID == true | プロセス名前空間からの脱出 |
| HostNetwork | spec.hostNetwork == true | ネットワーク名前空間からの脱出 |
| SYS_ADMIN | capabilities.add contains SYS_ADMIN | root に近い権限 |
ベストプラクティスのチェック(正のスコア)
| チェック | ポイント | 説明 |
|---|---|---|
| ReadOnlyRootFilesystem | +1 | ファイルシステムへの書き込みを防ぎます |
| RunAsNonRoot | +1 | root 以外のユーザーでプロセスを実行します |
| RunAsUser > 10000 | +1 | UID を高くすることで衝突のリスクを軽減します |
| LimitsCPU | +1 | CPU リソースの枯渇を防ぎます |
| LimitsMemory | +1 | メモリリソースの枯渇を防ぎます |
| RequestsCPU | +1 | スケジューラーがリソースを把握できるようにします |
| ServiceAccountName | +3 | サービスアカウントを明示します |
| AppArmor annotation | +3 | カーネルレベルの MAC を適用します |
| Seccomp profile | +4 | システムコールをフィルタリングします |
参考資料
コメント
Markdown 対応