【问题标题】:How to hide/mask sensitive data from airflow connections and variable section?如何隐藏/屏蔽气流连接和可变部分的敏感数据?
【发布时间】:2020-06-26 23:59:13
【问题描述】:

我们在 apache 气流中有许多 AWS 连接字符串,任何人都可以在气流网络服务器连接部分看到我们的访问密钥和秘密密钥。如何隐藏或屏蔽气流网络服务器中的敏感数据?

我们已经在气流配置中启用了身份验证,因此它不会允许未经授权的用户。但我不想在网络视图中显示我的密钥。

【问题讨论】:

    标签: python airflow


    【解决方案1】:

    对于 Airflow 变量部分,如果变量名称包含 secretpassword,Airflow 将自动隐藏任何值。对该值的检查不区分大小写,因此名称包含SECRET 的变量的值也将被隐藏。

    【讨论】:

      【解决方案2】:

      我找到了这个用例的解决方法。气流AWSHook中有一个选项,我们可以在连接字符串中传递密钥路径,而不是密钥和访问密钥。

      /root/keys/aws_keys

      [default]
      aws_access_key_id=<access key>
      aws_secret_access_key=<secret key>
      region=<region>
      
      [s3_prod]
      aws_access_key_id=<access key>
      aws_secret_access_key=<secret key>
      region=<region>
      

      它是如何工作的?首先,它将检查连接字符串中的额外参数是否添加了任何 aws 密钥,如果没有,它将检查密钥路径(s3_config_file)。如果这两个选项都不可用,那么它将从 boto.cfg 文件中查找凭据。所以现在不需要在 UI 中显式公开任何键 :)

      【讨论】:

        【解决方案3】:

        LDAP 身份验证模块能够为将成为管理员的组指定基于组的过滤器,并且能够查看该菜单以及其他内容。

        the documentation under security

        superuser_filter 和 data_profiler_filter 是可选的。如果已定义,这些配置允许您指定用户必须属于的 LDAP 组,以便拥有超级用户 (admin) 和数据探查器权限。如果未定义,所有用户都将是超级用户和数据分析器。

        请注意,数据分析器可以在任何已定义的连接上运行即席查询。但是,他们看不到管理菜单。您可能不希望一组用户能够执行任意 SQL 或其他任何操作,因此还要设置该过滤器。

        任何用户都可以在他们的 DAG 和任务中请求任何变量。将这些变量放在它们会在日志中显示的位置很容易。

        数据库提供了一种以加密方式存储连接密码和变量值的方法,但这并不能解决您的所有问题。

        【讨论】:

        • 是否有任何选项可以屏蔽网络服务器的密码?如果我错过了在气流配置中启用身份验证,那么它会将我的密钥暴露给外界。
        • @MJK IIRC /admin/connection/ 和 /admin/connection/edit UI 不加载也不显示密码。该字段为空。编辑时将其留空,更新将保留作为密码存储的任何内容。或者输入一些东西来设置它。在 HTTPS 上执行此操作(+ 身份验证?)。如果有人编写了一个记录连接详细信息的操作符,那么日志中显示的密码问题仍然存在。连接额外显示在 UI 中。这对 s3 连接类型很不利,可能还有其他连接类型。例如。 {"aws_access_key_id":"AID", "aws_secret_access_key": "AKEY"}
        【解决方案4】:

        我很确定 AWS 挂钩还允许您将访问密钥放在连接屏幕上的“登录”框中,并将密钥放在“密码”框中。如果钩子发现登录框中有内容,它将使用该内容和密码框作为连接信息,这里是来自 source code 的 AWS Hook 的 sn-p:

            if self.aws_conn_id:
                try:
                    connection_object = self.get_connection(self.aws_conn_id)
                    if connection_object.login:
                        aws_access_key_id = connection_object.login
                        aws_secret_access_key = connection_object.password
        
                    elif 'aws_secret_access_key' in connection_object.extra_dejson:
                        aws_access_key_id = connection_object.extra_dejson['aws_access_key_id']
                        aws_secret_access_key = connection_object.extra_dejson['aws_secret_access_key']
        
                    elif 's3_config_file' in connection_object.extra_dejson:
                        aws_access_key_id, aws_secret_access_key = \
                            _parse_s3_config(connection_object.extra_dejson['s3_config_file'],
                                             connection_object.extra_dejson.get('s3_config_format'))
        

        我还发现您需要在 Airflow 1.9 中的 AWSHook 的“额外”框中指定 region_name,否则它将无法正常工作。

        【讨论】:

          猜你喜欢
          • 2022-12-10
          • 1970-01-01
          • 2015-07-18
          • 2023-03-29
          • 2021-02-25
          • 2019-07-13
          • 2022-12-01
          • 1970-01-01
          • 2020-04-29
          相关资源
          最近更新 更多