# AWS - リレーショナルデータベース (RDS) 列挙

{{#include ../../../banners/hacktricks-training.md}}

## 基本情報

AWS が提供する **Relational Database Service (RDS)** は、クラウド上での **リレーショナルデータベースのデプロイ、運用、スケーリング** を簡素化するために設計されています。このサービスは、ハードウェアプロビジョニング、データベース構成、パッチ適用、バックアップなどの労働集約的な作業を自動化しつつ、コスト効率とスケーラビリティの利点を提供します。

AWS RDS は、MySQL、PostgreSQL、MariaDB、Oracle Database、Microsoft SQL Server、Amazon Aurora（MySQL/PostgreSQL 互換）などの広く使われているリレーショナルデータベースエンジンをサポートします。

RDS の主な機能は以下のとおりです：

- **データベースインスタンスの管理** が簡素化される。
- リードパフォーマンスを向上させるための **read replicas** の作成。
- 高可用性とフェイルオーバーを確保するための **multi-Availability Zone (AZ) deployments** の構成。
- 他の AWS サービスとの **統合**、例えば：
  - AWS Identity and Access Management (**IAM**) による堅牢なアクセス制御。
  - AWS **CloudWatch** による包括的な監視とメトリクス。
  - AWS Key Management Service (**KMS**) による at-rest の暗号化管理。

## 認証情報

DB クラスターを作成する際、マスターの **username** は設定可能です（デフォルトは **`admin`**）。このユーザーのパスワードを生成する方法は次のとおりです：

- 自分で **パスワードを指定する**
- RDS に **自動生成** させる
- RDS に AWS Secret Manager で **KMS キー** による暗号化で管理させる

<figure><img src="../../../images/image (144).png" alt=""><figcaption></figcaption></figure>

### 認証方式

認証オプションは3種類ありますが、**マスターパスワードの使用は常に許可されます**：

<figure><img src="../../../images/image (227).png" alt=""><figcaption></figcaption></figure>

### パブリックアクセス & VPC

デフォルトでは **データベースへのパブリックアクセスは許可されていません** が、許可されることもあります。したがって、デフォルトでは選択された **security group**（EC2 SG に保存される）が許可している場合にのみ、同一 VPC のマシンからアクセス可能です。

DB インスタンスを公開する代わりに、DB クラスターの **スケーラビリティ** と **可用性** を **改善する** **RDS Proxy** を作成することも可能です。

さらに、**データベースのポートは変更可能** です。

### 暗号化

**暗号化はデフォルトで有効** で、AWS 管理のキーが使用されます（代わりに CMK を選択することも可能）。

暗号化を有効にすると、**ストレージ、スナップショット、read replicas、およびバックアップに対する encryption at rest** が有効になります。これらの暗号化を管理するキーは **KMS** を使用して発行できます。\
データベース作成後にこのレベルの暗号化を追加することはできません。**作成時に設定する必要があります**。

ただし、暗号化されていないデータベースを暗号化するための **ワークアラウンド** が存在します。暗号化されていないデータベースのスナップショットを作成し、そのスナップショットの暗号化されたコピーを作成し、その暗号化されたスナップショットを使って新しいデータベースを作成することで、最終的にそのデータベースを暗号化することができます。

#### Transparent Data Encryption (TDE)

RDS に備わるアプリケーションレベルの暗号化機能に加え、RDS はデータの保存時の保護のための **プラットフォームレベルの追加暗号化機構** もサポートしています。これには Oracle と SQL Server 向けの **Transparent Data Encryption (TDE)** が含まれます。しかし、TDE はデータを保存時に暗号化することでセキュリティを強化しますが、**データベースのパフォーマンスに影響を与える可能性がある** ことに注意が必要です。特に MySQL の暗号化関数や Microsoft Transact-SQL の暗号化関数と併用すると、このパフォーマンス影響が顕著になることがあります。

TDE を利用するには、いくつかの事前手順が必要です：

1. **Option Group の関連付け**:
- データベースは option group に関連付けられている必要があります。option group は設定や機能のコンテナとして機能し、データベース管理（セキュリティ強化を含む）を容易にします。
- ただし、option group は特定のデータベースエンジンとバージョンでのみ利用可能であることに注意してください。
2. **Option Group に TDE を含める**:
- option group に関連付けた後、Oracle Transparent Data Encryption のオプションをそのグループに含める必要があります。
- 一度 TDE オプションが option group に追加されると、それは恒久的なものとなり、削除することはできない点を認識しておくことが重要です。
3. **TDE の暗号化モード**:
- TDE には 2 つの異なる暗号化モードがあります：
  - **TDE Tablespace Encryption**: テーブルスペース全体を暗号化し、より広範なデータ保護を提供します。
  - **TDE Column Encryption**: データベース内の特定の個別要素を暗号化することで、より細かい制御を可能にします。

TDE のこれらの前提条件と運用上の注意点を理解することは、RDS 内で暗号化を効果的に実装および管理し、データセキュリティと必要なコンプライアンスを確保するために重要です。

### 列挙
```bash
# Clusters info
## Get Endpoints, username, port, iam auth enabled, attached roles, SG
aws rds describe-db-clusters
aws rds describe-db-cluster-endpoints #Cluster URLs
aws rds describe-db-cluster-backtracks --db-cluster-identifier <cluster-name>

## Cluster snapshots
aws rds describe-db-cluster-snapshots
aws rds describe-db-cluster-snapshots --include-public --snapshot-type public

## Restore cluster snapshot as new instance
aws rds restore-db-instance-from-db-snapshot --db-cluster-identifier <ID> --snapshot-identifier <ID>

# Get DB instances info
aws rds describe-db-instances #username, url, port, vpc, SG, is public?
aws rds describe-db-security-groups

## Find automated backups
aws rds describe-db-instance-automated-backups

## Find snapshots
aws rds describe-db-snapshots
aws rds describe-db-snapshots --include-public --snapshot-type public

## Restore snapshot as new instance
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier <ID> --db-snapshot-identifier <ID> --availability-zone us-west-2a

# Any public snapshot in the account
aws rds describe-db-snapshots --snapshot-type public

# Proxies
aws rds describe-db-proxy-endpoints
aws rds describe-db-proxy-target-groups
aws rds describe-db-proxy-targets

## reset credentials of MasterUsername
aws rds modify-db-instance --db-instance-identifier <ID> --master-user-password <NewPassword> --apply-immediately
```
### 認証されていないアクセス

{{#ref}}
../aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md
{{#endref}}

### Privesc

{{#ref}}
../aws-privilege-escalation/aws-rds-privesc/README.md
{{#endref}}

### Post Exploitation

{{#ref}}
../aws-post-exploitation/aws-rds-post-exploitation/README.md
{{#endref}}

### Persistence

{{#ref}}
../aws-persistence/aws-rds-persistence/README.md
{{#endref}}

### SQL Injection

DynamoDBのデータに**SQL syntax**でアクセスする方法があり、典型的な**SQL injections**も可能です。

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
