【问题标题】:EMR & Spark 3.0: row-level security (filtering)EMR & Spark 3.0:行级安全(过滤)
【发布时间】:2021-10-19 16:10:57
【问题描述】:

问题:是否可以在不购买昂贵的企业解决方案的情况下使用 EMR、Spark 3.0 和 S3 实现行级过滤?

我想确保我没有错过任何东西。 EMR-Ranger doc 说集成支持 Spark,但看起来完全没用,因为:

  1. 如果通过 EMR 记录服务器工作
    它应该提供细粒度的访问控制,但 Ranger plugins doc 表示 EMR Spark 插件不支持写入操作、写入 CSV 和 Auro、Delta 和 Hudi、行过滤和数据屏蔽。
  2. 如果通过 EMRFS S3 Ranger 插件工作
    仅粗粒度(db-/table-/column-级别)访问控制。没有行级过滤或数据屏蔽(由于存储级身份验证)。见Ranger plugins doc

附: Hive 不是一个选项,Lake Formation 不支持 EMR 6.x (Spark 3.x)。

【问题讨论】:

    标签: apache-spark amazon-emr apache-ranger


    【解决方案1】:

    问题:您的 Q1) .. 是否可以使用 EMR、Spark 3.0 和 S3 实现行级过滤.. 无需昂贵的解决方案..? 您的 Q2 2) .. 仅粗略-粒度(db-/table-/column-级别)访问控制。 No row-level filtering or data...我在下面列出了代码 sn-p 来处理下面的问题..

    答案:避免为像 privacera 之类的东西付费,我通过强制 rowfilter 政策实施了我自己的 row-level filtering 报告并将其传递给 "rowFilterPolicyItems",请参阅下面的 1) JSON 和 2) Java 示例/选项,希望您能够根据您的自定义需求对其进行扩展。


    AWS DOCS 很烂..:

    自 2021 年 8 月起,可以读取,但不支持写入(无论插件如何)see AWS Ranger Docs here..

    ... 以下是在 Amazon EMR 上启用 Apache Ranger 集成之前的一些注意事项和限制。 1/ 当前仅 Apache Hive 支持行级授权和数据屏蔽策略。 2/ EMR Ranger-Spark 插件在使用带有 Java、Scala、R 和 Pyspark 的 Spark API 读取和写入数据时强制执行细粒度授权。 However, writing data using Spark SQL on Ranger-Enabled Clusters is currently not supported;仅支持使用 SparkSQL 读取数据。 ...


    更新 1: 甚至 AWS 自己的示例也不知道如何解决它,如下所示,所以我通过查看 Apache 中的代码推出了自己的示例...

    答案:WorkAround -- 所以我在ranger rowfilter"rowFilterPolicyItems" 我自己的内部实现了这些。

    1. 选项 1 JSON 设置

    {
      "rowFilterInfo" : {
        "filterExpr" : "..."
      },
      "roles" : [ "...", "..." ],
      "groups" : [ "...", "..." ],
      "conditions" : [ {
        "type" : "...",
        "values" : [ "...", "..." ]
      }, {
        "type" : "...",
        "values" : [ "...", "..." ]
      } ],
      "delegateAdmin" : true,
      "accesses" : [ {
        "type" : "...",
        "isAllowed" : true
      }, {
        "type" : "...",
        "isAllowed" : true
      } ],
      "users" : [ "...", "..." ]
    }
    

    例如你必须实施 "rowFilterPolicyItems"你可以使用我下面的示例..

      // you would setup/pass this in your JSON file
      // Or, you can also do it Programmatically in Java
      "rowFilterPolicyItems": [
        {
          "rowFilterInfo": {
            "filterExpr": "page='ranger-aws-emr3.tykt.org'"
          },
          "accesses": [
            {
              // **** I Would tinker with this access type,
              // if you are doing it Java I will paste a sample below
              "type": "select",
              "isAllowed": true
            }
          ],
          "users": [
            "reports"
          ],
          "groups": [],
          "conditions": [],
          "delegateAdmin": false
        }
      ], ...
    

    1. 选项 2 JAva 设置

    在 Java 中,您可以按如下方式以编程方式设置RangerPolicy.RangerPolicyItem policyItem = new RangerPolicy.RangerPolicyItem(); 这些策略可以添加到行过滤器项中。由于 AWS 缺少这个,我不得不自己做所有这些。多次尝试和错误,但它得到了回报。

     void createTyktPolicies(RangerService createdTyktRecordsPolicyService) throws Exception {
        RangerBaseService svc = serviceMgr.getRangerServiceByService(createdTyktRecordsPolicyService, this);
        if (svc != null) {
            List<String> serviceCheckUsers = getServiceCheckUsers(createdTyktRecordsPolicyService);
            // *** your policy as needed
            List<RangerPolicy.RangerPolicyItemAccess> allAccesses = svc.getAndAllowAllAccesses();
            List<RangerPolicy> defaultPolicies = svc.getDefaultRangerPolicies();
            if (CollectionUtils.isNotEmpty(defaultPolicies)) {
                createDefaultPolicyUsersAndGroups(defaultPolicies);
                for (RangerPolicy defaultPolicy : defaultPolicies) {
                    if (CollectionUtils.isNotEmpty(serviceCheckUsers) && StringUtils.equalsIgnoreCase(defaultPolicy.getService(), createdTyktRecordsPolicyService.getName())) {
    
                    // this is where I am creating my policy in code
                    // You CAN MODIFY THE POLICY ACCORDINGLY to your needs and try
                        RangerPolicy.RangerPolicyItem policyItem = new RangerPolicy.RangerPolicyItem();
                        policyItem.setUsers(serviceCheckUsers);
                        policyItem.setAccesses(allAccesses);
                        policyItem.setDelegateAdmin(true);
                        defaultPolicy.getPolicyItems().add(policyItem);
                    }
                    createPolicy(defaultPolicy);
                }
            }
        }
    }
    

    【讨论】:

    • 确实很糟糕,但也可以接受
    • @Transformer 感谢您的出色回答!抱歉没有立即奖励你,我去vacay了。我会在 24 小时内奖励你。
    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2016-02-10
    • 2013-01-27
    • 1970-01-01
    • 2020-03-07
    • 2020-10-22
    相关资源
    最近更新 更多