存取控制

Airflow Webserver UI 的存取控制由 Flask AppBuilder (FAB) 處理。請閱讀其相關的安全性文件,以了解其安全性模型。

預設角色

Airflow 預設提供一組角色:Admin、User、Op、Viewer 和 Public。預設情況下,只有 Admin 使用者可以設定/變更角色的權限。然而,建議保持這些預設角色不變,而是讓 Admin 使用者在必要時建立具有所需權限的新角色。

Public

Public 使用者(匿名)沒有任何權限。

Viewer

Viewer 使用者具有有限的讀取權限

airflow/providers/fab/auth_manager/security_manager/override.py[原始碼]

    VIEWER_PERMISSIONS = [
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_DEPENDENCIES),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_CODE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_READ, RESOURCE_ASSET),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_CLUSTER_ACTIVITY),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_IMPORT_ERROR),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_JOB),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_MY_PASSWORD),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_MY_PASSWORD),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_MY_PROFILE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_MY_PROFILE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_SLA_MISS),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_LOG),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_XCOM),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_BROWSE_MENU),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DAG_DEPENDENCIES),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_ACCESS_MENU, RESOURCE_ASSET),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_CLUSTER_ACTIVITY),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DOCS),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DOCS_MENU),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_JOB),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_SLA_MISS),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_TASK_INSTANCE),
    ]

User

User 使用者除了 Viewer 權限外,還具有額外權限

airflow/providers/fab/auth_manager/security_manager/override.py[原始碼]

    USER_PERMISSIONS = [
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_CREATE, RESOURCE_ASSET),
    ]

Op

Op 使用者除了 User 權限外,還具有額外權限

airflow/providers/fab/auth_manager/security_manager/override.py[原始碼]

    OP_PERMISSIONS = [
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_CONFIG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_ADMIN_MENU),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_CONFIG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_PLUGIN),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_PROVIDER),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_XCOM),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_PLUGIN),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_PROVIDER),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_XCOM),
        (permissions.ACTION_CAN_DELETE, RESOURCE_ASSET),
        (permissions.ACTION_CAN_CREATE, RESOURCE_ASSET),
    ]

Admin

Admin 使用者擁有所有可能的權限,包括授予或撤銷其他使用者的權限。Admin 使用者除了 Op 權限外,還具有額外權限

airflow/providers/fab/auth_manager/security_manager/override.py[原始碼]

    ADMIN_PERMISSIONS = [
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_AUDIT_LOG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_AUDIT_LOG),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_RESCHEDULE),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_TASK_RESCHEDULE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TRIGGER),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_TRIGGER),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_PASSWORD),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_PASSWORD),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_ROLE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_ROLE),
    ]

自訂角色

DAG 層級角色

Admin 可以建立一組僅允許檢視特定 DAG 的角色。這稱為 DAG 層級存取。在 DAG 模型表中定義的每個 DAG 都被視為一個 View,它具有兩個相關聯的權限(can_readcan_editcan_dag_readcan_dag_edit 自 2.0.0 版本起已棄用)。有一個特殊的檢視稱為 DAGs(在 1.10.* 版本中稱為 all_dags),它允許角色存取所有 DAG。預設的 AdminViewerUserOp 角色都可以存取 DAGs 檢視。

../_images/add-role.png ../_images/new-role.png

圖片顯示了如何建立一個只能寫入 example_python_operator 的角色。您也可以使用 CLI 透過 airflow roles create 指令建立角色,例如:

airflow roles create Role1 Role2

我們可以透過 airflow users add-role CLI 指令將指定的角色分配給新使用者。

權限

警告

Airflow 允許您為使用者定義具有細緻 RBAC 權限的自訂角色。但是,並非所有權限組合都完全一致,並且沒有機制可以確保分配的權限集完全一致。在許多情況下,特定資源的權限是重疊的。一個很好的例子是選單存取權限 - 缺少選單存取權限並不會自動停用對選單指向的功能的存取。另一個例子是對角色檢視的存取,即使使用者沒有「使用者檢視」存取權限,它也允許存取使用者資訊。當您沒有使用者存取權限時,新增角色存取權限是不一致的。

當您決定使用自訂的基於資源的權限集時,部署管理員應仔細檢查授予角色的最終權限集是否是他們期望的。

基於資源的權限

從 2.0 版本開始,權限基於個別資源以及對這些資源的一小部分操作。資源與標準 Airflow 概念相符,例如 DagDagRunTaskConnection。操作包括 can_createcan_readcan_editcan_delete

然後將權限(每個權限都包含資源 + 操作對)新增至角色。

為了存取端點,使用者需要分配給該端點的所有權限

有五個預設角色:Public、Viewer、User、Op 和 Admin。每個角色都具有前一個角色的權限,以及額外的權限。

DAG 層級權限

僅對於 DAG 層級權限,可以在所有 DAG 或個別 DAG 物件層級控制存取權限。這包括 DAGs.can_readDAGs.can_editDAGs.can_deleteDAG Runs.can_readDAG Runs.can_createDAG Runs.can_deleteDAG Runs.menu_access。當列出這些權限時,如果使用者具有列出的權限,或對正在操作的特定 DAG 具有相同的權限,則會授予存取權限。對於個別 DAG,資源名稱為 DAG: + DAG ID,對於 DAG Runs 資源,資源名稱為 DAG Run:

例如,如果使用者嘗試檢視 example_dag_id 的 DAG 資訊,並且端點需要 DAGs.can_read 存取權限,如果使用者具有 DAGs.can_readDAG:example_dag_id.can_read 存取權限,則將授予存取權限。

穩定 API 權限

端點

方法

權限

最低角色

/config

GET

Configurations.can_read

Op

/connections

GET

Connections.can_read

Op

/connections

POST

Connections.can_create

Op

/connections/{connection_id}

DELETE

Connections.can_delete

Op

/connections/{connection_id}

PATCH

Connections.can_edit

Op

/connections/{connection_id}

GET

Connections.can_read

Op

/dagSources/{file_token}

GET

DAG Code.can_read

Viewer

/dags

GET

DAGs.can_read

Viewer

/dags/{dag_id}

GET

DAGs.can_read

Viewer

/dags/{dag_id}

PATCH

DAGs.can_edit

User

/dags/{dag_id}/clearTaskInstances

PUT

DAGs.can_edit, DAG Runs.can_edit, Task Instances.can_edit

User

/dags/{dag_id}/details

GET

DAGs.can_read

Viewer

/dags/{dag_id}/tasks

GET

DAGs.can_read, Task Instances.can_read

Viewer

/dags/{dag_id}/tasks/{task_id}

GET

DAGs.can_read, Task Instances.can_read

Viewer

/dags/{dag_id}/dagRuns

GET

DAGs.can_read, DAG Runs.can_read

Viewer

/dags/{dag_id}/dagRuns

POST

DAGs.can_edit, DAG Runs.can_create

User

/dags/{dag_id}/dagRuns/{dag_run_id}

DELETE

DAGs.can_edit, DAG Runs.can_delete

User

/dags/{dag_id}/dagRuns/{dag_run_id}

GET

DAGs.can_read, DAG Runs.can_read

Viewer

/dags/~/dagRuns/list

POST

DAGs.can_edit, DAG Runs.can_read

User

/assets

GET

Assets.can_read

Viewer

/assets/{uri}

GET

Assets.can_read

Viewer

/assets/events

GET

Assets.can_read

Viewer

/eventLogs

GET

Audit Logs.can_read

Viewer

/eventLogs/{event_log_id}

GET

Audit Logs.can_read

Viewer

/importErrors

GET

ImportError.can_read

Viewer

/importErrors/{import_error_id}

GET

ImportError.can_read

Viewer

/health

GET

None

Public

/version

GET

None

Public

/pools

GET

Pools.can_read

Op

/pools

POST

Pools.can_create

Op

/pools/{pool_name}

DELETE

Pools.can_delete

Op

/pools/{pool_name}

GET

Pools.can_read

Op

/pools/{pool_name}

PATCH

Pools.can_edit

Op

/providers

GET

Providers.can_read

Op

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

Viewer

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

Viewer

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

Viewer

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{task_try_number}

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

Viewer

/dags/~/dagRuns/~/taskInstances/list

POST

DAGs.can_edit, DAG Runs.can_read, Task Instances.can_read

User

/variables

GET

Variables.can_read

Op

/variables

POST

Variables.can_create

Op

/variables/{variable_key}

DELETE

Variables.can_delete

Op

/variables/{variable_key}

GET

Variables.can_read

Op

/variables/{variable_key}

PATCH

Variables.can_edit

Op

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read, XComs.can_read

Viewer

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key}

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read, XComs.can_read

Viewer

/users

GET

Users.can_read

Admin

/users

POST

Users.can_create

Admin

/users/{username}

GET

Users.can_read

Admin

/users/{username}

PATCH

Users.can_edit

Admin

/users/{username}

DELETE

Users.can_delete

Admin

/roles

GET

Roles.can_read

Admin

/roles

POST

Roles.can_create

Admin

/roles/{role_name}

GET

Roles.can_read

Admin

/roles/{role_name}

PATCH

Roles.can_edit

Admin

/roles/{role_name}

DELETE

Roles.can_delete

Admin

/permissions

GET

Permission Views.can_read

Admin

網站權限

動作

權限

最低角色

存取首頁

Website.can_read

Viewer

顯示瀏覽選單

Browse.menu_access

Viewer

顯示 DAGs 選單

DAGs.menu_access

Viewer

取得 DAG 統計資訊

DAGs.can_read, DAG Runs.can_read

Viewer

顯示任務實例選單

Task Instances.menu_access

Viewer

取得任務統計資訊

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

Viewer

取得上次 DAG 執行

DAGs.can_read, DAG Runs.can_read

Viewer

取得 DAG 程式碼

DAGs.can_read, DAG Code.can_read

Viewer

取得 DAG 詳細資訊

DAGs.can_read, DAG Runs.can_read

Viewer

顯示 DAG 相依性選單

DAG Dependencies.menu_access

Viewer

取得 DAG 相依性

DAG Dependencies.can_read

Viewer

取得呈現的 DAG

DAGs.can_read, Task Instances.can_read

Viewer

取得包含中繼資料的日誌

DAGs.can_read, Task Instances.can_read, Task Logs.can_read

Viewer

取得日誌

DAGs.can_read, Task Instances.can_read, Task Logs.can_read

Viewer

重新導向至外部日誌

DAGs.can_read, Task Instances.can_read, Task Logs.can_read

Viewer

取得任務

DAGs.can_read, Task Instances.can_read

Viewer

顯示 XCom 選單

XComs.menu_access

Op

取得 XCom

DAGs.can_read, Task Instances.can_read, XComs.can_read

Viewer

建立 XCom

XComs.can_create

Op

刪除 XCom

XComs.can_delete

Op

觸發任務實例

DAGs.can_edit, Task Instances.can_create

User

刪除 DAG

DAGs.can_delete

User

顯示 DAG 執行選單

DAG Runs.menu_access

Viewer

觸發 DAG 執行

DAGs.can_edit, DAG Runs.can_create

User

清除 DAG

DAGs.can_edit, Task Instances.can_delete

User

清除 DAG 執行

DAGs.can_edit, Task Instances.can_delete

User

將 DAG 標記為封鎖

DAGS.can_edit, DAG Runs.can_read

User

將 DAG 執行標記為失敗

DAGS.can_edit, DAG Runs.can_edit

User

將 DAG 執行標記為成功

DAGS.can_edit, DAG Runs.can_edit

User

將任務標記為失敗

DAGs.can_edit, Task Instances.can_edit

User

將任務標記為成功

DAGs.can_edit, Task Instances.can_edit

User

以樹狀圖取得 DAG

DAGs.can_read, Task Instances.can_read, Task Logs.can_read

Viewer

以圖表取得 DAG

DAGs.can_read, Task Instances.can_read, Task Logs.can_read

Viewer

以持續時間圖表取得 DAG

DAGs.can_read, Task Instances.can_read

Viewer

顯示所有嘗試

DAGs.can_read, Task Instances.can_read

Viewer

顯示著陸時間

DAGs.can_read, Task Instances.can_read

Viewer

切換 DAG 暫停狀態

DAGs.can_edit

User

顯示甘特圖

DAGs.can_read, Task Instances.can_read

Viewer

取得外部連結

DAGs.can_read, Task Instances.can_read

Viewer

顯示任務實例

DAGs.can_read, Task Instances.can_read

Viewer

顯示組態設定選單

Configurations.menu_access

Op

顯示組態

Configurations.can_read

Viewer

刪除多個記錄

DAGs.can_edit

User

將任務實例設定為執行中

DAGs.can_edit

User

將任務實例設定為失敗

DAGs.can_edit

User

將任務實例設定為成功

DAGs.can_edit

User

將任務實例設定為等待重試

DAGs.can_edit

User

自動完成

DAGs.can_read

Viewer

顯示資產選單

Assets.menu_access

Viewer

顯示資產

Assets.can_read

Viewer

顯示文件選單

Docs.menu_access

Viewer

顯示文件選單

Documentation.menu_access

Viewer

顯示工作選單

Jobs.menu_access

Viewer

顯示稽核日誌

Audit Logs.menu_access

Viewer

重設密碼

My Password.can_read, My Password.can_edit

Viewer

顯示權限選單

Permission Views.menu_access

Admin

列出權限

Permission Views.can_read

Admin

取得我的個人資料

My Profile.can_read

Viewer

更新我的個人資料

My Profile.can_edit

Viewer

列出日誌

Audit Logs.can_read

Viewer

列出工作

Jobs.can_read

Viewer

顯示 SLA 遺漏選單

SLA Misses.menu_access

Viewer

列出 SLA 遺漏

SLA Misses.can_read

Viewer

列出外掛程式

Plugins.can_read

Viewer

顯示外掛程式選單

Plugins.menu_access

Viewer

顯示供應商選單

Providers.menu_access

Op

列出供應商

Providers.can_read

Op

列出任務重新排程

Task Reschedules.can_read

Admin

顯示觸發器選單

Triggers.menu_access

Admin

列出觸發器

Triggers.can_read

Admin

顯示管理員選單

Admin.menu_access

Viewer

顯示連線選單

Connections.menu_access

Op

顯示集區選單

Pools.menu_access

Viewer

顯示變數選單

Variables.menu_access

Op

顯示角色選單

Roles.menu_access

Admin

列出角色

Roles.can_read

Admin

建立角色

Roles.can_create

Admin

更新角色

Roles.can_edit

Admin

刪除角色

Roles.can_delete

Admin

顯示使用者選單

Users.menu_access

Admin

建立使用者

Users.can_create

Admin

更新使用者

Users.can_edit

Admin

刪除使用者

Users.can_delete

Admin

重設使用者密碼

Passwords.can_edit, Passwords.can_read

Admin

這些 DAG 層級控制可以直接透過 UI / CLI 設定,或透過 access_control 參數編碼在 DAG 本身中。

DAG 層級權限的優先順序

由於 DAG 層級存取控制可以在多個位置設定,因此衝突是不可避免的,並且需要明確的解決策略。因此,Airflow 認為 DAG 本身提供的 access_control 參數如果存在,則具有完全的權威性,這會產生一些影響

在 DAG 上設定 access_control 將覆寫任何先前存在的 DAG 層級權限,如果它不是 None 的任何值

DAG(
    dag_id="example_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
    access_control={
        "Viewer": {"can_edit", "can_read", "can_delete"},
    },
)

也可以使用類似的方式新增 DAG Runs 資源權限,但需要明確新增資源名稱以識別權限適用於哪個資源

DAG(
    dag_id="example_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
    access_control={
        "Viewer": {"DAGs": {"can_edit", "can_read", "can_delete"}, "DAG Runs": {"can_create"}},
    },
)

這也表示設定 access_control={} 將從資料庫中清除給定 DAG 的任何現有 DAG 層級權限

DAG(
    dag_id="example_no_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
    access_control={},
)

相反地,從 DAG 中完全移除 access_control 區塊(或將其設定為 None)不會進行任何變更,並可能留下懸而未決的權限。

DAG(
    dag_id="example_indifferent_to_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
)

如果 DAG 本身沒有定義 access_control,Airflow 將延遲到資料庫中定義的現有權限,這些權限可能是透過 UI、CLI 或先前在相關 DAG 上的 access_control 參數設定的。

在所有情況下,系統範圍的角色(例如 Can edit on DAG)優先於 DAG 層級存取控制,因此可以將它們視為 Can edit on DAG: *

這個條目是否有幫助?