# Permission Controler-通过Instance理解Kubernetes的Auth

*这一系列文档都是关于Kubernetes集群内部pods等资源对外部请求的认证与授权的管以及如何使用roles和role binding控制Kubernetes内部资源的访问权限。*

* Kubernetes Permission Controler概览
* Permission Controler-通过Instance理解Kubernetes的Auth
* Permission Controler-通过Instance理解Kubernetes的授权
* Permission Controler-探索Kubernetes的Service Accounts

在生产环境中，Kubernetes管理员使用namespaces隔离集群上的资源。Namespaces在权限控制上扮演着资源的逻辑分界线的角色。

**设想下面的应用场景：**

*运维team中新加入一位同事名字叫Bob，他的主要工作是管理工程师组在Kubernetes上的部署工作。因此运维组的老大必须授权Bob操作engineering namesapces足够的权限。*

下面的实验操作是发生在我的私人Kubernetes集群上，你可以使用具有Kubernetes集群最高权限的任何集群资源上完成下面的实验。

1. 创建名为cred的文件夹，然后通过下面的命令为Bob生成私钥。

```
mkdir cred
cd cred

```

```
openssl genrsa -out bob.key 2048

```

1. 使用私钥生成一个认证签名请求文件

```
openssl req -new -key bob.key -out bob.csr -subj "/CN=bob/O=eng"\n

```

1. 查看认证签名文件

```
cat bob.csr | base64 | tr -d '\n'

```

1. 创建Kubernetes Certificate Signing Request的signing-request.yaml文件，然后将认证签名文件作base64编码后插入到yaml文件中，最后通过命令创建Certificate Signing Request资源。

```
cat >> signing-request.yaml <<EOF
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: bob-csr
spec:
  groups:
  - system:authenticated

  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1lqQ0NBVW9DQVFBd0hURU1NQW9HQTFVRUF3d0RZbTlpTVEwd0N3WURWUVFLREFSbGJtZHVNSUlCSWpBTgpCZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3amJvYldWeHFVd21kUS85SW50T01kNXBieUJtCjZPSEt2aDRsSm5DMEgrNVVWNXNGYUJhMm1TdFVFdG1ENGRuUk0zcFdBUVBPUEdQditaY1NCc1N5QmhYdmswY1kKNGJXcWRLRGdUMnpTWEoyemxTVFdlTUJBcFZwWFBseGRLRE80bXk5YWtjbFFUVmE2ZnJadU5MQTNBQnBBTGxxLwowY05Id0tlVkpGVlJoN0l2bzZ4VlZVY0wyN21YK3ZoMmpjZGZKZkU1bG5lQXRXT2xDL05IZE9TUzhuR3JEcCtUCmhJamI5Q0p4Ty90N3VLWUJOMWM2SG1qRUowTkc2cDZhaVRhZWZiYllONmVhVllOUVdWT2hYNFlqQWNTRWp6clUKOCtrd2drZ2h2YjFtNmV0OHQ3VUYzRlJzNDNiU0xrbExPVDBVUGd1MlRQN3RVajM1WlJweHY5ZUQ1UUlEQVFBQgpvQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdFeTRCZS9vRDlUZ1p0V1hvM2FGNkxwUkpsZGtMYWJBbFE4CkdjVGJ1dlhwNmt4ODhDT0NwZjhIb2tMbEgzeiswajZjWktMUFZIVHdzdzJnbmNJbjBCM0RvL3U3dDlWT0d3RVEKaHpzd0cxSFI3VjUrZ1VEMzdmeXc3MGhZUFg0cGlCbncyNWJqLzljR2ViYTQwTjNqNjBHaUVrWlpUa0JUSzNRVApNWmdTMjB4S1UzS0RIOWJENkFJZlQvbUxXRkRRQURKekhVMm9UQ2hqK3JiUlgwYU5qazJVck42dWNqMEx0T0tlCjdoMWJ4YVJjU3BEcDhTWkhYODRwcWY1eVFFWEJ5dEt0ZjF5T3dBK2tCVldPdS81SkJWQVpQTmRyVElKR2g4RmEKbjF0S0E4RngyYStLdkN2b2txQjlrYzFVQ3U0d2QyRHVncWJKUmhwUGRiaStSM3htenlzPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K

  usages:
  - digital signature
  - key encipherment
  - server auth
> EOF

```

```
kubectl apply -f signing-request.yaml

```

1. 验证 Certificate Signing Request (CSR) 资源是否生成

```
kbuectl get csr

```

![](/files/-LqzOpkZDAs6YNm8ZqZR)

*从上图可见csr资源对应的状态仍然是Pending，集群管理员使用approve命令使其变成active*

1. 将csr资源的状态变更为Active

```
kubectl certificate approve bob-csr

kubectl get csr

```

![](/files/-LqzOu2p1AZWCuAl7og-)

*从上图可见csr资源已经变成Approved,Issued状态*

1. 获取认证的签名信息

```
kubectl get csr bob-csr -o jsonpath='{.status.certificate}' | base64 --decode > bob.crt

```

上面的bob.crt文件是用来对Bob进行认证和授权的文件。我们从Kubernetes中获得bob.key私钥文件和bob.crt认证文件后，我们就可以对bob账户做授权工作了。

1. 将Bob添加为Kubernetes集群用户

```
kubectl config set-credentials bob --client-certificate=bob.crt --client-key=bob.key

```

![](/files/-LqzOyza19VKvPmcVawy)

*通过上面命令可见bob用户已经添加到Kubernetes集群中*

1. 创建engineering namesapce

```
kubectl create namespace enginerging

```

1. 验证

* 验证kubernets admin管理员是否有操作engineering namespace的资源

```
kubectl auth can-i list pods --namespace engineering

yes
```

* 验证bob管理员是否有操作engineering namespace的资源

```
kubectl auth can-i list pods --namespace engineering --as bob

no
```

明显可见Bob还不能操作enginering namespace的资源。这是为什么？

即便我们对Bob做关于Kubernetes集群访问的认证，但是我们并没有对Bob授权操作Kubernets资源的行为。

在这一系列文章的下一章节中，我将带你对bob用户[授权操作Kubernetes资源的行为](https://juejin.im/post/5d6a3ea3f265da03cf7aa4dc)。这主要是关于 role和role binding的知识，继续加油哦！

*文章翻译自*[*A Practical Approach to Understanding Kubernetes Authentication*](https://link.juejin.im?target=https%3A%2F%2Fthenewstack.io%2Fa-practical-approach-to-understanding-kubernetes-authentication%2F) *，行文略有删减。*


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.k8stech.net/permission-controler-tong-guo-instance-li-jie-kubernetes-de-auth.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
