K8s 学习:常用命令 100 条(五)- 安全加固
系列文章: K8s 命令实战指南
适用人群: 安全工程师、运维工程师、DevOps 工程师
阅读时间: 18 分钟
前言
安全是 Kubernetes 集群的重中之重。本文介绍如何使用 kubectl 命令进行安全管理、权限控制和安全加固。
一、RBAC 权限管理
1.1 角色(Role)管理
# 查看所有 Role
kubectl get roles --all-namespaces
# 查看指定命名空间的 Role
kubectl get roles -n <namespace>
# 查看 Role 详情
kubectl describe role <role-name> -n <namespace>
# 创建 Role(YAML)
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
EOF
# 创建 Role(命令行)
kubectl create role pod-reader --verb=get,list,watch --resource=pods -n default
# 删除 Role
kubectl delete role <role-name> -n <namespace>
# 编辑 Role
kubectl edit role <role-name> -n <namespace>
# 查看 Role 的规则
kubectl get role <role-name> -n <namespace> -o yaml
使用场景:
- 命名空间级别权限控制
- 最小权限原则
- 职责分离
- 多租户环境
1.2 集群角色(ClusterRole)管理
# 查看所有 ClusterRole
kubectl get clusterroles
# 查看 ClusterRole 详情
kubectl describe clusterrole <clusterrole-name>
# 创建 ClusterRole(YAML)
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
EOF
# 创建 ClusterRole(命令行)
kubectl create clusterrole node-reader --verb=get,list,watch --resource=nodes
# 删除 ClusterRole
kubectl delete clusterrole <clusterrole-name>
# 编辑 ClusterRole
kubectl edit clusterrole <clusterrole-name>
# 查看系统内置 ClusterRole
kubectl get clusterroles | grep system
# 查看聚合 ClusterRole
kubectl get clusterrole <clusterrole-name> -o jsonpath='{.aggregationRule}'
使用场景:
- 集群级别权限控制
- 节点资源访问
- 集群资源管理
- 跨命名空间权限
1.3 角色绑定(RoleBinding)管理
# 查看所有 RoleBinding
kubectl get rolebindings --all-namespaces
# 查看指定命名空间的 RoleBinding
kubectl get rolebindings -n <namespace>
# 查看 RoleBinding 详情
kubectl describe rolebinding <rolebinding-name> -n <namespace>
# 创建 RoleBinding(YAML)
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
EOF
# 创建 RoleBinding(命令行)
kubectl create rolebinding read-pods --role=pod-reader --user=jane -n default
# 创建 RoleBinding(ServiceAccount)
kubectl create rolebinding read-pods --role=pod-reader --serviceaccount=default:mysa -n default
# 删除 RoleBinding
kubectl delete rolebinding <rolebinding-name> -n <namespace>
# 编辑 RoleBinding
kubectl edit rolebinding <rolebinding-name> -n <namespace>
使用场景:
- 用户权限绑定
- 服务账号授权
- 角色分配
- 权限管理
1.4 集群角色绑定(ClusterRoleBinding)管理
# 查看所有 ClusterRoleBinding
kubectl get clusterrolebindings
# 查看 ClusterRoleBinding 详情
kubectl describe clusterrolebinding <clusterrolebinding-name>
# 创建 ClusterRoleBinding(YAML)
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-nodes
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: node-reader
apiGroup: rbac.authorization.k8s.io
EOF
# 创建 ClusterRoleBinding(命令行)
kubectl create clusterrolebinding read-nodes --clusterrole=node-reader --user=jane
# 创建 ClusterRoleBinding(ServiceAccount)
kubectl create clusterrolebinding read-nodes --clusterrole=node-reader --serviceaccount=default:mysa
# 删除 ClusterRoleBinding
kubectl delete clusterrolebinding <clusterrolebinding-name>
# 编辑 ClusterRoleBinding
kubectl edit clusterrolebinding <clusterrolebinding-name>
# 查看管理员权限绑定
kubectl get clusterrolebinding cluster-admin -o yaml
使用场景:
- 集群管理员授权
- 集群级别权限绑定
- 服务账号集群权限
- 超级管理员配置
1.5 权限检查
# 检查用户是否有权限执行操作
kubectl auth can-i create deployments --as=jane
kubectl auth can-i delete pods --as=jane -n default
# 检查 ServiceAccount 权限
kubectl auth can-i list pods --as=system:serviceaccount:default:mysa
# 检查特定资源的权限
kubectl auth can-i get pods --resource-name=my-pod -n default
# 列出用户的所有权限
kubectl auth can-i --list --as=jane
# 检查用户在命名空间的权限
kubectl auth can-i --list --as=jane -n default
# 检查是否有特定角色的权限
kubectl auth can-i --list --as=jane | grep pod-reader
# 查看角色的权限范围
kubectl auth can-i --list --as=system:anonymous
使用场景:
- 权限验证
- 访问控制测试
- 安全审计
- 权限排查
二、服务账号管理
2.1 服务账号操作
# 查看所有 ServiceAccount
kubectl get serviceaccounts --all-namespaces
# 查看指定命名空间的 ServiceAccount
kubectl get serviceaccounts -n <namespace>
# 查看 ServiceAccount 详情
kubectl describe serviceaccount <sa-name> -n <namespace>
# 创建 ServiceAccount(YAML)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
EOF
# 创建 ServiceAccount(命令行)
kubectl create serviceaccount my-service-account -n default
# 删除 ServiceAccount
kubectl delete serviceaccount <sa-name> -n <namespace>
# 编辑 ServiceAccount
kubectl edit serviceaccount <sa-name> -n <namespace>
# 查看 ServiceAccount 的 Secret
kubectl get serviceaccount <sa-name> -n <namespace> -o jsonpath='{.secrets}'
# 查看 ServiceAccount 的 Token
kubectl get secret <secret-name> -n <namespace> -o jsonpath='{.data.token}' | base64 --decode
使用场景:
- Pod 身份认证
- API 访问认证
- 服务间认证
- CI/CD 认证
2.2 服务账号权限绑定
# 为 ServiceAccount 授予 Role
kubectl create rolebinding my-sa-binding --role=pod-reader --serviceaccount=default:my-service-account -n default
# 为 ServiceAccount 授予 ClusterRole
kubectl create clusterrolebinding my-sa-cluster-binding --clusterrole=node-reader --serviceaccount=default:my-service-account
# 在 Pod 中使用 ServiceAccount
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-service-account
containers:
- name: my-container
image: nginx
EOF
# 查看 Pod 使用的 ServiceAccount
kubectl get pod <pod-name> -o jsonpath='{.spec.serviceAccountName}'
# 查看 ServiceAccount 的镜像拉取密钥
kubectl get serviceaccount <sa-name> -n <namespace> -o jsonpath='{.imagePullSecrets}'
使用场景:
- Pod 权限控制
- 最小权限原则
- 服务账号隔离
- 安全最佳实践
三、网络策略(Network Policy)
3.1 网络策略管理
# 查看所有 NetworkPolicy
kubectl get networkpolicies --all-namespaces
# 查看指定命名空间的 NetworkPolicy
kubectl get networkpolicies -n <namespace>
# 查看 NetworkPolicy 详情
kubectl describe networkpolicy <policy-name> -n <namespace>
# 创建 NetworkPolicy(YAML)
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
EOF
# 创建允许特定流量的 NetworkPolicy
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-nginx
namespace: default
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
access: allowed
ports:
- protocol: TCP
port: 80
EOF
# 删除 NetworkPolicy
kubectl delete networkpolicy <policy-name> -n <namespace>
# 编辑 NetworkPolicy
kubectl edit networkpolicy <policy-name> -n <namespace>
使用场景:
- 网络隔离
- 访问控制
- 多租户隔离
- 安全加固
3.2 常用网络策略示例
# 拒绝所有入站流量
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
EOF
# 拒绝所有出站流量
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-egress
spec:
podSelector: {}
policyTypes:
- Egress
EOF
# 允许特定命名空间的流量
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-namespace
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
name: production
EOF
# 允许 DNS 查询
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns
spec:
podSelector: {}
egress:
- to:
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
EOF
使用场景:
- 默认拒绝策略
- 精细化访问控制
- 命名空间隔离
- 服务隔离
四、Pod 安全策略
4.1 Pod Security Standards(PSS)
# 查看命名空间的 Pod Security 标签
kubectl get namespace <namespace> -o jsonpath='{.metadata.labels}'
# 设置命名空间的 Pod Security 标准
kubectl label namespace <namespace> pod-security.kubernetes.io/enforce=restricted
kubectl label namespace <namespace> pod-security.kubernetes.io/audit=restricted
kubectl label namespace <namespace> pod-security.kubernetes.io/warn=restricted
# 查看三种安全级别
# privileged - 不限制(默认)
# baseline - 基础限制
# restricted - 严格限制
# 移除 Pod Security 标签
kubectl label namespace <namespace> pod-security.kubernetes.io/enforce-
# 验证 Pod Security 配置
kubectl get namespace <namespace> -o yaml | grep pod-security
使用场景:
- Pod 安全加固
- 特权控制
- 容器安全
- 合规要求
4.2 安全上下文(Security Context)
# 创建安全上下文的 Pod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: security-context-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- name: my-container
image: nginx
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
EOF
# 查看 Pod 的安全上下文
kubectl get pod <pod-name> -o jsonpath='{.spec.securityContext}'
# 查看容器的安全上下文
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].securityContext}'
# 查看容器的 capabilities
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].securityContext.capabilities}'
# 验证 Pod 是否以非 root 运行
kubectl exec <pod-name> -- id
kubectl exec <pod-name> -- ps aux | grep nginx
使用场景:
- 非 root 用户运行
- 只读文件系统
- 能力控制(Capabilities)
- 特权控制
五、镜像安全
5.1 镜像签名验证
# 查看镜像签名(需要 cosign)
cosign verify <image-name>:<tag>
# 签名镜像
cosign sign -key cosign.key <image-name>:<tag>
# 验证镜像签名
cosign verify -key cosign.pub <image-name>:<tag>
# 查看镜像摘要
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].image}'
# 使用镜像摘要(推荐)
kubectl set image deployment/<deployment-name> <container-name>=<image-name>@sha256:<digest>
# 查看镜像拉取策略
kubectl get pod <pod-name> -o jsonpath='{.spec.containers[*].imagePullPolicy}'
# 设置镜像拉取策略为 Always
kubectl patch deployment <deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"<container-name>","imagePullPolicy":"Always"}]}}}}'
使用场景:
- 镜像完整性验证
- 防止镜像篡改
- 安全镜像拉取
- 镜像来源验证
5.2 镜像漏洞扫描
# 使用 Trivy 扫描镜像
trivy image <image-name>:<tag>
# 使用 Clair 扫描镜像
clair-scanner <image-name>:<tag>
# 使用 Anchore 扫描镜像
anchore-cli image add <image-name>:<tag>
anchore-cli image vuln <image-name>:<tag> all
# 扫描 Pod 中的所有镜像
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}' | tr ' ' '\n' | sort | uniq | xargs -I {} trivy image {}
# 导出漏洞报告
trivy image --output report.json <image-name>:<tag>
# 只显示高危和严重漏洞
trivy image --severity HIGH,CRITICAL <image-name>:<tag>
使用场景:
- 漏洞检测
- 安全审计
- 镜像评估
- 合规检查
5.3 镜像拉取密钥管理
# 创建 Docker Registry Secret
kubectl create secret docker-registry my-registry-key \
--docker-server=<registry-server> \
--docker-username=<username> \
--docker-password=<password> \
--docker-email=<email>
# 查看 Secret
kubectl get secret my-registry-key -o yaml
# 在 Pod 中使用镜像拉取密钥
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: private-pod
spec:
imagePullSecrets:
- name: my-registry-key
containers:
- name: my-container
image: <private-registry>/<image>:<tag>
EOF
# 为 ServiceAccount 添加镜像拉取密钥
kubectl patch serviceaccount default -p '{"imagePullSecrets":[{"name":"my-registry-key"}]}'
# 查看 ServiceAccount 的镜像拉取密钥
kubectl get serviceaccount default -o jsonpath='{.imagePullSecrets}'
使用场景:
- 私有镜像仓库认证
- 安全镜像拉取
- 凭证管理
- 自动化部署
六、证书管理
6.1 证书查看
# 查看证书有效期(kubeadm)
kubeadm certs check-expiration
# 查看 API Server 证书
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
# 查看 kubelet 证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -noout
# 查看 etcd 证书
openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -text -noout
# 查看证书过期时间
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
# 查看证书主体
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -subject
# 查看证书颁发者
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -issuer
# 查看 CA 证书
openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout
使用场景:
- 证书有效期检查
- 证书内容查看
- 证书验证
- 证书更新
6.2 证书更新
# 更新所有证书(kubeadm)
kubeadm certs renew all
# 更新特定证书
kubeadm certs renew apiserver
kubeadm certs renew apiserver-kubelet-client
kubeadm certs renew front-proxy-client
kubeadm certs renew etcd-server
kubeadm certs renew etcd-peer
kubeadm certs renew etcd-healthcheck-client
# 更新 kubeconfig
kubeadm init phase kubeconfig all
# 重启服务使证书生效
kubectl rollout restart deployment -n kube-system
systemctl restart kubelet
systemctl restart docker
# 验证证书更新
kubeadm certs check-expiration
使用场景:
- 证书过期更新
- 定期证书轮换
- 安全加固
- 合规要求
6.3 证书轮换
# 启用 kubelet 证书轮换
cat <<EOF | kubectl apply -f -
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
rotateCertificates: true
EOF
# 查看 kubelet 证书轮换状态
kubectl get csr
# 手动批准 CSR
kubectl certificate approve <csr-name>
# 拒绝 CSR
kubectl certificate deny <csr-name>
# 查看待处理的 CSR
kubectl get csr | grep Pending
# 自动批准 CSR(需要配置 ClusterRole)
kubectl create clusterrolebinding csr-approver --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
使用场景:
- 自动证书轮换
- 节点证书管理
- 证书审批
- 安全自动化
七、审计日志
7.1 审计日志配置
# 查看审计日志配置
cat /etc/kubernetes/audit/audit.yaml
# 查看审计日志文件
tail -f /var/log/kubernetes/audit.log
# 查看审计日志大小
ls -lh /var/log/kubernetes/audit.log
# 查看审计策略
cat /etc/kubernetes/audit/audit.yaml | grep -A 10 "rules:"
# 修改审计策略
vi /etc/kubernetes/audit/audit.yaml
# 重启 API Server 使配置生效
kubectl rollout restart deployment -n kube-system kube-apiserver
使用场景:
- 安全审计
- 操作追踪
- 合规检查
- 事件溯源
7.2 审计日志查询
# 查看最近的审计日志
tail -n 100 /var/log/kubernetes/audit.log | jq .
# 筛选特定用户的操作
cat /var/log/kubernetes/audit.log | jq 'select(.user.username=="admin")'
# 筛选特定资源的操作
cat /var/log/kubernetes/audit.log | jq 'select(.objectRef.resource=="pods")'
# 筛选特定操作类型
cat /var/log/kubernetes/audit.log | jq 'select(.verb=="delete")'
cat /var/log/kubernetes/audit.log | jq 'select(.verb=="create")'
# 筛选失败的操作
cat /var/log/kubernetes/audit.log | jq 'select(.responseStatus.code>=400)'
# 统计操作次数
cat /var/log/kubernetes/audit.log | jq -r '.verb' | sort | uniq -c
# 统计用户操作次数
cat /var/log/kubernetes/audit.log | jq -r '.user.username' | sort | uniq -c
# 导出审计日志
cat /var/log/kubernetes/audit.log | jq . > audit-export.json
使用场景:
- 操作审计
- 用户行为分析
- 安全事件调查
- 合规报告
八、安全加固最佳实践
8.1 集群安全检查
# 使用 kube-bench 检查集群安全
kube-bench run --targets master
kube-bench run --targets node
# 使用 kube-hunter 检查集群漏洞
kube-hunter --remote
# 检查匿名访问
kubectl get clusterrolebinding cluster-admin -o yaml | grep system:anonymous
# 检查默认 ServiceAccount 权限
kubectl get clusterrolebinding | grep default
# 检查未加密的 Secret
kubectl get secrets --all-namespaces -o jsonpath='{.items[?(@.type=="Opaque")].metadata.name}'
# 检查特权 Pod
kubectl get pods --all-namespaces -o jsonpath='{.items[?(@.spec.containers[*].securityContext.privileged==true)].metadata.name}'
# 检查 hostPath 挂载
kubectl get pods --all-namespaces -o jsonpath='{.items[?(@.spec.volumes[*].hostPath)].metadata.name}'
使用场景:
- 安全基线检查
- 漏洞扫描
- 安全评估
- 合规检查
8.2 安全加固措施
# 禁用匿名访问
kubectl delete clusterrolebinding cluster-anonymous
# 限制默认 ServiceAccount 权限
kubectl patch clusterrolebinding default -p '{"subjects":null}'
# 启用 Pod Security Standards
kubectl label namespace default pod-security.kubernetes.io/enforce=restricted
# 启用网络策略
kubectl apply -f deny-all-network-policy.yaml
# 启用审计日志
kubectl apply -f audit-policy.yaml
# 定期轮换证书
kubeadm certs renew all
# 更新 kubeconfig
kubeadm init phase kubeconfig all
# 重启服务
systemctl restart kubelet
systemctl restart docker
使用场景:
- 集群加固
- 安全基线
- 合规要求
- 安全最佳实践
九、总结
9.1 安全体系
认证(Authentication)
↓
授权(RBAC)
↓
准入控制(Admission Control)
↓
网络策略(Network Policy)
↓
Pod 安全(Security Context)
↓
审计日志(Audit Log)
9.2 安全检查清单
- 禁用匿名访问
- 配置 RBAC 最小权限
- 启用 Network Policy
- 启用 Pod Security Standards
- 配置 Security Context
- 镜像签名验证
- 镜像漏洞扫描
- 定期证书轮换
- 启用审计日志
- 定期安全扫描
9.3 常用安全命令速查
| 场景 | 命令 |
|---|---|
| 权限检查 | kubectl auth can-i create pods |
| 查看角色 | kubectl get roles --all-namespaces |
| 查看绑定 | kubectl get rolebindings |
| 网络策略 | kubectl get networkpolicies |
| 证书检查 | kubeadm certs check-expiration |
| 证书更新 | kubeadm certs renew all |
| 审计日志 | cat /var/log/kubernetes/audit.log |
| 安全扫描 | kube-bench run |
参考资料
作者: PaPaBot
发布时间: 2026-03-07
标签: #Kubernetes #K8s #DevOps #安全 #RBAC
本文属于《K8s 命令实战指南》系列文章第五篇(完结篇)
Views: 0
