MLflow 认证
备注
此功能仍处于实验阶段,可能在未来的版本中无预警地进行更改。
MLflow 支持基本的HTTP认证,以实现对实验和注册模型的访问控制。一旦启用,任何访问者都需要登录后才能查看跟踪服务器中的任何资源。
MLflow 认证提供了用于管理用户和权限的 Python 和 REST API。
概述
要启用MLflow身份验证,请使用以下命令启动MLflow UI:
mlflow server --app-name basic-auth
服务器管理员可以随时通过不带 app-name
标志重启服务器来禁用此功能。任何创建的用户和权限将持久化在SQL数据库中,一旦功能重新启用,这些用户和权限将恢复服务。
由于HTTP认证的性质,它仅在远程跟踪服务器上受支持,用户通过REST API向服务器发送请求。
工作原理
权限
可用的权限包括:
权限 |
可以读取 |
可以更新 |
可以删除 |
可以管理 |
---|---|---|---|---|
|
是 |
不 |
不 |
不 |
|
是 |
是 |
不 |
不 |
|
是 |
是 |
是 |
是 |
|
不 |
不 |
不 |
不 |
所有用户的默认权限是 READ
。可以在 配置文件 中更改。
可以为每个用户单独授予资源的权限。支持的资源包括 Experiment
和 Registered Model
。要访问API端点,用户必须具有所需的权限。否则,将返回 403 Forbidden
响应。
访问实验所需的权限:
API |
端点 |
方法 |
所需权限 |
---|---|---|---|
|
|
无 |
|
|
|
可以读取 |
|
|
|
可以读取 |
|
|
|
可以删除 |
|
|
|
可以删除 |
|
|
|
可以更新 |
|
|
|
无 |
|
|
|
无 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以读取 |
|
|
|
可以更新 |
|
|
|
可以删除 |
|
|
|
可以删除 |
|
|
|
无 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以读取 |
|
|
|
可以读取 |
访问已注册模型的所需权限:
API |
端点 |
方法 |
所需权限 |
---|---|---|---|
|
|
无 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以删除 |
|
|
|
可以读取 |
|
|
|
无 |
|
|
|
可以读取 |
|
|
|
可以读取 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以删除 |
|
|
|
可以读取 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以更新 |
|
|
|
可以删除 |
|
|
|
可以读取 |
|
|
|
无 |
|
|
|
可以读取 |
|
|
|
可以更新 |
|
|
|
可以删除 |
MLflow 认证引入了几个新的 API 端点来管理用户和权限。
API |
端点 |
方法 |
所需权限 |
---|---|---|---|
|
|
无 |
|
|
|
仅该用户可读 |
|
|
|
仅可由该用户更新 |
|
|
|
仅限管理员 |
|
|
|
仅限管理员 |
|
|
|
可以管理 |
|
|
|
可以管理 |
|
|
|
可以管理 |
|
|
|
可以管理 |
|
|
|
可以管理 |
|
|
|
可以管理 |
|
|
|
可以管理 |
|
|
|
可以管理 |
一些API的行为也将被修改。例如,实验的创建者将自动被授予对该实验的 MANAGE
权限,以便创建者可以授予或撤销其他用户对该实验的访问权限。
API |
端点 |
方法 |
效果 |
---|---|---|---|
|
|
自动授予创建者 |
|
|
|
自动授予创建者 |
|
|
|
仅返回用户具有 |
|
|
|
仅返回用户具有 |
|
|
|
仅返回用户具有 |
|
|
|
仅返回用户具有 |
|
|
|
仅返回用户具有 |
权限数据库
所有用户和权限都存储在 basic_auth.db
数据库中,相对于启动 MLflow 服务器的目录。位置可以在 配置 文件中更改。要运行迁移,请使用以下命令:
python -m mlflow.server.auth db upgrade --url <database_url>
管理员用户
管理员用户对所有 MLflow 资源拥有无限制的访问权限,包括创建或删除用户、更新其他用户的密码和管理员状态、授予或撤销其他用户的权限,以及管理所有 MLflow 资源的权限, 即使 NO_PERMISSIONS
明确设置给该管理员账户。
MLflow 有一个内置的管理员用户,该用户将在首次启用 MLflow 认证功能时创建。
备注
建议在创建后尽快更新默认管理员密码。
默认的管理员用户凭证如下:
用户名 |
密码 |
---|---|
|
|
通过使用 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 = "http://localhost: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 = "http://localhost: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://developer.mozilla.org/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
或者,您可以向 Tracking Server 端点 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
:
变量 |
描述 |
---|---|
|
所有资源的默认权限 |
|
存储权限和用户数据的数据库位置 |
|
如果管理员尚未创建,默认的管理员用户名 |
|
如果管理员尚未创建,默认管理员密码 |
|
验证请求的函数 |
或者,将环境变量 MLFLOW_AUTH_CONFIG_PATH
指定为指向您的自定义配置文件。
authorization_function
设置支持可插拔的认证方法,如果你想使用除HTTP基本认证之外的其他认证方法。该值指定 module_name:function_name
。该函数具有以下签名:
def authenticate_request() -> Union[Authorization, Response]: ...
如果请求已认证,函数应返回一个 werkzeug.datastructures.Authorization
对象;如果请求未认证,则应返回一个 Response
对象(通常是 401: 未授权
)。有关如何实现自定义认证方法的示例,请参见 tests/server/auth/jwt_auth.py
。注意: 此示例不适用于生产环境。
连接到集中式数据库
默认情况下,MLflow 认证使用本地 SQLite 数据库来存储用户和权限数据。在多节点部署的情况下,建议使用集中式数据库来存储这些数据。
要连接到集中式数据库,可以将 database_uri
配置变量设置为数据库URL。
[mlflow]
database_uri = postgresql://username:password@hostname:port/database
然后,启动 MLflow 服务器,并将 MLFLOW_AUTH_CONFIG_PATH
环境变量设置为您的配置文件路径。
MLFLOW_AUTH_CONFIG_PATH=/path/to/my_auth_config.ini mlflow server --app-name basic-auth
在启动 MLflow 服务器之前,必须先创建数据库。数据库模式将在服务器启动时自动创建。
自定义认证
MLflow 认证设计为可扩展的。如果你的组织需要更高级的认证逻辑(例如,基于令牌的认证),可以安装第三方插件或创建自己的插件。
你的插件应该是一个可安装的Python包。它应该包含一个扩展MLflow应用的应用工厂,并且可以选择性地实现一个管理权限的客户端。应用工厂函数的名称将被传递给Flask CLI中的``–app``参数。更多信息请参见https://flask.palletsprojects.com/en/latest/cli/#application-discovery。
from flask import Flask
from mlflow.server import app
def create_app(app: Flask = app):
app.add_url_rule(...)
return app
class MyAuthClient:
...
然后,插件应该安装在你的 Python 环境中:
pip install my_auth
然后,在 mlflow/setup.py
中注册你的插件:
setup(
...,
entry_points="""
...
[mlflow.app]
my-auth=my_auth:create_app
[mlflow.app.client]
my-auth=my_auth:MyAuthClient
""",
)
然后,您可以启动 MLflow 服务器:
mlflow server --app-name my-auth