Realtime Compute Flink 版支援在作業中引用阿里雲Key Management Service(KMS)託管的憑據,替代明文使用者名稱/密碼(user-pwd)訪問資料來源,實現敏感憑據加密託管、免明文暴露和憑據免營運。
功能介紹
通過整合 KMS 憑據管理,可在 Flink 作業中引用 KMS 託管的憑據(如資料庫帳號密碼等),無需在作業代碼中暴露明文憑據。Flink 運行時通過 RAM 角色擷取臨時憑證(STS Token),調用 KMS 擷取真實憑據值後串連目標資料來源。
核心優勢:
敏感資訊保護:作業中不再暴露明文 user-pwd,憑據加密託管在 KMS 中。
憑據免營運:配合 KMS 憑據輪轉能力,憑據更新後 Flink 自動擷取最新值,無需修改作業代碼。
注意事項
在 KMS 中錯誤刪除憑據、在 RAM 中錯誤刪除或修改 RAM 角色的許可權與信任策略,可能導致 Flink 作業因無法擷取 KMS 憑據而運行失敗。根據Service Level Agreement for Realtime Compute for Apache Flink,因客戶不正確使用資源導致的不可用不納入 SLA。
使用限制
僅 VVR 11.8 及以上版本引擎的 Postgres CDC Connector、VVR 11.9 及以上版本引擎的 Kafka Connector 支援使用 KMS 憑據訪問雲資源。
使用 RAM 角色訪問 KMS 有添加引用角色數限制,詳情請參見使用 RAM 角色訪問雲資源。
許可權準備
步驟一:建立 KMS 憑據
KMS 提供多種類型憑據,以 RDS 憑據為例:
登入Key Management Service控制台,在頂部功能表列選擇地區後,在左側導覽列單擊資源 > 憑據管理。
在自管憑據頁簽憑據類型地區,單擊資料庫憑據。
在右側列表上方,單擊建立資料庫憑據下的建立單個憑據,完成相關配置後,單擊確定。
更多資訊,請參見憑據管理快速入門、管理及使用 RDS 憑據。
步驟二:建立並配置 RAM 角色
此角色是 Flink 服務訪問 KMS 的身份憑證。Flink 將通過扮演該角色擷取臨時憑證,以該角色身份調用 KMS 擷取憑據值。免 AK 訪問 KMS 的詳細原理說明,請參見使用 RAM 角色訪問雲資源的附錄。
建立 RAM 角色
登入 RAM 控制台 - 角色頁面,單擊建立角色。保持預設選項,並單擊確定。
填寫一個有辨識度的角色名稱,例如
FlinkRoleForKMSRead,單擊確定。
添加信任策略
角色建立成功後,在角色詳情頁的信任策略頁簽下,單擊編輯信任策略,在 Principal 中添加 "Service": ["stream.aliyuncs.com"],信任 Flink 扮演該角色。更多資訊,請參見修改 RAM 角色的信任策略。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"stream.aliyuncs.com"
]
}
}
],
"Version": "1"
}為 RAM 角色授予 KMS 存取權限
扮演該角色後,Flink 將以角色身份調用 KMS,需提前在角色權限原則中授予 KMS 相關許可權。
在角色詳情頁的許可權管理頁簽下,單擊新增授權,添加 AliyunKMSSecretUserAccess(擷取 KMS 中憑據的許可權)權限原則。若憑據使用了使用者指定的密鑰(CMK)加密,還需有密鑰的 kms:Decrypt 許可權,可通過添加 AliyunKMSCryptoUserAccess 權限原則來授權。
若期望細粒度控制到密鑰及憑據粒度,可自訂權限原則,授予 GetSecretValue、Decrypt 許可權,並將資源限制為指定資源。詳情請參見 KMS 自訂權限原則參考、建立自訂權限原則。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:GetSecretValue",
"Resource": "acs:kms:<region>:<account-id>:secret/<secret-name>"
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "acs:kms:<region>:<account-id>:key/<key-id>"
}
]
}步驟三:為 RAM 使用者授予許可權
建立一個權限原則並授權給 RAM 使用者,允許使用者將步驟二建立的 RAM 角色傳遞給 Flink 服務進行扮演。
若操作步驟四的 RAM 使用者已關聯 AliyunRAMFullAccess 或 AliyunStreamFullAccess 權限原則,則該使用者已擁有 PassRole 許可權,可跳過此步驟。
建立權限原則
登入 RAM 控制台 - 權限原則頁面,單擊建立權限原則。切換至指令碼編輯,編輯權限原則內容。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ram:ListRoles"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram::<account-id>:role/<role-name>",
"Condition": {
"StringEquals": {
"acs:Service": "stream.aliyuncs.com"
}
}
}
]
}許可權 | 說明 |
| 允許使用者查看賬戶下的角色列表,以便在 Flink 控制台介面中選擇角色。 |
| 允許使用者將指定的角色傳遞給 Flink 雲端服務。請將策略中的
可添加 |
單擊確定,將權限原則儲存,例如命名為 FlinkPassRolePolicy。更多資訊,請參見建立自訂權限原則。
為 RAM 使用者授權
登入 RAM 控制台 - 使用者頁面,找到需要授權的 RAM 使用者,單擊操作列的新增授權。
在新增授權面板中,搜尋並選中步驟三建立的權限原則(例如
FlinkPassRolePolicy),單擊確認新增授權。更多資訊,請參見管理RAM使用者的許可權。
步驟四:在 Flink 中引用 RAM 角色
將步驟二建立的 RAM 動作項目參考至 Flink 專案空間,使作業可以使用該角色訪問 KMS。
登入Realtime Compute控制台,進入目標工作空間。
在左側導覽列,選擇。
單擊 RAM 角色頁簽。
單擊引用 RAM 角色。
在彈窗中選擇步驟二建立的 RAM 角色(例如
FlinkRoleForKMSRead),支援按角色名稱模糊搜尋。說明角色列表為當前專案空間所屬阿里雲主帳號下的普通服務角色列表。操作者需與當前專案空間同屬一個阿里雲主帳號,且有
ram:ListRoles許可權,才能查看到對應的角色。單擊測試校正,系統會自動進行以下兩項授權檢測:
PassRole 許可權檢測:目前使用者有對所選 RAM 角色執行
ram:PassRole的許可權。信任策略檢測:所選 RAM 角色信任當前 Flink 專案空間對其進行扮演。
檢測通過後,單擊確定。
更多資訊,請參見使用 RAM 角色訪問雲資源。
步驟五:在作業中使用 KMS 憑據
完成上述配置後,在作業代碼中通過 secret:// 引用格式指定憑據,並配置 KMS 串連參數,Flink 即可在運行時自動擷取憑據值訪問資料來源。
Postgres CDC Connector 樣本
SQL 作業:以下樣本以 Postgres CDC 源表為例,使用 KMS 憑據管理的資料庫帳號密碼。KMS 中已建立資料庫憑據 my-db-secret,其 SecretData 為 {"AccountName":"alice","AccountPassword":"xxx"}。
CREATE TEMPORARY TABLE postgrescdc_source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = 'secret://kms.my-db-secret.AccountName',
'password' = 'secret://kms.my-db-secret.AccountPassword',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>',
'slot.name' = '<slot name>',
'decoding.plugin.name' = 'pgoutput',
'kms.endpoint' = '<YOUR-KMS-INSTANCE-VPC-ENDPOINT>',
-- KMS 專屬網關的 CA 憑證路徑
'kms.ca' = 'oss://flink-fullymanaged-<工作空間ID>/artifacts/namespaces/<專案空間名稱>/<檔案名稱>',
'kms.akless.assume-role.role-name' = 'FlinkRoleForKMSRead'
);Postgres CDC 連接器的參數說明、前提條件與類型映射,請參見Postgres CDC 連接器。
Kafka Connector 樣本
Kafka 的憑據寫在 SASL JAAS 配置中。將 properties.sasl.jaas.config 內的 username 和 password 替換為 secret:// 引用,其餘 Kafka 參數保持不變。KMS 中已建立憑據 my-kafka-secret,其 SecretData 為 {"AccountName":"<SASL 使用者名稱>","AccountPassword":"<SASL 密碼>"}。
SQL 作業:以下樣本以 Kafka 源表為例,結果表的配置方式相同。
CREATE TEMPORARY TABLE kafka_source (
order_id BIGINT,
user_id BIGINT,
amount INT,
payload STRING
) WITH (
'connector' = 'kafka',
'topic' = '<topic name>',
'properties.bootstrap.servers' = '<broker 1>,<broker 2>,<broker 3>',
'properties.group.id' = '<group id>',
'scan.startup.mode' = 'earliest-offset',
'format' = 'csv',
'properties.security.protocol' = 'SASL_PLAINTEXT',
'properties.sasl.mechanism' = 'PLAIN',
/* 使用者名稱與密碼引用 KMS 憑據 */
'properties.sasl.jaas.config' = 'org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="secret://kms.my-kafka-secret.AccountName" password="secret://kms.my-kafka-secret.AccountPassword";',
'kms.endpoint' = 'kms.cn-beijing.aliyuncs.com',
'kms.akless.assume-role.role-name' = 'FlinkRoleForKMSRead'
);資料攝入 YAML 作業:源端與目標端分別配置 KMS 參數。樣本中源端使用共用網關,目標端使用專屬網關,一次展示兩種配置形態。
source:
type: kafka
name: Kafka Source
topic: <topic name>
value.format: json
scan.startup.mode: earliest-offset
properties.bootstrap.servers: <broker 1>,<broker 2>,<broker 3>
properties.group.id: <group id>
properties.security.protocol: SASL_PLAINTEXT
properties.sasl.mechanism: PLAIN
properties.sasl.jaas.config: org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="secret://kms.my-kafka-secret.AccountName" password="secret://kms.my-kafka-secret.AccountPassword";
# 共用網關:Endpoint 按地區固定,無需配置 kms.ca
kms.endpoint: kms.cn-beijing.aliyuncs.com
kms.akless.assume-role.role-name: FlinkRoleForKMSRead
sink:
type: kafka
name: Kafka Sink
properties.bootstrap.servers: <broker 1>,<broker 2>,<broker 3>
# 阿里雲 Kafka 不支援等冪寫入,VVR 8.0.0 及以上版本需顯式關閉
properties.enable.idempotence: false
properties.security.protocol: SASL_PLAINTEXT
properties.sasl.mechanism: PLAIN
properties.sasl.jaas.config: org.apache.flink.kafka.shaded.org.apache.kafka.common.security.plain.PlainLoginModule required username="secret://kms.my-kafka-secret.AccountName" password="secret://kms.my-kafka-secret.AccountPassword";
# 專屬網關:需同時配置 kms.ca
kms.endpoint: <KMS 執行個體的 VPC 端點>
kms.ca: oss://flink-fullymanaged-<工作空間ID>/artifacts/namespaces/<專案空間名稱>/PrivateKmsCA_kst-******.pem
kms.akless.assume-role.role-name: FlinkRoleForKMSReadYAML 中
properties.sasl.jaas.config的值內含雙引號,可直接書寫,無需轉義。SASL 存取點的地址與連接埠以雲訊息佇列 Kafka 版控制台擷取的存取點資訊為準。
Kafka 連接器的完整參數與安全認證說明,請參見Kafka SQL 連接器和Kafka 資料攝入連接器。
參數說明
憑據引用格式
KMS 憑據引用格式為:secret://<provider>.<secret-name>.<key>
欄位 | 說明 |
| 憑據源類型標識,當前僅支援 |
| KMS 中的憑據名稱,例如 |
| 憑據值 SecretData JSON 中的欄位名,例如 |
樣本:secret://kms.my-db-secret.AccountPassword
KMS 參數
參數 | 類型 | 是否必填 | 說明 |
| String | 是 | KMS 網關地址(專屬網關或共用網關)。
|
| String | 專屬網關必填 | CA 憑證的 OSS 路徑。
|
| String | 否 | 訪問 KMS 使用的 RAM 角色名稱。需提前在訪問安全 > RAM 角色中添加引用。 |