作者: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. 论文:使用分层强化学习进行空对空格斗(战斗机空对空搏斗)《Hierarchical Reinforcement Learning for Air-to-Air Combat》

  2. 鹏程实验室,启智平台,openI平台,积分兑换新标准

    2024-02-13 11:12:21 星期二 地址: https://openi.pcl.ac.cn/reward/point/rule

  3. 树莓派3B+ 安装开源软路由 openwrt 并设置 无线网桥

    在openwrt官网上找到最新版的下载地址: https://openwrt.org/releases/19.07/start 注:   本文中使用的openwrt 系统为最新的稳定版系统,自带web ...

  4. 微软的GitHub Copilot

    随着OpenAI的ChatGPT4 Turbo的发布,基于ChatGPT的Copilot也推出了最新版. ======================================= 帮助文档: h ...

  5. 经典视频分享:Machine Learning: A New ICE (Identification, Control, Estimation) Age ? —— 自动控制和人工智能的结合前景

    机器学习作为近几年兴起的学科,虽然他诞生的时间已经而久远了,但是真正走进人们视野也就是这几年的事情. 机器学习领域本身只有强化学习这个分支和控制类是天然关联的,因此近几年国内的知名高校的强化学习研究者 ...

  6. 【转载】How to Use t-SNE Effectively —— (机器学习数据可视化) t-SNE使用指南

    原文地址:https://distill.pub/2016/misread-tsne/ 说明: 原文是比较有名的一个指南性博文,讲的就是t-SNE技术的一些使用注意事项和说明,属于说明性文章,内容很不 ...

  7. 为python编译C++模块时一定要注意的事情—————不要在anaconda环境下使用cmake来编译C++扩展模块!!!

    平时搞python的人很多都会有安装C++扩展模块的需求,而往往这些C++模块都是使用CMAKE做编译配置的,但是如果你这时候shell环境是使用anaconda的话,那么cmake默认调用的GCC和 ...

  8. .NET 7 + Vue 权限管理系统 小白快速上手

    前言 今天给大家推荐一个超实用的开源项目<.NET 7 + Vue 权限管理系统 小白快速上手>,DncZeus的愿景就是做一个.NET 领域小白也能上手的简易.通用的后台权限管理模板系统 ...

  9. 【A GUIDE TO CRC ERROR DETECTION ALGORITHM】 (译文2)

    6. A Fully Worked Example 一个完全可行的例子 Having defined CRC arithmetic, we can now frame a CRC calculatio ...

  10. 瑞芯微|rk3568 uart快速上手

    一.调试环境 平台:rk3568 kernel: 4.19.232 SDK: rk_android11.0_sdk Board: rk3568-evb1-ddr4-v10 二. rk3568 uart ...