kubernetes基于角色的安全控制学习笔记-阿里云开发者社区

开发者社区> wuque> 正文

kubernetes基于角色的安全控制学习笔记

简介: k8s 安全
+关注继续查看

【认证和授权】

    任何资源提供使用是认证和授权是必不可少的功能,用于身份鉴别,授权是实现权限分配。

kubernetes基于插件实现这两种功能,另外也支持准入控制,补充授权机制实现精准的访问控制

    API SERVER做为集群的网关,所有的访问请求都是经过它,并对每一次请求都经过验证和权限控制。

所有检查均正常才能访问或者存储数据到后端存储系统etcd中

[用户账户和用户组]
请求有两种类型

1    人    kubectl   rest接口    User Account 用户账号
    独立于集群之外的服务管理的账号,例如管理员分发的账号密钥,keystone一类的用户存储以及用户名密码
    通常用于复杂的业务逻辑控制,它作用与系统全局,因此需要全局唯一
2    pod    客户端库    Service Account 服务账号
    用于k8s api管理的账号,用于pod中的服务进程访问k8s api提供的身份验证
    隶属于名称空间,仅仅用于实现特定的操作任务。

system:unauthenticated: 未能通过任何一个授权插件检验的账号,即未通过认证测试的用户所属的组
system:authenticated: 认证成功的用户自动加入的组,用于快捷引用所有正常通过认证的用户账号
system:serviceaccount : 当前系统上所有的sa账号组
system:serviceaccounts:: 特定名称空间内所有的Service Account对象

api的请求要么与普通用户或者服务用户绑定,要么是匿名用户请求
认证插件: 负责鉴定用户身份,授权插件用于权限许可鉴别。
准入控制: 用于资源的创建、删除、更新和连接操作时进行许可检查。
kubernetes使用验证机制对api的请求进行身份验证。认证的方式:

    1    客户端证书
    2    承载令牌
    3    身份验证代理

以下属性与访问请求相关联,至少为username和serviceaccount启用一个验证插件,如果验证不通过返回401给客户端
成功验证后的用户需要检验是否有权限操作

    1    username
    2    uid
    3    group
    4    extra

api支持的权限控制主要包含以下几种

    1    node  基于pod的目标调度节点来实现对kubelete的访问控制
    2    ABAC 基于属性的访问控制
    3    RBAC 基于角色的访问控制
    4    webhook: 基于http回调机制通过外部rest服务就按察确认用户授权的访问控制
    还有两种  AlwaysAllow和AlwaysDeny,而且自1.9版本起,External Admission Webhooks被分为MutatingAdmission-Webhook和ValidatingAdmissionWebhook两种类型,分别用于在API中执行对象配置的变异和验证操作

[服务账号关联和应用]

服务账号就是: 用于让pod对象内的容器进程访问其他服务时提供的身份认证信息的账户,一个service account资源一般由用户名和secret组成
创建服务账号:serviceaccount是api servers上的一种资源,隶属于某个名称空间,用于pod与对象内部的应用程序在于api-server通讯时完成认证
每个pod对象均可附加其所属名称空间中的一个serviceaccount,且只能附加一个。不过一个service account资源可由所属命令空间中的多个pod对象共同使

[创建服务账号]

    kubectl  create service-account 命令进行创建,或者用声明式读取yaml文件进行创建
    apiVersion: v1
    kind: ServiceAccount
    metadata:
        name: sa-demo
        nameapace: default

[K8S的SSL/TLS认证]

    k8s集群的api server做为整个集群的通讯网关,contraller-manager、scheduler、kubelet以及kube-proxy均通过api server和etcd进行状态更新和存储,master的各组件需要ssl向外提供服务,集群内的各组件间进行通讯时还需要进行双向认证,各节点的通讯以及与客户端的通讯都应该以加密的方式进行身份验证

image.png

etcd集群内的对等节点通讯: 基于tcp的2380端口进行事务通讯,对等网络peer类型的数字证书实现通讯安全
etcd集群与客户端的通讯: rest api基于ssl通讯,监听2379端口,支持双向认证。
api server与客户端通讯基于https,有三种形式

       master: kube-schduler 和 kube-controller-manager
       node: 各kubelet和kube-proxy在启动的时候由master节点进行数字签名和办法
       kubelet及其他形式的客户端

image.png

[kubeconfig]
/etc/kubernetes/admin.conf是kubeconfig的文件,由kubeadm init自动生成。
使用kubectl config view命令可以查看当前使用配置文件路径

[root@master .kube]# kubectl config view
apiVersion: v1
clusters:

  • cluster:

    certificate-authority-data: DATA+OMITTED
    server: https://172.20.128.0:6443

    name: kubernetes

contexts:

  • context:

    cluster: kubernetes
    user: kubernetes-admin

    name: kubernetes-admin@kubernetes

current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:

  • name: kubernetes-admin
    user:

    client-certificate-data: REDACTED
    client-key-data: REDACTED
    

apiserver的客户端程序 kubectl kubelet kube-controller-manager都可以基于kubeconfig配置文件接入多个集群

kubeconfig常用命令

    - kubectl config set-cluster:设置kubeconfig的clusters配置段。
    - kubectl config set-credentials:设置kubeconfig的users配置段。
    - kubectl config set-context:设置kubeconfig的contexts配置段。
    - kubectl config use-context:设置kubeconfig的current-context配置段

[TLS bootstrapping机制]

    - kubelet使用TLS bootstrap token的kubeconfig文件向kube-apiserver发送请求。
    - kubelet自行生成私钥和签署请求,而后发给集群上的证书签署进程,由控制器自动完成签署过程,即称为k8s bootstrap 。
    - kubeadm启动了节点加入集群时的证书自动签署功能因此加入过程中kubeadm init命令成功后即完成。

[基于角色的访问控制]

RBAC是一种授权的机制,用于界定谁能够或者不能够操作哪个或哪类资源。

    谁: useraccount  或者 serviceaccount
    操作: 要执行的具体操作,增删改查。1.5版本引进,1.6版本为beta版本,1.8版本为稳定版

优点:

    1、对资源型和非资源型的url资源完美覆盖
    2、整个RBAC有少数的几个api对象实现,与其他的资源一样可以基于kubectl和api进行操作
    3、支持进程运行时操作,不需要重启api server即可生效

类型:

    支持Role和ClusterRole两种类型
    Role: 支持名称空间内的资源权限集合
    ClusterRole : 支持集群级别的资源权限控制,一般作用于整个集群
    对这两种资源进行赋权的时候用到RoleBinding和ClusterRoleBinding
    RoleBinding:  用于将Role许可权益绑定到一个用户和一组用户上
    ClusterRoleBinding:  把ClusterRole中定义的许可权限绑定在一个或一组用户之上

【Role和RoleBinding】

image.png

除了还可以用配置清单创建Role,还可以使用命令快速创建
kubectl create role services-admin --verb="" --resource="services,services/" -n testing

RoleBinding
image.png

kubectl config use-context kube-user1@kubernetes
kubectl get pod -n testing
kubectl get service -n testing 可以看到为拒绝状态

快速创建RoleBinding的命令
kubectl create rolebinding admin-services --role=service-admin --user=kube-user1 -n testing

【ClusterRole和ClusterRoleBinding】

ClusterRole
image.png

ClusterRole是集群级别的资源,它不属于名称空间,故在此处其配置不应该使用metadata.namespace字段,这也可以通过获取nodes-reader的状态信息来进行验证。kube-user1用户此前绑定的pods-reader和services-admin角色属于名称空间,它们无法给予此用户访问集群级别nodes资源的权限,所有的非名称空间级别的资源都无法通过RoleBinding绑定至用户并赋予用户相关的权限,这些是属于ClusterRoleBinding的功能。

【limitRange资源limitRange准入控制器】
未指定资源限制属性的容器可能会因故吞掉所有工作节点上的所有可用计算资源,妥当的做法是使用limitRange资源为每个名称空间指定最小和最大计算资源用量
在名称空间上定义了LimitRange对象之后,客户端提交创建或修改的资源对象将受到LimitRanger控制器的检查,任何违反LimitRange对象定义的资源最大用量的请求将被直接拒绝。

LimitRange支持三种资源的限制:
容器 , pod和 persistentVolumeClaim,pod和容器主要是cpu和内存的限制。persistentVolumeClaim是对存储空间的限制范围。

【ResourceQuota资源与准入控制器】

尽管LimitRange资源能限制单个容器、Pod及PVC等相关计算资源或存储资源的用量,但用户依然可以创建数量众多的此类资源对象进而侵占所有的系统资源。于是,Kubernetes提供了ResourceQuota资源用于定义名称空间的对象数量或系统资源配额,它支持限制每种资源类型的对象总数,以及所有对象所能消耗的计算资源及存储资源总量等。
用户创建或更新资源的操作违反配额约束将导致请求失败,APIServer以HTTP状态代码“403 FORBIDDEN”作为响应,并显示一条消息以提示可能违反的约束

image.png

【PodSecurityPolicy】
是集群级别的资源类型,用于控制用户在配置pod资源的期望状态时可以设定的特权类的属性
如是否可以使用特权容器,根命名空间、和主机文件系统等,以及可以使用的主机忘了和端口,卷类型和linux capabilities。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
开启预警系统 让ESET也来玩“云安全”
本文讲的是开启预警系统 让ESET也来玩“云安全”,很多用户都在使用ESET NOD32杀毒软件,其自带的强大实时监控和“启发式”杀毒技术使得用户不用担心电脑遭遇病毒、木马侵袭,为系统安全运行提供有力保障,同时,对于目前较为流行的“云安全”技术,其实细心的用户也许会发现,在ESET NOD32杀毒软件中,也同样可以实现。
914 0
Kubernetes部署的最佳安全实践
本文讲的是Kubernetes部署的最佳安全实践【编者的话】本文阐述了作者在部署一个安全的kubernetes应用时的最佳实践,包括:镜像无漏洞,使用授权镜像,限制节点访问,限制资源访问,定义资源配额,实现网络分割,运用安全上下文,处处记录日志,等等,并建议读者将这些措施无缝集成到持续集成流水线中。
2210 0
Java多线程高并发学习笔记——阻塞队列
在探讨可重入锁之后,接下来学习阻塞队列,这篇文章也是断断续续的写了很久,因为最近开始学ssm框架,准备做一个自己的小网站,后续可能更新自己写网站的技术分享。 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/superfj/p/7757876.html 阻塞队列是什么? 首先了解队列,队列是数据先进先出的一种数据结构。
951 0
SSH 安全 | 学习笔记
快速学习SSH 安全,重点介绍了如何在 Linux 下进行安全防护,并从用户系统安全、SSH 安全、恶意文件安全和云安全四个角度诠释如何提升系统的安全性。
40 0
Sed&awk笔记之sed篇:实战
相信大家肯定用过grep这个命令,它可以找出匹配某个正则表达式的行,例如查看包含"the word"的行: $ grep "the word" filename 但是grep是针对单行作匹配的,所以如果一个短句跨越了两行就无法匹配。这就给我们出了一个题目,如何用sed模仿grep的行为,并且
1848 0
流编辑器:sed|学习笔记
快速学习流编辑器:sed
46 0
Sed and awk 笔记之 sed 篇:简单介绍
自己博客上搬运过来的文章,抛砖引玉,系列原文地址:http://kodango.com/tag/sed-and-awk/,文章中的链接暂时还未修改,不好意思。最近在阅读《sed & awk》,这本书是sed和awk相关书籍中比较经典的一本。我在读书的时候有一个习惯,就是会作一些笔记,如果有条件我会放
1800 0
流程控制 - PHP手册笔记
原文:流程控制 - PHP手册笔记 脚本由语句构成,语句靠流程控制实现功能,这一节主要介绍了几个关键字的使用。 elseif elseif和else if的行为完全一样,如果用冒号来定义if/elseif条件,那就不能用两个单词的else if,否则PHP会产生解析错误。
1105 0
+关注
8
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载