跳到主要内容

用户名和密码认证

MLflow 支持基本的 HTTP 认证,以实现对实验、已注册模型和评分器的访问控制。启用后,任何访问者都必须先登录,才能查看跟踪服务器中的任何资源。

MLflow 认证提供 Python 和 REST API 来管理用户和权限。

概述

首先,安装基本认证应用程序所需的所有依赖项

bash
pip install mlflow[auth]
注意

基本认证应用程序需要一个密钥来保护 CSRF。请在运行 mlflow server 命令之前设置 MLFLOW_FLASK_SERVER_SECRET_KEY 环境变量。例如

text
export MLFLOW_FLASK_SERVER_SECRET_KEY="my-secret-key"

如果您的设置使用了多个服务器,请确保这些服务器之间使用相同的密钥。否则,您可能会遇到意外的验证错误。

要启用 MLflow 认证,请使用以下命令启动 MLflow UI

bash
mlflow server --app-name basic-auth

服务器管理员可以选择随时通过不带 app-name 标志重新启动服务器来禁用此功能。创建的任何用户和权限都将持久化到 SQL 数据库中,并在重新启用该功能后恢复服务。

由于 HTTP 认证的性质,它仅在远程跟踪服务器上受支持,用户通过 REST API 向服务器发送请求。

工作原理

权限

可用权限为

权限可读可更新可删除可管理
READ
EDIT
MANAGE
NO_PERMISSIONS

所有用户的默认权限为 READ。可以在 配置 文件中进行更改。

用户可以对每个资源授予单独的权限。支持的资源包括 ExperimentRegistered ModelScorer。要访问 API 端点,用户必须拥有所需权限。否则,将返回 403 Forbidden 响应。

访问实验所需的权限

API端点方法所需权限
创建实验2.0/mlflow/experiments/createPOST
获取实验2.0/mlflow/experiments/getGETcan_read
按名称获取实验2.0/mlflow/experiments/get-by-nameGETcan_read
删除实验2.0/mlflow/experiments/deletePOSTcan_delete
恢复实验2.0/mlflow/experiments/restorePOSTcan_delete
更新实验2.0/mlflow/experiments/updatePOSTcan_update
搜索实验2.0/mlflow/experiments/searchPOST
搜索实验2.0/mlflow/experiments/searchGET
设置实验标签2.0/mlflow/experiments/set-experiment-tagPOSTcan_update
创建运行2.0/mlflow/runs/createPOSTcan_update
获取运行2.0/mlflow/runs/getGETcan_read
更新运行2.0/mlflow/runs/updatePOSTcan_update
删除运行2.0/mlflow/runs/deletePOSTcan_delete
恢复运行2.0/mlflow/runs/restorePOSTcan_delete
搜索运行2.0/mlflow/runs/searchPOST
设置标签2.0/mlflow/runs/set-tagPOSTcan_update
删除标签2.0/mlflow/runs/delete-tagPOSTcan_update
记录指标2.0/mlflow/runs/log-metricPOSTcan_update
记录参数2.0/mlflow/runs/log-parameterPOSTcan_update
批量记录2.0/mlflow/runs/log-batchPOSTcan_update
记录模型2.0/mlflow/runs/log-modelPOSTcan_update
列出工件2.0/mlflow/artifacts/listGETcan_read
获取指标历史记录2.0/mlflow/metrics/get-historyGETcan_read

访问已注册模型所需的权限

API端点方法所需权限
创建已注册模型2.0/mlflow/registered-models/createPOST
重命名已注册模型2.0/mlflow/registered-models/renamePOSTcan_update
更新已注册模型2.0/mlflow/registered-models/updatePATCHcan_update
删除已注册模型2.0/mlflow/registered-models/deleteDELETEcan_delete
获取已注册模型2.0/mlflow/registered-models/getGETcan_read
搜索已注册模型2.0/mlflow/registered-models/searchGET
获取最新版本2.0/mlflow/registered-models/get-latest-versionsPOSTcan_read
获取最新版本2.0/mlflow/registered-models/get-latest-versionsGETcan_read
设置已注册模型标签2.0/mlflow/registered-models/set-tagPOSTcan_update
删除已注册模型标签2.0/mlflow/registered-models/delete-tagDELETEcan_update
设置已注册模型别名2.0/mlflow/registered-models/aliasPOSTcan_update
删除已注册模型别名2.0/mlflow/registered-models/aliasDELETEcan_delete
按别名获取模型版本2.0/mlflow/registered-models/aliasGETcan_read
创建模型版本2.0/mlflow/model-versions/createPOSTcan_update
更新模型版本2.0/mlflow/model-versions/updatePATCHcan_update
转换模型版本阶段2.0/mlflow/model-versions/transition-stagePOSTcan_update
删除模型版本2.0/mlflow/model-versions/deleteDELETEcan_delete
获取模型版本2.0/mlflow/model-versions/getGETcan_read
搜索模型版本2.0/mlflow/model-versions/searchGET
获取模型版本下载 URI2.0/mlflow/model-versions/get-download-uriGETcan_read
设置模型版本标签2.0/mlflow/model-versions/set-tagPOSTcan_update
删除模型版本标签2.0/mlflow/model-versions/delete-tagDELETEcan_delete

访问评分器所需的权限

API端点方法所需权限
注册评分器3.0/mlflow/scorers/registerPOST(对实验) can_update
列出评分器3.0/mlflow/scorers/listGET(对实验) can_read
获取评分器3.0/mlflow/scorers/getGETcan_read
删除评分器3.0/mlflow/scorers/deletePOSTcan_delete
列出评分器版本3.0/mlflow/scorers/list-versionsGETcan_read

MLflow 认证提供 API 端点来管理用户和权限。

API端点方法所需权限
创建用户2.0/mlflow/users/createPOST
获取用户2.0/mlflow/users/getGET仅对该用户可读
更新用户密码2.0/mlflow/users/update-passwordPATCH仅对此用户可更新
更新用户管理员身份2.0/mlflow/users/update-adminPATCH仅管理员
删除用户2.0/mlflow/users/deleteDELETE仅管理员
创建实验权限2.0/mlflow/experiments/permissions/createPOSTcan_manage
获取实验权限2.0/mlflow/experiments/permissions/getGETcan_manage
更新实验权限2.0/mlflow/experiments/permissions/updatePATCHcan_manage
删除实验权限2.0/mlflow/experiments/permissions/deleteDELETEcan_manage
创建已注册模型权限2.0/mlflow/registered-models/permissions/createPOSTcan_manage
获取已注册模型权限2.0/mlflow/registered-models/permissions/getGETcan_manage
更新已注册模型权限2.0/mlflow/registered-models/permissions/updatePATCHcan_manage
删除已注册模型权限2.0/mlflow/registered-models/permissions/deleteDELETEcan_manage

某些 API 的行为也会修改。例如,实验的创建者将自动获得该实验的 MANAGE 权限,以便创建者可以授予或撤销其他用户的该实验的访问权限。

API端点方法效果
创建实验2.0/mlflow/experiments/createPOST自动授予创建者 MANAGE 权限。
创建已注册模型2.0/mlflow/registered-models/createPOST自动授予创建者 MANAGE 权限。
搜索实验2.0/mlflow/experiments/searchPOST仅返回用户具有 READ 权限的实验。
搜索实验2.0/mlflow/experiments/searchGET仅返回用户具有 READ 权限的实验。
搜索运行2.0/mlflowPOST仅返回用户具有 READ 权限的实验。
搜索已注册模型2.0/mlflow/registered-models/searchGET仅返回用户具有 READ 权限的已注册模型。
搜索模型版本2.0/mlflow/model-versions/searchGET仅返回用户具有 READ 权限的已注册模型。

权限数据库

所有用户和权限都存储在 basic_auth.db 数据库中,该数据库位于 MLflow 服务器启动目录的相对位置。可以在 配置 文件中更改位置。要运行迁移,请使用以下命令

bash
python -m mlflow.server.auth db upgrade --url <database_url>

管理员用户

管理员用户可以无限制地访问所有 MLflow 资源,包括创建或删除用户、更新其他用户的密码和管理员状态、授予或撤销其他用户的权限,以及管理所有 MLflow 资源的权限,即使明确为该管理员账户设置了 NO_PERMISSIONS

MLflow 具有一个内置的管理员用户,该用户将在首次启用 MLflow 认证功能时创建。

注意

建议在创建管理员后尽快更新默认管理员密码。

默认管理员用户凭据如下

用户名密码
adminpassword1234

可以通过使用 2.0/mlflow/users/update-admin 端点将其他用户提升为管理员来创建多个管理员用户。

示例
bash
# authenticate as built-in admin user
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
python
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()

示例
bash
export MLFLOW_TRACKING_USERNAME=admin
export MLFLOW_TRACKING_PASSWORD=password
python
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_USERNAMEMLFLOW_TRACKING_PASSWORD。要使用基本认证,必须同时设置这两个环境变量。

bash
export MLFLOW_TRACKING_USERNAME=username
export MLFLOW_TRACKING_PASSWORD=password
python
import mlflow

mlflow.set_tracking_uri("https://<mlflow_tracking_uri>/")
with mlflow.start_run():
...

使用凭据文件

您可以将凭据保存在文件中,这样就不必每次都设置环境变量。凭据应使用 INI 格式保存在 ~/.mlflow/credentials 中。请注意,密码将以未加密的形式存储在磁盘上,并且仅受文件系统权限保护。

如果配置了 MLFLOW_TRACKING_USERNAMEMLFLOW_TRACKING_PASSWORD 环境变量,它们将覆盖凭据文件中提供的任何凭据。

凭据文件格式
ini
[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

python
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

python
import requests

response = requests.post(
"https://<mlflow_tracking_uri>/api/2.0/mlflow/users/create",
json={
"username": "username",
"password": "password",
},
)

使用 MLflow AuthServiceClient

MLflow AuthServiceClient 提供了一个函数来轻松创建新用户。

python
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。该函数具有以下签名

python
def authenticate_request() -> Union[Authorization, Response]:
...

如果请求已认证,该函数应返回一个 werkzeug.datastructures.Authorization 对象,如果请求未认证,则返回一个 Response 对象(通常是 401: Unauthorized)。有关如何实现自定义认证方法的示例,请参阅 tests/server/auth/jwt_auth.py注意:此示例不适用于生产环境。

连接到集中式数据库

默认情况下,MLflow 认证使用本地 SQLite 数据库来存储用户和权限数据。在多节点部署的情况下,建议使用集中式数据库来存储这些数据。

要连接到集中式数据库,您可以将 database_uri 配置变量设置为数据库 URL。

示例:/path/to/my_auth_config.ini
ini
[mlflow]
database_uri = postgresql://username:password@hostname:port/database

然后,设置 MLFLOW_AUTH_CONFIG_PATH 环境变量指向您的配置文件,并启动 MLflow 服务器。

bash
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 指定的数据库。