Kubernetes第十三曲 安全机制
- 一、kubernetes安全框架
- 二、第一模块:认证
- 三、第二模块:授权
- 四、第三模块:准入控制
- 五、使用RBAC授权
-
- 5.1、创建命名空间
- 5.2、创建nginx的pod
- 5.3、扩容成3个副本
- 5.4、查看
- 5.5、官方模板
- 5.6、创建role
- 5.7、创建rolebinding
- 5.7、拷贝rbac.yaml和rbac-user.sh文件到/root/demo中
- 5.8、证书拷贝到zhangsan目录
- 5.9、修改地址为apiserver访问地址(负载均衡VIP)
- 5.10、安装格式化工具
- 5.11、格式化
- 5.12、查看证书
- 5.13、使用zhangsan-kubeconfig访问pod资源
- 5.14、使用zhangsan-kubeconfig访问 svc资源就会被拒绝
- 5.15、也无法访问默认的命名空间
- 5.16、UI访问控制
- 5.17、查看令牌
- 5.18、查看token
- 5.20、登录成功界面
- 5.21、只有权限看到容器
kubernetes的安全框架
传输安全,认证,授权,准入控制
使用RBAC授权
一、kubernetes安全框架
三层:认证,授权,绑定角色
第一关是认证(authentication),第二关是授权(authorization),第三关是准入控制(admission control)
1.1 、结构分析:
kubectl、API、UI ,是访问管理K8S的方式,api用于二次开发时调用,https协议,6443端口
在kubectl处提交需求,请求调用/api/v1、/apis、/healthz等,然后经过安全框架
安全框架有认证(authentication),验证身份,使用【用户名密码】或者【token令牌】验证
授权(authorization),绑定权限,授权过程,分配到指定空间中
准入控制(admission control),空间准入控制,可以使用下面哪些资源,调用哪些插件
使用插件前先与etcd去验证,查看etcd是否授权,若是允许,会执行,并将操作记录到etcd中
1.2 、工作流程:
kubectl 首先请求api资源,然后是过三关,第一关是认证(authentication),第二关是授权(authorization),第三关是准入控制(admission control),只有通过这三关才可能会被K8S创建资源
K8s安全控制框架主要由下面三个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件
普通用户若要安全访问集群api server,往往需要证书、token或者用户名+密码验证;
pod访问,需要serivceaccount
第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限
token(共享秘钥)
SSL(双向SSL认证)
通过任何一个认证即表示认证通过,进入下一步
第二步:授权检查,确认是否对资源具有相关的权限
ABAC(基于属性的访问控制)
RBAC(基于角色的访问控制)
NODE(基于节点的访问控制)
WEB HOOK(自定义HTTP回调方法的访问控制)
第三步:准入控制(对操作资源相关联的其他资源是否有权限操作)
1.2.1、Service Account详解
https://github.com/kubernetes/kubernetes/blob/release-1.0/examples/cassandra/java/src/io/k8s/cassandra/KubernetesSeedProvider.java#L101
Service Account 是 Kubernetes 用于集群内运行的程序,进行服务发现时调用 API 的帐号,帐号的 token 会直接挂载到 Pod 中,可以供程序直接使用。
Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。它与User account不同
1.User account是为人设计的,而service account则是为Pod中的进程调用Kubernetes API而设计;
2.User account是跨namespace的,而service account则是仅局限它所在的namespace;
3.每个namespace都会自动创建一个default service account
4.Token controller检测service account的创建,并为它们创建secret
5.开启ServiceAccount Admission Controller后
①.每个Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了其他ServiceAccout)
②.验证Pod引用的service account已经存在,否则拒绝创建
③.如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中
④.每个container启动后都会挂载该service account的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/
#apiserver使用的是token认证
[root@localhost demo]# ps aux | grep apiserver
...
--token-auth-file=/opt/kubernetes/cfg/token.csv
...
#可以通过ServiceAccount在pod中去访问apiserver
[root@localhost demo]# kubectl get sa
NAME SECRETS AGE
default 1 22d
传输安全:告别8080,迎接6443
#默认8080监听本地(是通过master及其他组件连接使用)
[root@localhost demo]# netstat -natp | grep 8080 | grep LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 831/kube-apiserver
#对外提供服务端口是6443
[root@localhost demo]# netstat -natp | grep 6443 | grep LISTEN
tcp 0 0 192.168.221.70:6443 0.0.0.0:* LISTEN 831/kube-apiserver
二、第一模块:认证
三种客户端身份认证:
- HTTPS 证书认证:基于CA证书签名的数字证书认证
- HTTP Token认证:通过一个Token来识别用户(生产环境中使用广泛)
- HTTP Base认证:用户名+密码的方式认证
2.1、https证书认证
[root@localhost demo]# cat /root/k8s/k8s-cert/k8s-cert.sh
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.221.70",