Hi Fred, 

Thanks for raising the discussion! I think the definition of “environment 
variable” varies under different context. Under Flink on K8s it means the 
environment variable for a container, and if you are a SQL client user it could 
refer to environment variable of SQL client, or even the system properties on 
JVM. So using “environment variable” is a bit vague under different 
environments. 

A more generic solution in my mind is that we can take advantage of 
configurations in Flink, to pass table options dynamically by adding configs to 
TableConfig or even flink-conf.yaml. For example option 
“table.dynamic.options.my_catalog.my_db_.my_table.accessId = foo” means adding 
table option “accessId = foo” to table “my_catalog.my_db.my_table”. By this way 
we could de-couple DDL statement with table options containing secret 
credentials. What do you think?

Best regards, 

Qingsheng

> On Mar 30, 2022, at 16:25, Teunissen, F.G.J. (Fred) 
> <fred.teunis...@ing.com.INVALID> wrote:
> 
> Hi devs,
> 
> Some SQL Table properties contain sensitive data, like passwords that we do 
> not want to expose in the VVP ui to other users. Also, having them clear text 
> in a SQL statement is not secure. For example,
> 
> CREATE TABLE Orders (
>    `user` BIGINT,
>    product STRING,
>    order_time TIMESTAMP(3)
> ) WITH (
>    'connector' = 'kafka',
> 
>    'properties.bootstrap.servers' = 'kafka-host-1:9093,kafka-host-2:9093',
>    'properties.security.protocol' = 'SSL',
>    'properties.ssl.key.password' = 'should-be-a-secret',
>    'properties.ssl.keystore.location' = '/tmp/secrets/my-keystore.jks',
>    'properties.ssl.keystore.password' = 'should-also-be-a-secret',
>    'properties.ssl.truststore.location' = '/tmp/secrets/my-truststore.jks',
>    'properties.ssl.truststore.password' = 'should-again-be-a-secret',
>    'scan.startup.mode' = 'earliest-offset'
> );
> 
> I would like to bring up for a discussion a proposal to provide these secrets 
> values via environment variables since these can be populated from a K8s 
> configMap or secrets.
> 
> For implementing the SQL Table properties, the ConfigOption<T> class is used 
> in connectors and formatters. This class could be extended that it checks 
> whether the config-value contains certain tokens, like ‘${env-var-name}’. If 
> it does, it could fetch the value from the environment variable and use that 
> to replace that token in the config-value.
> 
> The above SQL statement would then look like,
> 
> CREATE TABLE Orders (
>    `user` BIGINT,
>    product STRING,
>    order_time TIMESTAMP(3)
> ) WITH (
>    'connector' = 'kafka',
> 
>    'properties.bootstrap.servers' = 'kafka-host-1:9093,kafka-host-2:9093',
>    'properties.security.protocol' = 'SSL',
>    'properties.ssl.key.password' = '${secret_kafka_ssl_key_password}',
>    'properties.ssl.keystore.location' = '/tmp/secrets/my-keystore.jks',
>    'properties.ssl.keystore.password' = 
> '${secret_kafka_ssl_keystore_password}',
>    'properties.ssl.truststore.location' = '/tmp/secrets/my-truststore.jks',
>    'properties.ssl.truststore.password' = 
> '${secret_kafka_ssl_truststore_password}',
>    'scan.startup.mode' = 'earliest-offset'
> );
> 
> For the purpose of secrets I don’t think you need any complex processing of 
> tokens but perhaps there are other usages as well. For instance,
> 
>    'properties.bootstrap.servers' = 
> 'kafka-${otap_env}-1:9093,kafka-${otap_env}-2:9093',
> 
> Because it is possible that (but I think unlikely) someone wants a property 
> value like ‘${not-an-env-var}’ you need to be able to escape this ’$’ token 
> like ‘$${not-an-env-var}’. This also means that in theory it would break 
> compatibility.
> 
> Looking forward for your feedback!
> 
> Best,
> Fred Teunissen
> 
> -----------------------------------------------------------------
> ATTENTION:
> The information in this e-mail is confidential and only meant for the 
> intended recipient. If you are not the intended recipient, don't use or 
> disclose it in any way. Please let the sender know and delete the message 
> immediately.
> -----------------------------------------------------------------

Reply via email to