Krane:Kubernetes RBAC静态分析和可视化工具

2020-07-13 03:43:25

Krane是一个简单的Kubernetes RBAC静态分析工具。找出了K8S RBAC设计中存在的安全隐患,并对如何缓解这些隐患提出了建议。Krane Dashboard提供当前的RBAC安全状态,并允许您浏览其定义。

RBAC风险规则-Krane评估一组内置的RBAC风险规则。可以使用一组自定义规则修改或扩展这些规则。

可移植性-Krane可以在以下模式之一运行:在CI/CD管道中,作为步骤操作,在将其应用于集群之前检测潜在的RBAC缺陷。

仪表板-Krane附带简单的仪表板UI,可帮助您了解群集内RBAC设计。仪表板提供RBAC安全状况的高级概述,并突出显示检测到的风险。它还允许通过刻面树和图形网络视图进行进一步的RBAC控制检查。

警报-它将通过其Slake集成对检测到的中等和高度严重风险发出警报。

Graph-Krane中的RBAC在本地Graph数据库中索引Kubernetes RBAC的全部内容,这使得使用任意CypherQL查询进一步查询RBAC数据变得容易。

假设您的本地计算机上正在运行docker。如果您还没有安装docker-compose,请安装它。

Krane依赖于RedisGraph。Docker-Compose堆栈定义了在本地构建和运行Krane服务所需的所有内容。它还将处理其RedisGraph依赖关系。

请注意,在本地运行docker-compose时,Krane不会自动启动RBAC报告和仪表板。相反,默认情况下容器将休眠24小时-可以在docker-compose.override.yml中调整此值。exec到正在运行的Krane容器中以运行命令。本地docker-compose还将在容器内挂载Kube config(~/.kube/config),使您能够针对您已经有权访问的任何Kubernetes集群运行报告。

#exec into a running krane tainerdocker-compose exec krane bash#一旦进入容器,您就可以开始使用`krane`命令。试试‘krane-help’。$krane-h。

$Krane--帮助名称:Krane描述:Kubernetes RBAC静态分析和amp;可视化工具命令:Dashboard start K8S RBAC仪表板服务器帮助显示全局或[命令]帮助文档报告运行K8S RBAC报告全局选项:-h,--help display help document-v,--version display version information-t,--trace display backtrace当发生错误时作者:marcin ciszak<;[email protected]&。

如果您计划对多个群集运行该工具,并分别为每个群集名称编制RBAC图索引,则还可以传递-c<;cluster-name>;标志。

注意:Krane希望指定的目录路径中存在以下文件(YAML或JSON格式):

注意:Krane使用的服务帐户需要访问RBAC资源。有关详细信息,请参阅前提条件。

注意:Krane希望本地存储的RBAC资源文件遵循特定的命名约定。请参阅上一节。为了运行Krane命令,它建议CI Executor引用quay.io/appvia/krane:最新的docker映像。

CI模式由--ci标志启用。当检测到一个或多个危险时,Krane将返回非零状态代码以及违反风险规则的详细信息。

要查看RBAC方面树、网络图和最新报告结果,您需要首先启动仪表板服务器。

如果要针对特定群集名称运行仪表板,可以传递群集标志-c<;cluster-name>;。仪表板将查找与文件系统上缓存的指定群集名称相关的数据。

上述命令将在默认端口8000上启动本地Web服务器,并显示仪表板链接。

Krane在RedisGraph中对RBAC实体进行索引。这使得我们可以使用RedisGraph支持的CypherQL子集高效而简单地查询依赖网络。

Role-Role节点表示给定的角色或ClusterRole。Kind属性定义角色的类型。

Subject-Subject表示集群中所有可能的参与者(Kind:User、Group和ServiceAccount)。

:Composite-定义ClusterRole之间的链接(一个ClusterRole可以聚合到另一个中)A<;-(是)-B的组合。

所有的边都是双向的,这意味着图可以在任何一个方向上查询,唯一的例外是:聚合和:合成关系,它们是单向的,尽管涉及相同的边节点。

为了直接查询图形,您可以执行到正在运行的redisgraph容器中,启动redis-cli并运行您的任意查询。请按照官方说明查看命令示例。

您也可以从Krane控制台查询图形。先执行运行Krane容器,然后。

#启动Krane控制台-这将打开带有Krane代码预加载控制台的交互式Ruby shell#Instantiate Graph client graph=Krane::Clients::RedisGraph。客户端集群:';default';#针对已索引的RBAC图res=graph运行任意CypherQL查询。查询(%q(Match(r:RULE{RESOURCE:";configmap";,Verb:";update";})<;-[:GRANT]-(ro:Role)<;-[:ASSIGN]-(s:Subject)返回s.Kind作为主题_KIND,s.name作为主题_NAME,ro.KIND作为角色_KIND,ro.name作为角色_NAME))#打印结果RES。打印结果集(_S)。

#Results.+-+|主题种类(_KIND)。|SUBJECT_NAME|ROLE_KIND|Role_Name|+-+。-+|服务帐户|引导签名者|角色|SYSTEM:控制器:引导签名者||USER|SYSTEM:kUBE-CONTROLLER-MANAGER|Role|system::leader-locking-kube-controller-manager||服务帐户|KUBE-CONTROLLER-MANAGER|Role|system::leader-locking-kube-controller-manager||USER|SYSTEM:SYSTEM:Kube-Scheduler|Role|System:Leader-LOCKING-kube-Scheduler||ServiceAccount|kube-Scheduler|Role|SYSTEM::Leader-LOCKING-kube-Scheduler。-+。

注意:上面的示例查询将选择分配了角色/集群角色的所有主题,授予更新配置映射的访问权限。

RBAC风险规则在规则文件中定义。每条规则的结构在很大程度上是不言而喻的。可以通过向Cutom规则文件添加额外的自定义规则来扩展/覆盖内置集。

宏是一组公共/共享属性的容器,由一个或多个风险规则引用。如果选择在给定的风险规则中使用宏,则需要按名称引用它,例如宏:<;宏名称>;。请注意,引用宏中定义的属性将优先于规则级别上定义的相同属性。

Writer-Writer是用于格式化查询结果集的Ruby表达式。编写器优先于模板。

模板-内置查询/编写器模板名称。如果未指定查询编写器,则选择的查询生成器将与匹配的编写器一起使用。

信息[必需]有关检查的文本信息以及有关如何降低风险的建议。

模板[条件]内置查询/编写器模板名称。如果未指定查询编写器,则选择的查询生成器将与匹配的编写器一起使用。

一些内置模板需要在各个规则级别指定MATCH_RULES属性,以便构建正确的查询。当前需要它的模板:

Risk-Role-根据Match_Rules指定的访问规则构建多匹配图查询。生成的图形查询返回以下列:

当模板依赖匹配规则构建查询时,需要MATCH_RULES[Conditonal]。

CUSTOM_PARAMS[可选]要在规则查询和编写器表示中评估和替换的自定义键-值对的列表。

示例:{{attrA}}和{{attrB}}以上键的模板占位符将分别替换为valueA和valueB。

阈值[可选]数值。定义后,它将在编写器表达式中作为模板占位符{{Threshold}}可用。

Disabled[可选]当设置为true时,它将禁用给定的规则并将其从评估中排除。默认情况下,所有规则都处于启用状态。

-id:Verbose-Rule-Example GROUP_TITLE:示例规则严重性::危险信息:风险描述和如何减轻风险的说明请参阅此处查询:|Match(s:Subject)-[:Access]->;。#{result t.SUBJECT_KIND}#{result t.SUBJECT_NAME}可以访问命名空间:#{Result.Namespace_names.join(';,';)}";End Disabled:true。

上面的示例显式定义了一个用于评估RBAC风险的图形查询,以及一个用于格式化查询结果集的编写器表达式。查询只选择他们有权访问的所有主题(白名单除外)和名称空间。请注意,结果集将仅包括有权访问2个以上名称空间的主题(请注意那里的阈值?)。最后一个编写器的表达式将被捕获为格式化结果项输出。

编写器可以通过具有与查询返回的元素相匹配的方法的结果对象来访问结果集项,例如result t.SUBJECT_KIND、Result.SUBJECT_NAME等。

编写器表达式中的{{Threshold}}占位符将替换为规则的Threshold关键字值。

{{WHITLIST_SUBJECT_NAMES}}表示将使用为给定规则ID定义的白名单值进行插值的自定义字段。如果白名单中没有定义占位符字段名称,则默认情况下它将被替换为空数组[';';]。阅读下面关于白名单的更多信息。

内置模板极大地简化了风险规则定义,但是,它们旨在提取特定类型的信息,可能不太适合您的自定义规则。如果您发现自己在多个规则中重复使用相同的查询或编写器表达式,则应考虑将这些表达式提取到宏中,并在自定义规则中引用它们以使其枯竭。

-id:Risk-Any-Verb-Secrets GROUP_TITLE:Risk Roles/ClustersRoles允许对机密执行所有操作严重性::Danger INFO:Roles/ClusterRoles允许对机密执行所有操作。这可能很危险。查看列出的角色!模板:Risk-Role Match_Rules:-Resources:[';Secrets';]谓词:[';*';]。

上面的示例显示了其中一个内置规则。它引用Risk-Role模板,该模板在处理时将通过在规则求值触发器之前插入查询和编写器表达式来扩展规则。Match_Rules将用于构建适当的匹配查询。

属性名称及其值是任意的。它们在白名单文件中定义,并分为三个单独的部分:

全局-顶级作用域。此处定义的自定义属性将应用于所有风险规则,而不考虑群集名称。

通用-无论群集名称如何,自定义属性的范围都将限定为特定的风险规则ID。

群集(带有嵌套的群集名称列表)-自定义属性将应用于给定群集名称的特定风险规则ID。

在评估时,每个风险规则将尝试插入查询中使用的所有参数占位符,例如{{your_Whitelist_Attribute_Name}}。如果占位符参数名称(即双花括号内的名称)与该风险规则ID的任何白名单属性名称相匹配,则它将被替换为其计算值。如果未找到给定占位符的值,则将其替换为[';';]。

下面的示例白名单为id属性值匹配的风险规则生成以下占位符-键=&>值映射";Some-Risk-Rule-id";

在自定义图形查询中使用上述占位符关键字时,将在评估风险规则时将其替换为各自的值。

-Rules:GLOBAL:#GLOBAL SCOPE-适用于所有风险规则和群集名称WHILLIST_ROLE_NAMES:#自定义属性名称-ACP:PROMETHUS:OPERATOR#自定义属性值COMMON:#COMMON SCOPE-适用于特定的风险规则ID,而不考虑群集名称某些-RISK-RULE-ID:#这对应于config/rules.yaml Whitelist_SUBJECT_NAMES中定义的风险规则ID:#自定义属性名称-特权-PSP-USER#自定义属性值CLUSTER:#CLUSTER SCOPE-。适用于指定风险规则ID和群集名称DEFAULT:#示例群集名称Some-Risk-Rule-id:#Risk Rule id Whitelist_Subject_Names:#Custom Attribute NANE-Another-User#自定义属性值。

群集中必须存在Kubernetes命名空间、服务帐户以及相应的RBAC。请参阅前提条件以供参考。

默认的Krane入口点执行bin/in-cluster-run,在启动RBAC报告循环和仪表板Web服务器之前等待RedisGraph实例变为可用。

KRANE_REPORT_INTERVAL-定义RBAC静态分析报告运行的间隔(秒)。默认值:300(单位为秒,即5分钟)。

KRANE_REPORT_OUTPUT-定义RBAC风险报告输出格式。可能的值:JSON、:YAML、:NONE。默认::json。

如果您的K8S集群带有内置的Compose-on-Kubernetes控制器支持(docker-ktop默认支持),那么您可以使用单个docker栈命令部署Krane及其依赖项:

Docker堆栈部署\--orchestrator Kubernetes\--命名空间Krane\--Compose-file docker-Compose.yml\--Compose-file docker-Compose.k8s.yml Krane

注意:在运行上述命令之前,请确保您当前的Kube上下文设置正确!

应用程序栈现在应该部署到Kubernetes集群,并且所有服务都准备好并公开。请注意,Krane将自动启动其报告循环和仪表板服务器。

$docker堆栈服务--orchestrator Kubernetes--命名空间krane kraneID名称模式副本映像PORTS0de30651-dd5 krane_redisgraph已复制1/1个重分布:1.99.7*:6379->;6379/tcpaa377a5f-62b krane_krane已复制1/1个季度。io/appvia/krane:最新*:

kubectl create\--context docker-ktop\--命名空间krane\-f k8s/redisgraph-service.yaml\-f k8s/redisgraph-ployment.yaml\-f k8s/krane-service.yaml\-f k8s/krane-ployment ment.yaml。

根据您的展开需要修改清单,确保在其展开文件中引用正确版本的Krane docker映像。请访问Krane Docker Registry获取可用的标签,或者只使用最新的。

克雷恩将通过其松弛集成通知您检测到的中、高度严重异常。

要启用通知,请在config/config.yaml文件中指定SLACK webhook_url&;channel,或者同时设置SLACK_WEBHOOK_URL和SLACK_CHANNEL环境变量。环境变量将优先于配置文件值。

Krane依赖于RedisGraph。Docker-Compose是在本地运行Krane依赖项的最快方式。

此时,您应该能够通过调用本地shell中的命令来修改Krane代码库和测试结果。

./bin/krane--help#获取帮助。/bin/krane report-k docker-ktop#生成#本地docker-ktop K8s群集的第一个报告.。

这将自动启动仪表板服务器,打开默认浏览器并监视源文件更改。

Krane是为改善开发人员使用Skaffold的体验而预先配置的。迭代项目并通过在本地或远程Kubernetes集群中运行整个堆栈来验证应用程序变得更容易了。代码热重新加载使本地更改能够自动传播到运行的容器,从而加快开发生命周期。

我们欢迎社会各界的任何贡献!有关如何入门的更多信息,请查看我们的投稿指南。如果您使用Krane,发现它很有用,或者通常对Kubernetes安全感兴趣,请通过Starring和观看此回购让我们知道。谢谢!