8-kubernetes-安全
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-安全的更多相关文章
- [笔记]kubernetes 无法启动问题
在启动kubernetes的时候报错误. ERROR: timed out for http://localhost:4001/v2/keys/ 原因是无法启动etcd, etcd 监听4001本地端 ...
- 基于Kubernetes在AWS上部署Kafka时遇到的一些问题
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 交代一下背景:我们的后台系统是一套使用Kafka消息队列的数据处理管线 ...
- 基于Python+Django的Kubernetes集群管理平台
➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...
- Docker中部署Kubernetes
Kubernetes为Google开源的容器管理框架,提供了Docker容器的夸主机.集群管理.容器部署.高可用.弹性伸缩等一系列功能:Kubernetes的设计目标包括使容器集群任意时刻都处于用户期 ...
- kubernetes部署Fluentd+Elasticsearch+kibana 日志收集系统
一.介绍 1. Fluentd 是一个开源收集事件和日志系统,用与各node节点日志数据的收集.处理等等.详细介绍移步-->官方地址:http://fluentd.org/ 2. Elastic ...
- kubernetes 文档
kubernetes 官方文档:http://kubernetes.io/docs/ null
- 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 ...
- kubernetes单机板
参考地址: *** http://blog.csdn.net/carter115/article/details/51121223 ** http://www.cnblogs.com/dongdong ...
- 一次kubernetes资源文件创建失败的排查
今天在jenkins中创建kubernetes的rc时,检查目标yaml文件时报出如下错误: + /opt/jenkins/kube/kubectl -s http://10.xx.xx.xx:808 ...
- kubernetes&tensorflow
谷歌内部--Borg Google Brain跑在数十万台机器上 谷歌电商商品分类深度学习模型跑在1000+台机器上 谷歌外部--Kubernetes(https://github.com/kuber ...
随机推荐
- 【转】对初学LoadRunner朋友的建议
对初学LoadRunner朋友的建议 作者:wind摘要:随着Internet的普及与迅速发展,企业业务量的迅速加大,数据大集中成为一种趋势,IT系统承载的负荷越来越重,系统性能的好坏严重的影响了企业 ...
- 【C#】静态构造方法与静态变量
扯下闲篇先,本来今天预计整理下委托.事件.Lamada的笔记,然后再把单例模式的懒汉.饿汉模式看完. 在看到懒汉的双重加锁设计时,向同桌贩卖了下该设计的优点,结果反被同桌的一个问题难倒了~! 一. 有 ...
- 给MySQL中数据表添加字段
添加一个char字段: mysql> alter table stock add src char(20); Query OK, 3766 rows affected (0.65 sec) Re ...
- 跨年夜问题:一句并不复杂的delete竟然在delete statement处cost飙升,在数据量上升的十万级就像进入了死循环,执行后久久没有结果
笔者使用的环境: # 类别 版本 1 操作系统 Win10 2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bi ...
- 微信小程序 | 模仿百思不得其姐
微信小程序 仿百思不得姐 设备 微信开发者工具 v1.02.1901230 扩展 修复了视频点击播放不流畅的问题 修复了视频的暂停够无法播放问题 优化了部分页面 接口 首页 http://api.bu ...
- Skywalking Php注册不上问题排查
Skywalking是一款分布式追踪应用,具体介绍可以参考 skywalking. 最近公司的一个Php应用在Skywalking后台查不到数据了: 登录到某台服务器上发现注册不上,启动时就报错了: ...
- leetcode1546题解【前缀和+贪心】
leetcode1546.和为目标值的最大数目不重叠非空子数组数目 题目链接 算法 前缀和+贪心 时间复杂度O(n). 1.对nums数组求前缀和: 2.在求前缀和过程中将前缀和sum插入到set集合 ...
- SessionMiddleware源码分析
settings.py文件中 MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', ] # from djang ...
- Class对象、反射、动态代理
Class对象是所有类的根源,Object是所有对象的根源. 编译后的新类会产生一个Class对象,保存在同名的.class文件中.每个类都有一个Class对象,它包含了所有的与类有关的信息.所有的C ...
- SpringBoot-03-配置之yaml语法学习
3. SpringBoot配置 3.1 yaml语法学习 配置文件 Springboot使用一个全局的配置文件,配置文件名称固定 spplication.properties 语法结构:key=val ...