Menu

Kubernetes 用户与身份认证机制为集群安全提供了基础保障,合理区分用户类型并配置多重认证策略,是实现最小权限和合规访问的关键。

理解 Kubernetes 中的用户类型

在 Kubernetes 集群中,用户分为两大类,分别适用于不同的认证与授权场景。

普通用户

普通用户通常由外部系统管理,例如:

注意事项

Service Account

Service Account 由 Kubernetes API 管理,具备如下特性:

请求身份绑定

每个 API 请求都绑定到以下身份之一:

集群内外的所有进程(如 kubectl、kubelet、控制平面组件)都需认证,否则视为匿名用户。

认证策略详解

Kubernetes 支持多种认证插件,常见方式包括客户端证书、bearer token、认证代理和 HTTP 基本认证。

认证属性

认证插件会为请求关联以下属性:

多重认证

主要认证方法

Kubernetes 支持多种认证方式,适应不同场景需求。

X509 客户端证书

通过配置 --client-ca-file 启用:

--client-ca-file=SOMEFILE

示例

openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2"

静态 Token 文件

通过 --token-auth-file 启用:

--token-auth-file=SOMEFILE

请求示例

Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269

Bootstrap Token

Bootstrap Token 用于集群初始化,格式为 [a-z0-9]{6}.[a-z0-9]{16}

启用配置

--enable-bootstrap-token-auth
# Controller Manager
--controllers=*,tokencleaner

静态密码文件

通过 --basic-auth-file 启用:

--basic-auth-file=SOMEFILE

请求示例

Authorization: Basic BASE64ENCODED(USER:PASSWORD)

Service Account Token

Service Account 认证自动启用,使用签名 bearer token。

创建 Service Account

kubectl create serviceaccount jenkins

查看 Secret

kubectl get secret jenkins-token-1yvwg -o yaml

Pod 挂载示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  template:
    spec:
      serviceAccountName: bob-the-bot
      containers:
      - name: nginx
        image: nginx:1.14.2

OpenID Connect Token

OpenID Connect(OIDC)基于 OAuth2,可集成外部身份提供商。

下图展示了 OIDC 认证流程:

Kubernetes OpenID Connect Flow {width=1116 height=517}

认证流程

  1. 登录身份提供商
  2. 获取 access_tokenid_tokenrefresh_token
  3. 使用 id_token 作为 bearer token
  4. API server 验证 JWT
  5. 完成授权

API Server 配置参数

OIDC 认证相关参数说明

参数 描述 是否必需
--oidc-issuer-url 身份提供商 URL
--oidc-client-id 客户端 ID
--oidc-username-claim JWT 用户名字段
--oidc-groups-claim JWT 用户组字段
--oidc-ca-file 身份提供商 CA 证书

kubectl 配置示例

kubectl config set-credentials mmosley \
    --auth-provider=oidc \
    --auth-provider-arg=idp-issuer-url=https://oidcidp.example.com \
    --auth-provider-arg=client-id=kubernetes \
    --auth-provider-arg=client-secret=1db158f6-177d-4d9c-8a8b-d36869918ec5 \
    --auth-provider-arg=refresh-token=q1bKLFOyUiosTfawzA93TzZ... \
    --auth-provider-arg=id-token=eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8...

Webhook Token 认证

Webhook 认证允许远程服务验证 bearer token。

配置文件示例

clusters:
  - name: name-of-remote-authn-service
    cluster:
      certificate-authority: /path/to/ca.pem
      server: https://authn.example.com/authenticate

users:
  - name: name-of-api-server
    user:
      client-certificate: /path/to/cert.pem
      client-key: /path/to/key.pem

current-context: webhook
contexts:
- context:
    cluster: name-of-remote-authn-service
    user: name-of-api-server
  name: webhook

请求格式

{
  "apiVersion": "authentication.k8s.io/v1",
  "kind": "TokenReview",
  "spec": {
    "token": "(BEARERTOKEN)"
  }
}

成功响应

{
  "apiVersion": "authentication.k8s.io/v1",
  "kind": "TokenReview",
  "status": {
    "authenticated": true,
    "user": {
      "username": "janedoe@example.com",
      "uid": "42",
      "groups": ["developers", "qa"]
    }
  }
}

认证代理

API server 可通过请求 header 识别用户身份。

配置示例

--requestheader-username-headers=X-Remote-User
--requestheader-group-headers=X-Remote-Group
--requestheader-extra-headers-prefix=X-Remote-Extra-

请求示例

GET / HTTP/1.1
X-Remote-User: fido
X-Remote-Group: dogs
X-Remote-Group: dachshunds
X-Remote-Extra-Scopes: openid

高级认证功能

Kubernetes 还支持匿名请求和用户模拟等高级认证能力。

匿名请求

用户模拟

管理员可通过 header 模拟其他用户,便于调试授权策略。

kubectl 使用

kubectl drain mynode --as=superman --as-group=system:masters

RBAC 权限配置

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: impersonator
rules:
- apiGroups: [""]
  resources: ["users", "groups", "serviceaccounts"]
  verbs: ["impersonate"]

证书管理

Kubernetes 支持多种证书管理方式,保障集群通信安全。

使用 OpenSSL 生成证书

生成 CA 证书

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt

生成服务器证书

openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=${MASTER_IP}" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000

API Server 配置

--client-ca-file=/path/to/ca.crt
--tls-cert-file=/path/to/server.crt
--tls-private-key-file=/path/to/server.key

使用 certificates.k8s.io API

Kubernetes 提供 certificates.k8s.io API 实现自动化证书生命周期管理。

最佳实践

为提升集群安全性,建议遵循以下最佳实践:

Kubernetes 身份认证最佳实践

类别 建议与说明
多重认证 结合多种认证方式提升安全性
最小权限原则 为不同用户和服务分配最小必需权限
定期轮换 定期更新证书和 token
审计日志 启用审计功能跟踪认证与授权活动
外部认证 企业环境集成 LDAP、OIDC 等系统

总结

Kubernetes 用户与身份认证体系为集群安全提供了坚实基础。通过合理区分用户类型、配置多重认证方式、强化证书管理和最小权限原则,可有效防止未授权访问和权限滥用,保障云原生环境的合规与安全。

参考文献


Menu