数字指纹 (DFP)
每个帐户、用户、服务和机器都有一个数字指纹,代表在给定时期内执行和未执行的典型操作。了解每个实体每天、每时每刻的工作有助于我们识别异常行为,并发现环境中的潜在威胁。
为了构建这个数字指纹,我们将训练各种粒度的无监督行为模型,包括针对组织中所有用户的通用模型,以及针对每个用户的细粒度模型,以监控他们的行为。这些模型会随着时间的推移不断更新和重新训练,当任何用户的行为偏离常态时,就会触发警报。
我们希望用于训练和推理的数据将是用户与之交互的任何敏感系统,例如 VPN、身份验证和云服务。数字指纹示例 (examples/digital_fingerprinting/README.md
) 包含在 Morpheus 中,它摄取来自 Azure Active Directory 和 Duo Authentication 的日志。
这些日志的位置可以是运行 Morpheus 的机器本地、NFS 等共享文件系统,或 Amazon S3 等远程存储。
定义新的数据源
使用 Morpheus API 可以轻松添加其他数据源和远程存储。将 DFP 应用于新数据源的关键是通过特征选择过程。任何数据源都可以在经过一些预处理以获得每个日志/数据点的特征向量后,馈送到 DFP 中。为了为每个实体(例如用户、服务和机器)构建有针对性的模型,所选数据源需要一个唯一标识我们要建模实体的字段。
为 DFP 管道添加新源需要定义五个关键部分
由
morpheus.config.Config.ae.userid_column_name
配置属性指定的用户 ID 列。这可以是唯一标识要进行指纹识别的用户、帐户或服务的任何列。可能的 user ID 示例包括用户名或全名(例如,
"johndoe"
或"Jane Doe"
)用户的 LDAP ID 号
用户组(例如,
"sales"
或"engineering"
)网络上机器的主机名
客户端的 IP 地址
服务名称(例如,
"DNS"
、"Customer DB"
或"SMTP"
)
由
morpheus.config.Config.ae.timestamp_column_name
配置属性指定的时间戳列。时间戳列需要转换为datetime
列,请参阅DateTimeColumn
。模型的特征,由
morpheus.config.Config.ae.feature_columns
配置属性指定的字符串列表。在DFPPreprocessingStage
之后,所有这些特征都应该可用于管道。
此示例旨在说明 Morpheus 中全面、生产就绪的 DFP 部署。它包含所有必要的组件(例如模型存储),以允许多个 Morpheus 管道进行通信,其规模可以处理整个公司的工作负载。
主要特征
多个管道专门用于执行训练或推理
使用模型存储来允许训练和推理管道进行通信
组织成 docker-compose 部署,便于启动
包含 Jupyter notebook 服务,以简化开发和调试
可以使用提供的 Helm charts 部署到 Kubernetes
使用许多自定义阶段来最大化性能。
本示例在 examples/digital_fingerprinting/production/README.md
以及本文档的其余部分中进行了描述。
Azure Active Directory
特征 |
描述 |
---|---|
appDisplayName |
例如,Windows sign in 、MS Teams 、Office 365 |
clientAppUsed |
例如,IMAP4 、Browser |
deviceDetail.displayName |
例如,username-LT |
deviceDetail.browser |
例如,EDGE 98.0.xyz 、Chrome 98.0.xyz |
deviceDetail.operatingSystem |
例如,Linux 、IOS 15 、Windows 10 |
statusfailureReason |
例如,external security challenge not satisfied 、error validating credentials |
riskEventTypesv2 |
AzureADThreatIntel 、unfamiliarFeatures |
location.countryOrRegion |
国家或地区名称 |
location.city |
城市名称 |
派生特征
特征 |
描述 |
---|---|
logcount |
跟踪用户当天生成的日志数量(每个日志递增) |
locincrement |
每当我们在用户当天的日志中观察到新城市 (location.city ) 时递增 |
appincrement |
每当我们在用户当天的日志中观察到新应用 (appDisplayName ) 时递增 |
Duo Authentication
特征 |
描述 |
---|---|
auth_device.name |
电话号码 |
access_device.browser |
例如,Edge 、Chrome 、Chrome Mobile |
access_device.os |
例如,Android 、Windows |
result |
SUCCESS 或 FAILURE |
reason |
结果的原因,例如,User Cancelled 、User Approved 、User Mistake 、No Response |
access_device.location.city |
城市名称 |
派生特征
特征 |
描述 |
---|---|
logcount |
跟踪用户当天生成的日志数量(每个日志递增) |
locincrement |
每当我们在用户当天的日志中观察到新城市 (location.city ) 时递增 |

Morpheus 中的 DFP 构建为容器化服务的应用程序,可以通过两种方式运行
使用 docker-compose 进行测试和开发
使用 helm charts 进行生产 Kubernetes 部署
服务
参考架构由以下服务组成:
服务 |
描述 |
---|---|
mlflow |
MLflow 提供版本化的模型存储 |
jupyter |
Jupyter Server 是管道测试和开发所必需的 |
morpheus_pipeline |
用于执行训练和推理管道 |
通过 docker-compose
运行
系统要求
主机上安装了 Docker 和 docker-compose
支持的 GPU 和 NVIDIA Container Toolkit
注意: 有关 GPU 要求,请参阅 入门 指南。
构建服务
从 Morpheus 仓库的根目录运行
cd examples/digital_fingerprinting/production
export MORPHEUS_CONTAINER_VERSION="$(git describe --tags --abbrev=0)-runtime"
docker compose build
注意: 这需要 1.28.0 或更高版本的 Docker Compose,最好是 v2。如果您遇到类似于以下的错误
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.jupyter.deploy.resources.reservations value Additional properties are not allowed ('devices' was
unexpected)
这很可能是由于使用了旧版本的 docker-compose
命令,请使用 docker compose
重新运行构建。有关更多信息,请参阅 迁移到 Compose V2。
下载示例数据集
首先,我们需要在 Conda 环境中安装其他要求。然后运行 examples/digital_fingerprinting/fetch_example_data.py
脚本。这将把示例数据下载到 examples/data/dfp
目录中。
从 Morpheus 仓库运行
conda env update --solver=libmamba \
-n ${CONDA_DEFAULT_ENV} \
--file ./conda/environments/examples_cuda-125_arch-x86_64.yaml
python examples/digital_fingerprinting/fetch_example_data.py all
运行服务
Jupyter Server
从 examples/digital_fingerprinting/production
目录运行
docker compose up jupyter
构建完成后,服务启动后,应显示类似于以下内容的消息
jupyter | To access the server, open this file in a browser:
jupyter | file:///root/.local/share/jupyter/runtime/jpserver-7-open.html
jupyter | Or copy and paste one of these URLs:
jupyter | https://127.0.0.1:8888/lab?token=<token>
jupyter | or http://127.0.0.1:8888/lab?token=<token>
复制 URL 并粘贴到 Web 浏览器中。DFP 示例中包含四个 notebook
dfp_azure_training.ipynb - Azure Active Directory 数据的训练管道
dfp_azure_inference.ipynb - Azure Active Directory 数据的推理管道
dfp_duo_training.ipynb - Duo Authentication 的训练管道
dfp_duo_inference.ipynb - Duo Authentication 的推理管道
注意: URL 中的令牌是一次性使用令牌,每次调用都会生成一个新令牌。
Morpheus 管道
默认情况下,morpheus_pipeline
将从 examples/digital_fingerprinting/production
目录运行 Duo 数据的训练管道
docker compose up morpheus_pipeline
如果您想从 examples/digital_fingerprinting/production
目录运行不同的管道,请运行
docker compose run morpheus_pipeline bash
在 morpheus_pipeline
容器内的提示符下,您可以运行 dfp_azure_pipeline.py
或 dfp_duo_pipeline.py
管道脚本。
python dfp_azure_pipeline.py --help
python dfp_duo_pipeline.py --help
这两个脚本都能够为其各自的数据源运行训练或推理管道。两者的命令行选项相同
标志 |
类型 |
描述 |
---|---|---|
--train_users |
以下之一:all 、generic 、individual 、none |
指示是否训练每个用户或所有用户的通用模型。选择 none 运行推理管道。 |
--skip_user |
文本 | 要跳过的 User ID。与 only_user 互斥 |
--only_user |
文本 | 仅包含此选项指定的用户。与 skip_user 互斥 |
--start_time |
文本 | 时间窗口的开始时间,如果未定义,start_date 将为 now()-duration |
--duration |
文本 | 从 start_time 开始运行的持续时间 [默认值:60d ] |
--cache_dir |
文本 | 缓存数据(例如 S3 下载和预处理数据)的位置 [环境变量:DFP_CACHE_DIR ;默认值:./.cache/dfp ] |
--log_level |
以下之一:CRITICAL 、FATAL 、ERROR 、WARN 、WARNING 、INFO 、DEBUG |
指定要使用的日志记录级别。[默认值:WARNING ] |
--sample_rate_s |
整数 | 对象日志之间的最小时间步长,以毫秒为单位。[环境变量:DFP_SAMPLE_RATE_S ;默认值:0] |
-f , --input_file |
文本 | 要处理的文件列表。可以为多个文件指定多个参数。也接受 glob (*) 通配符和架构前缀,例如 s3:// 。例如,要创建 s3 存储桶的本地缓存,请使用 filecache::s3://mybucket/* 。有关可能的选项列表,请参阅 fsspec 。 |
--watch_inputs |
标志 | 指示管道持续检查 --input_file 指定的路径中是否有新文件。这假设至少一个路径包含通配符。 |
--watch_interval |
浮点数 | 检查新文件之间等待的时间量,以秒为单位。仅当设置了 –watch_inputs 时才使用。[默认值 1.0 ] |
--tracking_uri |
文本 | 要连接的 MLflow 跟踪 URI。[默认值:https://127.0.0.1:5000 ] |
--help |
显示此消息并退出。 |
要在容器中使用示例数据集运行 DFP 管道,请运行
Duo 训练管道
python dfp_duo_pipeline.py --train_users=all --start_time="2022-08-01" --input_file="/workspace/examples/data/dfp/duo-training-data/*.json"
Duo 推理管道
python dfp_duo_pipeline.py --train_users=none --start_time="2022-08-30" --input_file="/workspace/examples/data/dfp/duo-inference-data/*.json"
Azure 训练管道
python dfp_azure_pipeline.py --train_users=all --start_time="2022-08-01" --input_file="/workspace/examples/data/dfp/azure-training-data/*.json"
Azure 推理管道
python dfp_azure_pipeline.py --train_users=none --start_time="2022-08-30" --input_file="/workspace/examples/data/dfp/azure-inference-data/*.json"
输出字段
输出文件将包含来自输入数据集中检测到异常的日志;这由 mean_abs_z
字段中的 z-score 确定。默认情况下,任何 z-score 为 2.0 或更高的日志都被认为是异常的。请参阅 DFPPostprocessingStage
。
运行上述示例生成的输出文件中的大多数字段是输入字段或从输入字段派生的。其他输出字段是
字段 |
类型 |
描述 |
---|---|---|
event_time |
文本 | ISO 8601 格式的日期字符串,Morpheus 检测到异常的时间 |
model_version |
文本 | 用于执行推理的模型的名称和版本,格式为 <模型名称>:<版本> |
max_abs_z |
浮点数 | 所有特征中的最大 z-score |
mean_abs_z |
浮点数 | 所有特征的平均 z-score |
除此之外,对于每个输入特征,都将存在以下输出字段
字段 |
类型 |
描述 |
---|---|---|
<特征名称>_loss |
浮点数 | 损失 |
<特征名称>_z_loss |
浮点数 | 损失 z-score |
<特征名称>_pred |
浮点数 | 预测值 |
有关这些字段的更多信息,请参阅 DFPInferenceStage。
可选的 MLflow 服务
启动 morpheus_pipeline
或 jupyter
服务将在后台启动 mlflow
服务。出于调试目的,查看正在运行的 MLflow 服务的日志可能会有所帮助。
从 examples/digital_fingerprinting/production
目录运行
docker compose up mlflow
通过 Kubernetes 运行
系统要求
配置了 GPU 资源的 Kubernetes 集群
集群中安装了 NVIDIA GPU Operator
注意: 有关 GPU 要求,请参阅 入门 指南。
有关自定义 DFP 管道的详细信息,请参阅 数字指纹 (DFP) 参考。