在分析事件的攻击模式和行为路径时,查看日志是快速而高效的方法。获取容器日志、组件服务日志、是应急响应的关键步骤之一。以下将详细阐述在这种情况下查看日志的方法、每个日志的作用和日志检查要点。
一、Docker
日志查看命令
docker的日志可以使用docker log查看
docker logs <docker_id> #查看指定容器id的日志
[root@paas-controller1:/home/pict]$ docker logs 3187a352b267 2023-10-10 10:50:48,470 INFO supervisord started with pid 1 2023-10-10 10:50:49,473 INFO spawned: 'posd-api' with pid 8 2023-10-10 10:50:49,475 INFO spawned: 'posd-conductor' with pid 9 2023-10-10 10:50:49,476 INFO spawned: 'posd-dbsync' with pid 10 ......
可关键字定位异常信息位置。例如,通过特征关键字找到可疑的jndi请求。
如图,在容器08ff中发现了jndi请求,可能是jndi注入
日志存储位置
具体的日志文件记录在/var/log/containers下,除了docker log展示应用程序的输出以外, /var/log/containers 中的日志文件包含更多 Docker 系统级别的信息,比如容器的创建、启动、停止等事件。
[root@paas-controller1:/var/log/containers]$ cd /var/log/containers/ [root@paas-controller1:/var/log/containers]$ [root@paas-controller1:/var/log/containers]$ ls k8sopapiserver-6fd6b4f547-t2wmv_admin_init-logpath-a53fb2789cce2130001b35.log k8sopapiserver-6fd6b4f547-t2wmv_admin_k8sopapiserver-c9b906b8901365689a1.log kube-apiserver-172.20.0.2_kube-system_kube-apiserver-980283aa01fc40862bce2cb47.log kube-controller-manager-172.20.0.2_kube-system_kube-controller-manager-b86d71b03d27c088162.log kube-proxy-172.20.0.2_kube-system_kube-proxy-783bc09bfd903c2dea9fa5ba6ca029527fda82b442.log kube-scheduler-172.20.0.2_kube-system_kube-scheduler-c90874214e5382856830fd61f3998646671e.log op-asm-operator-689c47fb9-lmg2n_admin_op-asm-operator-2f6faa56c0ea123cc1123.log op-asm-webhook-7dd4695996-rqhh5_admin_op-asm-webhook-af8be37b65eb071d62311328ec06e2ea6d.log op-cnrm-hook-65fc9d7ccc-nrt7h_admin_init-logpath-afd09553db0577e6bcfc786c70.log ......
查看docker 守护程序日志,主要是Docker 服务的启动和停止信息,容器的创建和销毁信息, 守护程序的运行状态和配置信息,Docker 网络和存储的相关事件,Docker 容器的日志输出
[root@paas-controller1:/home/pict]$ journalctl -u docker.service -- Logs begin at 三 2023-12-06 03:45:31 CST, end at 三 2023-12-06 16:50:44 CST. -- 三 2023-12-06 10:00:00 hostname systemd[1]: Starting Docker Application Container Engine... 三 2023-12-06 10:00:01 hostname docker[1234]: time="2023-12-06T10:00:01.123456789Z" level=info msg="Starting up" 三 2023-12-06 10:00:01 hostname docker[1234]: time="2023-12-06T10:00:01.987654321Z" level=info msg="API listen on /var/run/docker.sock" 三 2023-12-06 10:00:01 hostname systemd[1]: Started Docker Application Container Engine. 三 2023-12-06 14:30:00 hostname docker[1234]: time="2023-12-06T14:30:00.111222333Z" level=info msg="Container abcdef123456 started" 三 2023-12-06 14:35:00 hostname docker[1234]: time="2023-12-06T14:35:00.444555666Z" level=info msg="Container abcdef123456 stopped" ......
二、kubernetes日志
是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。在 Kubernetes 集群遭受攻击时,通过日志检查可以了解攻击的状况、追踪攻击者活动以及恢复受影响系统。
日志基本命令
使用kubectl logs命令查看日志,例如:
kubectl logs <pod_name> #获取名为nginx的pod日志
[root@paas-controller1:/home/pict]$ kubectl logs op-containers-k8sconfig-1-mmz98 I1010 11:08:38.464729 1 leaderelection.go:248] attempting to acquire leader lease kube-system/k8sconfig... E1010 11:08:38.484006 1 controller.go:270] Metrics controller - error update localcache: not found node 172.20.0.2 kubelet metrics config from patched I1010 11:08:38.506713 1 leaderelection.go:258] successfully acquired lease kube-system/k8sconfig
获取Pod内的特定容器中的日志
kubectl logs -p <pod_name> -c <container_name>
当pod中有多个容器时,需要使用-c参数指定容器打印内容
[root@paas-controller1:/home/pict]$kubectl logs -p sysslb -c apiroute #获取sysslb的pod中名为apiroute容器的日志 ### Starting apiroute @RUNHOME@ /opt/application/zenap-msb-apigateway/apiroute ### Starting apiroute-go /opt/application/zenap-msb-apigateway/apiroute /opt/application/zenap-msb-apigateway/apiroute ......
该方法只能读取最近写入的内容。如果 Pod 写入 40 MiB 的日志,并且 kubelet 在 10 MiB 之后轮转日志, 则kubectl logs 将最多返回 10 MiB 的数据。如果要查看更多信息,可进入日志目录查看。kubectl不提供直接的选项获取全部日志,因为可能导致大量数据传输,在某些情况下是不安全的
组件服务日志
k8s涉及的日志有很多,如图,包括kube-apiserver、controller-manager、scheduler、kube-proxy、etcd等
下表列出了Kubernetes集群中主要组件的日志,以及它们的主要功能:
组件 | 日志位置(请根据具体部署方式确定) | 功能 |
---|---|---|
kube-apiserver | /var/log/kube-apiserver.log | 提供Kubernetes API服务,接受和处理API请求。 |
kube-controller-manager | /var/log/kube-controller-manager.log | 控制器的核心组件,负责维护系统的期望状态。 |
kube-scheduler | /var/log/kube-scheduler.log | 负责决定将Pod调度到哪个节点上,根据资源和策略进行调度。 |
kube-proxy | /var/log/kube-proxy.log | 负责维护网络规则,使得Pod可以相互通信。 |
etcd | etcd服务器本身的日志 | 提供分布式键值存储,存储整个集群的状态信息。 |
kubelet | /var/log/kubelet.log | 在每个节点上运行,负责维护Pod的生命周期,与容器运行时交互。 |
container runtime | 依赖于具体容器运行时,比如Docker | 依赖于具体容器运行时,比如Docker | 负责管理和运行容器,记录容器的启动、停止等事件。 |
kube-dns | 可能在CoreDNS中,也可能在其他地方 | 负责为Pod提供DNS服务,实现Pod名称到IP地址的解析。 |
例如,在某节点目录下存在多个日志
近两年挖矿木马广泛利用的Kube-apiserver未授权访问漏洞为例,攻击者使用Kubectl -s远程删除了pod,可以在上图的apiserver.log中看到12月11号上午10点10分删除了nginx pod
查看audit日志
audit日志是 kube-apiserver 记录的所有 API 调用的详细信息,包括请求者、时间戳、操作类型、资源类型、请求参数、响应状态等。值得注意的信息有:
sourceIP显示了操作的IP来源,
user显示了操作者的身份和所在的用户组, group显示该用户隶属的组
requestReceivedTimestamp显示请求的时间戳,格式为UTC+0,与一般日志记录内容不同
组件服务日志存储位置:
以服务运行:
在使用 systemd 的 Linux 节点上,kubelet 和容器运行时默认写入 journald。 使用 journalctl -u指定服务单元查看服务日志;例如:
journalctl -u kubelet/kube-apiserver/kube-scheduler
具体存储位置可以通过/etc/manifests/kube-apiserver.yaml里搜索log查看。其他组件存储位置同理。例如,在目录下查看kube-apiserver的配置文件
参数--log-file和--audit-log-path指定了常规日志(General Log)和审计日志(Audit Log)的输出路径。
常规日志包含了 kube-apiserver 运行过程中产生的调试信息、错误信息以及其他重要事件的信息。但是不包括api细节
audit日志记录了api请求的详细信息
组件以静态pod运行:
如果 systemd 不存在,kube-apiserver等服务以pod方式运行,可以使用kube-system命名空间下的pod日志查看组件活动:
例如:
[root@paas-controller-1:/paasdata/op-log/k8s]$ kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE kube-apiserver-192.168.85.3 1/1 Running 0 38d kube-controller-manager-192.168.85.3 1/1 Running 0 38d kube-proxy-192.168.85.25 1/1 Running 1 (27d ago) 38d kube-proxy-192.168.85.3 1/1 Running 0 38d
日志可能写入到 /var/log 目录中的 .log 文件。例如/var/log/containers/kube-apiserver.log
Windows服务日志:
默认情况下,kubelet 将日志写入目录 C:\var\logs 中的文件(注意不是 C:\var\log)。这是kubelet的默认目录,但是一些集群部署工具会将 Windows 节点设置为将日志放到 C:\var\log\kubelet。
kubelet 总是指示容器运行时在目录 C:\var\log\pods 中写入日志。