#amazon-web-services #amazon-s3
#amazon-web-services #amazon-s3
Вопрос:
В настоящее время у меня есть политика корзины S3, которая разрешает ПОЛУЧИТЬ доступ ТОЛЬКО в том случае, если пользовательский агент соответствует «ALLOW_USER_AGENT»
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-username-and-password-access",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"ForAllValues:StringNotEquals": {
"aws:UserAgent": [
"ALLOW_USER_AGENT"
]
}
}
}
}
Я хочу изменить эту политику, чтобы она позволяла ПОЛУЧАТЬ доступ, если пользовательский агент соответствует «ALLOW_USER_AGENT» ИЛИ если исходный IP-адрес равен 11.11.11.11
Вот мой первый взгляд на эту политику. Правильная ли это политика? Я хочу разрешить ПОЛУЧИТЬ доступ, если 1 из этих 2 утверждений верны (не оба)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-username-and-password-access",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"ForAllValues:StringNotEquals": {
"aws:UserAgent": [
"ALLOW_USER_AGENT"
]
}
}
},
{
"Sid": "SourceIP",
"Action": "s3:GetObject",
"Effect": "Deny",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"11.11.11.11/32",
]
},
"Principal": {
"AWS": "*"
}
}
]
}
Комментарии:
1.
Deny
политик лучше избегать, поскольку они всегда переопределяют anAllow
. Наличие двух политик запрета, которые проверяют отдельные вещи, означает, что доступ будет разрешен только в том случае, если обе политики не применяются. Вместо того, чтобы использоватьDeny
политики, можете ли вы придумать способ предоставления доступа с помощьюAllow
политик?
Ответ №1:
В соответствии с вашими запросами правила разрешения / запрета должны быть:
- C1 (условие 1): aws:UserAgent = ALLOW_USER_AGENT
- C2 (условие 2): aws:sourceIP = 11.11.11.11 /32
Соответствующая политика корзины будет:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "deny-if-both-conditions-are-true",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"ForAnyValue:StringEquals": {
"aws:UserAgent": "ALLOW_USER_AGENT"
},
"IpAddress": {
"aws:SourceIp": "11.11.11.11/32"
}
}
},
{
"Sid": "deny-if-neither-conditions-are-met",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "11.11.11.11/32"
},
"ForAnyValue:StringNotEquals": {
"aws:UserAgent": "ALLOW_USER_AGENT"
}
}
}
]
}
Я протестировал эту политику и работает, как ожидалось. Кроме того, я обновил оператор «ForAllValues» на «ForAnyValue».
Используйте команду curl с параметром «-A», чтобы установить любой пользовательский агент.
Ссылка: