AWS - Redshift Enum

支持 HackTricks

Amazon Redshift

Redshift 是一个完全托管的服务,可以扩展到超过一拍字节的大小,用作大数据解决方案的数据仓库。使用 Redshift 集群,您可以使用快速的基于 SQL 的查询工具和商业智能应用程序对数据集进行分析,以更好地了解您的业务愿景。

Redshift 提供静态加密,使用四层加密密钥层次结构,使用 KMS 或 CloudHSM 管理顶层密钥当为集群启用加密时,无法禁用,反之亦然。当您有一个未加密的集群时,无法加密。

集群的加密只能在创建期间进行,一旦加密,数据、元数据和任何快照也会被加密。加密密钥的分层级别如下,第一层是主密钥,第二层是集群加密密钥,CEK,第三层是数据库加密密钥,DEK,最后一层是数据加密密钥本身

KMS

在创建集群期间,您可以选择 Redshift 的默认 KMS 密钥或选择您自己的 CMK,这使您在密钥控制方面具有更大的灵活性,特别是从可审计的角度。

Redshift 的默认 KMS 密钥在第一次选择和使用密钥选项时由 Redshift 自动创建,并由 AWS 完全管理。

然后,这个 KMS 密钥用 CMK 主密钥(第一层)加密。这个加密的 KMS 数据密钥然后用作集群加密密钥,CEK,第二层。这个 CEK 然后由 KMS 发送到 Redshift,并与集群分开存储。Redshift 然后通过安全通道将这个加密的 CEK 发送到集群,并存储在内存中。

Redshift 然后请求 KMS 解密 CEK,第二层。这个解密的 CEK 也存储在内存中。Redshift 然后创建一个随机的数据库加密密钥,DEK,第三层,并将其加载到集群的内存中。内存中的解密 CEK 然后加密 DEK,DEK 也存储在内存中。

这个加密的 DEK 然后通过安全通道发送,并在 Redshift 中与集群分开存储。CEK 和 DEK 现在都存储在集群的内存中,既有加密形式也有解密形式。解密的 DEK 然后用于加密数据密钥,第四层,这些密钥由 Redshift 为数据库中的每个数据块随机生成。

您可以使用 AWS Trusted Advisor 监控 Amazon S3 存储桶的配置,并确保启用了存储桶日志记录,这对于执行安全审计和跟踪 S3 中的使用模式非常有用。

CloudHSM

使用 CloudHSM 的 Redshift

当使用 CloudHSM 执行加密时,首先必须在 HSM 客户端和 Redshift 之间建立一个受信任的连接,同时使用客户端和服务器证书。

这个连接是为了提供安全通信,允许加密密钥在 HSM 客户端和 Redshift 集群之间传输。使用随机生成的私钥和公钥对,Redshift 创建一个公用客户端证书,该证书由 Redshift 加密和存储。必须下载并注册到您的 HSM 客户端,并分配到正确的 HSM 分区。

然后,您必须使用以下 HSM 客户端的详细信息配置 Redshift:HSM IP 地址,HSM 分区名称,HSM 分区密码,以及由 CloudHSM 使用内部主密钥加密的公用 HSM 服务器证书。一旦提供了这些信息,Redshift 将确认并验证它可以连接和访问开发分区。

如果您的内部安全策略或治理控制要求您必须应用密钥轮换,那么 Redshift 允许您为加密集群轮换加密密钥,但需要注意的是,在密钥轮换过程中,集群会在很短的时间内不可用,因此最好只在需要时或认为密钥可能已被泄露时进行轮换。

在轮换期间,Redshift 将为您的集群和该集群的任何备份轮换 CEK。它将为集群轮换 DEK,但无法为使用 DEK 加密存储在 S3 中的快照轮换 DEK。在过程完成之前,集群将处于“轮换密钥”状态,完成后状态将返回“可用”。

Enumeration

# Get clusters
aws redshift describe-clusters
## Get if publicly accessible
aws redshift describe-clusters | jq -r ".Clusters[].PubliclyAccessible"
## Get DB username to login
aws redshift describe-clusters | jq -r ".Clusters[].MasterUsername"
## Get endpoint
aws redshift describe-clusters | jq -r ".Clusters[].Endpoint"
## Public addresses of the nodes
aws redshift describe-clusters | jq -r ".Clusters[].ClusterNodes[].PublicIPAddress"
## Get IAM roles of the clusters
aws redshift describe-clusters | jq -r ".Clusters[].IamRoles"

# Endpoint access & authorization
aws redshift describe-endpoint-access
aws redshift describe-endpoint-authorization

# Get credentials
aws redshift get-cluster-credentials --db-user <username> --cluster-identifier <cluster-id>
## By default, the temporary credentials expire in 900 seconds. You can optionally specify a duration between 900 seconds (15 minutes) and 3600 seconds (60 minutes).
aws redshift get-cluster-credentials-with-iam --cluster-identifier <cluster-id>
## Gives creds to access redshift with the IAM redshift permissions given to the current AWS account
## More in https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-identity-based.html

# Authentication profiles
aws redshift describe-authentication-profiles

# Snapshots
aws redshift describe-cluster-snapshots

# Scheduled actions
aws redshift describe-scheduled-actions

# Connect
# The redshift instance must be publicly available (not by default), the sg need to allow inbounds connections to the port and you need creds
psql -h redshift-cluster-1.sdflju3jdfkfg.us-east-1.redshift.amazonaws.com -U admin -d dev -p 5439

提权

AWS - Redshift Privesc

持久性

以下操作允许向集群授予其他 AWS 账户的访问权限:

支持 HackTricks

Last updated