NVIDIA Morpheus (24.10.01)

数字指纹 (DFP)

每个帐户、用户、服务和机器都有一个数字指纹,代表在给定时期内执行和未执行的典型操作。了解每个实体每天、每时每刻的工作有助于我们识别异常行为,并发现环境中的潜在威胁。

为了构建这个数字指纹,我们将训练各种粒度的无监督行为模型,包括针对组织中所有用户的通用模型,以及针对每个用户的细粒度模型,以监控他们的行为。这些模型会随着时间的推移不断更新和重新训练,当任何用户的行为偏离常态时,就会触发警报。

我们希望用于训练和推理的数据将是用户与之交互的任何敏感系统,例如 VPN、身份验证和云服务。数字指纹示例 (examples/digital_fingerprinting/README.md) 包含在 Morpheus 中,它摄取来自 Azure Active DirectoryDuo Authentication 的日志。

这些日志的位置可以是运行 Morpheus 的机器本地、NFS 等共享文件系统,或 Amazon S3 等远程存储。

定义新的数据源

使用 Morpheus API 可以轻松添加其他数据源和远程存储。将 DFP 应用于新数据源的关键是通过特征选择过程。任何数据源都可以在经过一些预处理以获得每个日志/数据点的特征向量后,馈送到 DFP 中。为了为每个实体(例如用户、服务和机器)构建有针对性的模型,所选数据源需要一个唯一标识我们要建模实体的字段。

为 DFP 管道添加新源需要定义五个关键部分

  1. morpheus.config.Config.ae.userid_column_name 配置属性指定的用户 ID 列。这可以是唯一标识要进行指纹识别的用户、帐户或服务的任何列。可能的 user ID 示例包括

    • 用户名或全名(例如,"johndoe""Jane Doe"

    • 用户的 LDAP ID 号

    • 用户组(例如,"sales""engineering"

    • 网络上机器的主机名

    • 客户端的 IP 地址

    • 服务名称(例如,"DNS""Customer DB""SMTP"

  2. morpheus.config.Config.ae.timestamp_column_name 配置属性指定的时间戳列。时间戳列需要转换为 datetime 列,请参阅 DateTimeColumn

  3. 模型的特征,由 morpheus.config.Config.ae.feature_columns 配置属性指定的字符串列表。在 DFPPreprocessingStage 之后,所有这些特征都应该可用于管道。

  4. 用于 DFPFileToDataFrameStage 阶段的 DataFrameInputSchema

  5. 用于 DFPPreprocessingStageDataFrameInputSchema

此示例旨在说明 Morpheus 中全面、生产就绪的 DFP 部署。它包含所有必要的组件(例如模型存储),以允许多个 Morpheus 管道进行通信,其规模可以处理整个公司的工作负载。

主要特征

  • 多个管道专门用于执行训练或推理

  • 使用模型存储来允许训练和推理管道进行通信

  • 组织成 docker-compose 部署,便于启动

  • 包含 Jupyter notebook 服务,以简化开发和调试

  • 可以使用提供的 Helm charts 部署到 Kubernetes

  • 使用许多自定义阶段来最大化性能。

本示例在 examples/digital_fingerprinting/production/README.md 以及本文档的其余部分中进行了描述。

Azure Active Directory

特征

描述

appDisplayName 例如,Windows sign inMS TeamsOffice 365
clientAppUsed 例如,IMAP4Browser
deviceDetail.displayName 例如,username-LT
deviceDetail.browser 例如,EDGE 98.0.xyzChrome 98.0.xyz
deviceDetail.operatingSystem 例如,LinuxIOS 15Windows 10
statusfailureReason 例如,external security challenge not satisfiederror validating credentials
riskEventTypesv2 AzureADThreatIntelunfamiliarFeatures
location.countryOrRegion 国家或地区名称
location.city 城市名称

派生特征

特征

描述

logcount 跟踪用户当天生成的日志数量(每个日志递增)
locincrement 每当我们在用户当天的日志中观察到新城市 (location.city) 时递增
appincrement 每当我们在用户当天的日志中观察到新应用 (appDisplayName) 时递增

Duo Authentication

特征

描述

auth_device.name 电话号码
access_device.browser 例如,EdgeChromeChrome Mobile
access_device.os 例如,AndroidWindows
result SUCCESSFAILURE
reason 结果的原因,例如,User CancelledUser ApprovedUser MistakeNo Response
access_device.location.city 城市名称

派生特征

特征

描述

logcount 跟踪用户当天生成的日志数量(每个日志递增)
locincrement 每当我们在用户当天的日志中观察到新城市 (location.city) 时递增

Morpheus 中的 DFP 是通过两个独立的管道实现的:训练和推理。管道通过共享模型存储 (MLflow) 进行通信,并且两者都共享许多通用组件,因为 Morpheus 由可重用阶段组成,可以轻松混合和匹配。

dfp_high_level_arch.png

训练管道

  • 训练用户模型并上传到模型存储

  • 能够训练单个用户模型或所有用户的回退通用模型

推理管道

  • 从模型存储下载用户模型

  • 为每个日志生成异常分数

  • 将检测到的异常发送到监控服务

监控

  • 检测到的异常发布到 S3 存储桶、目录或 Kafka 主题。

  • 输出可以与监控工具集成。

dfp_runtime_env.png

Morpheus 中的 DFP 构建为容器化服务的应用程序,可以通过两种方式运行

  1. 使用 docker-compose 进行测试和开发

  2. 使用 helm charts 进行生产 Kubernetes 部署

服务

参考架构由以下服务组成:

服务

描述

mlflow MLflow 提供版本化的模型存储
jupyter Jupyter Server 是管道测试和开发所必需的
morpheus_pipeline 用于执行训练和推理管道

通过 docker-compose 运行

系统要求

注意: 有关 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.pydfp_duo_pipeline.py 管道脚本。

复制
已复制!
            

python dfp_azure_pipeline.py --help python dfp_duo_pipeline.py --help

这两个脚本都能够为其各自的数据源运行训练或推理管道。两者的命令行选项相同

标志

类型

描述

--train_users 以下之一:allgenericindividualnone 指示是否训练每个用户或所有用户的通用模型。选择 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 以下之一:CRITICALFATALERRORWARNWARNINGINFODEBUG 指定要使用的日志记录级别。[默认值: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_pipelinejupyter 服务将在后台启动 mlflow 服务。出于调试目的,查看正在运行的 MLflow 服务的日志可能会有所帮助。

examples/digital_fingerprinting/production 目录运行

复制
已复制!
            

docker compose up mlflow

通过 Kubernetes 运行

系统要求

注意: 有关 GPU 要求,请参阅 入门 指南。

有关自定义 DFP 管道的详细信息,请参阅 数字指纹 (DFP) 参考

上一篇 创建 C++ 源阶段
下一篇 数字指纹 (DFP) 参考
© 版权所有 2024,NVIDIA。 最后更新于 2024 年 12 月 3 日。