作者:KaliArch(薛磊),某Cloud MSP服务商产品负责人,熟悉企业级高可用/高并发架构,包括混合云架构、异地灾,熟练企业DevOPS改造优化,熟悉Shell/Python/Go等开发语言,熟悉Kubernetes、 Docker、 云原生、微服务架构等。

前言

KubeEye 是一款 Kubernetes 安全及配置问题检测工具,针对部署在 K8s 集群中的业务应用进行配置检测使用 OPA,针对集群部署的 Node 使用Node-Problem-Detector进行检测,同时除了系统内置有根据大多数业界常见场景的预定义规则,还支持用户自定义规则来进行集群检测。

架构

KubeEye 通过调用 Kubernetes API,通过匹配资源中的关键字和容器语法的规则匹配来获取集群诊断数据,详见架构图。

其中针对 Node 节点的检测,需要在被检测 Node 主机上安装。

特点

特性

  • KubeEye 根据行业最佳实践审查你的工作负载 YAML 规范,帮助你使你的集群稳定。
  • KubeEye 可以发现你的集群控制平面的问题,包括 kube-apiserver/kube-controller-manager/etcd 等。
  • KubeEye 可以帮助你检测各种节点问题,包括内存/CPU/磁盘压力,意外的内核错误日志等。

检查项

是/否 检查项 描述 级别
PrivilegeEscalationAllowed 允许特权升级 紧急
CanImpersonateUser role/clusterrole 有伪装成其他用户权限 警告
CanDeleteResources role/clusterrole 有删除 Kubernetes 资源权限 警告
CanModifyWorkloads role/clusterrole 有修改 Kubernetes 资源权限 警告
NoCPULimits 资源没有设置 CPU 使用限制 紧急
NoCPURequests 资源没有设置预留 CPU 紧急
HighRiskCapabilities 开启了高危功能,例如 ALL/SYS_ADMIN/NET_ADMIN 紧急
HostIPCAllowed 开启了主机 IPC 紧急
HostNetworkAllowed 开启了主机网络 紧急
HostPIDAllowed 开启了主机PID 紧急
HostPortAllowed 开启了主机端口 紧急
ImagePullPolicyNotAlways 镜像拉取策略不是 always 警告
ImageTagIsLatest 镜像标签是 latest 警告
ImageTagMiss 镜像没有标签 紧急
InsecureCapabilities 开启了不安全的功能,例如 KILL/SYS_CHROOT/CHOWN 警告
NoLivenessProbe 没有设置存活状态检查 警告
NoMemoryLimits 资源没有设置内存使用限制 紧急
NoMemoryRequests 资源没有设置预留内存 紧急
NoPriorityClassName 没有设置资源调度优先级 通知
PrivilegedAllowed 以特权模式运行资源 紧急
NoReadinessProbe 没有设置就绪状态检查 警告
NotReadOnlyRootFilesystem 没有设置根文件系统为只读 警告
NotRunAsNonRoot 没有设置禁止以 root 用户启动进程 警告
CertificateExpiredPeriod 将检查 API Server 证书的到期日期少于30天 紧急
EventAudit 事件检查 警告
NodeStatus 节点状态检查 警告
DockerStatus Docker 状态检查 警告
KubeletStatus Kubelet 状态检查 警告

部署

KubeEye 本身使用 Golang 编写,可使用编译好的二进制可执行文件进行相关组件安装。

安装

二进制安装

wget https://github.com/kubesphere/kubeeye/releases/download/v0.3.0/kubeeye-0.3.0-linux-amd64.tar.gz
tar -zxvf kubeeye-0.3.0-linux-amd64.tar.gz
mv kubeeye /usr/bin/

源码编译安装

git clone https://github.com/kubesphere/kubeeye.git
cd kubeeye
make installke

安装 NPD

针对集群 Node 主机的检测,kubeEye 采用Node-problem-Detector ,需要在 Node 主机节点进行安装,KubeEye 封装安装命令,可以进行一键安装。

️注意:这将在你的集群上安装 NPD,只有当你想要详细的节点报告时才需要。

[root@VM-48-7-centos ~]# kubeeye install -e npd
kube-system ConfigMap node-problem-detector-config created
kube-system DaemonSet node-problem-detector created

其主要在 kube-system 名称空间创建 node-problem-detector-config 的 ConfigMap 和 node-problem-detector DaemonSet。

集群中运行 KubeEye

kubeEye 除了可以一次性使用工具运行,同时 kubeEye 也是一个 Operator,可以运行在集群内部,进行长久的持续对集群进行检测。

Kubernetes 中部署 KubeEye

kubectl apply -f https://raw.githubusercontent.com/kubesphere/kubeeye/main/deploy/kubeeye.yaml
kubectl apply -f https://raw.githubusercontent.com/kubesphere/kubeeye/main/deploy/kubeeye_insights.yaml

查看 KubeEye 巡检结果

$ kubectl get clusterinsight -o yaml

apiVersion: v1
items:
- apiVersion: kubeeye.kubesphere.io/v1alpha1
kind: ClusterInsight
metadata:
name: clusterinsight-sample
namespace: default
spec:
auditPeriod: 24h
status:
auditResults:
auditResults:
- resourcesType: Node
resultInfos:
- namespace: ""
resourceInfos:
- items:
- level: waring
message: KubeletHasNoSufficientMemory
reason: kubelet has no sufficient memory available
- level: waring
message: KubeletHasNoSufficientPID
reason: kubelet has no sufficient PID available
- level: waring
message: KubeletHasDiskPressure
reason: kubelet has disk pressure
name: kubeeyeNode

测试

命令选项

[root@VM-48-7-centos ~]# kubeeye -h
KubeEye finds various problems on Kubernetes cluster. Usage:
ke [command] Available Commands:
audit audit resources from the cluster
completion generate the autocompletion script for the specified shell
help Help about any command
install A brief description of your command
uninstall A brief description of your command Flags:
-f, --config string Specify the path of kubeconfig.
-h, --help help for ke
--kubeconfig string Paths to a kubeconfig. Only required if out-of-cluster.
--master --kubeconfig (Deprecated: switch to --kubeconfig) The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.

可以看到 KubeEye 目前主要支持两个命令,一个为 install package 例如 NPD,另外一个执行 audit,对集群应用进行配置扫描。

audit

[root@VM-48-7-centos ~]# kubeeye audit
KIND NAMESPACE NAME MESSAGE
Deployment dddd jenkins-1644220286 [NoCPULimits ImagePullPolicyNotAlways NoMemoryLimits NoPriorityClassName NotReadOnlyRootFilesystem NotRunAsNonRoot]
Deployment jenkins jenkins-1644220286 [NoCPULimits ImagePullPolicyNotAlways NoMemoryLimits NoPriorityClassName NotReadOnlyRootFilesystem NotRunAsNonRoot]
Deployment smartkm-api-k8s velero [ImageTagIsLatest NoLivenessProbe NoPriorityClassName NotReadOnlyRootFilesystem NoReadinessProbe NotRunAsNonRoot]
DaemonSet smartkm-api-k8s restic [ImageTagIsLatest NoLivenessProbe NoPriorityClassName NotReadOnlyRootFilesystem NoReadinessProbe NotRunAsNonRoot]
Node minikube [KernelHasNoDeadlock FilesystemIsNotReadOnly KubeletHasSufficientMemory KubeletHasNoDiskPressure KubeletHasSufficientPID]
Event kube-system node-problem-detector-dmsws.16d844532f662318 [Failed to pull image "k8s.gcr.io/node-problem-detector/node-problem-detector:v0.8.7": rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)]
Event kube-system node-problem-detector-dmsws.16d844532f66703e [Error: ErrImagePull]
Event kube-system node-problem-detector-dmsws.16d84453351b8b19 [Error: ImagePullBackOff]

添加自定义检查规则

我们利用命令查看预定义 OPA 检查规则。

kubectl get cm -n kube-system node-problem-detector-config -oyaml

同时也可以根据自己业务创建自定义检查规则。

  • 创建 OPA 规则存放目录
mkdir opa
  • 添加自定义 OPA 规则文件

注意:为检查工作负载设置的 OPA 规则, Package 名称必须是 kubeeye_workloads_rego 为检查 RBAC 设置的 OPA 规则, Package 名称必须是 kubeeye_RBAC_rego 为检查节点设置的 OPA 规则, Package 名称必须是 kubeeye_nodes_rego

  • 以下为检查镜像仓库地址规则,保存以下规则到规则文件 imageRegistryRule.rego
package kubeeye_workloads_rego

deny[msg] {
resource := input
type := resource.Object.kind
resourcename := resource.Object.metadata.name
resourcenamespace := resource.Object.metadata.namespace
workloadsType := {"Deployment","ReplicaSet","DaemonSet","StatefulSet","Job"}
workloadsType[type] not workloadsImageRegistryRule(resource) msg := {
"Name": sprintf("%v", [resourcename]),
"Namespace": sprintf("%v", [resourcenamespace]),
"Type": sprintf("%v", [type]),
"Message": "ImageRegistryNotmyregistry"
}
} workloadsImageRegistryRule(resource) {
regex.match("^myregistry.public.kubesphere/basic/.+", resource.Object.spec.template.spec.containers[_].image)
}
  • 使用额外的规则运行 KubeEye

提示:KubeEye 将读取指定目录下所有 .rego 结尾的文件

kubeeye audit -p ./opa

问题排查

  • NPD 安装异常,默认使用 k8s.gcr.io,如果安装服务器无法连通公网可使用我的镜像仓库:1832990/node-problem-detector:v0.8.7。
  • kubEye 安装使用默认使用主机 $HOME/.kube/config 文件,如果不存在 K8s config 文件,则无法正常运行。

参考链接

本文由博客一文多发平台 OpenWrite 发布!

使用 KubeEye 为你的 K8s 集群安全保驾护航的更多相关文章

  1. kubernetes实战(八):k8s集群安全机制RBAC

    1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...

  2. kubernetes(k8s)集群安全机制RBAC

    1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...

  3. K8s集群安全机制

    安全机制说明 k8s作为一个分布式集群管理的工具,保证集群的安全性是其一个重要的任务.API Server是集群内部各个组件通信的中介,也是外部控制的入口,,所以K8s的安全机制就是围绕保护API S ...

  4. Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理

    上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...

  5. 一键运行CIS安全扫描,集群安全无忧!

    CIS安全扫描是Rancher 2.4推出的其中一个重磅功能,旨在帮助用户快速.有效地加强集群的安全性.本文将详细介绍CIS安全扫描这一功能,包含详细的操作demo. 本文来自Rancher Labs ...

  6. Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理

    如今的系统多不是孤军奋战,在多结点会话共享管理方面有着各自的解决办法,比如Session粘连,基于Web容器的各种处理等或者类似本文说的完全接管Web容器的Session管理,只是做法不尽相同. 而本 ...

  7. mongodb副本集加分片集群安全认证使用账号密码登录

    mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...

  8. Kubernetes集群安全概述

    API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全端口两个不同的HTTP端口,对外提供API服务,其中本地端口是基于HTTP协议的,用于在本机( ...

  9. elasticsearch集群安全重启节点

    es2.x 关闭集群的动态分片:(动态分片开启状态如果节点宕机了,会导致集群重新分配数据进行数据转移,会导致节点直接大量传输数据)curl -XPUT 'http://192.168.248.193: ...

  10. kafka集群安全化之启用kerberos与acl

    一.背景 在我们部署完kafka之后,虽然我们已经可以“肆意”的用kafka了,但是在一个大公司的实际生产环境中,kafka集群往往十分庞大,每个使用者都应该只关心自己所负责的Topic,并且对其他人 ...

随机推荐

  1. attention机制、LSTM二者之间,是否存在attention一定优于LSTM的关系呢?

    这里没有严格的论证,只是自己的一些理解. attention机制下的Transformer确实是当前AI技术中最为火热的,基于其构建的大语言模型可以说是AI技术至今最强的技术之一了,但是attenti ...

  2. 连接huggingface.co报错:(MaxRetryError("SOCKSHTTPSConnectionPool(host='huggingface.co', port=443) (SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1007)

    参考: https://blog.csdn.net/shizheng_Li/article/details/132942548 https://blog.csdn.net/weixin_4220944 ...

  3. List按需转换Map

    需求 : Mybatis的<select>返回一个List,想按照实体类其中的属性转换成Map<String, String>实现过程: 其实有很多方式,可以使用普通for循环 ...

  4. 9组-Beta冲刺-3/5

    一.基本情况(15分) 队名:不行就摆了吧 组长博客:9组-Beta冲刺-3/5 GitHub链接:https://github.com/miaohengming/studynote/tree/mai ...

  5. Win32 动态库dll

    这两天学习动态库的练习,分享下方法 实例.封装窗口类的两种状态. 1.自定义窗口类QWnd 2.资源模板窗口对话框类 下面是dll的头文件,类的声明 #pragma once #ifndef _CLA ...

  6. 调用微信红包接口,本地可以服务器不可以。 请求被中止: 未能创建 SSL/TLS 安全通道

    微信红包的地址接口地址是: https://api.mch.weixin.qq.com/pay/micropay 当时造成这个不能用的原因是:我把服务器从windows server 2008升级到w ...

  7. 005.MinIO-DirectPV分布式多租户存储部署

    MinIO部署准备 部署概述 本实验结合Kubernetes进行MinIO部署,实现MinIO于Kubernetes的融合. minio官方支持通过简单的快速部署,以便于进行基础测试: curl ht ...

  8. 宿舍管理系统——单链表+结构体实现入住、退房和查询功能(C语言版)

    本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评论区留言,也欢迎直接加QQ:2961439733,备注博客园或CSDN即可): 编辑工具:Dev-C++(版本:5.11.0.0) 编译器:TD ...

  9. Java实现英语作文单词扫盲程序

    来自背英语四级单词的突发奇想: 是否可以通过Java语言实现一个随机抽取作文中单词进行复习的程序. 首先,展示下成果: 点击查看代码 package Demo; import java.util.Ar ...

  10. Fluent Builder 模式

    前言 以前最讨厌设计复杂方法调用, 就是那种需要一堆有逻辑规则的 config 作为参数的方法. 这种 config 通常是一个大对象, 有许多 property, property 之间有存在一些逻 ...