我在Amazon S3中有一个存储桶,我将数据设置为只读给大家.但是,这不是我想要的.我希望这些数据只能从我的移动应用程序访问,并限制它通过url下载.
那可能吗?如果是这样,如何实施这样的桶策略?
我正在尝试使用 boto3 将供应商 S3 存储桶中的文件传输到我的 S3 存储桶。我正在使用 sts 服务来承担访问供应商 s3 存储桶的角色。我能够连接到供应商存储桶并获得存储桶的列表。CopyObject operation: Access Denied复制到我的存储桶时遇到错误。这是我的脚本
session = boto3.session.Session(profile_name="s3_transfer")
sts_client = session.client("sts", verify=False)
assumed_role_object = sts_client.assume_role(
RoleArn="arn:aws:iam::<accountid>:role/assumedrole",
RoleSessionName="transfer_session",
ExternalId="<ID>",
DurationSeconds=18000,
)
creds = assumed_role_object["Credentials"]
src_s3 = boto3.client(
"s3",
aws_access_key_id=creds["AccessKeyId"],
aws_secret_access_key=creds["SecretAccessKey"],
aws_session_token=creds["SessionToken"],
verify=False,
)
paginator =src_s3.get_paginator("list_objects_v2")
# testing with just 2 items.
# TODO: Remove MaxItems once script works.
pages = paginator.paginate(
Bucket="ven_bucket", Prefix="client", PaginationConfig={"MaxItems": 2, "PageSize": 1000}
)
dest_s3 = session.client("s3", verify=False)
for page in pages:
for obj in page["Contents"]: …Run Code Online (Sandbox Code Playgroud) 我使用了
AWSSecurityTokenServiceClient sts_client = new AWSSecurityTokenServiceClient(),
Run Code Online (Sandbox Code Playgroud)
并且自动设置了默认区域(全局)。但是此构造函数已弃用,建议使用:
AWSSecurityTokenServiceClientBuilder.
Run Code Online (Sandbox Code Playgroud)
我也希望它使用默认区域。我写:
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCredentials)).build();
Run Code Online (Sandbox Code Playgroud)
但我有一个例外:
com.amazonaws.SdkClientException: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.
at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.java:371)
at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.java:337)
at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
at co.softimize.STSManager.<init>(STSManager.java:31)
at co.softimize.sts.STSManagerTests.setup(STSManagerTests.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) …Run Code Online (Sandbox Code Playgroud) 当调用AssumeRole时,我们可以设置从900秒(15分钟)到最大3600秒(1小时)的时间。默认值为 1 小时。这能超过1个小时吗?比如12小时?
我想这是可能的,但我还没有找到任何明确的信息说这是真的。
从 AssumeRole 接收到 Credentials 对象时,过期时间是 UTC 时间吗?
我对 STS 的用例和优点感到困惑。根据文档,它是临时获取一个角色来执行 AWS 中 IAM 用户或服务无法执行的任务。请注意,我说的是编程访问(不是控制台访问)
例如,IAM 用户可能没有 S3 权限。据我的理解:
他可以通过联系AWS STS来获取临时访问密钥/令牌,并获取S3的访问密钥和秘密。
有了这些临时凭证,他就可以访问 S3。
我的问题是:
要从 AWS STS 获取临时凭证,他仍然需要现有的访问令牌(永久)和秘密,对吧?
如果他现有的访问令牌和秘密被泄露,攻击者仍然可以使用它首先从 STS 获取临时凭证,然后访问 S3,对吧?据我所知,攻击者将无法使用他的永久访问令牌和秘密直接访问 S3。
我正在尝试了解其正确的用例。我知道我很困惑,但也许我在循环思考。
提前致谢。
我正在通过 AWS Security Token Service (AWS STS) 创建临时凭证。并使用这些凭据将文件从 S3 JAVA SDK 上传到 S3。我需要一些方法来限制文件上传的大小。我试图在创建用户时添加策略(s3:content-length-range),但这似乎不起作用。有没有其他方法可以指定用户可以上传的最大文件大小??
我正在开发一个基于 API 网关/Lambda 的项目。请求流程如下:
sts.assumeRole()并成功生成accessKeyIdandsecretAccessKeyaccessKeyId/secretAccessKey尝试访问 S3 存储桶中的项目除了最后一步之外,该过程的每一步都正常工作(通过控制台日志确认)。当我尝试使用生成的凭据时,收到以下错误消息:
{
"message": "The AWS Access Key Id you provided does not exist in our records.",
"code": "InvalidAccessKeyId",
"region": null,
"time": "2019-07-19T22:05:05.817Z",
"requestId": "...",
"extendedRequestId": "...",
"statusCode": 403,
"retryable": false,
"retryDelay": 68.28400384749038
}
Run Code Online (Sandbox Code Playgroud)
我知道这强烈暗示 STS 有一些我不明白的东西,但我一直无法弄清楚是什么。(例如,当授权者 lambda 完成运行时,AWS 是否会取消分配生成的角色?)
为什么 AWS 会拒绝新生成的凭证对并报告此错误消息?
aws-sts ×8
amazon-s3 ×3
amazon-iam ×1
aws-cli ×1
aws-lambda ×1
aws-sdk ×1
boto3 ×1
python-3.x ×1