MLflow 身份验证
此功能仍处于实验阶段,未来版本可能会在不发出警告的情况下对其进行增强。
MLflow 身份验证通过 HTTP 基本身份验证为实验和注册模型提供安全的访问控制。启用后,用户必须先进行身份验证才能访问跟踪服务器上的任何资源。
快速入门
安装与设置
安装带有身份验证依赖项的 MLflow
pip install mlflow[auth]
设置您的服务器密钥并启动已验证的服务器
export MLFLOW_FLASK_SERVER_SECRET_KEY="my-secret-key"
mlflow server --app-name basic-auth
密钥在多个服务器之间必须保持一致,以防止验证错误。
默认管理员访问
MLflow 在首次启动时创建默认管理员用户
用户名 | 密码 |
---|---|
admin | password1234 |
首次登录后,请立即使用 /api/2.0/mlflow/users/update-password
端点更新默认管理员密码。
核心概念
权限级别
MLflow 使用具有四个级别的分层权限系统
权限 | 读取 | 更新 | 删除 | 管理 |
---|---|---|---|---|
读取 | ✅ | ❌ | ❌ | ❌ |
编辑 | ✅ | ✅ | ❌ | ❌ |
管理 | ✅ | ✅ | ✅ | ✅ |
无权限 | ❌ | ❌ | ❌ | ❌ |
所有用户的默认权限为 **READ**,可在身份验证配置文件中进行配置。
资源类型
权限主要授予两种资源类型
- **实验** - 控制对实验数据和运行的访问
- **注册模型** - 控制对模型注册表操作的访问
身份验证方法
交互式登录(推荐)
使用 mlflow.login()
进行引导式身份验证设置
import mlflow
# Interactive login with prompts
mlflow.login()
# Login to Databricks (currently the only supported backend)
mlflow.login(backend="databricks", interactive=True)
# Non-interactive mode (requires existing credentials)
mlflow.login(backend="databricks", interactive=False)
# After login, start using MLflow normally
with mlflow.start_run():
mlflow.log_metric("accuracy", 0.95)
如果未找到凭据,mlflow.login()
将提示您输入凭据,并自动保存以供将来使用。对于 Databricks,它会保存到 ~/.databrickscfg
。
环境变量
在您的环境中设置身份验证凭据
export MLFLOW_TRACKING_USERNAME=your_username
export MLFLOW_TRACKING_PASSWORD=your_password
import mlflow
mlflow.set_tracking_uri("https://your-mlflow-server.com")
with mlflow.start_run():
# Your authenticated MLflow operations
mlflow.log_metric("accuracy", 0.95)
凭据文件
将凭据存储在 ~/.mlflow/credentials
中(受文件系统权限保护)
[mlflow]
mlflow_tracking_username = your_username
mlflow_tracking_password = your_password
环境变量优先于凭据文件。这允许在不同环境中轻松覆盖设置。
高级身份验证选项
MLflow 支持其他身份验证方法和安全配置
基于令牌的身份验证
import os
os.environ["MLFLOW_TRACKING_TOKEN"] = "your_api_token"
AWS SigV4 身份验证
import os
os.environ["MLFLOW_TRACKING_AWS_SIGV4"] = "true"
自定义身份验证头
import os
os.environ["MLFLOW_TRACKING_AUTH"] = "custom_auth_header_value"
TLS/SSL 配置
import os
# Disable TLS verification (not recommended for production)
os.environ["MLFLOW_TRACKING_INSECURE_TLS"] = "true"
# Custom client certificate
os.environ["MLFLOW_TRACKING_CLIENT_CERT_PATH"] = "/path/to/client.crt"
# Custom server certificate
os.environ["MLFLOW_TRACKING_SERVER_CERT_PATH"] = "/path/to/server.crt"
仅在开发环境中禁用 TLS 验证。在生产环境中务必使用正确的证书。
用户管理
创建用户
使用 Web 界面
导航到 <tracking_uri>/signup
以访问用户创建表单。
使用 Python 客户端
from mlflow.server import get_app_client
# Authenticate as admin
auth_client = get_app_client("basic-auth", tracking_uri="https://your-server.com")
user = auth_client.create_user(username="newuser", password="secure_password")
print(f"Created user: {user.username} (ID: {user.id})")
使用 REST API
import requests
response = requests.post(
"https://your-server.com/api/2.0/mlflow/users/create",
json={"username": "newuser", "password": "secure_password"},
auth=("admin", "password1234"),
)
管理管理员状态
只有现有管理员才能将用户提升为管理员状态
# Promote user to admin
auth_client.update_user_admin(username="newuser", is_admin=True)
# Remove admin privileges
auth_client.update_user_admin(username="newuser", is_admin=False)
权限管理
实验权限
授予用户在实验上的特定权限
from mlflow import MlflowClient
# Create experiment and grant permissions
client = MlflowClient(tracking_uri="https://your-server.com")
experiment_id = client.create_experiment("my_experiment")
# Grant MANAGE permission to user
auth_client.create_experiment_permission(
experiment_id=experiment_id, username="data_scientist", permission="MANAGE"
)
# Update existing permission
auth_client.update_experiment_permission(
experiment_id=experiment_id, username="data_scientist", permission="EDIT"
)
# Check current permission
permission = auth_client.get_experiment_permission(
experiment_id=experiment_id, username="data_scientist"
)
print(f"User permission: {permission.permission}")
注册模型权限
控制对模型注册表操作的访问
# Create model with automatic MANAGE permission for creator
model = client.create_registered_model("my_model")
# Grant READ permission to another user
auth_client.create_registered_model_permission(
name="my_model", username="ml_engineer", permission="READ"
)
# Update to EDIT permission
auth_client.update_registered_model_permission(
name="my_model", username="ml_engineer", permission="EDIT"
)
API 参考
核心端点
用户管理
端点 | 方法 | 描述 | 所需权限 |
---|---|---|---|
/api/2.0/mlflow/users/create | POST | 创建新用户 | 仅限管理员 |
/api/2.0/mlflow/users/get | GET | 获取用户信息 | 仅限本人 |
/api/2.0/mlflow/users/update-password | PATCH | 更新密码 | 仅限本人 |
/api/2.0/mlflow/users/update-admin | PATCH | 更新管理员状态 | 仅限管理员 |
/api/2.0/mlflow/users/delete | DELETE | 删除用户 | 仅限管理员 |
实验权限
端点 | 方法 | 所需权限 |
---|---|---|
/api/2.0/mlflow/experiments/permissions/create | POST | 可管理 |
/api/2.0/mlflow/experiments/permissions/get | GET | 可管理 |
/api/2.0/mlflow/experiments/permissions/update | PATCH | 可管理 |
/api/2.0/mlflow/experiments/permissions/delete | DELETE | 可管理 |
模型注册表权限
端点 | 方法 | 所需权限 |
---|---|---|
/api/2.0/mlflow/registered-models/permissions/create | POST | 可管理 |
/api/2.0/mlflow/registered-models/permissions/get | GET | 可管理 |
/api/2.0/mlflow/registered-models/permissions/update | PATCH | 可管理 |
/api/2.0/mlflow/registered-models/permissions/delete | DELETE | 可管理 |
增强行为
启用身份验证后,某些 API 会根据用户权限自动过滤结果
- **搜索实验** - 仅返回用户可读取的实验
- **搜索运行** - 仅返回来自可读取实验的运行
- **搜索注册模型** - 仅返回用户可读取的模型
- **创建操作** - 自动授予创建者管理权限
配置
数据库配置
MLflow 默认使用 SQLite,但也支持用于多节点部署的集中式数据库
# /path/to/auth_config.ini
[mlflow]
database_uri = postgresql://username:password@hostname:port/database
default_permission = READ
admin_username = admin
admin_password = password1234
authorization_function = mlflow.server.auth:authenticate_request_basic_auth
使用自定义配置启动服务器
MLFLOW_AUTH_CONFIG_PATH=/path/to/auth_config.ini mlflow server --app-name basic-auth
数据库迁移
根据需要运行数据库迁移
python -m mlflow.server.auth db upgrade --url <database_url>
高级主题
自定义身份验证
MLflow 通过可插拔函数支持自定义身份验证方法
# custom_auth.py
from werkzeug.datastructures import Authorization
from flask import Response
def custom_authenticate() -> Union[Authorization, Response]:
# Your custom authentication logic
# Return Authorization object if authenticated
# Return Response object (401) if not authenticated
pass
更新配置以使用您的自定义函数
[mlflow]
authorization_function = custom_auth:custom_authenticate
插件开发
创建可安装的身份验证插件
# my_auth_plugin/__init__.py
from flask import Flask
from mlflow.server import app
def create_app(app: Flask = app):
# Extend MLflow app with custom auth logic
app.add_url_rule(...)
return app
class MyAuthClient:
# Custom client for managing permissions
pass
注册您的插件
# setup.py
setup(
entry_points={
"mlflow.app": ["my-auth=my_auth_plugin:create_app"],
"mlflow.app.client": ["my-auth=my_auth_plugin:MyAuthClient"],
}
)
安全最佳实践
密码安全
- 使用强密码(至少 12 个字符)
- 定期轮换凭据
- 使用环境变量或安全的凭据文件安全地存储凭据
网络安全
- 在生产环境中使用 HTTPS
- 配置正确的防火墙规则
- 考虑使用带有额外安全头的反向代理
数据库安全
- 使用加密连接到您的数据库
- 定期备份身份验证数据
- 实施适当的数据库访问控制
监控
- 监控身份验证日志以查找可疑活动
- 设置失败身份验证尝试的警报
- 定期审计用户权限
故障排除
常见问题
密钥错误
Solution: Ensure MLFLOW_FLASK_SERVER_SECRET_KEY is set and consistent across all servers
权限被拒 (403)
Solution: Check user permissions using get_experiment_permission or get_registered_model_permission
身份验证失败 (401)
Solution: Verify username/password and ensure user exists in the system
数据库连接问题
Solution: Verify database_uri in configuration and ensure database is accessible
调试技巧
-
启用调试日志
export MLFLOW_LOGGING_LEVEL=DEBUG
-
检查用户权限
# Verify current user permissions
user = auth_client.get_user("username")
print(f"Is admin: {user.is_admin}")
permission = auth_client.get_experiment_permission("exp_id", "username")
print(f"Experiment permission: {permission.permission}") -
数据库检查
# Check database tables
sqlite3 basic_auth.db ".tables"
sqlite3 basic_auth.db "SELECT * FROM users;"
迁移指南
在现有服务器上启用身份验证
- **在启用身份验证之前备份您的数据**
- **安装身份验证依赖项**:
pip install mlflow[auth]
- **设置密钥**:
export MLFLOW_FLASK_SERVER_SECRET_KEY="your-key"
- **重启服务器**:
mlflow server --app-name basic-auth
- **首次登录后立即更新管理员密码**
禁用身份验证
要禁用身份验证,只需在不带 --app-name basic-auth
标志的情况下重启服务器。用户数据和权限将保留,以便将来重新启用。
需要帮助? 请查阅 MLflow 身份验证 API 参考以获取详细的函数文档。