k8s-security-policies について
クラスター運用者やプラットフォームチーム向けの Kubernetes セキュリティガイダンスです。ネットワーク分離、Pod セキュリティ、最小権限 RBAC、ポリシー適用を扱います。
主な機能
- 01Pod Security Standards の設定
- 02NetworkPolicy の例
- 03Role と ClusterRole のガイダンス
- 04OPA Gatekeeper のポリシーパターン
- 05Istio の認証・認可ポリシー
活用シーン
- 01ワークロード間のトラフィック分離
- 02サービスアカウント権限の制限
- 03Namespace 単位での Pod セキュリティ適用
- 04Admission ポリシーによる必須ラベルの適用
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ ormus-solutions/ libreuiux-claude-code --skill k8s-security-policiesインストール後、Claude Code で/k8s-security-policiesを入力して読み込まれたか確認します。
同梱ファイルassets/network-policy-template.yamlreferences/rbac-patterns.md
詳細
Kubernetes セキュリティポリシー
Kubernetes で NetworkPolicy、PodSecurityPolicy、RBAC、Pod Security Standards を実装するための包括的なガイドです。
目的
ネットワークポリシー、ポッドセキュリティ標準、RBAC を使用して、Kubernetes クラスターに多層防御のセキュリティを実装します。
このスキルを使用する場面
- ネットワークセグメンテーションを実装する
- ポッドセキュリティ標準を設定する
- 最小権限アクセスのために RBAC を設定する
- コンプライアンス対応のセキュリティポリシーを作成する
- アドミッション制御を実装する
- マルチテナントクラスターを保護する
Pod Security Standards
1. Privileged(制限なし)
apiVersion: v1
kind: Namespace
metadata:
name: privileged-ns
labels:
pod-security.kubernetes.io/enforce: privileged
pod-security.kubernetes.io/audit: privileged
pod-security.kubernetes.io/warn: privileged
2. Baseline(最小限の制限)
apiVersion: v1
kind: Namespace
metadata:
name: baseline-ns
labels:
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/warn: baseline
3. Restricted(最も厳しい制限)
apiVersion: v1
kind: Namespace
metadata:
name: restricted-ns
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted
ネットワークポリシー
すべてをデフォルトで拒否
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
フロントエンドからバックエンドへの通信を許可
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
DNS を許可
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns
namespace: production
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
name: kube-system
ports:
- protocol: UDP
port: 53
参照: assets/network-policy-template.yaml を参照してください。
RBAC 設定
Role(ネームスペーススコープ)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: production
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
ClusterRole(クラスター全体)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: production
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
name: default
namespace: production
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
参照: references/rbac-patterns.md を参照してください。
ポッドのセキュリティコンテキスト
制限付きポッド
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: myapp:1.0
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
OPA Gatekeeper によるポリシー適用
ConstraintTemplate
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
validation:
openAPIV3Schema:
type: object
properties:
labels:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg, "details": {"missing_labels": missing}}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[_]}
missing := required - provided
count(missing) > 0
msg := sprintf("missing required labels: %v", [missing])
}
Constraint
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: require-app-label
spec:
match:
kinds:
- apiGroups: ["apps"]
kinds: ["Deployment"]
parameters:
labels: ["app", "environment"]
サービスメッシュのセキュリティ(Istio)
PeerAuthentication(mTLS)
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: production
spec:
mtls:
mode: STRICT
AuthorizationPolicy
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-frontend
namespace: production
spec:
selector:
matchLabels:
app: backend
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/production/sa/frontend"]
ベストプラクティス
- ネームスペースレベルでPod Security Standards を実装する
- ネットワークセグメンテーションにネットワークポリシーを使用する
- すべてのサービスアカウントに最小権限の RBAC を適用する
- アドミッション制御を有効にする(OPA Gatekeeper/Kyverno)
- コンテナを root 以外のユーザーで実行する
- ルートファイルシステムを読み取り専用にする
- 必要な場合を除き、すべてのケイパビリティを削除する
- リソースクォータとリミットレンジを実装する
- セキュリティイベントの監査ログを有効にする
- イメージの定期的なセキュリティスキャンを実施する
コンプライアンスフレームワーク
CIS Kubernetes Benchmark
- RBAC 認可を使用する
- 監査ログを有効にする
- Pod Security Standards を使用する
- ネットワークポリシーを設定する
- 保存データのシークレット暗号化を実装する
- ノード認証を有効にする
NIST Cybersecurity Framework
- 多層防御を実装する
- ネットワークセグメンテーションを使用する
- セキュリティ監視を設定する
- アクセス制御を実装する
- ロギングと監視を有効にする
トラブルシューティング
NetworkPolicy が機能しない場合:
# Check if CNI supports NetworkPolicy
kubectl get nodes -o wide
kubectl describe networkpolicy <name>
RBAC で権限が拒否される場合:
# Check effective permissions
kubectl auth can-i list pods --as system:serviceaccount:default:my-sa
kubectl auth can-i '*' '*' --as system:serviceaccount:default:my-sa
参照ファイル
assets/network-policy-template.yaml- ネットワークポリシーの例assets/pod-security-template.yaml- ポッドセキュリティポリシーreferences/rbac-patterns.md- RBAC 設定パターン
関連スキル
k8s-manifest-generator- セキュアなマニフェストの作成に使用gitops-workflow- ポリシーの自動デプロイに使用
コメント
Markdown 対応