O Realtime Compute for Apache Flink permite referenciar credenciais hospedadas no Alibaba Cloud Key Management Service (KMS) nos jobs, substituindo nomes de usuário e senhas em texto simples (user-pwd) ao acessar sources de dados. Isso proporciona a hospedagem de credenciais criptografadas, evita a exposição de texto simples e permite o gerenciamento de credenciais sem necessidade de manutenção.
Visão geral
Com a integração do gerenciamento de credenciais do KMS, é possível referenciar credenciais hospedadas no KMS (como nomes de usuário e senhas de bancos de dados) em jobs do Flink sem expor credenciais em texto simples no código do job. Durante a execução, o Flink assume uma função do RAM para obter um token STS temporário, chama o KMS para recuperar o valor real da credencial e, em seguida, se conecta ao source de dados de destino.
Principais benefícios:
Proteção de informações confidenciais: Nenhuma credencial (user-pwd) em texto simples fica exposta nos jobs. As credenciais ficam hospedadas de forma criptografada no KMS.
Credenciais sem necessidade de manutenção: Com a rotação de credenciais do KMS, o Flink obtém automaticamente o valor mais recente da credencial após as atualizações. O código do job não requer modificações.
Observações
Excluir credenciais incorretamente no KMS pode causar falhas nos jobs do Flink. O mesmo ocorre se você excluir ou modifique incorretamente as permissões e a política de confiança de uma função do RAM, pois os jobs não conseguirão obter as credenciais do KMS. De acordo com o Contrato de Nível de Serviço do Realtime Compute for Apache Flink, o SLA não cobre a indisponibilidade causada pelo uso incorreto de recursos pelos clientes.
Limites
Apenas o Postgres CDC Connector (VVR 11.8 e posterior) e o Kafka Connector (VVR 11.9 e posterior) permitem o acesso a recursos da cloud com credenciais do KMS.
A quantidade de funções do RAM referenciadas para acessar o KMS possui um limite. Para mais detalhes, consulte Use a RAM role to access cloud resources.
Preparação de permissões
Etapa 1 (crie uma credencial do KMS): O operador deve ter permissões de gerenciamento de credenciais do KMS.
Etapas 2 e 3: O operador deve ter a política
AliyunRAMFullAccessatribuída ou receber separadamente as permissões de gerenciamento de funções e de permissões do RAM. Para mais informações, consulte Crie uma política personalizada.Etapas 4 e 5 (referenciar uma função no Flink e desenvolver jobs): O operador deve ter permissões de editor ou superiores no namespace do Flink, ou receber permissões de granularidade fina para referenciar funções do RAM, gerencie arquivos e desenvolva jobs. Para mais detalhes, consulte Grant permissions to access the development console.
Etapa 1: Crie uma credencial do KMS
O KMS oferece vários tipos de credenciais. As etapas a seguir usam uma credencial do RDS como exemplo:
Acesse o console do Key Management Service. Selecione a região na barra de menus superior e, no painel de navegação à esquerda, escolha Resources > Secrets.
Na aba Self-Managed Secrets, na área Secret Type, clique em Database Secret.
Acima da lista à direita, clique em Create Single Secret na opção Create Database Secret, conclua a configuração e clique em OK.
Para obter mais informações, consulte Introdução ao Secrets Manager e Gerencie e use secrets do ApsaraDB RDS.
Etapa 2: Crie e configure uma função do RAM
Essa função é a credencial de identidade que o service do Flink usa para acessar o KMS. O Flink assume a função para obter credenciais temporárias e chama o KMS usando a função para recuperar os valores das credenciais. Para saber mais sobre o acesso sem credenciais ao KMS, consulte o apêndice de Use a RAM role to access cloud resources.
1. Crie uma função do RAM
Acesse a página RAM console - Roles e clique em Create Role. Mantenha as opções padrão e clique em OK.
Insira um nome descritivo para a função, por exemplo,
FlinkRoleForKMSRead, e clique em OK.
2. Adicionar uma política de confiança
Depois de criar a função, na página de detalhes da função, clique em aba Trust Policy e clique em Edit Trust Policy. Adicione "Service": ["stream.aliyuncs.com"] a Principal para autorizar o Flink a assumir a função. Para mais detalhes, consulte Modify the trust policy of a RAM role.
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"stream.aliyuncs.com"
]
}
}
],
"Version": "1"
}
3. Conceder permissões de acesso ao KMS para a função do RAM
Quando o Flink assume a função, ele chama o KMS usando a função. Conceda antecipadamente as permissões necessárias do KMS à política de permissões da função.
Na página de detalhes da função, clique em aba Permissions e clique em Grant Permission. Adicione a política AliyunKMSSecretUserAccess (que concede permissão para recuperar credenciais no KMS). Se as credenciais forem criptografadas com uma chave mestra do cliente (CMK), conceda também a permissão kms:Decrypt adicionando a política AliyunKMSCryptoUserAccess.
Para controlar as permissões no nível da chave e da credencial, crie uma política personalizada que conceda as permissões GetSecretValue e Decrypt e restrinja o acesso aos recursos especificados. Para mais informações, consulte Referência de política personalizada do KMS e Crie uma política personalizada.
{
"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>"
}
]
}
Etapa 3: Conceder permissões a um usuário do RAM
Crie uma política de permissões e conceda-a ao usuário do RAM. Isso permite que o usuário transfira a função do RAM criada na Etapa 2 para o service do Flink assumir.
Se o usuário do RAM na Etapa 4 já estiver associado à política AliyunRAMFullAccess ou AliyunStreamFullAccess, o usuário já tem a permissão PassRole. Pule esta etapa.
Crie uma política de permissões
Acesse a página RAM console - Policies e clique em Create Policy. Alterne para o modo Script e edite o conteúdo da política.
{
"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"
}
}
}
]
}
|
Permissão |
Descrição |
|
|
Permite que o usuário visualize a lista de funções da conta, permitindo selecionar a função no console do Flink. |
|
|
Permite que o usuário transfira a função especificada para o service da cloud do Flink. Substitua
Adicione uma |
Clique em OK e salve a política, por exemplo, como FlinkPassRolePolicy. Para obter mais informações, consulte Crie uma política personalizada.
Conceder permissões ao usuário do RAM
Acesse a página RAM console - Users. Encontre o usuário do RAM a ser autorizado e clique em Add Permissions na coluna Actions.
No painel Add Permissions, pesquise e selecione a política criada na Etapa 3 (por exemplo,
FlinkPassRolePolicy) e clique em Confirm e confirme. Para mais detalhes, consulte Conceder permissões a um usuário do RAM.
Etapa 4: Referenciar a função do RAM no Flink
Referencie a função do RAM criada na Etapa 2 no namespace do Flink para que os jobs possam usá-la no acesso ao KMS.
Acesse o console do Realtime Compute e entre no workspace de destino.
No painel de navegação à esquerda, escolha .
Clique em aba RAM Roles.
Clique em Reference RAM Role.
-
Na caixa de diálogo, selecione a função do RAM criada na Etapa 2 (por exemplo,
FlinkRoleForKMSRead). O sistema oferece suporte à pesquisa aproximada por nome de função.NotaA lista de funções contém funções de service regulares na conta Alibaba Cloud proprietária do namespace atual. O operador deve pertencer à mesma conta Alibaba Cloud do namespace atual e ter a permissão
ram:ListRolespara visualize as funções. -
Clique em Test. O sistema verifica automaticamente os dois itens a seguir:
Verificação de permissão PassRole: O usuário atual tem a permissão
ram:PassRolena função do RAM selecionada.Verificação de política de confiança: A função do RAM selecionada permite que o namespace atual do Flink a assuma.
Após a aprovação das verificações, clique em OK.
Para mais informações, consulte Use a RAM role to access cloud resources.
Etapa 5: Usar credenciais do KMS em jobs
Depois de concluir as etapas anteriores, especifique as credenciais usando o formato de referência secret:// no código do job e configure os parâmetros de conexão do KMS. O Flink recupera automaticamente os valores das credenciais durante a execução para acessar o source de dados.
Exemplo do Postgres CDC Connector
Job SQL: O exemplo a seguir usa uma tabela source do Postgres CDC e hospeda o nome de usuário e a senha do banco de dados com uma credencial do KMS. Uma credencial de banco de dados chamada my-db-secret foi criada no KMS, com o 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' = 'oss://<bucket>/kms-ca.pem',
'kms.akless.assume-role.role-name' = 'FlinkRoleForKMSRead'
);
Para as descrições de parâmetros, pré-requisitos e mapeamento de tipos do conector Postgres CDC, consulte Postgres CDC connector.
Exemplo do Kafka Connector
A configuração SASL JAAS referencia as credenciais do Kafka. Substitua os valores de username e password em properties.sasl.jaas.config por referências secret://. Os demais parâmetros do Kafka permanecem inalterados. Uma credencial chamada my-kafka-secret foi criada no KMS, com o SecretData {"AccountName":"<SASL username>","AccountPassword":"<SASL password>"}.
Job SQL: O exemplo a seguir usa uma tabela source do Kafka. Configure uma tabela de resultados da mesma maneira.
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',
/* Reference KMS credentials in username and password */
'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'
);
Job YAML de ingestão de dados: O source e o destino especificam os parâmetros do KMS separadamente. O source usa um gateway compartilhado e o destino usa um gateway dedicado, portanto, este exemplo abrange ambos.
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";
# Shared gateway: the endpoint is fixed per region, and kms.ca is not required
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>
# ApsaraMQ for Kafka does not support idempotent writes. Disable idempotence on VVR 8.0.0 and later
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";
# Dedicated gateway: kms.ca is also required
kms.endpoint: <your-kms-instance-vpc-endpoint>
kms.ca: oss://flink-fullymanaged-<workspace-id>/artifacts/namespaces/<namespace>/PrivateKmsCA_kst-******.pem
kms.akless.assume-role.role-name: FlinkRoleForKMSRead
No YAML, o valor de
properties.sasl.jaas.configcontém aspas duplas. Mantenha-as como estão, sem usar escape.Obtenha os endereços do endpoint e a porta para acesso SASL no console do ApsaraMQ for Kafka.
Para os parâmetros completos e configurações de segurança do conector Kafka, consulte Kafka SQL connector e Kafka YAML connector.
Descrição dos parâmetros
Formato de referência de credencial
O formato de referência de credencial do KMS é secret://<provider>.<secret-name>.<key>.
|
Campo |
Descrição |
|
|
O identificador do tipo de source da credencial. Atualmente, há suporte apenas para |
|
|
O nome da credencial no KMS, por exemplo, |
|
|
O nome do campo no JSON SecretData da credencial, por exemplo, |
Exemplo: secret://kms.my-db-secret.AccountPassword
Parâmetros do KMS
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
|
String |
Sim |
O endereço do gateway do KMS (gateway dedicado ou gateway compartilhado).
|
|
|
String |
Obrigatório para gateways dedicados |
O caminho do OSS para o certificado CA.
|
|
|
String |
Não |
O nome da função do RAM usada para acessar o KMS. A função deve ser referenciada antecipadamente em Security > RAM Roles. |