我想为特定用户添加S3权限。 AWS控制台正在向我询问用户的Canonical ID。
我使用AWS CLI命令aws iam list-users
来检索用户列表,但没有“Canonical ID”字段,并且无法识别“User ID”,这给我一个“Invalid ID”消息。我也尝试过使用ARN,但它没有用。
答案 0 :(得分:13)
要向存储桶上的IAM用户授予权限,您需要创建存储桶策略 - 这是一个JSON文档。 ACL中的“访问其他AWS账户”选项用于授予对其他(完全独立的)根AWS账户的访问权限,而不是授予您自己的root账户中IAM用户的访问权限。
要访问存储桶策略,请浏览到S3 Web控制台中的存储桶。在那里,您将看到概述/属性/权限/管理选项卡。在权限下,有一个名为“Bucket Policy”的子选项卡。在Bucket Policy页面的底部有一个指向“Policy Generator”的链接,它将为您生成JSON。 (或直接链接是http://awspolicygen.s3.amazonaws.com/policygen.html)
要识别您要授予其权限的IAM用户,您将使用ARN(亚马逊资源名称)。 IAM用户的ARN格式如下:“arn:aws:iam :: {Account-ID}:user / {Username}”(注意花括号不是格式的一部分)。 IAM ARN的示例如下所示: arn:aws:iam :: 100123456789:user / Daniel
要获取您的数字帐户ID,请以root用户身份登录并单击页面右上角的用户名,然后选择“我的帐户”(将您带到https://console.aws.amazon.com/billing/home?#/account)。帐户ID列在页面顶部的“帐户设置”下。
将用户ARN插入策略生成器的“Principal”字段,并从下拉列表中选择要授予用户的操作。
要为存储桶中的存储桶或一组文件(对象)授予权限,您需要在“Amazon资源名称”字段中输入标识存储桶的ARN或存储桶中的某些对象子集(例如,如果我有一个名为 daniels-stuff 的存储桶以及该存储区中名为 images 的文件夹,我想授予其访问权限,那么我可以提供一个ARN,例如 arn :AWS:S3 :::丹尼尔斯-东西/图像/ * 强>
在输入必要信息后点击“添加声明”,然后点击“生成政策”。请注意,您可以将多个语句(访问权限分配)放入一个策略中。
最后,对https://brandonwamboldt.ca/understanding-s3-permissions-1662/的s3存储桶策略有一个很好的入门,其中包含一些示例策略。
祝你好运(虽然我认为你现在可能已经解决了你的问题,其他人可能会觉得这很有用)。答案 1 :(得分:9)
您可以使用两种解决方案授予此用户访问Amazon S3存储桶和内容的权限
{
"Version": "2012-10-17",
"Id": "9758b97b-6fe0-4ba3-b5bd-3d0fe8896a83",
"Statement": [
{
"Sid": "AllowMyUser",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR bucket name /*"
}
]
}
{
"Version": "2012-10-17",
"Id": "9758b97b-6fe0-4ba3-b5bd-3d0fe8896a83",
"Statement": [{
"Sid": "AllowMyUser",
"Effect": "Allow",
"Principal": {
"AWS": "YOUR IAM User AWSId"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR bucket name /*"
}]
}
AWS CLI iam user返回可在S3中使用API documentation个状态的UserId
例如,您可以创建名为David的IAM用户。您的公司使用Amazon S3,每个员工都有一个带文件夹的存储桶;存储桶具有基于资源的策略(存储桶策略),允许用户仅访问存储桶中自己的文件夹。假设名为David的员工离开您的公司并删除相应的IAM用户。但后来另一位名叫David的员工开始创建一个名为David的新IAM用户。如果存储桶策略指定名为David的IAM用户,则该策略最终可能会授予新David访问前David所留下的Amazon S3存储桶中的信息。
https://docs.aws.amazon.com/IAM/latest/APIReference/API_User.html
答案 2 :(得分:3)
用户的规范ID最容易通过调用来查找,因为要查找其ID的用户是aws s3api list-buckets:
aws --profile PROD s3api list-buckets
{
"Owner": {
"DisplayName": "a-display-name",
"ID": "a-64?-char-hex-string" <<-- this HERE is the canonical user ID
},
"Buckets": [
{
"CreationDate": "2018-03-28T21:50:56.000Z",
"Name": "bucket-1"
},
{
"CreationDate": "2018-03-22T14:08:48.000Z",
"Name": "bucket-2"
}
]
}
使用此ID,您可以调用s3api来授予访问权限 - 例如,提供读取权限 - 如下所示:
aws --profile OTHER s3api put-object-acl \
--bucket bucket-3 \
--key path/to/file \
--grant-read id="the-64-char-hex"
答案 3 :(得分:3)
要获取规范ID,最简单的方法之一是使用CLI并运行aws s3api list-buckets
命令。您将在输出中获得ID。
还有其他获取规范ID的方法,并且在aws文档中有明确说明:https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html
列表桶AWS文档:https://docs.aws.amazon.com/cli/latest/reference/s3api/list-buckets.html
答案 4 :(得分:1)
1。使用以下JSON创建新策略
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:scoped_model/scoped_model.dart';
class UserModel extends Model {
bool _isLoading = true;
bool get isLoading => _isLoading;
String _name;
String get name => _name;
String _avatarUrl;
String get avatarUrl => _avatarUrl;
Timestamp _creationDate;
Timestamp get creationDate => _creationDate;
List _myGroups;
List get myGroups => _myGroups;
// Get the ID of the currently logged in user
Future<String> loadUserId() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
return user != null ? user.uid.toString() : null;
}
// Load user data
Future loadData() async {
// Set model to loading
_isLoading = true;
// Notify listeners
notifyListeners();
DocumentReference reference =
Firestore.instance.collection('users').document(await loadUserId());
DocumentSnapshot snapshot = await reference.get();
_name = await snapshot['nickname'];
_avatarUrl = await snapshot['avatarUrl'];
_creationDate = await snapshot['timestamp'];
_myGroups = await snapshot['myGroups'];
// Set loading to false = data is loaded
_isLoading = false;
// Notify listeners. Data is ready
notifyListeners();
}
}
** 2。将策略分配给用户或用户组
注意:
我一直遇到{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::<your_bucket_name_here>"
},
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::<your_bucket_name_here>/*"
}
]
}
错误,因为我缺少上面的JSON数组中的前2个对象。您必须授予用户权限:
在完全没有机会对存储桶内容执行任何操作之前。
答案 5 :(得分:1)
如何在AWS中查看规范ID。
在顶部,单击您的用户帐户下拉框。 单击我的安全证书。 在控制台中单击帐户标识符 请不要分享您的凭据信息。 To view the Canonical ID in AWS
Pala(VR.PL)
答案 6 :(得分:0)
请确保在行末使用*
来授予所有权限!
arn:aws:s3:::daniels-stuff/images/*
答案 7 :(得分:0)
您还可以从CLI命令获取IAM用户的规范ID:
列出所有存储桶和您的iam Canonical ID:
aws s3api list-buckets
如果您只想获取您的规范ID:
aws s3api list-buckets | grep ID
请记住,以上命令是通过CLI完成的,您应该已经在CLI中进行了设置。
答案 8 :(得分:0)
要找到帐户的规范ID,请执行以下步骤:
答案 9 :(得分:0)
将此粘贴到终端机
aws s3api list-buckets --query "Owner.ID"
答案 10 :(得分:-3)
如果您不是ROOT用户,还有另一种方法可以找到您的规范名称,
您需要使用CLI(使用访问密钥和密钥)进行日志记录,然后输入
aws iam list-users
它将显示以下信息
{
"Users": [
{
"UserName": "yoda",
"PasswordLastUsed": "2018-02-24T17:47:15Z",
"CreateDate": "2018-02-11T02:23:11Z",
"UserId": "AIDASDY9WSX6QD", <== Canonical Name
"Path": "/",
"Arn": "arn:aws:iam::7783412456453:user/yoda"
}
]
注意:编辑了用户ID和ARN原件: - )
我希望这会有所帮助
理学