[安全运营] - 【畅想】WindowsServer安全事件监控

💆脑补框架图
准备内容
1 材料
- 引擎代码
git clone https://github.com/Qianlitp/WatchAD.git
- 前端代码
git clone https://github.com/Qianlitp/WatchAD-Web.git
2 软件/服务准备
- 虚拟机:服务器
- Docker:用于docker部署watchAD
- Anaconda:用于python版本控制
- Kafka:本地服务或docker版
- Zookeeper:本地服务或docker版
- Mongo:本地服务或docker版
部署
1 安装依赖
1.1 安装Docker
1.1.1 直接安装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
1.1.2 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
}
]
}
1.1.3 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/"]
}
2 启动Engine服务
2.1 启动依赖服务
需要启动rabbitMQ、MongoDB、Logstash、ElasticSearch、Redis五个服务,直接通过命令执行即可:
# 进入项目目录
cd WatchAd
# 启动服务
docker compose up -d
2.2 启动WatchAD Engine
2.2.1 安装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
2.2.2 创建Python指定版本虚拟环境
# 激活conda
source /root/anaconda/bin/activate
# 创建python3.6虚拟环境
conda create --name watchaad python=3.6
# 进入python3.6虚拟环境
conda activate watchad
2.2.3 安装依赖
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
2.2.4 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
2.2.5 启动Engine
python WatchAD.py --start
3 启动WEB服务
完成上述的环境依赖配置、引擎启动后,同样通过docker可以启动server web服务
# 进入web目录
cd WatchAD-Web
# docker启动服务
docker compose up -d
# 在这之前,你也可以先build,然后up
docker compuse build
docker compose up -d
测试环境
1 配置一台域控
2 配置日志采集
2.1 安装winlogbeat
2.1.1 安装包安装
下载安装包:https://www.elastic.co/fr/downloads/beats/winlogbeat
默认路径
C:\Program Files\Elastic\Beats\8.14.3\winlogbeat
2.1.2 源码安装winlogbeat
# 下载源码包
https://www.elastic.co/fr/downloads/beats/winlogbeat
# 解压到你想的位置
C:/winlogbeat
# 修改配置文件
vim
# 安装服务
set-executionpolicy remotesigned
2.2 配置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
2.3 启动winlogbeat
# 手动启动,通过powershell
.\winlogbeat.exe -e -c .\winlogbeat.yml
# 启动服务
Start-Service winlogbeat
# 停止服务
Stop-Service winlogbeat
# 查看服务状态
Get-Service winlogbeat
# 重启服务
Restart-Service winlogbeat
2.4 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
1 winlogbeat采集日志格式
2 创建Topic
2.1 创建topic
./bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 3 --partitions 5 --topic seclog-winserver-office-printer
2.2 其他命令
# 查看所有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
3 各个Windows Server配置winlogbeat
3.1 配置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
3.2 启动winlogbeat服务
# 启动服务
Start-Service winlogbeat
# 停止服务
Stop-Service winlogbeat
# 查看服务状态
Get-Service winlogbeat
# 重启服务
Restart-Service winlogbeat
3.3 配置审计记录策略
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 也能够收集这些自定义日志。用户可以指定这些日志的名称和来源,以满足特定的日志记录需求。
4 数据接入ES+Kibana
4.1 配置gohangout
创建gohangout配置,消费Kafka写入ES。
4.2 测试gohangout写入
./gohangout -logtostderr -v 5 --config config/qa/config-ypsec-office-windows-server-printer.yml
4.3 kibana平台
4.3.1 创建索引模板
# 创建索引模板(指定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"
]
}
4.3.2 创建索引
# 创建索引,如:waf-chaitin-qa-hwcloud-000001,同时指定滚动别名(同4中命名一致)
PUT /ypsec-fw-fortinet-office-wantong-000001
{
"aliases": {
"ypsec-office-wantong": {
"is_write_index": true
}
}
}
5 验证事件效果
5.0.3 【示例】用户创建事件
事件id 4722,新用户启用
6 其他问题
6.1 【报错】启动engine报错
编辑WatchAD.py的代码添加supervisord变量、调整start函数的supervisord的代码即可
supervisord_path = "/root/anaconda3/envs/watchad/bin/supervisord"
def start():
if not 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!")
6.2 【疑问】为什么看不到源IP
在 Windows Server 上,用户账户相关的事件日志(如用户登录、账户创建、禁用、启用等)通常不直接包含客户端的 IP 地址。对于大多数用户账户管理类的事件(例如事件 ID 4720、4722、4725 等),这些事件记录的是执行操作的账户和目标账户的信息,但不会包括与操作相关的网络信息,如 IP 地址。
6.3 【疑问】什么事件会记录 IP 地址
Windows 事件日志中有一些特定类型的事件会记录与网络相关的信息,包括客户端的 IP 地址。常见的情况如下:
6.3.1 登录事件(如事件 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(登录失败):当用户登录失败时,也会记录类似的信息。
6.3.2 远程桌面连接事件
- 当用户通过远程桌面连接(RDP)登录时,登录事件日志通常也会包含客户端的 IP 地址。
6.3.3 网络登录事件
- 网络登录通常发生在通过 SMB 共享、远程桌面等方式访问服务器时,相关的登录事件会记录客户端 IP 地址。
6.4 如何收集包含 IP 地址的日志?
为了确保你能够收集到包含 IP 地址的日志,你需要关注以下事件 ID,并使用工具(如 Winlogbeat)正确配置日志采集:
4624(成功的登录事件)
4625(失败的登录事件)
4648(使用明确凭证登录的尝试)
你可以通过 Winlogbeat 配置文件中的 winlogbeat.event_logs
部分来指定你想要收集的事件日志类型和 ID。
winlogbeat.event_logs:
- name: Security
event_id: 4624, 4625, 4648
参考链接
相关内容

如果你觉得这篇文章对你有所帮助,欢迎赞赏~
