Realtime Compute for Apache Flink, işlerde Alibaba Cloud Key Management Service (KMS) üzerinde barındırılan kimlik bilgilerine başvurmayı destekler. Bu sayede veri kaynaklarına erişilirken düz metin kullanıcı adı ve şifreleri (user-pwd) kullanmak yerine şifrelenmiş kimlik bilgileri kullanılabilir. Bu yaklaşım, kimlik bilgilerinin şifrelenerek saklanmasını sağlar, düz metin olarak açığa çıkmasını önler ve bakım gerektirmeyen bir kimlik bilgisi yönetimi imkanı sunar.
Genel Bakış
KMS kimlik bilgisi yönetimini entegre ederek, Flink işlerinde KMS üzerinde barındırılan kimlik bilgilerine (veritabanı kullanıcı adları ve şifreleri gibi) başvurabilirsiniz. Bu sayede iş kodunda düz metin kimlik bilgileri açıkta kalmaz. Çalışma zamanında Flink, geçici bir STS belirteci almak için bir RAM rolünü üstlenir, gerçek kimlik bilgisi değerini almak üzere KMS'i çağırır ve ardından hedef veri kaynağına bağlanır.
Temel avantajlar:
Hassas bilgilerin korunması: İşlerde düz metin user-pwd açıkta kalmaz. Kimlik bilgileri KMS'de şifrelenmiş olarak barındırılır.
Bakım gerektirmeyen kimlik bilgileri: KMS kimlik bilgisi döndürme özelliği sayesinde, güncellemelerden sonra Flink en son kimlik bilgisi değerini otomatik olarak alır. İş kodunun değiştirilmesine gerek kalmaz.
Notlar
KMS'deki kimlik bilgilerinin yanlışlıkla silinmesi veya RAM'deki bir RAM rolünün izinlerinin ve güven ilkesinin yanlışlıkla silinmesi ya da değiştirilmesi, Flink işlerinin KMS kimlik bilgilerini alamamasına ve dolayısıyla başarısız olmasına neden olabilir. Realtime Compute for Apache Flink Hizmet Seviyesi Sözleşmesi uyarınca, müşterilerin kaynakları hatalı kullanmasından kaynaklanan kullanılamazlık durumu SLA kapsamında değildir.
Sınırlamalar
Yalnızca Postgres CDC Connector (VVR 11.8 ve sonrası) ile Kafka Connector (VVR 11.9 ve sonrası), KMS kimlik bilgilerini kullanarak cloud kaynaklara erişimi destekler.
KMS'e erişmek için başvurulan RAM rollerinin sayısı konusunda bir sınır bulunmaktadır. Ayrıntılar için bkz. Cloud kaynaklara erişmek için RAM rolü kullanma.
İzin hazırlığı
Adım 1 (KMS kimlik bilgisi oluşturma): Operatörün KMS kimlik bilgisi yönetimi izinlerine sahip olması gerekir.
Adım 2 ve Adım 3: Operatöre
AliyunRAMFullAccessilkesi verilmeli veya RAM rolü yönetimi ile izin yönetimi izinleri ayrı ayrı tanınmalıdır. Daha fazla bilgi için bkz. Özel ilke oluşturma.Adım 4 ve Adım 5 (Flink'te rol referans gösterme ve iş geliştirme): Operatörün Flink ad alanı üzerinde düzenleyici veya daha yüksek düzeyde izinlere sahip olması ya da RAM rollerini referans gösterme, dosyaları yönetme ve iş geliştirme için ayrıntılı izinlere sahip olması gerekir. Ayrıntılar için bkz. Geliştirme konsoluna erişim izinleri verme.
Adım 1: KMS kimlik bilgisi oluşturma
KMS, birden fazla türde kimlik bilgisi sunar. Aşağıdaki adımlarda örnek olarak bir RDS kimlik bilgisi kullanılmıştır:
Key Management Service konsolu üzerinde oturum açın. Üst menü çubuğundan bölgeyi seçin ve sol gezinme bölmesinde Resources > Secrets seçeneğini tıklayın.
Self-Managed Secrets sekmesinde, Secret Type alanında Database Secret seçeneğini tıklayın.
Sağ taraftaki listenin üst kısmında, Create Database Secret altında Create Single Secret seçeneğini tıklayın, yapılandırmayı tamamlayın ve OK seçeneğini tıklayın.
Daha fazla bilgi için bkz. Secrets Manager'a giriş ve ApsaraDB RDS gizli dizilerini yönetme ve kullanma.
Adım 2: RAM rolü oluşturma ve yapılandırma
Bu rol, Flink hizmetinin KMS'e erişmek için kullandığı kimlik kimlik bilgisidir. Flink, geçici kimlik bilgilerini almak için bu rolü üstlenir ve kimlik bilgisi değerlerini almak üzere rol adına KMS'i çağırır. KMS'e kimlik bilgisi içermeyen erişim hakkında ayrıntılı bilgi için Cloud kaynaklara erişmek için RAM rolü kullanma bölümünün ekine bakın.
1. RAM rolü oluşturma
RAM konsolu - Roles sayfasına gidin ve Create Role seçeneğini tıklayın. Varsayılan seçenekleri koruyun ve OK seçeneğini tıklayın.
Tanınabilir bir rol adı girin, örneğin
FlinkRoleForKMSReadve OK seçeneğini tıklayın.
2. Güven ilkesi ekleme
Rol oluşturulduktan sonra, rol ayrıntıları sayfasında Trust Policy sekmesini tıklayın ve Edit Trust Policy seçeneğini tıklayın. Flink'in rolü üstlenmesine güven sağlamak için Principal öğesine "Service": ["stream.aliyuncs.com"] ekleyin. Daha fazla bilgi için bkz. RAM rolünün güven ilkesini değiştirme.
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"stream.aliyuncs.com"
]
}
}
],
"Version": "1"
}
3. RAM rolüne KMS erişim izinleri verme
Flink rolü üstlendikten sonra, rol adına KMS'i çağırır. Gerekli KMS izinlerini, rolün izin ilkesine önceden verin.
Rol ayrıntıları sayfasında Permissions sekmesini tıklayın ve Grant Permission seçeneğini tıklayın. KMS'den kimlik bilgilerini alma izni veren AliyunKMSSecretUserAccess ilkesini ekleyin. Kimlik bilgileri bir müşteri anahtarı (CMK) ile şifrelenmişse, kms:Decrypt iznini vermek için AliyunKMSCryptoUserAccess ilkesini de ekleyin.
İzinleri anahtar ve kimlik bilgisi düzeyinde kontrol etmek için GetSecretValue ve Decrypt izinlerini veren ve kaynağı belirtilen kaynaklarla sınırlayan özel bir ilke oluşturun. Ayrıntılar için bkz. KMS özel ilke referansı ve Özel ilke oluşturma.
{
"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>"
}
]
}
Adım 3: RAM kullanıcıya izin verme
Bir izin ilkesi oluşturun ve bunu RAM kullanıcıya atayın. Bu işlem, kullanıcının Adım 2'de oluşturulan RAM rolünü Flink hizmetine aktarmasına (pass) olanak tanır.
Adım 4'teki RAM kullanıcı zaten AliyunRAMFullAccess veya AliyunStreamFullAccess ilkesiyle ilişkiliyse, kullanıcıda zaten PassRole izni vardır. Bu adımı atlayabilirsiniz.
İzin ilkesi oluşturma
RAM konsolu - Policies sayfasına gidin ve Create Policy seçeneğini tıklayın. Script moduna geçin ve ilke içeriğini düzenleyin.
{
"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"
}
}
}
]
}
|
İzin |
Açıklama |
|
|
Kullanıcının hesap altındaki rol listesini görüntülemesine olanak tanır, böylece Flink konsolunda rol seçilebilir. |
|
|
Kullanıcının belirtilen rolü Flink cloud hizmetine aktarmasına olanak tanır. İlke içindeki
Rolün yalnızca |
İlkeyi kaydetmek için OK seçeneğini tıklayın, örneğin FlinkPassRolePolicy olarak kaydedin. Daha fazla bilgi için bkz. Özel ilke oluşturma.
RAM kullanıcıya izin verme
RAM konsolu - Users sayfasına gidin. Yetkilendirmek istediğiniz RAM kullanıcıyı bulun ve Actions sütununda Add Permissions seçeneğini tıklayın.
Add Permissions panelinde, Adım 3'te oluşturulan ilkeyi arayın ve seçin (örneğin,
FlinkPassRolePolicy), ardından Confirm seçeneğini tıklayın. Daha fazla bilgi için bkz. RAM kullanıcıya izin verme.
Adım 4: Flink'te RAM rolünü referans gösterme
Adım 2'de oluşturulan RAM rolünü Flink ad alanına referans gösterin, böylece işler KMS'e erişmek için bu rolü kullanabilir.
Realtime Compute konsolunda oturum açın ve hedef çalışma alanına gidin.
Sol gezinme bölmesinde seçeneğini tıklayın.
RAM Roles sekmesini tıklayın.
Reference RAM Role seçeneğini tıklayın.
-
Açılan iletişim kutusunda, Adım 2'de oluşturulan RAM rolünü seçin (örneğin,
FlinkRoleForKMSRead). Rol adına göre bulanık arama desteklenir.NotRol listesi, mevcut ad alanına sahip olan Alibaba Cloud hesabı altındaki normal hizmet rollerini içerir. Operatörün mevcut ad alanıyla aynı Alibaba Cloud hesabına ait olması ve rolleri görüntülemek için
ram:ListRolesiznine sahip olması gerekir. -
Test seçeneğini tıklayın. Sistem aşağıdaki iki öğeyi otomatik olarak denetler:
PassRole izin denetimi: Mevcut kullanıcının seçilen RAM rolü üzerinde
ram:PassRoleizni vardır.Güven ilkesi denetimi: Seçilen RAM rolü, mevcut Flink ad alanının rolü üstlenmesine güvenir.
Denetimler başarılı olduktan sonra OK seçeneğini tıklayın.
Daha fazla bilgi için bkz. Cloud kaynaklara erişmek için RAM rolü kullanma.
Adım 5: İşlerde KMS kimlik bilgilerini kullanma
Önceki adımlar tamamlandıktan sonra, iş kodunda secret:// başvuru formatını kullanarak kimlik bilgilerini belirtin ve KMS bağlantı parametrelerini yapılandırın. Flink, çalışma zamanında veri kaynağına erişmek için kimlik bilgisi değerlerini otomatik olarak alır.
Postgres CDC Connector örneği
SQL işi: Aşağıdaki örnekte bir Postgres CDC kaynak tablosu kullanılmakta ve veritabanı kullanıcı adı ile şifresi bir KMS kimlik bilgisi ile barındırılmaktadır. KMS'de my-db-secret adlı bir veritabanı kimlik bilgisi oluşturulmuş olup SecretData değeri {"AccountName":"alice","AccountPassword":"xxx"} şeklindedir.
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'
);
Postgres CDC connector'ının parametre açıklamaları, ön koşulları ve tür eşlemeleri için bkz. Postgres CDC connector.
Kafka Connector örneği
Kafka kimlik bilgileri, SASL JAAS yapılandırmasında referans gösterilir. properties.sasl.jaas.config içindeki username ve password değerlerini secret:// başvurularıyla değiştirin. Diğer Kafka parametreleri aynı kalır. KMS'de my-kafka-secret adlı bir kimlik bilgisi oluşturulmuş olup SecretData değeri {"AccountName":"<SASL username>","AccountPassword":"<SASL password>"} şeklindedir.
SQL işi: Aşağıdaki örnekte bir Kafka kaynak tablosu kullanılmaktadır. Sonuç tablosunu da aynı şekilde yapılandırın.
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'
);
Veri alımı YAML işi: Kaynak ve hedef (sink) KMS parametrelerini ayrı ayrı belirtir. Kaynak paylaşılan bir ağ geçidi kullanırken hedef özel bir ağ geçidi kullanır, bu nedenle bu örnek her ikisini de kapsar.
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
YAML'de
properties.sasl.jaas.configdeğeri çift tırnak içerir. Bunları olduğu gibi yazın, escape karakteri kullanmayın.SASL erişimi için uç nokta adreslerini ve bağlantı noktasını ApsaraMQ for Kafka konsolundan alın.
Kafka connector'ının tam parametreleri ve güvenlik ayarları için bkz. Kafka SQL connector ve Kafka YAML connector.
Parametre açıklaması
Kimlik bilgisi başvuru formatı
KMS kimlik bilgisi başvuru formatı secret://<provider>.<secret-name>.<key> şeklindedir.
|
|
|
|
|
|
|
|
|
|
|
|
Örnek: secret://kms.my-db-secret.AccountPassword
KMS parametreleri
|
Parametre |
Tür |
Gerekli |
Açıklama |
|
|
String |
Evet |
KMS ağ geçidi adresi (özel ağ geçidi veya paylaşılan ağ geçidi).
|
|
|
String |
Özel ağ geçitleri için gerekli |
CA sertifikasının OSS yolu.
|
|
|
String |
Hayır |
KMS'e erişmek için kullanılan RAM rolünün adı. Rolün önceden Security > RAM Roles altında referans gösterilmiş olması gerekir. |