全部产品
Search
文档中心

实时计算Flink版:KMS 凭据管理集成(公测)

更新时间:Sep 23, 2026

实时计算 Flink 版支持在作业中引用阿里云密钥管理服务(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 凭据管理权限。

  • 步骤二、步骤三:操作者需被授予 AliyunRAMFullAccess 权限策略,或单独被授予 RAM 角色管理及权限管理权限。更多信息请参见创建自定义权限策略。

  • 步骤四、步骤五(在 Flink 中引用角色、开发作业):操作者需有 Flink 项目空间的 editor 及以上权限,或被授予引用 RAM 角色、文件管理、开发作业的细粒度权限。详情请参见开发控制台授权。

步骤一:创建 KMS 凭据

KMS 提供多种类型凭据,以 RDS 凭据为例:

  1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击资源 > 凭据管理。

  2. 在自管凭据页签凭据类型区域,单击数据库凭据。

  3. 在右侧列表上方,单击创建数据库凭据下的创建单个凭据,完成相关配置后,单击确定。

更多信息,请参见凭据管理快速入门、管理及使用 RDS 凭据。

步骤二:创建并配置 RAM 角色

此角色是 Flink 服务访问 KMS 的身份凭证。Flink 将通过扮演该角色获取临时凭证,以该角色身份调用 KMS 获取凭据值。免 AK 访问 KMS 的详细原理说明,请参见使用 RAM 角色访问云资源的附录。

创建 RAM 角色

  1. 登录 RAM 控制台 - 角色页面,单击创建角色。保持默认选项,并单击确定。

  2. 填写一个有辨识度的角色名称,例如 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"
        }
      }
    }
  ]
}

权限

说明

ram:ListRoles

允许用户查看账户下的角色列表,以便在 Flink 控制台界面中选择角色。

ram:PassRole

允许用户将指定的角色传递给 Flink 云服务。请将策略中的 <account-id> 和 <role-name> 替换为实际信息:

  • <account-id>:替换为阿里云的主账号 UID。

  • <role-name>:替换为步骤二创建的 RAM 角色名称。

可添加 Condition 限制,仅可传递给 stream.aliyuncs.com。

单击确定,将权限策略保存,例如命名为 FlinkPassRolePolicy。更多信息,请参见创建自定义权限策略。

为 RAM 用户授权

  1. 登录 RAM 控制台 - 用户页面,找到需要授权的 RAM 用户,单击操作列的新增授权。

  2. 在新增授权面板中,搜索并选中步骤三创建的权限策略(例如 FlinkPassRolePolicy),单击确认新增授权。更多信息,请参见管理RAM用户的权限。

步骤四:在 Flink 中引用 RAM 角色

将步骤二创建的 RAM 角色引用至 Flink 项目空间,使作业可以使用该角色访问 KMS。

  1. 登录实时计算控制台,进入目标工作空间。

  2. 在左侧导航栏,选择安全服务 > 访问安全。

  3. 单击 RAM 角色页签。

  4. 单击引用 RAM 角色。

  5. 在弹窗中选择步骤二创建的 RAM 角色(例如 FlinkRoleForKMSRead),支持按角色名模糊搜索。

    说明

    角色列表为当前项目空间所属阿里云主账号下的普通服务角色列表。操作者需与当前项目空间同属一个阿里云主账号,且有 ram:ListRoles 权限,才能查看到对应的角色。

  6. 单击测试校验,系统会自动进行以下两项授权检测:

    • PassRole 权限检测:当前用户有对所选 RAM 角色执行 ram:PassRole 的权限。

    • 信任策略检测:所选 RAM 角色信任当前 Flink 项目空间对其进行扮演。

  7. 检测通过后,单击确定。

更多信息,请参见使用 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: FlinkRoleForKMSRead
说明
  • YAML 中 properties.sasl.jaas.config 的值内含双引号,可直接书写,无需转义。

  • SASL 接入点的地址与端口以云消息队列 Kafka 版控制台获取的接入点信息为准。

Kafka 连接器的完整参数与安全认证说明,请参见Kafka SQL 连接器和Kafka 数据摄入连接器。

参数说明

凭据引用格式

KMS 凭据引用格式为:secret://<provider>.<secret-name>.<key>

字段

说明

<provider>

凭据源类型标识,当前仅支持 kms。

<secret-name>

KMS 中的凭据名称,例如 my-db-secret。

<key>

凭据值 SecretData JSON 中的字段名,例如 AccountName、AccountPassword。

示例:secret://kms.my-db-secret.AccountPassword

KMS 参数

参数

类型

是否必填

说明

kms.endpoint

String

是

KMS 网关地址(专属网关或共享网关)。

  • 专属网关:

    • 在 KMS 实例管理页面,单击软件密钥管理或硬件密钥管理页签后,选择目标 KMS 实例。

    • 单击实例 ID 进入到详情页,查看实例 VPC 地址,即为 Endpoint。详情请参见服务接入点。

  • 共享网关:Endpoint 按地域固定,可通过服务接入点获取。

kms.ca

String

专属网关必填

CA 证书的 OSS 路径。

  1. 通过 KMS 实例详情下载 CA 证书,下载后的文件默认命名为 PrivateKmsCA_kst-******.pem。

  2. 通过 Flink 文件管理上传,复制 OSS 路径,格式为 oss://flink-fullymanaged-<工作空间ID>/artifacts/namespaces/<项目空间名称>/<文件名>。

kms.akless.assume-role.role-name

String

否

访问 KMS 使用的 RAM 角色名称。需提前在访问安全 > RAM 角色中添加引用。