Amazon CloudTrail 基于身份的策略示例
预设情况下,IAM 用户和角色没有创建或修改 CloudTrail 资源的权限。它们还无法使用 Amazon Web Services Management Console、Amazon CLI 或 Amazon API 执行任务。IAM 管理员必须创建 IAM 策略,以便为用户和角色授予权限以对所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户、组或角色。
要了解如何使用这些示例 JSON 策略文档创建 IAM 基于身份的策略,请参阅 IAM 用户指南 中的在 JSON 选项卡上创建策略。
主题
策略最佳实践
基于身份的策略非常强大。它们确定某个人是否可以创建、访问或删除您账户中的 CloudTrail 资源。这些操作可能会使 Amazon Web Services 账户 产生成本。创建或编辑基于身份的策略时,请遵循以下准则和建议:
-
开始使用 Amazon 托管策略 – 为了快速地开始使用 CloudTrail,请使用 Amazon 托管策略,为您的员工提供他们所需的权限。这些策略已在您的账户中提供,并由 Amazon 维护和更新。有关更多信息,请参阅 IAM 用户指南中的开始使用 Amazon 托管式策略中的权限。
-
授予最低权限 – 创建自定义策略时,仅授予执行任务所需的许可。最开始只授予最低权限,然后根据需要授予其它权限。这样做比起一开始就授予过于宽松的权限而后再尝试收紧权限来说更为安全。有关更多信息,请参阅 IAM 用户指南 中的授予最低权限。
-
为敏感操作启用 MFA – 为增强安全性,要求 IAM 用户使用多重身份验证 (MFA) 来访问敏感资源或 API 操作。要了解更多信息,请参阅《IAM 用户指南》中的在 Amazon 中使用多重身份验证 (MFA)。
-
使用策略条件来增强安全性 – 在切实可行的范围内,定义基于身份的策略在哪些情况下允许访问资源。例如,您可编写条件来指定请求必须来自允许的 IP 地址范围。您也可以编写条件,以便仅允许指定日期或时间范围内的请求,或者要求使用 SSL 或 MFA。有关更多信息,请参阅 IAM 用户指南中的 IAM JSON 策略元素:条件。
CloudTrail 没有可在策略语句的 Condition
元素中使用的服务特定上下文键。
示例:允许和拒绝针对指定跟踪的操作
以下示例演示了一个策略,该策略允许具有此策略的用户查看跟踪的状态和配置,并为名为 my-First-Trail
的跟踪启动和停止日志记录。此跟踪在 ID 为 123456789012
的 Amazon 账户的美国东部(俄亥俄)区域(其主区域)中创建。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudtrail:StartLogging", "cloudtrail:StopLogging", "cloudtrail:GetTrail", "cloudtrail:GetTrailStatus", "cloudtrail:GetEventSelectors" ], "Resource": [ "arn:aws:cloudtrail:
us-east-2
:123456789012
:trail/My-First-Trail
" ] } ] }
下面的示例中演示的策略明确地拒绝对任何名称不为 My-First-Trail
的跟踪执行 CloudTrail 操作。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "cloudtrail:*" ], "NotResource": [ "arn:aws:cloudtrail:us-east-2:123456789012:trail/
My-First-Trail
" ] } ] }
示例:对针对特定跟踪记录的操作创建和应用策略
您可以使用权限和策略来控制用户对 CloudTrail 跟踪记录执行特定操作的能力。
例如,您不想贵公司的开发人员组中的用户开始或停止对特定跟踪的日志记录,但想对他们授予权限以对该跟踪执行 DescribeTrails
和 GetTrailStatus
操作。您希望开发人员组的用户能够对自己管理的跟踪记录执行 StartLogging
或 StopLogging
操作。
您可以创建两条策略语句,然后将它们附加到您在 IAM 中创建的开发人员组。有关 IAM 中的组的更多信息,请参阅 IAM 用户指南中的 IAM 组。
在第一条策略中,您拒绝对您指定的跟踪 ARN 执行 StartLogging
和 StopLogging
操作。在下面的示例中,跟踪 ARN 为 arn:aws:cloudtrail:us-east-2:123456789012:trail/Example-Trail
。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1446057698000", "Effect": "Deny", "Action": [ "cloudtrail:StartLogging", "cloudtrail:StopLogging" ], "Resource": [ "arn:aws:cloudtrail:us-east-2:123456789012:trail/Example-Trail" ] } ] }
在第二条策略中,允许对所有 CloudTrail 资源执行 DescribeTrails
和 GetTrailStatus
操作:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1446072643000", "Effect": "Allow", "Action": [ "cloudtrail:DescribeTrails", "cloudtrail:GetTrail", "cloudtrail:GetTrailStatus" ], "Resource": [ "*" ] } ] }
如果开发人员组中的用户尝试针对您在第一条策略中指定的跟踪启动或停止日志记录,该用户会收到拒绝访问异常。该开发人员组中的用户可针对自己创建和管理的跟踪记录启动和停止日志记录。
以下 CLI 示例显示已在名为 Amazon CLI 的 devgroup
配置文件中配置开发人员组。首先,devgroup
的用户运行 describe-trails
命令。
$ aws --profile devgroup cloudtrail describe-trails
该命令成功完成:
{ "trailList": [ { "IncludeGlobalServiceEvents": true, "Name": "Default", "TrailARN": "arn:aws:cloudtrail:us-east-2:123456789012:trail/Example-Trail", "IsMultiRegionTrail": false, "S3BucketName": "myS3bucket ", "HomeRegion": "us-east-2" } ] }
然后,该用户针对您在第一条策略中指定的跟踪运行 get-trail-status
命令。
$ aws --profile devgroup cloudtrail get-trail-status --name Example-Trail
该命令成功完成:
{ "LatestDeliveryTime": 1449517556.256, "LatestDeliveryAttemptTime": "2015-12-07T19:45:56Z", "LatestNotificationAttemptSucceeded": "", "LatestDeliveryAttemptSucceeded": "2015-12-07T19:45:56Z", "IsLogging": true, "TimeLoggingStarted": "2015-12-07T19:36:27Z", "StartLoggingTime": 1449516987.685, "StopLoggingTime": 1449516977.332, "LatestNotificationAttemptTime": "", "TimeLoggingStopped": "2015-12-07T19:36:17Z" }
接下来,一位 devgroup
用户针对同一个跟踪运行 stop-logging
命令。
$ aws --profile devgroup cloudtrail stop-logging --name Example-Trail
该命令返回拒绝访问异常:
A client error (AccessDeniedException) occurred when calling the StopLogging operation: Unknown
该用户针对同一个跟踪运行 start-logging
命令。
$ aws --profile devgroup cloudtrail start-logging --name Example-Trail
该命令返回拒绝访问异常:
A client error (AccessDeniedException) occurred when calling the StartLogging operation: Unknown
示例:拒绝基于标签创建或删除事件数据存储的访问权限
当事件数据存储没有应用 stage
标签密钥,或者如果 stage
标签值不是 alpha
、beta
、gamma
,或者 prod
阶段之一,以下策略示例将拒绝(使用 CreateEventDataStore
操作)创建事件数据存储的权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "cloudtrail:CreateEventDataStore", "Resource": "*", "Condition": { "Null": { "aws:RequestTag/stage": "true" } } }, { "Effect": "Deny", "Action": "cloudtrail:CreateEventDataStore", "Resource": "*", "Condition": { "ForAnyValue:StringNotEquals": { "aws:RequestTag/stage": [ "alpha", "beta", "gamma", "prod" ] } } } ] }
如果事件数据存储应用了 stage
标签且值为 prod
,以下策略示例将明确拒绝(使用 DeleteEventDataStore
操作)删除事件数据存储的权限。类似的策略可以帮助保护事件数据存储免遭意外删除。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "cloudtrail:DeleteEventDataStore", "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/stage": "prod" } } } ] }
授予使用 CloudTrail 控制台的权限
授予 CloudTrail 管理权限
要允许用户管理 CloudTrail 跟踪,您必须向 IAM 用户授予显式权限以使其能够执行与 CloudTrail 任务关联的操作。在大多数情况下,您可以使用包含预定义权限的 Amazon 托管策略来执行此操作。
您向用户授予的执行 CloudTrail 管理任务的权限不同于 CloudTrail 本身将日志文件传输到 Simple Storage Service(Amazon S3)存储桶或将通知发送到 Amazon SNS 主题所需的权限。有关这些权限的更多信息,请参阅针对 CloudTrail 的 Amazon S3 存储桶策略。
如果您配置与 Amazon CloudWatch Logs 的集成,则 CloudTrail 还需要一个角色,可通过代入此角色来将事件传送到 Amazon CloudWatch Logs 日志组。这将需要额外的权限以创建角色以及角色本身。有关更多信息,请参阅 授予在 CloudTrail 控制台上查看和配置 Amazon CloudWatch Logs 信息的权限 和 将事件发送到 CloudWatch Logs。
一种典型方法是创建具有适当权限的 IAM 组,然后将单个 IAM 用户添加到该组。例如,您可以为应具有 CloudTrail 操作的完全访问权的用户创建 IAM 组,并为应能够查看跟踪记录信息而不是创建或更改跟踪记录的用户创建单独的组。
创建 IAM 组和用户以进行 CloudTrail 访问
-
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam
。 -
在控制面板的导航窗格中,选择 Groups,然后选择 Create New Group。
-
键入名称,然后选择 Next Step。
-
在 Attach Policy(附加策略)页面上,找到并选择适用于 CloudTrail 的下列策略这一:
-
AWSCloudTrail_FullAccess。此策略使该组中的用户可以完全访问 CloudTrail 操作。这些用户有权管理(但不能删除)Simple Storage Service(Amazon S3)存储桶、CloudWatch Logs 的日志组以及跟踪的 Amazon SNS 主题。
注意 未打算跨您的 Amazon 账户广泛共享 AWSCloudTrail_FullAccess 策略。拥有此角色的用户能够禁用或重新配置他们的 Amazon 账户中最敏感且最重要的审计功能。因此,此策略应仅应用于账户管理员,并且此策略的使用应受到密切控制和监控。
-
AWSCloudTrailReadOnlyAccess。此策略可让组中的用户查看 CloudTrail 控制台,包括近期事件和事件历史记录。这些用户还可以查看现有跟踪记录及其存储桶。用户可以下载事件历史记录文件,但无法创建或更新跟踪记录。
注意 您还可创建用于授予单个操作的权限的自定义策略。有关更多信息,请参阅 向 CloudTrail 用户授予自定义权限。
-
-
选择 Next step(下一步)。
-
查看您即将创建的组的信息。
注意 您可以编辑组名,但需要再次选择策略。
-
选择创建组。已创建的组将显示在组列表中。
-
选择您创建的组名,选择 Group Actions(用户操作),然后选择 Add Users to Group(将用户添加到组)。
-
在 Add users to group(将用户添加到组)页面上,选择现有的 IAM 用户,然后选择 Add users(添加用户)。如果还没有 IAM 用户,请选择 Create new users(创建新用户),输入用户名,然后选择 Create(创建)。
-
如果创建了新用户,请在导航窗格中选择 Users,然后针对每个用户完成以下操作:
-
选择用户。
-
如果用户将使用控制台管理 CloudTrail,则在 Security credentials(安全凭证)选项卡中,选择 Manage password(管理密码),然后为用户创建密码。
-
如果用户将使用 CLI 或 API 管理 CloudTrail,并且如果您尚未创建访问密钥,则在 Security credentials(安全凭证)选项卡中,选择 Manage access keys(管理访问密钥),然后创建访问密钥。将密钥存储在安全位置。
-
为每个用户提供凭证(访问密钥或密码)。
-
其他资源
要了解有关创建 IAM 用户、组、策略和权限的更多信息,请参阅 IAM 用户指南中的使用控制台创建管理员组和权限与策略。
对于只需要调用 Amazon CLI 或 Amazon API 的用户,无需为其提供最低控制台权限。相反,只允许访问与您尝试执行的 API 操作相匹配的操作。
允许用户查看他们自己的权限
该示例说明了您如何创建策略,以允许 IAM 用户查看附加到其用户身份的内联和托管式策略。此策略包括在控制台上完成此操作或者以编程方式使用 Amazon CLI 或 Amazon API 所需的权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewOwnUserInfo", "Effect": "Allow", "Action": [ "iam:GetUserPolicy", "iam:ListGroupsForUser", "iam:ListAttachedUserPolicies", "iam:ListUserPolicies", "iam:GetUser" ], "Resource": ["arn:aws:iam::*:user/${aws:username}"] }, { "Sid": "NavigateInConsole", "Effect": "Allow", "Action": [ "iam:GetGroupPolicy", "iam:GetPolicyVersion", "iam:GetPolicy", "iam:ListAttachedGroupPolicies", "iam:ListGroupPolicies", "iam:ListPolicyVersions", "iam:ListPolicies", "iam:ListUsers" ], "Resource": "*" } ] }
向 CloudTrail 用户授予自定义权限
CloudTrail 策略向使用 CloudTrail 的用户授予权限。如果您需要向用户授予不同权限,可将 CloudTrail 策略挂载到 IAM 组或用户。您可以编辑策略,使之包括或排除特定权限。您还可以创建自己的自定义策略。策略是一些 JSON 文档,它们定义了允许用户执行的操作以及允许用户对哪些资源执行这些操作。有关特定示例,请参阅 示例:允许和拒绝针对指定跟踪的操作 和 示例:对针对特定跟踪记录的操作创建和应用策略。
目录
只读访问权限
以下示例展示了一个策略,该策略授予对 CloudTrail 跟踪记录的只读访问权。这等同于托管策略 AWSCloudTrailReadOnlyAccess。它对用户授予查看跟踪信息的权限,而不是创建或更新跟踪记录的权限。此策略还授予了读取 Simple Storage Service(Amazon S3)存储桶中的对象的权限,而不是创建或删除这些对象的权限。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetBucketLocation" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cloudtrail:DescribeTrails", "cloudtrail:GetTrail", "cloudtrail:GetTrailStatus", "cloudtrail:LookupEvents", "cloudtrail:ListPublicKeys", "cloudtrail:ListTags", "s3:ListAllMyBuckets", "kms:ListAliases", "lambda:ListFunctions" ], "Resource": "*" } ] }
在这些策略语句中,Effect
元素指定是允许还是拒绝操作。Action
元素列出了允许用户执行的特定操作。Resource
元素列出允许用户对其执行这些操作的 Amazon 资源。对于控制对 CloudTrail 操作的访问的策略,Resource
元素通常设置为 *
(一个表示“所有资源”的通配符)。
Action
元素中的值对应于服务支持的 API。操作前附加了 cloudtrail:
以表示其指的是 CloudTrail 操作。您可以在 *
元素中使用 Action
通配符,如以下示例所示:
-
"Action": ["cloudtrail:*Logging"]
这允许以“Logging”结尾的所有 CloudTrail 操作(
StartLogging
、StopLogging
)。 -
"Action": ["cloudtrail:*"]
这允许所有 CloudTrail 操作,但不允许其他 Amazon 服务的操作。
-
"Action": ["*"]
这将允许所有 Amazon 操作。此权限适合授予充当您账户的 Amazon 管理员的用户。
只读策略不对用户授予执行 CreateTrail
、UpdateTrail
、StartLogging
和 StopLogging
操作的权限。具有此策略的用户不能够创建跟踪记录、更新跟踪记录或启用和关闭日志记录。有关 CloudTrail 操作的完整列表,请参阅 Amazon CloudTrail API 参考。
完全访问权限
以下示例展示了一个授予对 CloudTrail 的完全访问权限的策略。这等同于托管策略 AWSCloudTrail_FullAccess。它对用户授予执行所有 CloudTrail 操作的权限。它还允许用户记录 Simple Storage Service(Amazon S3)和 Amazon Lambda 中的数据事件、管理 Simple Storage Service(Amazon S3)存储桶中的文件、管理 CloudWatch Logs 对 CloudTrail 日志事件的监控方式,以及管理与用户关联的账户中的 Amazon SNS 主题。
未打算跨您的 Amazon 账户广泛共享 AWSCloudTrail_FullAccess 策略或等效权限。拥有此角色或等同访问权限的用户能够禁用或重新配置他们的 Amazon 账户中最敏感且最重要的审计功能。因此,此策略应仅应用于账户管理员,并且此策略的使用应受到密切控制和监控。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sns:AddPermission", "sns:CreateTopic", "sns:SetTopicAttributes", "sns:GetTopicAttributes" ], "Resource": [ "arn:aws:sns:*:*:aws-cloudtrail-logs*" ] }, { "Effect": "Allow", "Action": [ "sns:ListTopics" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:CreateBucket", "s3:PutBucketPolicy" ], "Resource": [ "arn:aws:s3:::aws-cloudtrail-logs*" ] }, { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation", "s3:GetBucketPolicy" ], "Resource": "*" }, { "Effect": "Allow", "Action": "cloudtrail:*", "Resource": "*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup" ], "Resource": [ "arn:aws:logs:*:*:log-group:aws-cloudtrail-logs*" ] }, { "Effect": "Allow", "Action": [ "iam:ListRoles", "iam:GetRolePolicy", "iam:GetUser" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "*", "Condition": { "StringEquals": { "iam:PassedToService": "cloudtrail.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "kms:CreateKey", "kms:CreateAlias", "kms:ListKeys", "kms:ListAliases" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "lambda:ListFunctions" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "dynamodb:ListGlobalTables", "dynamodb:ListTables" ], "Resource": "*" } ] }
授予在 CloudTrail 控制台中查看 Amazon Config 信息的权限
您可以在 CloudTrail 控制台中查看事件信息,包括与该事件相关的资源。对于这些资源,您可以选择 Amazon Config 图标在 Amazon Config 控制台中查看资源的时间表。可将此策略挂载到您的用户,以对其授予只读 Amazon Config 访问权。该策略不对他们授予在 Amazon Config 中更改设置的权限。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "config:Get*", "config:Describe*", "config:List*" ], "Resource": "*" }] }
有关更多信息,请参阅 使用 Amazon Config 查看引用的资源。
授予在 CloudTrail 控制台上查看和配置 Amazon CloudWatch Logs 信息的权限
如果您具有足够的权限,则可以在 CloudTrail 控制台查看和配置将事件传送到 CloudWatch Logs 的行为。这些权限可能超出了为 CloudTrail 管理员授予的权限。将此策略附加到将配置和管理 CloudTrail 与 CloudWatch Logs 集成的管理员。该策略未在 CloudTrail 或 CloudWatch Logs 中直接授予他们权限,而是授予创建和配置 CloudTrail 将代入的角色所需的权限,此角色将事件成功地传送到您的 CloudWatch Logs 组。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:PutRolePolicy", "iam:AttachRolePolicy", "iam:ListRoles", "iam:GetRolePolicy", "iam:GetUser" ], "Resource": "*" }] }
有关更多信息,请参阅 使用 Amazon CloudWatch Logs 监控 CloudTrail 日志文件。
其他信息
要了解有关创建 IAM 用户、组、策略和权限的更多信息,请参阅 IAM 用户指南中的创建您的第一个 IAM 用户和管理员组和访问控制。