用户名和密码认证
MLflow 支持基本的 HTTP 认证,以实现对实验、已注册模型和评分器的访问控制。启用后,任何访问者都必须先登录,才能查看跟踪服务器中的任何资源。
MLflow 认证提供 Python 和 REST API 来管理用户和权限。
概述
首先,安装基本认证应用程序所需的所有依赖项
pip install mlflow[auth]
基本认证应用程序需要一个密钥来保护 CSRF。请在运行 mlflow server 命令之前设置 MLFLOW_FLASK_SERVER_SECRET_KEY 环境变量。例如
export MLFLOW_FLASK_SERVER_SECRET_KEY="my-secret-key"
如果您的设置使用了多个服务器,请确保这些服务器之间使用相同的密钥。否则,您可能会遇到意外的验证错误。
要启用 MLflow 认证,请使用以下命令启动 MLflow UI
mlflow server --app-name basic-auth
服务器管理员可以选择随时通过不带 app-name 标志重新启动服务器来禁用此功能。创建的任何用户和权限都将持久化到 SQL 数据库中,并在重新启用该功能后恢复服务。
由于 HTTP 认证的性质,它仅在远程跟踪服务器上受支持,用户通过 REST API 向服务器发送请求。
工作原理
权限
可用权限为
| 权限 | 可读 | 可更新 | 可删除 | 可管理 |
|---|---|---|---|---|
| READ | 是 | 否 | 否 | 否 |
| EDIT | 是 | 是 | 否 | 否 |
| MANAGE | 是 | 是 | 是 | 是 |
| NO_PERMISSIONS | 否 | 否 | 否 | 否 |
所有用户的默认权限为 READ。可以在 配置 文件中进行更改。
用户可以对每个资源授予单独的权限。支持的资源包括 Experiment、Registered Model 和 Scorer。要访问 API 端点,用户必须拥有所需权限。否则,将返回 403 Forbidden 响应。
访问实验所需的权限
| API | 端点 | 方法 | 所需权限 |
|---|---|---|---|
| 创建实验 | 2.0/mlflow/experiments/create | POST | 无 |
| 获取实验 | 2.0/mlflow/experiments/get | GET | can_read |
| 按名称获取实验 | 2.0/mlflow/experiments/get-by-name | GET | can_read |
| 删除实验 | 2.0/mlflow/experiments/delete | POST | can_delete |
| 恢复实验 | 2.0/mlflow/experiments/restore | POST | can_delete |
| 更新实验 | 2.0/mlflow/experiments/update | POST | can_update |
| 搜索实验 | 2.0/mlflow/experiments/search | POST | 无 |
| 搜索实验 | 2.0/mlflow/experiments/search | GET | 无 |
| 设置实验标签 | 2.0/mlflow/experiments/set-experiment-tag | POST | can_update |
| 创建运行 | 2.0/mlflow/runs/create | POST | can_update |
| 获取运行 | 2.0/mlflow/runs/get | GET | can_read |
| 更新运行 | 2.0/mlflow/runs/update | POST | can_update |
| 删除运行 | 2.0/mlflow/runs/delete | POST | can_delete |
| 恢复运行 | 2.0/mlflow/runs/restore | POST | can_delete |
| 搜索运行 | 2.0/mlflow/runs/search | POST | 无 |
| 设置标签 | 2.0/mlflow/runs/set-tag | POST | can_update |
| 删除标签 | 2.0/mlflow/runs/delete-tag | POST | can_update |
| 记录指标 | 2.0/mlflow/runs/log-metric | POST | can_update |
| 记录参数 | 2.0/mlflow/runs/log-parameter | POST | can_update |
| 批量记录 | 2.0/mlflow/runs/log-batch | POST | can_update |
| 记录模型 | 2.0/mlflow/runs/log-model | POST | can_update |
| 列出工件 | 2.0/mlflow/artifacts/list | GET | can_read |
| 获取指标历史记录 | 2.0/mlflow/metrics/get-history | GET | can_read |
访问已注册模型所需的权限
| API | 端点 | 方法 | 所需权限 |
|---|---|---|---|
| 创建已注册模型 | 2.0/mlflow/registered-models/create | POST | 无 |
| 重命名已注册模型 | 2.0/mlflow/registered-models/rename | POST | can_update |
| 更新已注册模型 | 2.0/mlflow/registered-models/update | PATCH | can_update |
| 删除已注册模型 | 2.0/mlflow/registered-models/delete | DELETE | can_delete |
| 获取已注册模型 | 2.0/mlflow/registered-models/get | GET | can_read |
| 搜索已注册模型 | 2.0/mlflow/registered-models/search | GET | 无 |
| 获取最新版本 | 2.0/mlflow/registered-models/get-latest-versions | POST | can_read |
| 获取最新版本 | 2.0/mlflow/registered-models/get-latest-versions | GET | can_read |
| 设置已注册模型标签 | 2.0/mlflow/registered-models/set-tag | POST | can_update |
| 删除已注册模型标签 | 2.0/mlflow/registered-models/delete-tag | DELETE | can_update |
| 设置已注册模型别名 | 2.0/mlflow/registered-models/alias | POST | can_update |
| 删除已注册模型别名 | 2.0/mlflow/registered-models/alias | DELETE | can_delete |
| 按别名获取模型版本 | 2.0/mlflow/registered-models/alias | GET | can_read |
| 创建模型版本 | 2.0/mlflow/model-versions/create | POST | can_update |
| 更新模型版本 | 2.0/mlflow/model-versions/update | PATCH | can_update |
| 转换模型版本阶段 | 2.0/mlflow/model-versions/transition-stage | POST | can_update |
| 删除模型版本 | 2.0/mlflow/model-versions/delete | DELETE | can_delete |
| 获取模型版本 | 2.0/mlflow/model-versions/get | GET | can_read |
| 搜索模型版本 | 2.0/mlflow/model-versions/search | GET | 无 |
| 获取模型版本下载 URI | 2.0/mlflow/model-versions/get-download-uri | GET | can_read |
| 设置模型版本标签 | 2.0/mlflow/model-versions/set-tag | POST | can_update |
| 删除模型版本标签 | 2.0/mlflow/model-versions/delete-tag | DELETE | can_delete |
访问评分器所需的权限
| API | 端点 | 方法 | 所需权限 |
|---|---|---|---|
| 注册评分器 | 3.0/mlflow/scorers/register | POST | (对实验) can_update |
| 列出评分器 | 3.0/mlflow/scorers/list | GET | (对实验) can_read |
| 获取评分器 | 3.0/mlflow/scorers/get | GET | can_read |
| 删除评分器 | 3.0/mlflow/scorers/delete | POST | can_delete |
| 列出评分器版本 | 3.0/mlflow/scorers/list-versions | GET | can_read |
MLflow 认证提供 API 端点来管理用户和权限。
| API | 端点 | 方法 | 所需权限 |
|---|---|---|---|
| 创建用户 | 2.0/mlflow/users/create | POST | 无 |
| 获取用户 | 2.0/mlflow/users/get | GET | 仅对该用户可读 |
| 更新用户密码 | 2.0/mlflow/users/update-password | PATCH | 仅对此用户可更新 |
| 更新用户管理员身份 | 2.0/mlflow/users/update-admin | PATCH | 仅管理员 |
| 删除用户 | 2.0/mlflow/users/delete | DELETE | 仅管理员 |
| 创建实验权限 | 2.0/mlflow/experiments/permissions/create | POST | can_manage |
| 获取实验权限 | 2.0/mlflow/experiments/permissions/get | GET | can_manage |
| 更新实验权限 | 2.0/mlflow/experiments/permissions/update | PATCH | can_manage |
| 删除实验权限 | 2.0/mlflow/experiments/permissions/delete | DELETE | can_manage |
| 创建已注册模型权限 | 2.0/mlflow/registered-models/permissions/create | POST | can_manage |
| 获取已注册模型权限 | 2.0/mlflow/registered-models/permissions/get | GET | can_manage |
| 更新已注册模型权限 | 2.0/mlflow/registered-models/permissions/update | PATCH | can_manage |
| 删除已注册模型权限 | 2.0/mlflow/registered-models/permissions/delete | DELETE | can_manage |
某些 API 的行为也会修改。例如,实验的创建者将自动获得该实验的 MANAGE 权限,以便创建者可以授予或撤销其他用户的该实验的访问权限。
| API | 端点 | 方法 | 效果 |
|---|---|---|---|
| 创建实验 | 2.0/mlflow/experiments/create | POST | 自动授予创建者 MANAGE 权限。 |
| 创建已注册模型 | 2.0/mlflow/registered-models/create | POST | 自动授予创建者 MANAGE 权限。 |
| 搜索实验 | 2.0/mlflow/experiments/search | POST | 仅返回用户具有 READ 权限的实验。 |
| 搜索实验 | 2.0/mlflow/experiments/search | GET | 仅返回用户具有 READ 权限的实验。 |
| 搜索运行 | 2.0/mlflow | POST | 仅返回用户具有 READ 权限的实验。 |
| 搜索已注册模型 | 2.0/mlflow/registered-models/search | GET | 仅返回用户具有 READ 权限的已注册模型。 |
| 搜索模型版本 | 2.0/mlflow/model-versions/search | GET | 仅返回用户具有 READ 权限的已注册模型。 |
权限数据库
所有用户和权限都存储在 basic_auth.db 数据库中,该数据库位于 MLflow 服务器启动目录的相对位置。可以在 配置 文件中更改位置。要运行迁移,请使用以下命令
python -m mlflow.server.auth db upgrade --url <database_url>
管理员用户
管理员用户可以无限制地访问所有 MLflow 资源,包括创建或删除用户、更新其他用户的密码和管理员状态、授予或撤销其他用户的权限,以及管理所有 MLflow 资源的权限,即使明确为该管理员账户设置了 NO_PERMISSIONS。
MLflow 具有一个内置的管理员用户,该用户将在首次启用 MLflow 认证功能时创建。
建议在创建管理员后尽快更新默认管理员密码。
默认管理员用户凭据如下
| 用户名 | 密码 |
|---|---|
admin | password1234 |
可以通过使用 2.0/mlflow/users/update-admin 端点将其他用户提升为管理员来创建多个管理员用户。
# authenticate as built-in admin user
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
from mlflow.server import get_app_client
tracking_uri = "https://:5000/"
auth_client = get_app_client("basic-auth", tracking_uri=tracking_uri)
auth_client.create_user(username="user1", password="pw1")
auth_client.update_user_admin(username="user1", is_admin=True)
管理权限
MLflow 提供 REST API 和客户端类 AuthServiceClient 来管理用户和权限。要实例化 AuthServiceClient,建议使用 mlflow.server.get_app_client()。
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
from mlflow import MlflowClient
from mlflow.server import get_app_client
tracking_uri = "https://:5000/"
auth_client = get_app_client("basic-auth", tracking_uri=tracking_uri)
auth_client.create_user(username="user1", password="pw1")
auth_client.create_user(username="user2", password="pw2")
client = MlflowClient(tracking_uri=tracking_uri)
experiment_id = client.create_experiment(name="experiment")
auth_client.create_experiment_permission(
experiment_id=experiment_id, username="user2", permission="MANAGE"
)
认证到 MLflow
使用 MLflow UI
当用户首次在浏览器中访问 MLflow UI 时,将提示他们登录。登录尝试次数没有限制。
目前,MLflow UI 不显示有关当前用户的信息。用户登录后,唯一的注销方式是关闭浏览器。

使用环境变量
MLflow 提供两个环境变量用于认证:MLFLOW_TRACKING_USERNAME 和 MLFLOW_TRACKING_PASSWORD。要使用基本认证,必须同时设置这两个环境变量。
export MLFLOW_TRACKING_USERNAME=username
export MLFLOW_TRACKING_PASSWORD=password
import mlflow
mlflow.set_tracking_uri("https://<mlflow_tracking_uri>/")
with mlflow.start_run():
...
使用凭据文件
您可以将凭据保存在文件中,这样就不必每次都设置环境变量。凭据应使用 INI 格式保存在 ~/.mlflow/credentials 中。请注意,密码将以未加密的形式存储在磁盘上,并且仅受文件系统权限保护。
如果配置了 MLFLOW_TRACKING_USERNAME 和 MLFLOW_TRACKING_PASSWORD 环境变量,它们将覆盖凭据文件中提供的任何凭据。
[mlflow]
mlflow_tracking_username = username
mlflow_tracking_password = password
使用 REST API
用户可以使用 HTTP Authorization 请求头进行认证。有关更多信息,请参阅 https://mdn.org.cn/en-US/docs/Web/HTTP/Authentication。
在 Python 中,您可以使用 requests 库
import requests
response = requests.get(
"https://<mlflow_tracking_uri>/",
auth=("username", "password"),
)
创建新用户
要创建新用户,您需要使用管理员权限进行认证。
使用 MLflow UI
MLflow UI 在 <tracking_uri>/signup 处提供了一个简单的页面用于创建新用户。
使用 REST API
或者,您可以向跟踪服务器端点 2.0/users/create 发送 POST 请求。
在 Python 中,您可以使用 requests 库
import requests
response = requests.post(
"https://<mlflow_tracking_uri>/api/2.0/mlflow/users/create",
json={
"username": "username",
"password": "password",
},
)
使用 MLflow AuthServiceClient
MLflow AuthServiceClient 提供了一个函数来轻松创建新用户。
import mlflow
auth_client = mlflow.server.get_app_client(
"basic-auth", tracking_uri="https://<mlflow_tracking_uri>/"
)
auth_client.create_user(username="username", password="password")
配置
认证配置位于 mlflow/server/auth/basic_auth.ini
| 变量 | 描述 |
|---|---|
default_permission | 所有资源的默认权限 |
database_uri | 存储权限和用户数据的数据库位置 |
admin_username | 如果管理员尚未创建,则默认管理员用户名 |
admin_password | 如果管理员尚未创建,则默认管理员密码 |
authorization_function | 用于认证请求的函数 |
或者,将环境变量 MLFLOW_AUTH_CONFIG_PATH 分配给指向您的自定义配置文件。
authorization_function 设置支持可插拔的认证方法,如果您想使用除 HTTP 基本认证以外的其他认证方法。该值指定 module_name:function_name。该函数具有以下签名
def authenticate_request() -> Union[Authorization, Response]:
...
如果请求已认证,该函数应返回一个 werkzeug.datastructures.Authorization 对象,如果请求未认证,则返回一个 Response 对象(通常是 401: Unauthorized)。有关如何实现自定义认证方法的示例,请参阅 tests/server/auth/jwt_auth.py。注意:此示例不适用于生产环境。
连接到集中式数据库
默认情况下,MLflow 认证使用本地 SQLite 数据库来存储用户和权限数据。在多节点部署的情况下,建议使用集中式数据库来存储这些数据。
要连接到集中式数据库,您可以将 database_uri 配置变量设置为数据库 URL。
[mlflow]
database_uri = postgresql://username:password@hostname:port/database
然后,设置 MLFLOW_AUTH_CONFIG_PATH 环境变量指向您的配置文件,并启动 MLflow 服务器。
MLFLOW_AUTH_CONFIG_PATH=/path/to/my_auth_config.ini mlflow server --app-name basic-auth
在启动 MLflow 服务器之前必须创建数据库。数据库模式将在服务器启动时自动创建。
Auth 迁移使用与跟踪迁移 (alembic_version) 不同的版本表 (alembic_version_auth)。这允许您安全地将同一数据库用于跟踪数据和 auth 数据,而不会发生迁移冲突。
要使用单独的数据库,请将 database_uri 配置为指向与 --backend-store-uri 不同的数据库。默认情况下,auth 使用 basic_auth.db (SQLite),而跟踪使用 --backend-store-uri 指定的数据库。