K8S攻击面与检测规则实现
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
背景
由于微服务基本都是基于k8s的、故针对k8s的检测产生了如下文章、本文章只是给出了基础攻击的检测、部分工具检测原理一致。本文攻击方面直接参考先知原文未修改,特此感谢。
一、8080端口未授权访问
条件
1、k8s版本小于1.16.0
2、8080对公网开放
1、如何打开和关闭8080端口
测试了几个版本的k8s,发现在新版本后,–insecure-port=8080配置默认就关闭了
cd /etc/kubernetes/manifests
vim kube-apiserver.yaml
这里设置为0表示关闭,甚至在高版本的k8s中,直接将--insecure-port这个配置删除了,需要手动添加
这里将修改为8080,并添加配置
- --insecure-port=8080
- --insecure-bind-address=0.0.0.0
systemctl restart kubelet
上述就是打开8080端口的方法
1.1 8080/6443端口匿名用户访问pod操作日志DSL语法
以任意工具以匿名用户访问或者pods、secrets、namespace并且来源IP不是堡垒机的都进行告警
{
"query": {
"bool": {
"must": [
{
"terms": {
"parsed_data.verb": [
"list",
"get"
]
}
},
{
"term": {
"parsed_data.user.username": "system:anonymous"
}
},
{
"term": {
"parsed_data.objectRef.name": "pods"
}
}
],
"must_not": [
{
"term": {
"parsed_data.sourceIPs": "10.211.55.3"
}
}
]
}
}
}
2、执行命令-通过kubectl -s命令
kubectl -s ip:8080 get node
获取Pods
kubectl -s 127.0.0.1:8080 get pods
执行命令
kubectl -s 127.0.0.1:8080 --namespace=default exec -it nginxfromuzju-59595f6ffc-p8xvk bash
Tips: 在高版本的k8s中,这种方法是不行的,连不上去
2.1 通过8080/6443 exec进入pod
选择不是来自堡垒机IP10.211.55.3的执行了exec进入了pod、这里并没有以匿名用户或者指定的凭据来访问,也可对匿名用户单独做告警
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"parsed_data.requestURI.keyword": "/api/v1/namespaces/default/pods/*/exec*"
}
},
{
"term": {
"parsed_data.objectRef.subresource": "exec"
}
},
{
"term": {
"parsed_data.verb": "create"
}
}
],
"must_not": [
{
"term": {
"parsed_data.sourceIPs": "10.211.55.3"
}
}
]
}
}
}
3、获取service-account-token
可以通过访问api来获取token
/api/v1/namespaces/kube-system/secrets/
3.1 获取secrets检测
当用户访问所有的secrets
{
"query": {
"bool": {
"must": [
{
"terms": {
"parsed_data.verb": [
"list",
"get"
]
}
},
{
"match_phrase": {
"parsed_data.requestURI": "/api/v1/secrets"
}
},
{
"term": {
"parsed_data.objectRef.resource": "secrets"
}
}
],
"must_not": [
{
"term": {
"parsed_data.sourceIPs": "10.211.55.3"
}
}
]
}
}
}
当用户访问具体的namespace的secrets规则
GET /k8s-audit-log-2024.09.13/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"parsed_data.requestURI": "/api/v1/"
}
},
{
"match_phrase": {
"parsed_data.requestURI": "/secrets"
}
},
{
"term": {
"parsed_data.verb": "get"
}
},
{
"term": {
"parsed_data.objectRef.name": "secrets"
}
}
],
"must_not": [
{"term": {
"parsed_data.sourceIPs": "10.211.55.3"
}}
]
}
}
}
3、获取宿主机权限-通过k8s dashboard,创建特权Pods
为什么会出现这个问题:因为在启动dashborad的时候,管理员为了方便,修改了配置,跳过了登录
安装dashborad
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
vim recommended.yam
需要添加两个参数,一个是不需要登录,一个是绑定0.0.0.0地址
- --enable-skip-login
- -- insecure-bind-address=0.0.0.0
kubectl apply -f recommended.yaml
这里使用国际友人的配置快速启动
- [https://medium.com/@tejaswi.goudru/disable\-authentication\-https\-in\-kubernetes\-dashboard\-2fada478ce91](mailto:https://medium.com/@tejaswi.goudru/disable-authentication-https-in-kubernetes-dashboard-2fada478ce91)
wget https://gist.githubusercontent.com/tejaswigk/da57d7911284cbf56e7f99af0afd6884/raw/de38da2a7619890a72d643d2bbd94278221e5977/insecure-kubernetes-dashboard.yml
kubectl apply -f insecure-kubernetes-dashboard.yml
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard 9090:80
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录