mcpField
S
scanning-kubernetes-manifests-with-kubesec

scanning-kubernetes-manifests-with-kubesec

github.com/mukul975セキュリティ35.2k94 回インストール8 週間前に更新
リポジトリ

scanning-kubernetes-manifests-with-kubesec について

KubesecでKubernetesマニフェストをスキャンするチーム向けのオープンソースセキュリティスキルです。リスクスコアと具体的な強化チェックを、CLI、Docker、kubectl、API、CI/CD、アドミッションWebhookで使う方法を扱います。

主な機能

  1. 01Kubernetesリソースのリスク評価
  2. 02特権とケイパビリティの検査
  3. 03ボリュームマウントとリソース制限の検査
  4. 04セキュリティコンテキストの検査
  5. 05CLI、Docker、APIでのスキャン
  6. 06CI/CDとアドミッションWebhookへの統合

活用シーン

  1. 01Kubernetesマニフェストの監査
  2. 02CI/CDで設定をスキャン
  3. 03デプロイ時に危険なマニフェストを拒否
  4. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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)に付与されます
  • ゼロまたは負のスコア:セキュリティ制御の欠如や危険な設定を示します
  • 重大なアドバイザリ:差し迫ったセキュリティリスクとなる設定にフラグを付けます
チェックカテゴリー
  1. 権限制御:特権コンテナ、ホスト PID/ネットワークへのアクセス、root での実行をチェックします
  2. ケイパビリティ:過剰な Linux ケイパビリティ(SYS_ADMIN、NET_RAW)を特定します
  3. ボリュームマウント:危険なホストパスマウントや、書き込み可能な機密パスを検出します
  4. リソース制限:CPU/メモリのリソース制約が設定されていることを検証します
  5. セキュリティコンテキスト: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ホストへの完全なアクセス
HostPIDspec.hostPID == trueプロセス名前空間からの脱出
HostNetworkspec.hostNetwork == trueネットワーク名前空間からの脱出
SYS_ADMINcapabilities.add contains SYS_ADMINroot に近い権限
ベストプラクティスのチェック(正のスコア)
チェックポイント説明
ReadOnlyRootFilesystem+1ファイルシステムへの書き込みを防ぎます
RunAsNonRoot+1root 以外のユーザーでプロセスを実行します
RunAsUser > 10000+1UID を高くすることで衝突のリスクを軽減します
LimitsCPU+1CPU リソースの枯渇を防ぎます
LimitsMemory+1メモリリソースの枯渇を防ぎます
RequestsCPU+1スケジューラーがリソースを把握できるようにします
ServiceAccountName+3サービスアカウントを明示します
AppArmor annotation+3カーネルレベルの MAC を適用します
Seccomp profile+4システムコールをフィルタリングします

参考資料

コメント