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

💆脑补框架图

IT-SomeSecurity.png

准备内容

  1. 引擎代码

bash

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

bash

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服务

bash

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

bash

# 下载离线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对应的相关服务为一个不常见IP段

json

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

#修改配置文件后,重启docker服务
systemctl restart docker

json

# daemon.json示例文件
{
  "bip":"10.55.0.1/24",
  "default-address-pools": [
    {
      "base": "10.10.10.1/16",
      "size": 24
    }
  ]
}

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

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/"]
}

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

bash

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

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

bash

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

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

bash

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

bash

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

bash

# 本文使用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

bash

python WatchAD.py --start

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

bash

# 进入web目录
cd WatchAD-Web

# docker启动服务
docker compose up -d

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

测试环境

image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png

下载安装包:https://www.elastic.co/fr/downloads/beats/winlogbeat image.png image.png image.png 默认路径

C:\Program Files\Elastic\Beats\8.14.3\winlogbeat

image.png

json

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

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

# 修改配置文件
vim

# 安装服务
set-executionpolicy remotesigned  

yaml

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

powershell

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

# 启动服务
Start-Service winlogbeat

# 停止服务
Stop-Service winlogbeat

# 查看服务状态
Get-Service winlogbeat

# 重启服务
Restart-Service winlogbeat

json

{
  "@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

bash

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

bash

# 查看所有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

yaml

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

powershell

# 启动服务
Start-Service winlogbeat

# 停止服务
Stop-Service winlogbeat

# 查看服务状态
Get-Service winlogbeat

# 重启服务
Restart-Service winlogbeat

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 脚本的运行情况非常有用。
  • 自定义事件日志

text

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

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

bash

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

yaml

# 创建索引模板(指定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"
  ]
}

yaml

# 创建索引,如:waf-chaitin-qa-hwcloud-000001,同时指定滚动别名(同4中命名一致)
PUT /ypsec-fw-fortinet-office-wantong-000001
{
  "aliases": {
 "ypsec-office-wantong": {
   "is_write_index": true
 }
  }
}

image.png image.png image.png

事件id 4722,新用户启用 image.png

image.png

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

python

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!")

image.png image.png

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

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

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

json

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 地址的日志,你需要关注以下事件 ID,并使用工具(如 Winlogbeat)正确配置日志采集:

json

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

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

yaml

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

参考链接

相关内容