AWS SNS изменить тему политики - C # - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть служба 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);

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

1 Ответ

0 голосов
/ 27 декабря 2018

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

Следующий код создает объект политики.Для этого случая вам нужно только одно утверждение.У него есть ресурс bucket + username и действия 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;
}

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

...