k8s安全框架-rbac授权--网络访问限制
Posted Linux蛋蛋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s安全框架-rbac授权--网络访问限制相关的知识,希望对你有一定的参考价值。
• K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都 支持插件方式,通过API Server配置来启用插件。
1. Authentication(鉴权)
2. Authorization(授权)
3. Admission Control(准入控制)
• 客户端要想访问K8s集群API Server,一般需要证书、Token或 者用户名+密码;如果Pod访问,需要ServiceAccount
三种客户端身份认证:
• HTTPS 证书认证:基于CA证书签名的数字证书认证
• HTTP Token认证:通过一个Token来识别用户
• HTTP Base认证:用户名+密码的方式认证
1.0鉴权
RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。
RBAC根据API请求属性,决定允许还是拒绝。
比较常见的授权维度: • user:用户名
• group:用户分组
• 资源,例如pod、deployment
• 资源操作方法:get,list,create,update,patch,watch,delete • 命名空间
• API组
2.0准入控制
Adminssion Control实际上是一个准入控制器插件列表,发送到API Server 的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过, 则拒绝请求。
3.0 基于角色的权限访问控制RBAC
RBAC(Role-Based Access Control,基于角色的访问控 制),允许通过Kubernetes API动态配置策略。
角色
• Role:授权特定命名空间的访问权限
• ClusterRole:授权所有命名空间的访问权限 角色绑定
• RoleBinding:将角色绑定到主体(即subject) • ClusterRoleBinding:将集群角色绑定到主体
主体(subject)
• User:用户
• Group:用户组
• ServiceAccount:服务账号
实战授权
#为zhangfan用户授权default命名空间pod读取权限
1.用k8s ca签发客户端证书
[root@k8s-master rbac]# cat cert.sh
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
cat > aliang-csr.json <<EOF
{
"CN": "aliang",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes aliang-csr.json | cfssljson -bare aliangsh
2.0生成kubeconfig授权文件
[root@k8s-master rbac]# cat kubeconfig.sh
kubectl config set-cluster kubernetes \\
--certificate-authority=/etc/kubernetes/pki/ca.crt \\
--embed-certs=true \\
--server=https://172.16.226.4:6443 \\
--kubeconfig=aliang.kubeconfig
# 设置客户端认证
kubectl config set-credentials aliang \\
--client-key=aliang-key.pem \\
--client-certificate=aliang.pem \\
--embed-certs=true \\
--kubeconfig=aliang.kubeconfig
# 设置默认上下文
kubectl config set-context kubernetes \\
--cluster=kubernetes \\
--user=aliang \\
--kubeconfig=aliang.kubeconfig
# 设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=aliang.kubeconfig
sh. kubeconfig.sh
3.0创建rbac授权策略
创建授权文件
[root@k8s-master rbac]# cat rbac.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default #授权命名空间
name: pod-reader #rbac名称
rules:
- apiGroups: [""] #核心组
resources: ["pods"]
verbs: ["get", "watch", "list"] #关键字
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: aliang
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
去node1节点验证
3.1增加授权
增加授权查看资源名称如图所示
mv aliang.kubeconfig /root/.kube/config
node节点可以看到相应内容,说明授权成功
授权整体流程如下
4.0网络策略
网络策略(Network Policy),用于限制Pod出入流量,提供Pod级别和Namespace级别网络访问控制。
一些应用场景:
• 应用程序间的访问控制。例如微服务A允许访问微服务B,微服务C不能访问微服务A
• 开发环境命名空间不能访问测试环境命名空间Pod
• 当Pod暴露到外部时,需要做Pod白名单 • 多租户网络环境隔离
Pod网络入口方向隔离:
• 基于Pod级网络隔离:只允许特定对象访问Pod(使用标签定义),允许白名单上的IP地址或者IP段访问Pod • 基于Namespace级网络隔离:多个命名空间,A和B命名空间Pod完全隔离。
Pod网络出口方向隔离:
• 拒绝某个Namespace上所有Pod访问外部
• 基于目的IP的网络隔离:只允许Pod访问白名单上的IP地址或者IP段 • 基于目标端口的网络隔离:只允许Pod访问白名单上的端口
实战
需求1:将default命名空间携带app=web标签的Pod隔离,只允 许default命名空间携带run=client1标签的Pod访问80端口。
4.1 创建网络策略控制yaml
cat. np1.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: np1
namespace: default #指定默认命名空间
spec:
podSelector:
matchLabels:
app: web #
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
run: client1
ports:
- protocol: TCP
port: 80
kubectl apply -f np1.yaml
kubectl get networkpolicy #查看授权
4.2验证
kubectl run client1 --image=busybox – sleep 36000
kubectl run client2 --image=busybox – sleep 36000
测试结果
client1 只能访问web.80端口,client2 无法访问
需求2:default命名空间下所有pod可以互相访问,也可以访问其 他命名空间Pod,但其他命名空间不能访问default命名空间Pod。
[root@k8s-master ~]# cat np2.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: np2
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}
• podSelector: {}:如果未配置,默认所有Pod
• from.podSelector: {} : 如果未配置,默认不允许
以上是关于k8s安全框架-rbac授权--网络访问限制的主要内容,如果未能解决你的问题,请参考以下文章