如何将 IP 限制添加到已经具有用户限制的 s3 存储桶(在存储桶策略中)
How can I add IP restrictions to s3 bucket(in the bucket Policy) already having a User restriction
我有几个 s3 存储桶,我只授予特定 IAM 用户访问权限。我通过设置以下存储桶策略来做到这一点:
Effect : "Deny"
NotPrincipal : { "AWS " : "<My_IAM_User>" }
我只能从 IAM 用户访问存储桶,因此该策略按预期工作,但我还想将存储桶访问限制为仅特定 IP。此 IP 是我的服务器 运行 所在的 ec2 IP 地址。我使用的策略值是:
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"<My_EC2_Server_IP_Address>"
]
}
}
我原以为上述策略只允许我的 EC2 服务器访问 s3 存储桶对象,但如果我从任何其他 IP 进行调用(例如:运行 我本地计算机上的服务器并尝试访问存储桶。)它仍然使用存储桶中的有效对象进行响应。
上述策略似乎并未阻止任何来自其他随机 IP 地址的访问存储桶的请求。
我的整个存储桶策略如下所示:
{
"Version": "<Version_value>",
"Statement": [
{
"Sid": "<Sid_value>",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "<My_IAM_User>"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<My_Bucket_name>/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "<My_EC2_Server_IP_Address>"
}
}
}
]
}
我的参考资料:
1. https://aws.amazon.com/premiumsupport/knowledge-center/block-s3-traffic-vpc-ip/
2. https://medium.com/@devopslearning/100-days-of-devops-day-11-restricting-s3-bucket-access-to-specific-ip-addresses-a46c659b30e2
如果您打算拒绝给定 IAM 用户以外的所有 AWS 凭证并拒绝给定 IP 以外的所有 IP 地址,那么我会将该策略编写为两个独立的拒绝语句。
像这样:
{
"Version": "<Version_value>",
"Statement": [
{
"Sid": "deny1",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "<My_IAM_User>"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<My_Bucket_name>/*"
},
{
"Sid": "deny2",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<My_Bucket_name>/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "<My_EC2_Server_IP_Address>"
}
}
}
]
}
注意 IP 地址条件。除非您使用的是弹性 IP,否则您的 EC2 实例的 IP 可能会发生变化,例如如果你停止然后重新启动实例。
另请注意:您不应在 EC2 实例上使用 IAM 用户凭据。相反,您应该使用 IAM 角色。
我有几个 s3 存储桶,我只授予特定 IAM 用户访问权限。我通过设置以下存储桶策略来做到这一点:
Effect : "Deny"
NotPrincipal : { "AWS " : "<My_IAM_User>" }
我只能从 IAM 用户访问存储桶,因此该策略按预期工作,但我还想将存储桶访问限制为仅特定 IP。此 IP 是我的服务器 运行 所在的 ec2 IP 地址。我使用的策略值是:
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"<My_EC2_Server_IP_Address>"
]
}
}
我原以为上述策略只允许我的 EC2 服务器访问 s3 存储桶对象,但如果我从任何其他 IP 进行调用(例如:运行 我本地计算机上的服务器并尝试访问存储桶。)它仍然使用存储桶中的有效对象进行响应。 上述策略似乎并未阻止任何来自其他随机 IP 地址的访问存储桶的请求。
我的整个存储桶策略如下所示:
{
"Version": "<Version_value>",
"Statement": [
{
"Sid": "<Sid_value>",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "<My_IAM_User>"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<My_Bucket_name>/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "<My_EC2_Server_IP_Address>"
}
}
}
]
}
我的参考资料: 1. https://aws.amazon.com/premiumsupport/knowledge-center/block-s3-traffic-vpc-ip/ 2. https://medium.com/@devopslearning/100-days-of-devops-day-11-restricting-s3-bucket-access-to-specific-ip-addresses-a46c659b30e2
如果您打算拒绝给定 IAM 用户以外的所有 AWS 凭证并拒绝给定 IP 以外的所有 IP 地址,那么我会将该策略编写为两个独立的拒绝语句。
像这样:
{
"Version": "<Version_value>",
"Statement": [
{
"Sid": "deny1",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "<My_IAM_User>"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<My_Bucket_name>/*"
},
{
"Sid": "deny2",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<My_Bucket_name>/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "<My_EC2_Server_IP_Address>"
}
}
}
]
}
注意 IP 地址条件。除非您使用的是弹性 IP,否则您的 EC2 实例的 IP 可能会发生变化,例如如果你停止然后重新启动实例。
另请注意:您不应在 EC2 实例上使用 IAM 用户凭据。相反,您应该使用 IAM 角色。