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: {} : 如果未配置,默认不允许

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值