Amazon Redshift
管理指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

数据库审计日志记录

概述

Amazon Redshift 记录您的数据库中的连接和用户活动相关信息。这些日志有助于您监控数据库以确保安全并进行故障排除,该流程通常称为数据库审计。这些日志存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中,使负责监控数据库中活动的用户可以很方便地访问数据安全功能。

Amazon Redshift 日志

Amazon Redshift 在下列日志文件中记录信息:

  • 连接日志 – 记录身份验证尝试以及连接与断开连接。

  • 用户日志 – 记录与数据库用户定义更改相关的信息。

  • 用户活动日志 – 记录在数据库中运行之前的每个查询。

连接日志和用户日志主要用于实现安全性。您可以使用连接日志来监控连接到数据库的用户相关信息以及相关的连接信息,如用户的 IP 地址、发出请求的时间以及使用的身份验证类型等。您可以使用用户日志来监控数据库用户定义更改。

用户活动日志主要用于进行故障排除。它会跟踪用户及系统在数据库中执行的查询类型的相关信息。

连接日志和用户日志均对应于数据库的系统表中存储的信息。您可以使用系统表获取相同的信息,但日志文件这种机制更易于检索和查看。日志文件依赖 Amazon S3 权限(而非数据库权限)针对表执行查询。此外,通过查看日志文件中的信息(而非查询系统表),您可以减少与数据库互动产生的任何影响。

注意

日志文件没有基本系统日志表 STL_USERLOGSTL_CONNECTION_LOG 那么新。早于 (但不包括) 最新记录的记录将被复制到日志文件。

连接日志

记录身份验证尝试以及连接与断开连接。下表介绍了连接日志中的信息。

列名称 说明
事件 连接或身份验证事件。
recordtime 事件发生的时间。
remotehost 远程主机的名称或 IP 地址。
remoteport 远程主机的端口号。
pid 与语句关联的进程 ID。
dbname 数据库名称。
username 用户名。
authmethod 身份验证方法。
duration 连接的持续时间(单位为微秒)。
sslversion 安全套接字层 (SSL) 版本。
sslcipher SSL 密码。
mtu 最大传输单元 (MTU)。
sslcompression SSL 压缩类型。
sslexpansion SSL 扩展类型。

用户日志

记录数据库用户的以下更改的详细信息。

  • 创建用户

  • 删除用户

  • 更改用户(重命名)

  • 更改用户(更改属性)

列名称 说明
userid 受更改影响的用户的 ID。
username 受到更改影响的用户的用户名称。
oldusername 对于重命名操作,这指的是原始用户名称。对于任何其他操作,此字段为空。
操作 发生的操作。有效值:
  • 更改

  • 创建

  • 删除

  • 重命名

usecreatedb 如果为 true (1),则表示用户具有创建数据库的权限。
usesuper 如果为 true (1),则表示用户为超级用户。
usecatupd 如果为 true (1),则表示用户可更新系统目录。
valuntil 密码到期日期。
pid 进程 ID。
xid 事务 ID。
recordtime 查询开始的时间(采用 UTC 表示)。

用户活动日志

记录在数据库中运行之前的每个查询。

列名称 说明
recordtime 事件发生的时间。
db 数据库名称。
用户 用户名。
pid 与语句关联的进程 ID。
userid 用户 ID。
xid 事务 ID。
query 日志前缀:后跟查询的文字,包括换行符。

启用日志记录

在 Amazon Redshift 中,审计日志记录在默认情况下未启用。当您针对群集启用日志记录时,Amazon Redshift 会创建日志并将其上传到 Amazon S3 中,以捕获从群集创建起到当前的数据。每个日志记录更新是已记录信息的延续。

注意

在 Amazon S3 中存储审计日志记录是一个可选的手动流程。当您针对群集启用日志记录时,则是将相应日志仅存储到 Amazon S3 中。记录到数据表则并非可选流程,系统针对群集自动执行该流程。有关记录到数据表的更多信息,请参阅 Amazon Redshift Database Developer Guide 中的系统表参考

您可以通过使用 AWS 管理控制台、Amazon Redshift API 参考或 AWS Command Line Interface (AWS CLI) 一起启用连接日志、用户日志以及用户活动日志。对于用户活动日志,您还必须启用 enable_user_activity_logging 数据库参数。如果您仅启用审计日志记录功能,但不启用相关参数,则数据库审计日志将仅为连接日志和用户日志记录信息,而不为用户活动日志记录信息。enable_user_activity_logging 参数默认处于禁用状态 (false),但您可以将其设置为 true 以启用用户活动日志。有关更多信息,请参阅 Amazon Redshift 参数组

管理日志文件

Amazon S3 中的 Amazon Redshift 日志文件的数量和大小在很大程度上取决于您群集中的活动。如果您有一个活动的群集生成了大量日志,则 Amazon Redshift 可能会更频繁地生成日志文件。对于同一类活动,您可能有一系列日志文件,例如同一个小时有多个连接日志。

由于 Amazon Redshift 使用 Amazon S3 来存储日志,因此您需要为在 Amazon S3 中使用的存储支付相应费用。在配置日志记录之前,您应计划需存储日志文件多长时间,并确定何时可根据审计需求删除这些日志文件或将其存档。您制定的计划在很大程度上取决于您存储的数据类型,例如需满足合规性或法规要求的数据。有关 Amazon S3 定价的更多信息,请转到 Amazon Simple Storage Service (S3) 定价

Amazon Redshift 审计日志记录的存储桶权限

当您启用日志记录时,Amazon Redshift 会收集日志记录信息并将其上传到 Amazon S3 中存储的日志文件。您可以使用现有存储桶,也可以新建一个。Amazon Redshift 要求对存储桶具备以下 IAM 权限:

  • s3:GetBucketAcl:该服务要求对 Amazon S3 存储桶具备读取权限,以便可以识别存储桶拥有者。

  • s3:PutObject:该服务要求具备放置对象权限,以便上传日志。每次上传日志时,该服务就会确定当前存储桶拥有者与启用日志记录时的存储桶拥有者是否一致。如果不一致,则日志记录仍处于启用状态,但在您选择其他存储桶之前,该服务不会上传任何日志文件。

如果您想要使用新的存储桶,并且 Amazon Redshift 在配置过程中为您创建了该存储桶,则该存储桶将应用相应权限。不过,如果您在 Amazon S3 中创建自己的存储桶或使用现有存储桶,则需要添加存储桶策略,其中包含存储桶名称以及与下表中您所在区域对应的 Amazon Redshift 账户 ID:

区域名称 区域 账户 ID
美国东部(弗吉尼亚北部)地区 us-east-1 193672423079
美国东部(俄亥俄)区域 us-east-2 391106570357
美国西部(加利福利亚北部)区域 us-west-1 262260360010
美国西部(俄勒冈)区域 us-west-2 902366379725
亚太地区(孟买)区域 ap-south-1 865932855811
亚太区域(首尔) ap-northeast-2 760740231472
亚太区域(新加坡) ap-southeast-1 361669875840
亚太区域(悉尼) ap-southeast-2 762762565011
亚太区域(东京) ap-northeast-1 404641285394
加拿大 (中部) 区域 ca-central-1 907379612154
中国(北京)区域 cn-north-1 111890595117
欧洲(法兰克福)区域 eu-central-1 053454850223
欧洲(爱尔兰)区域 eu-west-1 210876761215
欧洲 (伦敦) 区域 eu-west-2 307160386991
南美洲(圣保罗)区域 sa-east-1 075028567923

注意

中国(北京) 区域的 ARN 格式使用 aws-cn 标识符,而不是 aws 标识符,如以下策略示例所示:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Put bucket policy needed for audit logging", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::111890595117:user/logs" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::AuditLogs/*" }, { "Sid": "Get bucket policy needed for audit logging ", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::111890595117:user/logs" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws-cn:s3:::AuditLogs" } ] }

该存储桶策略使用以下格式,其中 BucketNameAccountId 是占位符,请将其替换为您自己的值:

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Put bucket policy needed for audit logging", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountId:user/logs" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::BucketName/*" }, { "Sid": "Get bucket policy needed for audit logging ", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountID:user/logs" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::BucketName" } ] }

以下示例就是针对 美国东部(弗吉尼亚北部)地区 的存储桶策略,该存储桶名为 AuditLogs。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Put bucket policy needed for audit logging", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::193672423079:user/logs" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::AuditLogs/*" }, { "Sid": "Get bucket policy needed for audit logging ", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::193672423079:user/logs" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::AuditLogs" } ] }

有关创建 Amazon S3 存储桶以及添加存储桶策略的更多信息,请转到 Amazon Simple Storage Service 控制台用户指南 中的创建存储桶编辑存储桶权限

Amazon Redshift 审计日志记录的存储桶结构

默认情况下,Amazon Redshift 通过使用下列存储桶和对象结构在 Amazon S3 存储桶中整理日志文件:AWSLogs/AccountID/ServiceName/Region/Year/Month/Day/AccountID_ServiceName_Region_ClusterName_LogType_Timestamp.gz

例如:AWSLogs/123456789012/redshift/us-east-1/2013/10/29/123456789012_redshift_us-east-1_mycluster_userlog_2013-10-29T18:01.gz

如果您提供 Amazon S3 密钥前缀,则该前缀放在密钥开头。

例如,如果指定前缀 myprefix:myprefix/AWSLogs/123456789012/redshift/us-east-1/2013/10/29/123456789012_redshift_us-east-1_mycluster_userlog_2013-10-29T18:01.gz

Amazon S3 密钥前缀不得超过 512 个字符,其中不得包含空格 ( )、双引号 (“)、单引号 (‘)、反斜杠 (\)。此外还有很多不得使用的特殊字符和控制字符。这些字符的十六进制代码如下:

  • x00 – x20

  • x 22

  • x 27

  • x5c

  • x7f 或更大

Amazon Redshift 审计日志记录故障排除

Amazon Redshift 审计日志记录可能会因如下原因而中断:

  • Amazon Redshift 无权将日志上传到 Amazon S3 存储桶中。验证相应存储桶是否配置了适当的 IAM 策略。有关更多信息,请参阅 Amazon Redshift 审计日志记录的存储桶权限

  • 存储桶拥有者发生变化。当 Amazon Redshift 上传日志时,它会验证存储桶拥有者与启用日志记录时的存储桶拥有者是否相同。如果存储桶拥有者发生变化,则在您配置其他存储桶以用于审计日志记录之前,Amazon Redshift 不会上传日志。有关更多信息,请参阅 修改审计日志记录的存储桶

  • 找不到存储桶。如果相应存储桶在 Amazon S3 中已被删除,则 Amazon Redshift 无法上传日志。您需要重新创建该存储桶,或对 Amazon Redshift 进行配置以将日志上传到其他存储桶。有关更多信息,请参阅 修改审计日志记录的存储桶

使用 AWS CloudTrail 记录 Amazon Redshift API 调用

Amazon Redshift 与 AWS CloudTrail 集成,后者可捕获 Amazon Redshift API 调用并将日志文件传输到您指定的 Amazon S3 存储桶中。CloudTrail 捕获从 Amazon Redshift 控制台或您的代码发出的 API 调用。通过使用 CloudTrail 收集的信息,您可以确定向 Amazon Redshift 发送的请求以及发出的请求的源 IP 地址、用户和时间等。要了解有关 CloudTrail 的更多信息 (包括如何启用该服务及如何查找日志文件),请参阅 AWS CloudTrail User Guide

您可以将 CloudTrail 与 Amazon Redshift 数据库审核日志记录一起使用,也可以单独使用 CloudTrail。

CloudTrail 中的 Amazon Redshift 信息

在您的 AWS 账户中启用了 CloudTrail 日志记录时,对 Amazon Redshift 操作的 API 调用会被跟踪并记录在 CloudTrail 日志文件中,这些调用与其他 AWS 服务记录一起写入到这些文件中。CloudTrail 基于时间段和文件大小来确定何时创建新文件并向其写入内容。

所有 Amazon Redshift 操作均由 CloudTrail 记录下来并记载到 Amazon Redshift API 参考中。例如,对 CreateClusterDeleteClusterDescribeCluster 操作的调用将在 CloudTrail 日志文件中生成条目。

每个日志条目都包含有关生成请求的人员的信息。日志条目中的用户身份信息可帮助您确定以下内容:

  • 发出请求使用的是根凭证还是 AWS Identity and Access Management (IAM) 用户凭证

  • 发出请求使用的是 IAM 角色的临时安全凭证,还是由外部身份提供商验证而非由 AWS 直接验证安全凭证的联合用户

  • 请求是否由其他 AWS 服务发出

有关更多信息,请参阅 CloudTrail userIdentity 元素

日志文件可以在 Amazon S3 存储桶中存储任意长时间,不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。默认情况下,将使用 Amazon S3 服务器端加密 (SSE) 对日志文件进行加密。

如果您需要获得日志文件传输的通知,则可以将 CloudTrail 配置为在传输新日志文件时发布 Amazon SNS 通知。有关更多信息,请参阅为 CloudTrail 配置 Amazon SNS 通知

还可以将多个 AWS 区域和多个 AWS 账户中的 Amazon Redshift 日志文件聚合到单个 Amazon S3 存储桶中。

有关更多信息,请参阅接收多个区域中的 CloudTrail 日志文件从多个账户中接收 CloudTrail 日志文件

了解 Amazon Redshift 日志文件条目

CloudTrail 日志文件可以包含一个或多个日志条目。每个条目列出了多个 JSON 格式的事件。一个日志条目表示来自任何源的一个请求,包括有关所请求的操作、操作的日期和时间、请求参数等方面的信息。日志条目不是公用 API 调用的有序堆栈跟踪,因此它们不会以任何特定顺序显示。以下示例显示了示例 CreateCluster 调用的一个 CloudTrail 日志条目。

Copy
{ "eventVersion": "1.04", "userIdentity": { "type": "IAMUser", "principalId": "AIDAMVNPBQA3EXAMPLE", "arn": "arn:aws:iam::123456789012:user/Admin", "accountId": "123456789012", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "Admin", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2017-03-03T16:51:56Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2017-03-03T16:56:09Z", "eventSource": "redshift.amazonaws.com", "eventName": "CreateCluster", "awsRegion": "us-east-2", "sourceIPAddress": "52.95.4.13", "userAgent": "signin.amazonaws.com", "requestParameters": { "clusterIdentifier": "my-dw-instance", "allowVersionUpgrade": true, "enhancedVpcRouting": false, "encrypted": false, "clusterVersion": "1.0", "masterUsername": "awsuser", "masterUserPassword": "****", "automatedSnapshotRetentionPeriod": 1, "port": 5439, "dBName": "mydbtest", "clusterType": "single-node", "nodeType": "dc1.large", "publiclyAccessible": true, "vpcSecurityGroupIds": [ "sg-95f606fc" ] }, "responseElements": { "nodeType": "dc1.large", "preferredMaintenanceWindow": "sat:05:30-sat:06:00", "clusterStatus": "creating", "vpcId": "vpc-84c22aed", "enhancedVpcRouting": false, "masterUsername": "awsuser", "clusterSecurityGroups": [], "pendingModifiedValues": { "masterUserPassword": "****" }, "dBName": "mydbtest", "clusterVersion": "1.0", "encrypted": false, "publiclyAccessible": true, "tags": [], "clusterParameterGroups": [ { "parameterGroupName": "default.redshift-1.0", "parameterApplyStatus": "in-sync" } ], "allowVersionUpgrade": true, "automatedSnapshotRetentionPeriod": 1, "numberOfNodes": 1, "vpcSecurityGroups": [ { "status": "active", "vpcSecurityGroupId": "sg-95f606fc" } ], "iamRoles": [], "clusterIdentifier": "my-dw-instance", "clusterSubnetGroupName": "default" }, "requestID": "4c506036-0032-11e7-b8bf-d7aa466e9920", "eventID": "13ba5550-56ac-405b-900a-8a42b0f43c45", "eventType": "AwsApiCall", "recipientAccountId": "123456789012" }

以下示例显示了示例 DeleteCluster 调用的一个 CloudTrail 日志条目。

Copy
{ "eventVersion": "1.04", "userIdentity": { "type": "IAMUser", "principalId": "AIDAMVNPBQA3EXAMPLE", "arn": "arn:aws:iam::123456789012:user/Admin", "accountId": "123456789012", "accessKeyId": "ASIAIDR2R5ERHQH72ZQQ", "userName": "Admin", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2017-03-03T16:58:23Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2017-03-03T17:02:34Z", "eventSource": "redshift.amazonaws.com", "eventName": "DeleteCluster", "awsRegion": "us-east-2", "sourceIPAddress": "52.95.4.13", "userAgent": "signin.amazonaws.com", "requestParameters": { "clusterIdentifier": "my-dw-instance", "skipFinalClusterSnapshot": true }, "responseElements": null, "requestID": "324cb76a-0033-11e7-809b-1bbbef7710bf", "eventID": "59bcc3ce-e635-4cce-b47f-3419a36b3fa5", "eventType": "AwsApiCall", "recipientAccountId": "123456789012" }

AWS CloudTrail 日志中的 Amazon Redshift 账户 ID

当 Amazon Redshift 代表您调用其他 AWS 服务时,该次调用就以属于 Amazon Redshift 服务的账户 ID(而非您自己的账户 ID)记录下来。例如,当 Amazon Redshift 调用 AWS Key Management Service (AWS KMS) 操作(如 CreateGrant、Decrypt、Encrypt 以及 RetireGrant)以管理您群集的加密时,相应调用就由 AWS CloudTrail 使用 Amazon Redshift 账户 ID 记录下来。

当调用其他 AWS 服务时,Amazon Redshift 使用下表中的账户 ID。

区域 区域 账户 ID
美国东部(弗吉尼亚北部)地区 us-east-1 368064434614
美国东部(俄亥俄)区域 us-east-2 790247189693
美国西部(加利福利亚北部)区域 us-west-1 703715109447
美国西部(俄勒冈)区域 us-west-2 473191095985
亚太地区(孟买)区域 ap-south-1 408097707231
亚太区域(首尔) ap-northeast-2 713597048934
亚太区域(新加坡) ap-southeast-1 960118270566
亚太区域(悉尼) ap-southeast-2 485979073181
亚太区域(东京) ap-northeast-1 615915377779
加拿大 (中部) 区域 ca-central-1 764870610256
中国(北京)区域 cn-north-1 066403562008
欧洲(法兰克福)区域 eu-central-1 434091160558
欧洲(爱尔兰)区域 eu-west-1 246478207311
欧洲 (伦敦) 区域 eu-west-2 885798887673
南美洲(圣保罗)区域 sa-east-1 392442076723

以下示例显示了 Amazon Redshift 所调用的 AWS KMS Decrypt 操作的 CloudTrail 日志条目。

Copy
{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAI5QPCMKLTL4VHFCYY:i-0f53e22dbe5df8a89", "arn": "arn:aws:sts::790247189693:assumed-role/prod-23264-role-wp/i-0f53e22dbe5df8a89", "accountId": "790247189693", "accessKeyId": "ASIAJ6VAVPSP2DVJ35KQ", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2017-03-03T16:24:54Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAI5QPCMKLTL4VHFCYY", "arn": "arn:aws:iam::790247189693:role/prod-23264-role-wp", "accountId": "790247189693", "userName": "prod-23264-role-wp" } } }, "eventTime": "2017-03-03T17:16:51Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-2", "sourceIPAddress": "52.14.143.61", "userAgent": "aws-internal/3", "requestParameters": { "encryptionContext": { "aws:redshift:createtime": "20170303T1710Z", "aws:redshift:arn": "arn:aws:redshift:us-east-2:123456789012:cluster:my-dw-instance-2" } }, "responseElements": null, "requestID": "30d2fe51-0035-11e7-ab67-17595a8411c8", "eventID": "619bad54-1764-4de4-a786-8898b0a7f40c", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:123456789012:key/f8f4f94f-e588-4254-b7e8-078b99270be7", "accountId": "123456789012", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "123456789012", "sharedEventID": "c1daefea-a5c2-4fab-b6f4-d8eaa1e522dc" }