Skip to content

Latest commit

 

History

History
123 lines (82 loc) · 8.14 KB

File metadata and controls

123 lines (82 loc) · 8.14 KB

AWS - Redshift Enum

{% hint style="success" %} 学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}

Amazon Redshift

Redshift 是一种完全托管的服务,可以扩展到超过一个 PB 的大小,用作 大数据解决方案的数据仓库。使用 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 分区密码和公共 HSM 服务器证书,该证书由 CloudHSM 使用内部主密钥加密。一旦提供了这些信息,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

Privesc

{% content-ref url="../aws-privilege-escalation/aws-redshift-privesc.md" %} aws-redshift-privesc.md {% endcontent-ref %}

持久性

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

{% hint style="success" %} 学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks
{% endhint %}