Kubernetes 认证授权实验总结

实验目标

通过一系列实验步骤,深入理解 Kubernetes 中的认证和授权机制,包括用户账户和服务账户的创建、RBAC(基于角色的访问控制)的配置与应用,以及如何通过这些机制实现对 Kubernetes 资源的安全访问控制。

实验环境

  • Kubernetes 集群(已部署并运行)

  • kubectl 命令行工具(已配置并连接到集群)

  • 一台具有管理员权限的主机(用于执行命令)


实验一:创建用户账户并进行认证

实验目的

创建一个用户账户,并通过证书认证的方式使其能够访问 Kubernetes 集群。通过此实验,了解 Kubernetes 中用户账户的创建过程以及证书认证机制。

实验步骤

  1. 创建用户证书

    • 在 Kubernetes 集群的证书目录下,生成用户证书。

      • 目的:生成用户的私钥证书签名请求(CSR),并通过集群的 CA 证书签名生成用户证书。

    cd /etc/kubernetes/pki/
    openssl genrsa -out admin.key 2048
    openssl req -new -key admin.key -out admin.csr -subj "/CN=admin"
    openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out admin.crt -days 365
  2. 将用户证书添加到 Kubernetes 配置

    kubectl config set-credentials admin --client-certificate /etc/kubernetes/pki/admin.crt --client-key /etc/kubernetes/pki/admin.key --embed-certs=true
    • 目的:将生成的用户证书和私钥添加到 Kubernetes 的配置文件中,创建一个用户实体

  3. 为用户创建上下文

    kubectl config set-context admin@kubernetes --cluster kubernetes --user admin
    • 目的:创建一个上下文,将用户与集群关联起来,方便后续切换用户。

  4. 切换到新用户并测试认证

    kubectl config use-context admin@kubernetes
    kubectl get pods
    • 目的:切换到新创建的用户上下文,并尝试访问集群资源。由于未授权,预期会返回“Forbidden”错误。

  5. 切换回管理员上下文

    kubectl config use-context kubernetes-admin@kubernetes
    • 目的:切换回管理员上下文,以便后续进行授权操作。


实验二:创建服务账户并绑定到 Pod

实验目的

创建一个服务账户,并将其绑定到 Pod 中,使 Pod 能够以服务账户的身份访问 Kubernetes API。通过此实验,了解服务账户的创建、绑定过程以及其在 Pod 中的应用。

实验步骤

  1. 创建服务账户

    kubectl create sa admin
    • 目的:创建一个名为 admin 的服务账户。

  2. 查看服务账户

    kubectl describe sa admin
    • 目的:查看服务账户的详细信息,确认其已成功创建。

  3. 创建私有仓库的 Secret

    kubectl create secret docker-registry docker-login --docker-username admin --docker-password admin --docker-server reg.admin.org --docker-email [email protected]
    • 目的:创建一个用于访问私有 Docker 仓库的 Secret。

  4. 将 Secret 注入服务账户

    kubectl edit sa admin
    • 在编辑的 YAML 文件中,添加 imagePullSecrets 字段,将 docker-login Secret 注入服务账户。

    imagePullSecrets:
    - name: docker-login
    • 目的:将私有仓库的 Secret 关联到服务账户,使服务账户能够拉取私有仓库中的镜像

  5. 创建 Pod 并绑定服务账户

    apiVersion: v1
    kind: Pod
    metadata:
      name: testpod
    spec:
      serviceAccountName: admin
      containers:
      - image: reg.admin.org/nginx/nginx:latest
        name: testpod

    kubectl apply -f example1.yml
    • 目的:创建一个 Pod,并通过 serviceAccountName 字段将其绑定到 admin 服务账户

  6. 验证 Pod 是否正常运行

    kubectl get pods
    • 目的:验证 Pod 是否成功启动并运行,确认服务账户的绑定是否生效。


实验三:基于角色的访问控制(RBAC)授权

实验目的

通过 RBAC 机制为用户和服务账户分配权限,实现对 Kubernetes 资源的细粒度访问控制。通过此实验,了解 RBAC 的基本概念、角色和角色绑定的创建与应用。

实验步骤

  1. 创建 Role

    kubectl create role myrole --dry-run=client --verb=get --resource pods -o yaml > myrole.yml
    • 编辑 myrole.yml 文件,扩展权限范围:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: myrole
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      verbs:
      - get
      - watch
      - list
      - create
      - update
      - patch
      - delete

    kubectl apply -f myrole.yml
    • 目的:创建一个 Role,定义用户对 Pod 资源的访问权限

  2. 创建 RoleBinding

    kubectl create rolebinding admin --role myrole --namespace default --user admin --dry-run=client -o yaml > rolebinding-myrole.yml
    • 编辑 rolebinding-myrole.yml 文件:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: admin
      namespace: default
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: myrole
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: admin

    kubectl apply -f rolebinding-myrole.yml
    • 目的将用户 admin 绑定到 Role myrole,使其获得对 Pod 资源的操作权限。

  3. 切换到用户上下文并测试授权

    kubectl config use-context admin@kubernetes
    kubectl get pods
    • 目的:切换到用户上下文,验证用户是否能够访问 Pod 资源

  4. 尝试访问未授权的资源

    kubectl get svc
    • 目的:验证用户是否无法访问未授权的资源(如 Service),预期返回“Forbidden”错误。

  5. 切换回管理员上下文

    kubectl config use-context kubernetes-admin@kubernetes
    • 目的:切换回管理员上下文,以便后续操作


实验四:ClusterRole 授权

实验目的

创建 ClusterRole 并绑定到用户,使其能够跨命名空间访问集群资源。通过此实验,了解 ClusterRole 的创建与应用,以及其与 Role 的区别。

实验步骤

  1. 创建 ClusterRole

    kubectl create clusterrole myclusterrole --resource=deployment --verb get --dry-run=client -o yaml > myclusterrole.yml
    • 编辑 myclusterrole.yml 文件,扩展权限范围:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: myclusterrole
    rules:
    - apiGroups:
      - apps
      resources:
      - deployments
      verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    - apiGroups:
      - ""
      resources:
      - pods
      verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete

    kubectl apply -f myclusterrole.yml
    • 目的:创建一个 ClusterRole,定义用户对 Deployment 和 Pod 资源的全局访问权限。

  2. 创建 ClusterRoleBinding

    kubectl create clusterrolebinding clusterrolebind-myclusterrole --clusterrole myclusterrole --user admin --dry-run=client -o yaml > clusterrolebind-myclusterrole.yml
    • 编辑 clusterrolebind-myclusterrole.yml 文件:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: clusterrolebind-myclusterrole
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: myclusterrole
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: admin

    kubectl apply -f clusterrolebind-myclusterrole.yml
    • 目的:将用户 admin 绑定到 ClusterRole myclusterrole,使其获得对 Deployment 和 Pod 资源的全局访问权限。

  3. 切换到用户上下文并测试授权

    kubectl config use-context admin@kubernetes
    kubectl get pods -A
    kubectl get deployments.apps -A
    • 目的:验证用户是否能够跨命名空间访问 Pod 和 Deployment 资源。

  4. 尝试访问未授权的资源

    kubectl get svc -A
    • 目的:验证用户是否无法访问未授权的资源(如 Service),预期返回“Forbidden”错误。

  5. 切换回管理员上下文

    kubectl config use-context kubernetes-admin@kubernetes
    • 目的:切换回管理员上下文,完成实验。


实验总结

通过以上实验,我们完成了以下任务:

  1. 创建用户账户并使用证书认证机制使其能够访问 Kubernetes 集群。

  2. 创建服务账户,并将其绑定到 Pod 中,使 Pod 能够以服务账户的身份访问 Kubernetes API。

  3. 使用 RBAC 机制为用户分配权限,通过 Role 和 RoleBinding 实现对 Pod 资源的细粒度访问控制。

  4. 使用 ClusterRole 和 ClusterRoleBinding 为用户分配全局权限,使其能够跨命名空间访问 Deployment 和 Pod 资源。

这些实验帮助我们深入理解了 Kubernetes 中的认证和授权机制,以及如何通过这些机制实现对集群资源的安全访问控制。

你可能感兴趣的:(kubernetes,容器,云原生)