【畅想】WindowsServer安全事件监控

admin 2024年8月22日23:56:54评论18 views字数 10030阅读33分26秒阅读模式

💆脑补框架图

【畅想】WindowsServer安全事件监控
IT-SomeSecurity.png

准备内容

材料

  1. 1. 引擎代码

git clone https://github.com/Qianlitp/WatchAD.git
  1. 1. 前端代码

git clone https://github.com/Qianlitp/WatchAD-Web.git

软件/服务准备

  1. 1. 虚拟机:服务器

  2. 2. Docker:用于docker部署watchAD

  3. 3. Anaconda:用于python版本控制

  4. 4. Kafka:本地服务或docker版

  5. 5. Zookeeper:本地服务或docker版

  6. 6. Mongo:本地服务或docker版

部署

安装依赖

安装Docker

直接安装docker

  • • 网络好的,可以通过命令行的方式,直接安装Docker服务

apt update
apt install -y docker-ce
  • • 网络不行,只能间接选择了离线安装的方式

# 下载离线deb
containerd.io_1.7.19-1_amd64.deb
docker-ce_27.1.1-1~ubuntu.24.04~noble_amd64.deb
docker-compose-plugin_2.29.1-1~ubuntu.24.04~noble_amd64.deb
docker-buildx-plugin_0.16.1-1~ubuntu.24.04~noble_amd64.deb  
docker-ce-cli_27.1.1-1~ubuntu.24.04~noble_amd64.deb

# 进入下载包的目录
cd docker-ce

# 离线安装
sudo dpkg -i ./containerd.io_1.7.19-1_amd64.deb ./docker-ce_27.1.1-1~ubuntu.24.04~noble_amd64.deb ./docker-ce-cli_27.1.1-1~ubuntu.24.04~noble_amd64.deb ./docker-buildx-plugin_0.16.1-1~ubuntu.24.04~noble_amd64.deb ./docker-compose-plugin_2.29.1-1~ubuntu.24.04~noble_amd64.deb

Docker网卡配置

为了避免Docker服务启动后,和本地宿主机地址冲突导致的访问异常,修改docker对应的相关服务为一个不常见IP段

# 修改配置文件
vim /etc/docker/daemon.json(示例文件如下)

#修改配置文件后,重启docker服务
systemctl restart docker
# daemon.json示例文件
{
"bip":"10.55.0.1/24",
"default-address-pools":[
{
"base":"10.10.10.1/16",
"size":24
}
]
}

Docker仓库

如果需要指定固定的私有Docker镜像仓库,那也可以通过修改上面的daemon.json文件,添加配置即可,如下:

# 添加registry-mirrors参数,记得修改配置后重启服务

{
"bip":"10.55.0.1/24",
"default-address-pools":[
{
"base":"10.10.10.1/16",
"size":24
}
],
"registry-mirrors":["https://docker.xxxx.xxxx/"]
}

启动Engine服务

启动依赖服务

需要启动rabbitMQ、MongoDB、Logstash、ElasticSearch、Redis五个服务,直接通过命令执行即可:

# 进入项目目录
cd WatchAd
# 启动服务
docker compose up -d

启动WatchAD Engine

安装anaconda

因为Python版本的兼容性,选择通过anaconda来进行Python版本安装和控制。

# 下载安装脚本
wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh

# 安装anaconda
bash Anaconda3-2024.06-1-Linux-x86_64.sh

创建Python指定版本虚拟环境

# 激活conda
source /root/anaconda/bin/activate
# 创建python3.6虚拟环境
conda create --name watchaad python=3.6
# 进入python3.6虚拟环境
conda activate watchad

安装依赖

pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

pip国内加速

# 本文使用aliyun源
pip install -i https://mirrors.aliyun.com/pypi/simple/ package_name
# 其他源
pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ package_name
pip install -i https://pypi.douban.com/simple/ package_name
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ package_name
pip install -i https://mirrors.cloud.tencent.com/pypi/simple/ package_name

启动Engine

python WatchAD.py --start

启动WEB服务

完成上述的环境依赖配置、引擎启动后,同样通过docker可以启动server web服务

# 进入web目录
cd WatchAD-Web

# docker启动服务
docker compose up -d

# 在这之前,你也可以先build,然后up
docker compuse build
docker compose up -d

测试环境

配置一台域控

【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png

配置日志采集

安装winlogbeat

安装包安装

下载安装包:https://www.elastic.co/fr/downloads/beats/winlogbeat

【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png

默认路径

C:Program FilesElasticBeats8.14.3winlogbeat

【畅想】WindowsServer安全事件监控
image.png

源码安装winlogbeat

# 下载源码包
https://www.elastic.co/fr/downloads/beats/winlogbeat

# 解压到你想的位置
C:/winlogbeat

# 修改配置文件
vim

# 安装服务
set-executionpolicy remotesigned  

配置winlogbeat

winlogbeat.event_logs:
  -name:Application
ignore_older:72h
-name:Security
-name:System
-name:Microsoft-Windows-PowerShell/Operational
-name:Microsoft-Windows-TaskScheduler/Operational

output.kafka:
hosts:["kafka_broker1:9092","kafka_broker2:9092","kafka_broker3:9092"]
topic:"winlogbeat"
partition.round_robin:
reachable_only:false
required_acks:1
compression:gzip
max_message_bytes: 1000000

启动winlogbeat

# 手动启动,通过powershell
.winlogbeat.exe -e -c .winlogbeat.yml

# 启动服务
Start-Service winlogbeat

# 停止服务
Stop-Service winlogbeat

# 查看服务状态
Get-Service winlogbeat

# 重启服务
Restart-Service winlogbeat

Security日志样例解析

{
  "@timestamp":"2024-08-07T12:34:56.789Z",//事件发生的时间戳
"winlog":{//包含与 Windows 日志相关的详细信息
"event_id":4624,//事件 ID,例如 4624 表示成功登录事件
"provider_name":"Microsoft-Windows-Security-Auditing",//事件提供程序的名称
"computer_name":"MyComputer",//事件发生的计算机名称
"record_id":123456,//事件记录 ID
"opcode":"Info",//操作码,指示事件的类型
"log_name":"Security",//日志名称
"level":"Information",//事件级别
"event_data":{//事件的具体数据,包括与事件相关的用户、域名、进程等信息
"SubjectUserSid":"S-1-5-18",//执行此登录事件的用户 SID。S-1-5-18` 代表本地系统账户
"SubjectUserName":"SYSTEM",//执行此操作的用户名是 SYSTEM
"SubjectDomainName":"NT AUTHORITY",//用户的域名是 NT AUTHORITY`,这是 Windows 操作系统的内部域
"SubjectLogonId":"0x3e7",//登录会话的唯一标识符
"TargetUserSid":"S-1-5-21-3623811015-3361044348-30300820-1013",//被登录用户的 SID,这是一个特定用户的 SID
"TargetUserName":"User",//被登录的用户名是 User
"TargetDomainName":"DOMAIN",//目标用户的域名是 DOMAIN
"TargetLogonId":"0x5fdce6e",//目标登录会话的唯一标识符
"LogonType":"2",//登录类型为 2,表示这是一次交互式登录(如通过控制台登录)
"LogonProcessName":"User32",//登录进程的名称是 User32,通常与用户界面的登录有关
"AuthenticationPackageName":"Negotiate",//使用的身份验证包是 Negotiate,这是一种动态选择 Kerberos 或 NTLM 的身份验证机制
"WorkstationName":"MyComputer",//登录的工作站名称是 “MyComputer”
"LogonGuid":"{00000000-0000-0000-0000-000000000000}",//这是一个全零的 GUID,通常表示此字段未使用
"TransmittedServices":"-",
"LmPackageName":"-",
"KeyLength":"0",//在此日志中,0 表示没有使用加密密钥
"ProcessId":"0x4c0",//0x4c0是十六进制的进程号,对应的十进制值为 1216。可以在任务管理器中查看此进程的详细信息。
"ProcessName":"C:\Windows\System32\winlogon.exe",//生成登录事件的进程的可执行文件路径
"IpAddress":"127.0.0.1",//登录请求的 IP 地址是 127.0.0.1`,表示这是一个本地登录
"IpPort":"0"//使用的端口号是 0`,通常表示未通过网络端口连接
},
"keywords":[//事件的关键字
"Audit Success"
],
"task":"Logon",//事件的任务类别
"process":{//事件相关的进程信息
"pid":0,
"thread":{
"id":0
}
}
},
"event":{//通用事件信息
"kind":"event",//事件类型
"code":4624,//事件代码
"provider":"Microsoft-Windows-Security-Auditing",//事件提供者
"action":"logged_in",//事件动作
"outcome":"success"//事件结果
},
"agent":{//收集日志的代理信息
"name":"MyAgent",//代理名称
"type":"winlogbeat",//代理类型
"version":"7.10.0"//代理版本
},
"ecs":{//Elastic Common Schema 信息
"version":"1.5.0"//ECS版本
},
"host":{//事件发生的主机信息
"name":"MyComputer",//主机名称
"hostname":"mycomputer.domain.local",//主机的完全限定域名(FQDN)
"architecture":"x86_64",//主机架构
"os":{//操作系统信息
"platform":"windows",//操作系统平台
"version":"10.0",//操作系统版本
"family":"windows",//操作系统家族
"name":"Windows 10 Pro",//操作系统名称
"kernel":"10.0.19041.388",//内核版本
"build":"19041.388"//构建版本
}
}
}

winlogbeat直接接入kafka

winlogbeat采集日志格式

创建Topic

创建topic

./bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 3 --partitions 5 --topic seclog-winserver-office-printer

其他命令

# 查看所有topic
./bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181| grep seclog-

# 消费topic验证
./bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic seclog-winserver-office-printer

# 列出kafka集群所有topic
./kafka-topics.sh --list --bootstrap-server 10.71.3.9:9092,10.71.3.4:9092,10.71.3.6:9092

各个Windows Server配置winlogbeat

配置winlogbeat

winlogbeat.event_logs:
  -name:Application
ignore_older:72h
-name:Security
-name:System
-name:Microsoft-Windows-PowerShell/Operational
-name:Microsoft-Windows-TaskScheduler/Operational

output.kafka:
hosts:["kafka_broker1:9092","kafka_broker2:9092","kafka_broker3:9092"]
topic:"winlogbeat"
partition.round_robin:
reachable_only:false
required_acks:1
compression:gzip
max_message_bytes: 1000000

启动winlogbeat服务

# 启动服务
Start-Service winlogbeat

# 停止服务
Stop-Service winlogbeat

# 查看服务状态
Get-Service winlogbeat

# 重启服务
Restart-Service winlogbeat
【畅想】WindowsServer安全事件监控
image.png

配置审计记录策略

winlogbeat支持记录的日志类型有哪些。以下是 Winlogbeat 支持的主要日志类型:

  • • Application Log: 应用程序日志包含与应用程序和服务运行相关的事件日志。通常,这些日志由操作系统或本地应用程序生成,用于记录应用程序的错误、警告和信息性事件。

  • • System Log: 系统日志记录与操作系统本身相关的事件。这些事件包括操作系统组件和服务的启动、停止、故障以及其他重要的系统级事件。

  • • Security Log: 安全日志记录与系统安全相关的事件。这包括用户登录和注销事件、访问控制更改、审核策略更改等安全性事件。安全日志通常用于监控系统的安全状态和用户活动。

  • • Directory Service Log: 目录服务日志专用于记录 Active Directory 相关的事件。此日志通常用于监控和排查 Active Directory 环境中的问题。

  • • DNS Server Log: DNS Server 日志记录与 DNS 服务器相关的事件,如 DNS 查询、区域传输以及其他 DNS 服务器操作。这些日志有助于监控 DNS 服务器的运行状态和性能。

  • • File Replication Service Log: 文件复制服务日志记录与 Windows Server 中的文件复制服务(FRS)相关的事件。这些日志对于监控和维护基于 FRS 的分布式文件系统环境非常有用。

  • • Microsoft Windows Defender 日志: 记录与 Windows Defender 防病毒和防恶意软件服务相关的事件,如扫描结果、威胁检测和其他安全操作。这些日志对于监控系统的安全防护状态非常重要。

  • • Task Scheduler 日志: 记录与任务计划程序相关的事件,包括任务创建、执行、失败和终止事件。这些日志有助于监控自动化任务的执行情况。

  • • Windows PowerShell 日志: 记录与 PowerShell 脚本和命令执行相关的事件。此类日志对于审计和调试 PowerShell 脚本的运行情况非常有用。

  • • 自定义事件日志

- Windows 允许用户创建自定义的事件日志,而 Winlogbeat 也能够收集这些自定义日志。用户可以指定这些日志的名称和来源,以满足特定的日志记录需求。

数据接入ES+Kibana

配置gohangout

创建gohangout配置,消费Kafka写入ES。

测试gohangout写入

./gohangout -logtostderr -v 5 --config config/qa/config-ypsec-office-windows-server-printer.yml

kibana平台

创建索引模板

# 创建索引模板(指定mapping和setting,可clone已有模板。注意:不可指定别名)
PUT_index_template/template-ypsec-skyeye-qianxin-qa-hwcloud
{
"version":1,
"priority":10,
"template":{
"settings":{
"index":{
"lifecycle":{
"name":"policy-ilm-c-common",
"rollover_alias":"ypsec-sky-eye-xin-qacloud"
}
}
}
},
"index_patterns":[
"ypsec-sky-eye-xin-qacloud-*"
],
"composed_of":[
"ypsec-component-template-001"
]
}

创建索引

# 创建索引,如:waf-chaitin-qa-hwcloud-000001,同时指定滚动别名(同4中命名一致)
PUT/ypsec-fw-fortinet-office-wantong-000001
{
"aliases":{
"ypsec-office-wantong":{
"is_write_index":true
}
}
}
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png

验证事件效果

【示例】用户创建事件

事件id 4722,新用户启用

【畅想】WindowsServer安全事件监控
image.png

其他问题

【报错】启动engine报错

【畅想】WindowsServer安全事件监控
image.png

编辑WatchAD.py的代码添加supervisord变量、调整start函数的supervisord的代码即可

supervisord_path = "/root/anaconda3/envs/watchad/bin/supervisord"

defstart():
ifnot check():
        sys.exit(-1)
    logger.info("Starting the WatchAD detect engine ...")

    rsp = subprocess.call("{supervisord} -c {root_dir}/supervisor.conf".format(supervisord=supervisord_path, root_dir=project_dir),
                          shell=True,
                          env={"WATCHAD_ENGINE_DIR": project_dir,"WATCHAD_ENGINE_NUM":str(ENGINE_PROCESS_NUM)})
if rsp ==0:
        logger.info("Started!")
【畅想】WindowsServer安全事件监控
image.png
【畅想】WindowsServer安全事件监控
image.png

【疑问】为什么看不到源IP

在 Windows Server 上,用户账户相关的事件日志(如用户登录、账户创建、禁用、启用等)通常不直接包含客户端的 IP 地址。对于大多数用户账户管理类的事件(例如事件 ID 4720、4722、4725 等),这些事件记录的是执行操作的账户和目标账户的信息,但不会包括与操作相关的网络信息,如 IP 地址。

【疑问】什么事件会记录 IP 地址

Windows 事件日志中有一些特定类型的事件会记录与网络相关的信息,包括客户端的 IP 地址。常见的情况如下:

登录事件(如事件 ID 4624 和 4625)

这些事件通常包括 Network Information 字段,其中包含客户端 IP 地址:

Network Information:
Workstation Name:  WORKSTATION01
Source Network Address: 192.168.1.100
Source Port:  12345
  • • 事件 ID 4624(登录成功):当用户成功登录时,这个事件会记录详细信息,包括客户端 IP 地址(如果登录是通过网络进行的)。

  • • 事件 ID 4625(登录失败):当用户登录失败时,也会记录类似的信息。

远程桌面连接事件

  • • 当用户通过远程桌面连接(RDP)登录时,登录事件日志通常也会包含客户端的 IP 地址。

网络登录事件

  • • 网络登录通常发生在通过 SMB 共享、远程桌面等方式访问服务器时,相关的登录事件会记录客户端 IP 地址。

如何收集包含 IP 地址的日志?

为了确保你能够收集到包含 IP 地址的日志,你需要关注以下事件 ID,并使用工具(如 Winlogbeat)正确配置日志采集:

4624(成功的登录事件)
4625(失败的登录事件)
4648(使用明确凭证登录的尝试)

你可以通过 Winlogbeat 配置文件中的 winlogbeat.event_logs 部分来指定你想要收集的事件日志类型和 ID。

winlogbeat.event_logs:
  - name: Security
    event_id: 4624, 4625, 4648

【畅想】WindowsServer安全事件监控

原文始发于微信公众号(埋藏酱油瓶):【畅想】WindowsServer安全事件监控

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月22日23:56:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【畅想】WindowsServer安全事件监控https://cn-sec.com/archives/3087889.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息