文章目录
一.kubernetes的安全框架
管理kubernetes的有kubectl、api、UI界面
如下是k8s的安全框架图
安全认证流程:kubectl请求api资源,然后通过三层安全机制。
第一层是认证(Authentication),验证身份、用户名和密码或者token;
第二层是授权(Authorization)角色绑定(RBAC),以获得权限;
第三层是准入控制(Admission Control,资源使用限定)。
请求只有通过这三层安全机制,才会被k8s响应请求,创建资源。
- k8s的安全控制框架主要由以上3个阶段进行控制,每一个阶段都支持插件方式,通过APIServer配置来启用插件方式,通过APiserver配置来启用插件。
- 普通用户想要安全的访问集群APIServer,往往需要证书、token或者是用户名+密码
- pod访问需要ServiceAccount
[root@master01 demo]# kubectl get serviceaccount
NAME SECRETS AGE
default 1 5d23h
apiserver内部使用8080端口,默认8080端口监听本地,通过master以及其他组件连接使用
[root@master01 demo]# netstat -napt | grep LISTEN | grep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 67360/kube-apiserve
apiserver外部使用6443端口
[root@master01 demo]# netstat -napt | grep LISTEN | grep 6443
tcp 0 0 192.168.158.10:6443 0.0.0.0:* LISTEN 67360/kube-apiserve
二.Authentication,认证
认证有三种客户端身份认证
HTTPS 证书认证:基于CA证书签名的数字证书认证
HTTP Token认证:通过一个Token来识别用户(生产环境中使用广泛)
HTTP Base认证:用户名+密码的方式认证
HTTPS证书认证,基于CA证书签名的数字证书认证
CA认证如下
[root@master01 demo]# cat /root/k8s/k8s-cert/server-csr.json
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.158.10",
"192.168.158.40",
"192.168.158.100",
"192.168.158.110",
"192.168.158.120",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
HTTP Token认证,通过一个Token来识别用户(生产环境中使用广泛)
httpd的令牌认证如下
[root@master01 ~]# cat /opt/kubernetes/cfg/token.csv
2525e5219c98c6fd3747f969838a0456,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
HTTP Base认证,用户名+密码的方式认证
三.Authorization,授权
RBAC(Role-Based Access Control,基于角色的访问控制),负责完成授权(Authorization)工作。
以下是授权模块的相关概念
user:身份验证期间提供的用户字符串;
user:身份验证期间提供的用户字符串;
group:已验证用户所属的组名列表;
extra:任意字符串键到字符串值得映射,由身份验证层提供;
API:指示请求是否针对API资源;
request path:到其他非资源端点得路径;
api request verb:api动作(get、list、create、update、patch、watch、proxy、redirect、delete和deletecollection)等,用于
资源请求。
http request verb:http动作(get、post和delete用于非资源请求);
resource:正在访问得资源的ID或者名称(仅仅用于资源请求),对于使用get、update、patch和delete谓词的资源请求,必须提供资源名称;
subresource:正在访问的资源(仅仅用于资源请求);
namespace:正在访问的子资源(仅用于资源请求);
api group:被访问的api组(仅用于资源请求),一个空字符串指定核心api组
由于RBAC是基于角色进行控制的,所以首先需要创建角色、然后创建绑定的资源、最后将角色与目标甚至api和请求等绑定。绑定api模式适用于二次开发。
四.admission contorl,准入控制
NamespaceLifecycle:命令空间回收
LimitRanger:配额管理
ServiceAccount:每个pod中导入方便访问apiserver
ResourceQuota:基于命名空间的高级配额管理
NodeRestriction:node加入到k8s群集中以最小的权限运行
以下是官方推荐的插件(用于1.11版本以上)
--enable-admission-plugins= \ NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds, ResourceQuota
五.基于授权机制创建新的用户
使用RBAC(基于角色的访问控制)授权,允许通过kubernetes API动态配置策略
主体:user(用户)、Group(用户组)、ServiceAccount(服务账号)
角色:Role(授权特定命名空间的访问权限)、ClusterRole(授权所有命名空间访问权限)
角色绑定:RoleBinding(将角色绑定到主体,即subject)、ClusterRoleBinding(将集群角色绑定到主体)
创建命名空间
[root@master01 ~]# kubectl create ns tom
namespace/tom created
[root@master01 ~]# kubectl get ns
NAME STATUS AGE
default Active 5d23h
kube-public Active 5d</