专栏首页伪架构师kube-scan 和 KCCSS

kube-scan 和 KCCSS

在 Kubernetes 中使用声明式 API 来定义工作负载,因为工作负载的灵活多变,这种定义的随意性是很大的,很容易因为复制黏贴、手工运维等原因给 Pod 分配不需要的特权,造成安全隐患。kube-scan 就是针对这种情况而出现的一个工具,它根据内置的二十几个检查项目,对工作负载描述的安全性进行打分,从最安全的 0 分,到最危险的 10 分。

kube-scan 所使用的计分项和算法,被称为 Kubernetes Common Configuration Scoring System (KCCSS),是一套仿造 CVSS 的 Kubernetes 配置评分系统,它从对完整性、可用性和保密性三个方面的威胁来评价安全漏洞,评分标准对降低工作负载安全性的评价,如果在同样方面已经做出了合适的补救措施,还可以挽回这部分的扣减。

快速开始

老一套的部署方式:

$ kubectl apply -f \
    https://raw.githubusercontent.com/octarinesec/kube-scan/master/kube-scan.yaml
namespace/kube-scan created
configmap/kube-scan created
serviceaccount/kube-scan created
clusterrole.rbac.authorization.k8s.io/kube-scan created
clusterrolebinding.rbac.authorization.k8s.io/kube-scan created
deployment.apps/kube-scan created
service/kube-scan-ui created

可以看到创建了一个新的命名空间 kube-scan,其中有一个 kube-scan-ui:80 的服务。尝试访问一下,页面会显示出当前集群中运行的有风险载荷,例如使用 Helm 缺省安装的 Traefik:

点击 show more,会显示对应问题的详细信息:

往前一步

通过对部署文件的观察,会发现这个 Pod 里有两个容器,分别命名为 kube-scan-uikube-scan,粗浅判断这是一个前后端分离的任务。在浏览器中打开调试工具,会发现对 <host-name>/api/risks 的访问,直接访问这个地址,会拿到一个 JSON 响应:

{
    "data": [{
        "kind": "Deployment",
        "name": "traefik-1583034161",
        "namespace": "infra",
        "domain": "",
        "risk": {
            "riskScore": 7,
            "riskCategory": "Medium",
            "riskItems": [{
                    "name": "AllowPrivilegeEscalation",
                    "riskCategory": "Low",
                    "type": "Basic",
                    "title": "Workload allows privilege escalation",
                    "shortDescription": "Privilege escalation allows programs inside the container to run as root",
                    "description": "Privilege escalation allows programs inside the container to run as root, even if the main process is not root, which can give those programs control over that container, host and even cluster",
                    "confidentiality": "Low",
                    "confidentialityDescription": "Root processes that can escape the containers have the ability to read secrets from Kubernetes, Docker and other applications",

这样一来,我们就可以考虑,将 UI 部分去掉,仅留下后端服务。如此一来,就可以通过简单的代码,把扫描过程集成到日常运维工作之中了。

另外一些小秘密

kube-scan 的文档非常贫瘠,因此只能从 YAML 和源码中找到一些东西。

刷新时间

YAML 中有一个环境变量 KUBESCAN_REFRESH_STATE_INTERVAL_MINUTES,原定的刷新时间是 1440 分钟也就是 24 小时。修改这一变量就能进行更快的刷新了。

KCCSS 配置

安装过程中生成了一个 Configmap 对象 kube-scan,其中保存了 kube-scan 的评价标准,在他的代码中可以看到已经支持的各种威胁和补救措施。basic 节点中列出了目前能够判断的威胁列表,例如下面的定义:

- name: "privileged"
  title: "Workload is privileged"
  shortDescription: "Processes inside a privileged containers get full access to the host"
  description: "..."
  confidentiality: "High"
  confidentialityDescription: "..."
  integrity: "Low"
  integrityDescription: "..."
  availability: "Low"
  availabilityDescription: "..."
  exploitability: "Moderate"
  attackVector: "Local"
  scope: "Host"
  handler: "IsPrivileged"

其中有一些非常易读的关键信息,例如问题的名称、标题、描述,以及对完整性、可用性和保密性的影响级别,最后是攻击来源、难度和范围。

评分方法

定时对工作负载进行检查,然后调用源码 formula.go 中实现的评分过程,整体流程如下:

  • GetHandler 根据配置文件中的 handler 字段获取处理方法。
  • 用查询到的 Handler 函数对工作负载进行检查,如果存在该问题,则根据问题涉及范围,检查该工作负载是否已经有针对性的进行了加固,以此来调整该项目得分。
  • 根据 Risk 和 Remediation 生成结果列表。

注意如下命名空间是硬编码忽略的 {“octarine”, “kube-system”, “kube-public”, “octarine-tiller”, “istio-system”, “octarine-dataplane”, “kube-scan”}

结论

  • KCCSS 和 kube-scan 两个项目的文档都非常稀少,很不友好。
  • 特征库更新困难,需要同时更新源码和配置。
  • 仅提供了对全集群进行扫描,如果能加入单个对象进行检查的手段可能会更加实用。

本文分享自微信公众号 - 伪架构师(fake-architect),作者:崔秀龙

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2879 堆的判断

    2879 堆的判断 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 堆是一种常用...

    attack
  • 11g rac配置scan ip(r6笔记第30天)

    如果是从10g转战11g rac就会发现很多不同之处,其中一个比较大的改变就是在11g中有了一个新特性scan,其实这是一个简称,完整的名称为:SCAN(Si...

    jeanron100
  • Function as a Service介绍

    本文是在去年梳理的关于FaaS的一个文档,主要目标是梳理FaaS的基本概念,发展势头,应用场景和一些基本的架构设计。后来在内部参考FaaS的设计思路,我们实现了...

    黑光技术
  • 事件风暴过程全体验-下篇

    作为TW技术咨询师,为多家企业进行架构和 Fintech 创新相关技术咨询,如架构设计、遗留系统上云迁移及规划、各种技术赋能、企业技术相关平台的生态规划及落地建...

    张逸
  • Leetcode 169 多数元素

    给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

    glm233
  • android自定义listview实现header悬浮框效果

    之前在使用iOS时,看到过一种分组的View,每一组都有一个Header,在上下滑动的时候,会有一个悬浮的Header,这种体验觉得很不错,请看下图: ? ...

    xiangzhihong
  • 大数阶乘的AS3与C++版本

    说出这个问题的时候,有两种情况,一种会问:“阶乘是什么?”,另外一种可能会想,这个结果会走出Number型能表述的上限。

    meteoric

扫码关注云+社区

领取腾讯云代金券