# 服务端规则指南

编写服务端规则前，请您详细阅读本文，以便了解规则背后的故事，并帮助您更好的编写 RmEye 规则。


# 规则在何时被应用

RmEye 通过本地部署的客户端，向服务器传输行为事件。 \
服务器在收集并解析了行为事件日志后，会立即调用规则匹配函数检测该行为是否被某条规则命中。


# 规则分类

基于 RmEye 的设计思想，一切动作都基于其进程载体，所以，规则被分为 动作（action）和 进程（process）两种类型。

- [`进程规则`]

    用于在进程启动事件日志中，检测新进程的启动上下文，判断其是否为可疑行为。

- [`动作规则`]

    用于在非进程启动事件日志中，检测其特定行为上下文，判断其是否为可疑行为。

RmEye 动作规则列表编写于 `/Server/rules/py/action.py` 文件中；进程规则列表编写于 `/Server/rules/py/process.py` 文件中。


# 规则单元数据结构

```json
    {
        'rules': [
            'originalfilename =~ ".*wbadmin.exe.*" and commandline =~ ".*delete.*"',
        ],
        'score': 70,
        'name': '通过wbadmin删除备份'
    }
```
这是一个 进程（process）类型的示例规则单元，它是一个 dict 数据，包含有三个 item，\
分别是：`rules`, `score`, `name`

- [`rules`]-> `list`:

    其中包含一个或多个使用 `rule_engine` 语法的规则匹配表达式，每个表达式间的关系为 `或`，即任何一个表达式被匹配，都认为该规则已命中。

- [`score`]-> `int`:

    由一个整数表示的规则匹配分值

- [`name`]-> `str`:

    规则名称

# 适用于 RmEye 的 `rule_engine` 规则匹配表达式

`rule_engine` 表达式是服务端规则的核心，它允许用户定义一个 key-value 类型的 Query 表达式，以匹配一个 dict 数据；\
表达式的左值匹配 dict 数据中的特定键名（key），\
右值允许适用通配符、数字、字符串等进行完全匹配或模糊匹配 dict 数据中，对应左值键名的值（value）。\
需要特别注意的是，必须定义 RmEye 数据源事件日志中存在的左值，才可以使规则完全按照预期工作。

# 进程规则已支持的通用左值定义

- `processid`

    进程 PID

- `image`

    进程文件路径

- `originalfilename`

    进程原始文件名

- `hashes`

    进程 MD5 哈希

- `commandline`

    进程命令行

- `user`

    进程用户名

- `integritylevel`

    进程权限等级

- `parentprocessid`

    父进程 PID

- `parentimage`

    父进程文件路径

- `parentcommandline`

    父进程命令行

- `parentuser`

    父进程用户

# 动作规则已支持的特有左值定义

- `action`

    动作类型，包括：
    | action | 描述 |
    | ---- | ---- |
    | processaccess | 进程句柄访问 |
    | pipecreate | 命名管道创建 |
    | createremotethread | 远程线程创建 |
    | filecreatestreamhash | 文件流创建 |
    | registryadd | 注册表项新建 |
    | registryvalueSet | 注册表值项设置 |
    | registryobjectSet | 注册表对象设置 |
    | dnsquery | DNS 查询 |
    | networkconnect | 网络连接建立 |
    | clipboardchange | 剪贴板访问 |
    | processtampering | 进程执行流劫持 |
    | filedeletedetected | 可执行文件删除 |
    | filecreate | 文件创建 |
    | imageload | DLL 加载 |
    | processcreate | 进程创建（已分离为进程规则）|
    | processterminal | 进程退出（内部保留）|

- `sourceimage` - 仅适用于动作 `processaccess`

    源进程文件路径

- `targetimage` - 仅适用于动作 `processaccess`

    目标进程文件路径

- `grantedaccess` - 仅适用于动作 `processaccess`

    访问权限

- `calltrace` - 仅适用于动作 `processaccess`

    调用栈（Call Stack）

- `pipename` - 仅适用于动作 `pipecreate`

    管道名称

- `targetfilename` - 仅适用于动作 `filecreate`

    目标文件名

- `imageloaded` - 仅适用于动作 `imageload`

    已加载的映像名