API 身份验证

API 的身份验证与 Web 身份验证是分开处理的。默认设置是检查用户会话。

[api]
auth_backends = airflow.api.auth.backend.session

在版本 1.10.11 中更改: 在 Airflow <1.10.11 中,默认设置是允许所有 API 请求无需身份验证,但如果 Web 服务器可以公开访问,则会造成安全风险。

在版本 2.3.0 中更改: 在 Airflow <2.3.0 中,此设置是 auth_backend 并且只允许一个值。在 2.3.0 中,它被更改为支持依次尝试的多个后端。

如果要检查当前设置的身份验证后端,可以使用 airflow config get-value api auth_backends 命令,如下例所示。

$ airflow config get-value api auth_backends
airflow.providers.fab.auth_manager.api.auth.backend.basic_auth

Kerberos 身份验证

目前,API 支持 Kerberos 身份验证,包括实验性和稳定版本。

要启用 Kerberos 身份验证,请在配置中设置以下内容

[api]
auth_backends = airflow.providers.fab.auth_manager.api.auth.backend.kerberos_auth

[kerberos]
keytab = <KEYTAB>

Airflow Kerberos 服务配置为 airflow/fully.qualified.domainname@REALM。确保此主体 在 Kerberos 数据库和密钥表文件中都存在

您必须确保使用 Kerberos 的完整用户名/领域来命名用户才能使其工作。这意味着您的用户名应该是 user_name@REALM

kinit user_name@REALM
ENDPOINT_URL="https://127.0.0.1:8080/"
curl -X GET  \
    --negotiate \  # enables Negotiate (SPNEGO) authentication
    --service airflow \  # matches the `airflow` service name in the `airflow/fully.qualified.domainname@REALM` principal
    --user : \
    "${ENDPOINT_URL}/api/v1/pools"

注意

请记住,稳定的 API 受身份验证和 访问控制 的保护。这意味着您的用户需要具有具有必要相关权限的角色,否则您将收到 403 响应。

基本身份验证

目前 API 支持基本用户名密码身份验证。这适用于通过 LDAP 登录或在 Airflow 元数据数据库中使用密码创建的用户。

要启用基本身份验证,请在配置中设置以下内容

[api]
auth_backends = airflow.providers.fab.auth_manager.api.auth.backend.basic_auth

用户名和密码需要进行 base64 编码,并通过 Authorization HTTP 标头以以下格式发送

Authorization: Basic Base64(username:password)

这是一个示例 curl 命令,您可以用来验证设置

ENDPOINT_URL="https://127.0.0.1:8080/"
curl -X GET  \
    --user "username:password" \
    "${ENDPOINT_URL}/api/v1/pools"

请注意,即使 Airflow Web 服务器可能正在使用另一种身份验证方法,您仍然可以启用此设置,以允许通过用户名密码凭据进行 API 访问。在此设置下,只有通过 LDAP 或 airflow users create 命令创建的用户才能通过 API 身份验证。

自行构建 API 身份验证

每个身份验证后端都定义为一个新的 Python 模块。它必须具有 2 个定义的方法

  • init_app(app: Flask) - 创建 flask 应用程序时调用的函数,允许您添加新视图。

  • requires_authentication(fn: Callable) - 一个装饰器,允许在视图函数之前和之后或代替视图函数执行任意代码。

并且可能具有以下之一来支持 CLI 远程模式 使用的 API 客户端授权

  • 函数 create_client_session() -> requests.Session

  • 属性 CLIENT_AUTH: tuple[str, str] | requests.auth.AuthBase | None

在编写后端模块后,在 airflow.cfg[api] 部分的 auth_backends 键中提供完全限定的模块名称。

您的身份验证后端的其他选项可以在 airflow.cfg 中配置为新选项。

此条目是否有帮助?