一、网络策略Network Policy
默认情况下,k8s集群网络没有任何网络限制,Pod可以与任何其他Pod通信,此时为了减少网络风险暴露面,防止Pod被失陷后进行横向的移动,可通过网络策略(NetworkPolicy)进行控制,网络策略是K8S的一个资源,可用于限制Pod出入流量,提供pod级别和Namespace级别网络访问控制。类似于在路由器上配置访问控制列表,支持方向、源目的段、namespace选择器、pod选择器、端口、协议。Flannel不支持,需要calico网络。
进入到名字为web的Pod中去:
Web的IP地址为10.244.1.5,网关地址为10.244.1.1,也即是worker2上CNI0的IP地址:
Worker2:
在web 这个pod中ping nginxdemo的IP地址10.244.0.6:
在web这个Pod中ping 10.244.1.1
在web这个pod中ping node的eth0接口IP地址:
通过以上测试说明在缺省情况下,对于一个Pod其出入是没有做任何限制的。
由于我使用的网络插件是flannel,flannel不支持networkpolicy,这里不再做测试,具体可以参考k8s官网:https://kubernetes.io/docs/concepts/services-networking/network-policies/。如下为官网的一个示例。
二、基于角色的访问控制RBAC
RBAC是基于权限的访问控制,K8S将用户的权限进行了细粒度的管控,K8S的资源对象可以按照组或者角色进行划分,对资源的操作类型包括get、list、watch、delete、create等。访问K8S的主体包括通过命令行使用kubectl命令行访问的管理员,也包括通过Pod使用SA(serviceAccount)账号发起的应用,如下:
1、 客户端身份认证
在K8S中ApiServer提供了三种客户端身份认证,具体如下:
(1) HTTPS证书认证:通过数字证书来认证用户(kubeconfig)
(2) HTTP Token认证:通过Token来标识认证用户,如ServiceAccount
(3) HTTP Base认证:通过用户名、密码的方式进行认证,已经在1.19版本弃用
2、 授权检查的维度
(1) 用户
(2) 用户组
(3) 资源对象:node、svc……
(4) 资源操作方法:get、list、watch、delete、create、update、patch
(5) 命名空间
(6) API组
3、 准入控制
Admission Control是准入控制的插件列表,所有访问API Server的请求都需要经过该插件的检查,只有检查通过才会放行请求。常见的准入控制插件包括NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, RuntimeClass, ResourceQuota,
[root@k8s-master1 bin]# kube-apiserver -h | grep enable-admission-plugins
下面演示用户通过证书访问K8S,并分配查看pod的权限的操作过程:
4、 用户证书签发
通过证书认证有两个重要的字段,分别对应了用户及用户组:
(1) CommanName(CN):在认证时,将作为用户User
(2) Organization(O):在认证时,将作为用户组group
这里我将创建一个user1,为user1颁发证书:
[root@k8s-master1 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes user1-csr.json | cfssljson -bare user1
[root@k8s-master1 pki]# openssl x509 -in user1.pem -noout –text
5、 创建kubeconfig
[root@k8s-master1 pki]# cat kubeconfig.sh
kubectl config set-cluster kubernetes --certificate-authority=/home/user1/pki/ca.pem --embed-certs=true --server=https://192.168.2.151:6443 --kubeconfig=user1.kubeconfig
kubectl config set-credentials user1 --client-key=user1-key.pem --client-certificate=user1.pem --embed-certs=true --kubeconfig=user1.kubeconfig
kubectl config set-context kubernetes --cluster=kubernetes --user=user1 --kubeconfig=user1.kubeconfig
kubectl config use-context kubernetes --kubeconfig=user1.kubeconfig
生成的user1.kubeconfig文件内容如下:
使用生成的user1.kubeconfig文件访问pod:
[root@k8s-master1 pki]# kubectl get pods --kubeconfig=user1.kubeconfig
Error from server (Forbidden): pods is forbidden: User "user1" cannot list resource "pods" in API group "" in the namespace "defaul
6、 创建RBAC策略,为user1分配查看pod的权限:
通过apiGroups指定API接口、通过resources指定K8S的资源对象、通过verbs指定操作的类型;在RoleBinding中通过subjects中的name指定用户user,通过roleRef中的name指定角色,然后即实现了用户与角色的绑定:
通过create执行RBAC策略:
kubectl create -f rbac-user1.yaml
通过—kubeconfig参数指定kubeconfig文件:
[root@k8s-master1 pki]# kubectl get pods --kubeconfig=user1.kubeconfig
NAME READY STATUS RESTARTS AGE
nginxdemo-75c5ffcc9c-7x4wl 1/1 Running 0 39d
nginxdemo-75c5ffcc9c-j6ljb 1/1 Running 0 46d
nginxdemo1-58bff5ffd6-h8pm5 1/1 Running 0 39d
web-7f8f4959cd-jjs5w 1/1 Running 0 20d
现在user1拥有了查看pod的权限,但是无service查看的权限:
[root@k8s-master1 pki]# kubectl get clusterrolebinding -A -o wide
[root@k8s-master1 pki]# kubectl get role -o wide
[root@k8s-master1 pki]# kubectl get rolebindings -A -o wide
[root@k8s-master1 pki]# kubectl describe rolebindings read-pods
标签:master1,Network,user1,--,kubeconfig,RBAC,policy,k8s,root From: https://blog.51cto.com/u_9652359/12171423