Как ограничить пользователя IAM только одним сегментом?

У меня есть сегмент myapp, которым я хочу ограничить только что созданного пользователя IAM (у которого нет групповой политики).

Но я не уверен, как это сделать.

Я пробовал это:

{
    "Statement": [
        {
            "Effect":"Allow",
            "Action": [ 
                "s3:ListBucket"
            ],
            "Resource":"arn:aws:s3:::myapp/*"
        }
    ]
}

Тем не менее, когда я вхожу в консоль IAM с этим пользователем, я вижу:

iam-totally-restricted

Как мне этого добиться?

Изменить 1

Это политика, которую я сейчас использую для своего пользователя:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::myapp"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::myapp/*"
            ]
        }
    ]
}

Однако, когда я загружаю изображение, я получаю эту ошибку:

Excon::Errors::Forbidden at /jobs
Expected(200) <=> Actual(403 Forbidden)
excon.error.response
  :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>0FF1D4848595DCFB</RequestId><HostId>+RrQvNFwV2hAcYPK3ZJJYzy5uiA7Aag0oc1Gpp3hENJ9lzJz453j8qJeLbdQ8jN4cc3ViRJ1lEg=</HostId></Error>"
  :cookies       => [
  ]
  :headers       => {
    "Connection"       => "close"
    "Content-Type"     => "application/xml"
    "Date"             => "Sat, 25 Jun 2016 18:54:24 GMT"
    "Server"           => "AmazonS3"
    "x-amz-id-2"       => "+R3ViRJ1lEg="
    "x-amz-request-id" => "0FF1DCFB"
  }
  :host          => "s3.amazonaws.com"
  :local_address => "192.168.1.102"
  :local_port    => 23456
  :path          => "/logos/company/logo/48/amped-logo.png"
  :port          => 443
  :reason_phrase => "Forbidden"
  :remote_ip     => "xx.xx.xxx.xxx"
  :status        => 403
  :status_line   => "HTTP/1.1 403 Forbidden\r\n"

Вот мои правила CORS:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://localhost:3000</AllowedOrigin>
        <AllowedMethod>HEAD</AllowedMethod>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>DELETE</AllowedMethod>
        <ExposeHeader>ETag</ExposeHeader>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

Изменить 2

Наконец-то я решил эту проблему, как вы можете видеть здесь: AWS S3 403 Forbidden Error во вновь созданной встроенной политике IAM для нового пользователя IAM


person marcamillion    schedule 25.06.2016    source источник
comment
Возможный дубликат Мне нужен Пользователь Amazon S3 с полным доступом к одному сегменту   -  person Mark B    schedule 25.06.2016


Ответы (1)


Вам потребуется добавить разрешение getbucketlocation и listAllbuckets, чтобы разрешить доступ пользователя к консоли.

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListAllMyBuckets"
      ],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::myapp/*"
    }
  ]
}
person Shibashis    schedule 25.06.2016
comment
Идеальный. Итак, я думаю, я не могу ограничить список всех ведер? В идеале мне бы хотелось, чтобы он просто показывал 1 ведро, которое я хочу, чтобы они видели. Но разве это невозможно? - person marcamillion; 25.06.2016
comment
Нет никакого способа обойти это. Для доступа через консоль это необходимо. - person Shibashis; 25.06.2016
comment
Ох, хорошо. Спасибо большое. - person marcamillion; 25.06.2016
comment
Когда я попытался просмотреть корзину myapp, я получил сообщение "Извините, у вас нет прав для просмотра этой корзины". Что может быть причиной этого? - person marcamillion; 25.06.2016
comment
Измените ресурс ListBucket с этого: "Resource": "arn:aws:s3:::myapp/*", который недопустимо пытается предоставить доступ к ListBucket для объектов внутри корзины, на этот "Resource": "arn:aws:s3:::myapp", который предоставляет доступ к ListBucket для рассматриваемой корзины. - person Mark B; 25.06.2016
comment
Также AWS задокументировал это: blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/ - person Mark B; 25.06.2016
comment
Я использовал именно эту политику (вторую) из сообщения в блоге AWS, на которое ссылался @MarkB. Когда я нахожусь в консоли, я вижу папки и могу перейти туда, куда, как я ожидаю, смогу перейти. Но когда я пытаюсь загрузить файл в одну из своих папок, я получаю эту ошибку: Excon::Errors::Forbidden - Expected(200) <=> Actual(403 Forbidden) excon.error.response. Я подозреваю, что это политика, но я не совсем уверен. Что может быть причиной этого? - person marcamillion; 25.06.2016
comment
для загрузки требуется разрешение putobject. - person Shibashis; 25.06.2016
comment
У меня есть разрешение PutObject. Но проблема в том, что когда я перехожу к просмотру URL-адреса изображения, я также вижу сообщение об ошибке 403. - person marcamillion; 25.06.2016
comment
какое текущее разрешение? - person Shibashis; 25.06.2016
comment
@Shibashis Я обновил свой вопрос, добавив более подробную информацию о текущей политике IAM, правилах CORS и сообщении об ошибке. Это относится к вашему вопросу? Не уверен, что я понимаю это иначе. - person marcamillion; 26.06.2016
comment
Неважно. Я понял это, как можно увидеть здесь: stackoverflow.com/questions/38035583/ - person marcamillion; 26.06.2016