AWS Identity and Access Management (IAM)
用户可使用 AWS 管理控制台 、AWS CLI 或通过 软件开发工具包和 API 从多个受支持的平台访问 AWS 服务和资源。IAM 可以帮助您安全地控制对 AWS 服务和资源的访问。
注意:如果您是账户所有者,则可以使用 Root 账户直接登录控制台。不过,我们建议您为每位用户创建个人 IAM 用户并使用个人凭证登录。
管理员必备操作
- 创建分组,附加相应权限;
- 创建用户,将用户加入分组以获得权限,禁止直接向用户附加权限;
- 设置密码策略,路径:IAM -> 账户设置。
主要概念
- 策略
- IAM 组
- IAM 用户(用于标识非 AWS 成员,如人类操作员、本地计算机等)
- IAM 角色(用于标识 AWS 成员,如各种 AWS services)
用户或系统经过身份验证后还必须经过授权才能访问 AWS 服务。要将权限分配给用户、组、角色或资源,你需要创建一个策略,即一份明确列出各项权限的文档。
策略
策略是描述权限的JSON格式文档,将被分配给用户、组或角色。
策略元素 http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html
IAM 组、用户
- DevOps组
- 用户 A
- 用户 B
- 测试开发组
- 用户 C
- 用户 D
安全设置:
- 定期修改 IAM User 的密码:https://console.aws.amazon.com/iam/home#/security_credentials
- Deactivate 不使用的 Endpoints:IAM -> Account settings -> Security Token Service (STS) -> Endpoints
相关文档:
http://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html
IAM 角色
您可以使用角色,向那些通常无法访问您 AWS 资源的用户、应用程序或服务委托访问权限。
- 一个 IAM 角色使用一个策略
- IAM 角色没有相关联的凭证
- IAM 用户、应用程序和服务可以扮演 IAM 角色
IAM 角色与用户类似,因为它是一种带有权限策略的 AWS 身份,其权限策略确定了改身份在 AWS 中能做什么、不能做什么。但是,角色可用于对其有需要的任何人,而不是只与某个人相关联。此外,角色也不与任何凭证(密码或访问密钥)相关联。相反,如果为用户分配了角色,那么系统会动态创建访问密钥并将其提供给该用户。
授权示例:应用程序对 AWS 资源的访问
托管在 EC2 实例上的应用程序需要与 S3 存储桶中存储的对象进行交互操作。
方案一:将访问密钥和秘密访问密钥嵌入到应用程序代码中,或嵌入应用程序支持的配置文件中。
AWS console -> IAM -> Users -> Choose one user
Choose Security credentials -> Create access key
编写应用程序代码
// 使用该方案,每次更改用户的凭证都要求更新代码。在很多情况下,这种方式不安全而且不可行。 $key = 'FAKE00JNM1WBTEHBUA'; $secret = 'fake00lRROGXZ1rkIoqO9dPqHb24Gk5JcI3bPgiv'; $s3 = new S3Client([ 'credentials' => array( 'key' => $key, 'secret' => $secret), 'version' => 'latest', 'region' => 'us-east-1' ]); try { // Upload the second object. $bucket = 'test-20191209'; $keyname = 'welcome.jpg'; $result = $s3->putObject([ 'Bucket' => $bucket, 'Key' => $keyname, 'SourceFile' => 'images/welcome-bg.jpg', 'ContentType' => 'image/jpeg', ]); echo $result['ObjectURL'] . PHP_EOL; } catch (S3Exception $e) { echo $e->getMessage() . PHP_EOL; }
方案二:将访问密钥和秘密访问密钥存放在 EC2 的指定路径。
在文本编辑器中,创建一个新文件。在此文件中,粘贴以下代码:
[default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY将 YOUR_AWS_ACCESS_KEY 替换为您的唯一 AWS 访问密钥 ID,并将 YOUR_AWS_SECRET_ACCESS_KEY 替换为您的唯一 AWS 秘密访问密钥。
如果您使用的是 Windows,将文件另存为 C:\Users\
.aws\credentials 如果您使用的是 Linux, macOS, or Unix,将文件另存为~/.aws/credentials 编写应用程序代码
// 使用该方案,每次更改用户的凭证都要求服务器管理员登录到 EC2 上修改 credentials 文件内容。在服务器很多时会非常不便,也不安全。 $s3 = new S3Client([ 'profile' => 'default', 'version' => 'latest', 'region' => 'us-east-1' ]);
方案三:创建一个 IAM 角色将临时安全凭证作为实例配置文件的一部分进行传递。
创建 Policy,命名为
AppInEC2AccessS3{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:*", "Resource": "*" } ] }创建 Role,命名为
AppInEC2Select type of trusted entity: AWS service
- Choose the service that will use this role: EC2
Choose one or more policies to attach to your new role:
AppInEC2AccessS3将 Role 附加到 EC2 上
Select the instance, choose Actions, Instance Settings, Attach/Replace IAM role
Attach
AppInEC2to this EC2编写应用程序代码
// Best practice $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]);
参考:
- 使用实例配置文件 http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html
- 适用于 Amazon EC2 的 IAM 角色 http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html
- http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials
- https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/best-practices.html
- https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/best-practices.html#use-roles-with-ec2
- https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html