Политика редактирования тем AWS SNS — C#

У меня есть служба SNS, я ищу способ создать эту часть политики с помощью C# sdk:

{
  "Sid": "__console_sub_0",
  "Effect": "Allow",
  "Principal": {
    "AWS": "*"
  },
  "Action": [
    "SNS:Subscribe",
    "SNS:Receive"
  ],
  "Resource": "arn:aws:sns:MYARN"
}

Это то, что я вижу, когда устанавливаю в консоли браузера «Разрешить этим пользователям публиковать сообщения в этой теме» и «Разрешить этим пользователям подписываться на эту тему», а сейчас она должна быть открыта для всех.

Для чего я пробовал:

1)

Policy snsPolicy = new Policy().WithStatements(
            new Amazon.Auth.AccessControlPolicy.Statement(Amazon.Auth.AccessControlPolicy.Statement.StatementEffect.Allow)
            .WithPrincipals(Principal.AllUsers)
            .WithResources(new Resource("arn:aws:sns:MYARN"))
            );
        SetTopicAttributesRequest setTopicAttributesRequest = new SetTopicAttributesRequest();
        setTopicAttributesRequest.TopicArn = "arn:aws:sns:MYARN";
        setTopicAttributesRequest.AttributeName = "Policy";
        setTopicAttributesRequest.AttributeValue = "test val";

Результат:

Invalid parameter: Policy Error: null

2)

  AmazonSimpleNotificationServiceClient snsClient = new AmazonSimpleNotificationServiceClient(bucketRegion);
        snsClient.AuthorizeS3ToPublish("arn:aws:sns:MYARN", "MYBUCKET");

            List<string> tl = new List<string>();
        tl.Add("*");
        List<string> tl2 = new List<string>();
        tl2.Add("SNS:Subscribe"); 
        tl2.Add("SNS:Receive");
        Amazon.SimpleNotificationService.Model.AddPermissionResponse permissionResponse = snsClient.AddPermission("arn:aws:sns:MYARN", "SubscribePolicy", tl, tl2);

Результат:

Invalid parameter: Policy statement action out of service scope!

В обоих случаях я даже не уверен, что это правильная команда для этого. Может ли кто-нибудь направить меня на правильный путь?

Спасибо

РЕДАКТИРОВАТЬ

Я создал статус и добавил его в политику, как было предложено, и использовал его для SetTopicAttributesRequest:

             AmazonSimpleNotificationServiceClient snsClient = new AmazonSimpleNotificationServiceClient(bucketRegion);            
        Policy snsPolicy = new Policy();
        snsPolicy.Id = "test_id";
        snsPolicy.Statements.Add(statment);
        SetTopicAttributesRequest setTopicAttributesRequest = new SetTopicAttributesRequest();
        setTopicAttributesRequest.TopicArn = "arn:aws:sns:MYARN";
        setTopicAttributesRequest.AttributeName = "Policy";
        setTopicAttributesRequest.AttributeValue = snsPolicy.ToJson();
        snsClient.SetTopicAttributes(setTopicAttributesRequest);

Но ошибка "Недопустимый параметр: Ошибка политики: ноль" такая же.


person Ehud Grand    schedule 27.12.2018    source источник


Ответы (1)


Согласно документации AWS, вы должны использовать объект Policy, найденный в папке Amazon.Auth.AccessControlPolicy.

Следующий код создает объект политики. В этом случае вам понадобится только одно утверждение. Он имеет ресурс ведра + имя пользователя и действия GET и PUT. В качестве дополнительной меры безопасности давайте добавим условие, которое блокирует запросы GET и PUT к IP-адресу настольного клиента.

public Policy GeneratePolicy(string bucket, string username, string ipAddress)
{
    var statement = new Statement(Statement.StatementEffect.Allow);

    // Allow access to the sub folder represented by the username in the bucket
    statement.Resources.Add(ResourceFactory.NewS3ObjectResource(bucket, username + "/*"));

    // Allow Get and Put object requests.
    statement.Actions = new List() 
        { S3ActionIdentifiers.GetObject,  S3ActionIdentifiers.PutObject };

    // Lock the requests coming from the client machine.
    statement.Conditions.Add(ConditionFactory.NewIpAddressCondition(ipAddress));

    var policy = new Policy();
    policy.Statements.Add(statement);

    return policy;
}

Перейдите по этой ссылке для получения дополнительной информации.

person Mohamed Hamza    schedule 27.12.2018