使用隐藏水平信息的Amazon Dynamo DB进行细粒度访问控制

时间:2015-07-20 11:15:11

标签: amazon-web-services amazon-dynamodb multi-tenant access-control amazon-iam

我已经浏览了documentation并且它与我的用例密切相关,只是我不能使用Google,Facebook或亚马逊作为我的身份提供商,但我已经拥有企业级OAuth 2.0访问权限已验证用户的令牌。

据我所知,我可以使用AWS STS的Enterprise Federated支持获取临时凭据并使用它们来进一步访问AWS资源,但我无法理解如何配置IAM策略以使用这些凭据来实现水平信息隐藏

我在DynamoDB中有一些表,我存储了我的应用程序的所有用户的详细信息,我的应用程序支持多个租户,因此我希望一个租户的用户无法访问其他租户的数据。我可以配置的IAM策略类型为:

"Condition": {
            "ForAllValues:StringEquals": {
               "dynamodb:LeadingKeys":  ["${www.amazon.com:user_id}"]
            }
        }

现在我的用户没有通过亚马逊(或Google或Facebook)登录,因此我无法使用" $ {www.amazon.com:user_id}"我的某些表的哈希键也是复合的。

所以我的问题是如何在数据库级别实现多租户,并且能够为每个租户隔离或分离数据,即隐藏我的表的某些行与不应该访问它的用户。

是否可以在定义IAM策略时指定自定义策略变量并指定如何在运行时解析这些变量?或者其他一些方式?

我在Dynamo中的表目前有复合哈希键,它是Tenant_ID和User_ID的组合,所以我可以在IAM策略中指定某种规则,以便我能够实现水平信息隐藏吗?

如果您需要有关我的用例的更多信息,请告诉我。

此致 Agraj

1 个答案:

答案 0 :(得分:0)

要启用fine-grained data access in DynamoDB,您必须在DynamoDB IAM政策中指定IAM Policy Element Variable

典型的政策可能如下所示:

    import java.io.FileWriter;
import java.util.Arrays;
import java.io.Writer;
import java.util.List;

//Default separator
char SEPARATOR = ',';

//function write line in csv
public void writeLine(FileWriter writer, String[] params, char separator)
{
   boolean firstParam = true;

   StringBuilder stringBuilder = new StringBuilder();
   String param = "";

   for (int i = 0; i < params.length; i++)
   {
      //get param
      param = params[i];
      log.info(param);

         //if the first param in the line, separator is not needed
       if (!firstParam) 
       {
           stringBuilder.append(separator);
       }

         //Add param to line
       stringBuilder.append(param);

       firstParam = false;
   }

   //prepare file to next line
   stringBuilder.append("\n");

   //add to file the line
   log.info(stringBuilder.toString());
   writer.append(stringBuilder.toString());

}

//get path of csv file (creates new one if its not exists)
String csvFile = "/JMeter/dane.csv"; // for example '/User/Downloads/blabla.csv'

String[] params = {${context1}, ${context2}};

FileWriter fileWriter = new FileWriter(csvFile, true);
writeLine(fileWriter, params, SEPARATOR);

//proper close to file
fileWriter.flush();
fileWriter.close();

其中{ "Version": "2012-10-17", "Statement": [ { "Sid": "FullAccessToUserItems", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": [ "arn:aws:dynamodb:*:table/*" ], "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": [ "${cognito-identity.amazonaws.com:sub}" ] } } } ] } 是表示Cognito中用户子的IAM策略变量。

不幸的是,亚马逊不会发布可用的政策变量列表。但这意味着您的用户管理通过亚马逊进行管理,以实现细粒度的安全性。您无法定义自己的策略变量 - 它们必须是预定义的Amazon变量 - 因此细粒度的安全性仅适用于您在Amazon中管理用户的情况。

此外,您的DynamoDB分区键必须与策略变量匹配。例如,您的表分区键必须是Cognito子。

如果从Cognito收到您的OAuth令牌,您只需将其发布到亚马逊Token Endpoint,这将返回包含用户Cognito sub的id_token。