💆脑补框架图
准备内容
材料
-
1. 引擎代码
git clone https://github.com/Qianlitp/WatchAD.git
-
1. 前端代码
git clone https://github.com/Qianlitp/WatchAD-Web.git
软件/服务准备
-
1. 虚拟机:服务器
-
2. Docker:用于docker部署watchAD
-
3. Anaconda:用于python版本控制
-
4. Kafka:本地服务或docker版
-
5. Zookeeper:本地服务或docker版
-
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
测试环境
配置一台域控
配置日志采集
安装winlogbeat
安装包安装
下载安装包:https://www.elastic.co/fr/downloads/beats/winlogbeat
默认路径
C:Program FilesElasticBeats8.14.3winlogbeat
源码安装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
配置审计记录策略
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
}
}
}
验证事件效果
【示例】用户创建事件
事件id 4722,新用户启用
其他问题
【报错】启动engine报错
编辑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!")
【疑问】为什么看不到源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安全事件监控
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论