问题:您的 Q1) .. 是否可以使用 EMR、Spark 3.0 和 S3 实现行级过滤.. 无需昂贵的解决方案..?您的 Q2 2) ..仅粗粒度(db-/table-/column-级别)访问控制。No row-level filtering or data
...我在下面列出了代码片段来处理下面的问题..
回答:为了避免支付 privacera 之类的费用,我通过强制执行策略并将其传递 a来实现自己 的报告,请参阅下面的 1)和 2)示例/选项,希望您能够根据您的自定义需求扩展它。row-level filtering
rowfilter
"rowFilterPolicyItems"
JSON
Java
AWS DOCS 很烂..:
截至 2021 年 8 月,可以进行读取,但不支持写入(无论插件如何),请参阅此处的 AWS Ranger 文档。
... 以下是在 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 中的代码推出了自己的示例......
回答: 解决方法——所以我在自己的内部ranger
rowfilter
和内部实现了这些。"rowFilterPolicyItems"
选项 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
}
], ...
选项 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);
}
}
}
}