kubernetes安全框架

访问K8S集群的资源需要过三关:认证、鉴权、准入控制,任意一个不通过都会失败

普通用户若要安全访问集群API server,往往需要证书、token或者用户名+密码,pod访问需要ServiceAccout

K8S安全控制框架主要由下面三个阶段进行控制,每个阶段都支持插件方式,通过API server配置来启用插件

1、Authentication(鉴权)
2、Authorization (授权)
3、Admission Control (准入控制)

1、鉴权(Authentication)

三种客户端身份认证:

https证书认证:基于CA证书签名的数字证书认证
http token认证:通过一个token来识别用户
http base认证:用户名+密码的方式认证(基本不用,安全系数低)

2、授权(Authorization)

RBAC(Role-Based Access Control基于角色的访问控制):复制完成授权(Authorization)工作

根据API请求属性,决定允许还是拒绝

user:用户
group:用户分组
extra:用户额外信息
API
请求路径:例如/api,/healthz
API请求方法:get、list、create、update、patch、delete
http请求方法:get、post、put、delete
资源
子资源
命名空间
API组

3、准入控制(Admission Control)

Adminssion Control实际上是一个准入控制器插件列表,发送到API server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求

进入到容器中查看启用和禁用的

kubectl exec -it kube-apiserver-k8s-master sh -n kube-system

kube-apiserver | grep admin

基于角色的权限访问控制:RBAC

RBAC(Role-Based Access Control基于角色的访问控制),允许通过kubernetes API动态配置策略

角色 

	Role:授权特定命名空间的访问权限
 ClusterRole:权限所有命名空间的访问权限

角色绑定  

	RoleBinding:将角色绑定到主体(即subject)
 ClusterRolebinding:将集群角色绑定到主体

主体(subject)

	User:用户
 Group:用户组
 ServiceAccount:服务账号

例子:指定用户授权访问不同命名空间权限

示例:为fage用户授权default命名空间pod读取权限

1、用K8S CA签发客户端证书
2、生成kubeconfig授权文件
3、创建RBAC权限策略

1、生成CA签发的证书,需要K8S内的CA证书

[root@k8s-master ~]# mkdir ssl && cd ssl

[root@k8s-master ssl]# 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 > fage-csr.json <<EOF
{
"CN": "fage", #用户名,根据客户端证书里包含的user、group确认一个用户
"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 fage-csr.json | cfssljson -bare aliang

[root@k8s-master ssl]# bash cert.sh

[root@k8s-master ssl]# ls | grep "fage*"

fage.csr

fage-csr.json

fage-key.pem

fage.pem

[root@k8s-master ssl]#

2、生成用户认证文件

[root@k8s-master ssl]# cat kubeconfig.sh

kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \ #指定ca根证书
--embed-certs=true \
--server=https://192.168.10.10:6443 \ #集群地址
--kubeconfig=fage.kubeconfig #生成文件的文件名
# 设置客户端认证
kubectl config set-credentials fage \
--client-key=fage-key.pem \ #指定CA颁发的用户证书
--client-certificate=fage.pem \
--embed-certs=true \ #生成为配置文件,true为是false则不写入
--kubeconfig=fage.kubeconfig #生成用户的认证文件
# 设置默认上下文
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=fage \ #只是标识没有实际的意义。
--kubeconfig=fage.kubeconfig #生成用户的认证文件
# 设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=fage.kubeconfig

[root@k8s-master ssl]# bash kubeconfig.sh

3、指定命名空间授权

[root@k8s-master ssl]# cat rbac.yaml  

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules: #权限控制位置
- apiGroups: [""] #要加deployments需要在这个位置加上"apps"
resources: ["pods","services","deployments"]
verbs: ["get", "watch", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: fage
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

[root@k8s-master ssl]#

如果修改权限后重新生效文件即可

kubectl apply -f rbac.yaml

复制生成的文件到节点上去验证,或者给使用的同事

scp /root/fage.kubeconfig root@192.168.10.112:/root/.kube/config

网络策略

网络策略(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访问白名单上的端口

网络概述案例参考地址:

https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/  

字段含义

podSelector:目标pod,根据标签选择
policyType:策略类型,知道策略用于入栈、出站流量
ingress: from 是可以访问的白名单,可以来自于IP段、命名空间、pod标签等,ports是可以访问的端口
egress: 这个pod组可以访问外部的IP段和端口  

实例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: #将策略应用到那个对象中
matchLabels:
role: db
policyTypes: #应用到出口还是入口,这里出入都应用了
- Ingress
- Egress
ingress: #这里的ingress代表是入口,下面是策略明细
- from:
- ipBlock:
cidr: 172.17.0.0/16 #允许访问的访问的网段
except:
- 172.17.1.0/24 #允许网段中除了这个网段不能访问
- namespaceSelector: #允许访问的命名空间
matchLabels:
project: myproject
- podSelector: #那些pod可以访问
matchLabels:
role: frontend
ports: #允许访问的端口
- protocol: TCP
port: 6379
egress: #这里egress代表出口
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978

案例:项目pod出入流量访问控制

需求1  

将default命名空间写到run=web标签的pod隔离,只允许default命名空间携带run=client1标签的pod访问80端口

vim network-policy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
posSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
# - namespaceSelector:
# matchLabels:
# project: default
- podSelector:
matchLabels:
run: client1
ports:
- protocol: TCP
port: 80

生效配置

kubectl apply -f network-policy.yaml

需求2  

default命名空间下所有pod可以互相访问,也可以访问其他命名空间Pod,但其他命名空间不能访问default命名空间pod

cat network-policy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name:deny-from-other-namespaces
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {}

8-kubernetes-安全的更多相关文章

  1. [笔记]kubernetes 无法启动问题

    在启动kubernetes的时候报错误. ERROR: timed out for http://localhost:4001/v2/keys/ 原因是无法启动etcd, etcd 监听4001本地端 ...

  2. 基于Kubernetes在AWS上部署Kafka时遇到的一些问题

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 交代一下背景:我们的后台系统是一套使用Kafka消息队列的数据处理管线 ...

  3. 基于Python+Django的Kubernetes集群管理平台

    ➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...

  4. Docker中部署Kubernetes

    Kubernetes为Google开源的容器管理框架,提供了Docker容器的夸主机.集群管理.容器部署.高可用.弹性伸缩等一系列功能:Kubernetes的设计目标包括使容器集群任意时刻都处于用户期 ...

  5. kubernetes部署Fluentd+Elasticsearch+kibana 日志收集系统

    一.介绍 1. Fluentd 是一个开源收集事件和日志系统,用与各node节点日志数据的收集.处理等等.详细介绍移步-->官方地址:http://fluentd.org/ 2. Elastic ...

  6. kubernetes 文档

    kubernetes 官方文档:http://kubernetes.io/docs/ null

  7. kubernetes 1.4.5集群部署

    2016/11/16 23:39:58 环境: centos7 [fu@centos server]$ uname -a Linux centos 3.10.0-327.el7.x86_64 #1 S ...

  8. kubernetes单机板

    参考地址: *** http://blog.csdn.net/carter115/article/details/51121223 ** http://www.cnblogs.com/dongdong ...

  9. 一次kubernetes资源文件创建失败的排查

    今天在jenkins中创建kubernetes的rc时,检查目标yaml文件时报出如下错误: + /opt/jenkins/kube/kubectl -s http://10.xx.xx.xx:808 ...

  10. kubernetes&tensorflow

    谷歌内部--Borg Google Brain跑在数十万台机器上 谷歌电商商品分类深度学习模型跑在1000+台机器上 谷歌外部--Kubernetes(https://github.com/kuber ...

随机推荐

  1. Zabbix-4.0-设置钉钉报警脚本

    问题:当服务器发生报错时,有一个信息能实现自动发送到我的手机或者应用上,以达到对服务器的实时的监控与处理.邮件与短信不能满足实时性,于是想到了钉钉的通知. 思路:在钉钉里面建一个群,群里面拉个机器人. ...

  2. Google Code Jam 2020 Round1B Blindfolded Bullseye

    总结 这一题是道交互题,平时写的不多,没啥调试经验,GYM上遇到了少说交个十几发.一开始很快的想出了恰烂分的方法,但是没有着急写,果然很快就又把Test Set3的方法想到了,但是想到归想到,调了快一 ...

  3. 小程序开发-使用npm包

    微信小程序引用npm包 微信小程序官方支持使用npm包,地址为 https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html 实 ...

  4. flag在index里

    题目:http://123.206.87.240:8005/post/ 我们来看这一题 首先打开题目 他让点击就点击呗 跳转到另一个新的界面 这就没了??? ... 没思路就对了    //假装证明自 ...

  5. Windows+Git+TortoiseGit+COPSSH安装图文教程

    http://blog.csdn.net/aaron_luchen/article/details/10498181/ http://jingyan.baidu.com/article/3a2f7c2 ...

  6. 【GIT-精讲】从零玩转Git/GitHub/GitLab

    关于版本控制 一.什么是版本控制 版本控制(Version Control Systems)版本控制(Revision control)是一种软件工程技巧 在开发的过程中,确保由不同人所编辑的同一档案 ...

  7. flask提交表单验证不通过,以及CSRF攻击原理

    学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...

  8. 从头看看Tomcat启动Spring容器的原理

    通过带注解Spring Boot可以启动一个web容器,并初始化bean容器.那么Tomcat启动并初始化spring容器的原理是怎样的? Tomcat启动web程序时会创建一对父子容器(图1): 有 ...

  9. django之models报错

    django 执行python manage.py makemigrations报错:TypeError: __init__() missing 1 required positional argum ...

  10. python中的一些内置函数

    1.布尔类型 2.求和sum 3.取全局变量和局部变量 4.ascii码和字符集 chr().ord() 5.看某个功能下有哪些方法 help(x).dir(x) 6.exec执行python代码 7 ...