K8s 学习:常用命令 100 条(五)- 安全加固

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