Как ограничить доступ к корзине S3 конкретным VPC, одновременно разрешая доступ к консоли - PullRequest
0 голосов
/ 18 января 2019

Я настраиваю набор блоков S3 и хочу ограничить доступ к ним для VPC, но при этом разрешить доступ к сегментам из консоли AWS.

Как предложено здесь Я создал конечную точку S3, а также добавил ее в основную таблицу маршрутизации. Политика конечной точки разрешает полный доступ ко всем ресурсам.

Я создал политику S3 (см. Ниже) и добавил ее в корзину. Как только я сохраню политику, доступ к корзине из консоли больше не будет возможен.

Я также пытался специально добавить пользователя к условию "StringNotEquals" в форме "aws: имя пользователя": "user1", но безрезультатно.

{
"Version": "2012-10-17",
"Id": "Policy-S3-Bucket-myBucket",
"Statement": [

    {
        "Sid": "Access-via-VPC-only",
        "Principal": "*",
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::myBucket",
            "arn:aws:s3:::myBucket/*"
        ],
        "Condition": {
            "StringNotEquals": {
                "aws:sourceVpc": "vpc-01c9d66c12345"
            }
        }
    },
    {
        "Sid": "Allow-console-access",
        "Action": [
          "s3:*"
        ],
        "Effect": "Allow",
        "Resource": [
          "arn:aws:s3:::myBucket",
          "arn:aws:s3:::myBucket/*"
      ],
        "Principal": {
          "AWS": [
            "arn:aws:iam::<account-id>:user/user1", "arn:aws:iam::<account-id>:user/user2"
          ]
        }
      }
]
}

Ожидаемым результатом будет то, что корзина S3 доступна только вышеупомянутому VPC и через консоль AWS.

Фактический результат:

В обзоре сегмента отображается сообщение «Ошибка: доступ запрещен», а на странице разрешений (настройки общедоступного доступа) показано: «У вас нет доступа для просмотра этой конфигурации. Обратитесь к администратору своей учетной записи для запроса доступа».

Я должен войти в систему, используя пользователя root, и удалить политику, чтобы восстановить доступ к корзине.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Хитрость заключается в том, чтобы отрицать все, кроме того, что это исходит от пользователя или от VPC, но должно быть в том же состоянии. Политики работают так, что правила Deny предшествуют всем остальным правилам, поэтому, если вы откажетесь, вы не сможете разрешить последующее правило; это уже отрицается и все.

Кстати, aws: userid пользователя root является идентификатором учетной записи. Вероятно, плохая практика использовать этого пользователя, ну да ладно: P

Таким образом, моя корзина теперь принимает трафик только от VPC и от пользователя, к которому я подключаюсь через веб-консоль AWS (поэтому я не получаю сообщения об отказе в доступе в веб-консоли)

{
"Version": "2012-10-17",
"Id": "Policy154336817545456388",
"Statement": [
    {
        "Sid": "Block-if-not-from-VPC-or-Me",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket-name",
            "arn:aws:s3:::bucket-name/*"
        ],
        "Condition": {
            "StringNotEquals": {
                "aws:SourceVpce": "vpce-4598ujfjrhc",
                "aws:userid": "576767373466"
            }
        }
    }
    ]
}
0 голосов
/ 19 января 2019

Я нашел решение, которое, кажется, работает. Я проверил его в симуляторе политики, и он также работает правильно в реальной среде. Следующая политика делает трюк:

{
    "Version": "2012-10-17",
    "Id": "Policy-S3-Bucket-myBucket",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:username": ["user1", "user2"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::myBucket"],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-01c9d66c12345"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::myBucket"],
            "Condition": {
                "StringEquals": {
                    "aws:username": ["user1", "user2"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": ["arn:aws:s3:::myBucket/*"],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-01c9d66c12345"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": ["arn:aws:s3:::myBucket/*"],
            "Condition": {
                "StringEquals": {
                    "aws:username": ["user1", "user2"]
                }
            }
        }
    ]
}

Политика требует, чтобы строка sourceVpc ИЛИ имя пользователя соответствовало указанному в условии.

По общему признанию, политика является многословной и имеет значительное количество тиражирования. Если у кого-то есть идея решить эту проблему более эффективно, я весь в ушах.

...