

# Amazon RDS Custom のセキュリティ
<a name="custom-security"></a>

RDS Custom のセキュリティ上の考慮事項を、よく理解しておきます。

RDS Custom のセキュリティの詳細については、以下のトピックを参照してください。
+ [Amazon S3 バケットを、「混乱した代理」問題から保護する](custom-security.confused-deputy.md)
+ [コンプライアンスプログラムのための RDS Custom for Oracle の認証情報のローテーション](custom-security.cred-rotation.md)

## RDS Custom がユーザーに代わってタスクを安全に管理する方法
<a name="custom-security.security-tools"></a>

RDS Custom は、次のツールとテクニックを使用して、ユーザーに代わって安全に操作を実行します。

**AWSServiceRoleForRDSCustom サービスリンクロール**  
*サービスリンクロール*はサービスによって事前に定義されており、サービスがユーザーに代わって他の AWS のサービス サービスを呼び出すために必要なアクセス許可がすべて含まれています。RDS Custom の場合、`AWSServiceRoleForRDSCustom` は最小特権の原則に従って定義されるサービスリンクロールです。RDS Custom は `AmazonRDSCustomServiceRolePolicy` で特権を使用します。これは、このロールにアタッチされているポリシーであり、ほとんどのプロビジョニングタスクとすべてのオフホスト管理タスクを実行します。詳細については、「[AmazonRDSCustomServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSCustomServiceRolePolicy.html)」を参照してください。  
ホスト上でタスクを実行する場合、RDS Custom オートメーションはサービスリンクロールの認証情報を使用し、AWS Systems Manager を使用してコマンドを実行します。Systems Manager のコマンド履歴と AWS CloudTrail を使用してコマンド履歴を監査できます。Systems Manager は、ネットワーク設定を使用して RDS Custom DB インスタンスに接続します。詳細については、「[ステップ 4: RDS Custom for Oracle 用に IAM を設定する](custom-setup-orcl.md#custom-setup-orcl.iam-vpc)」を参照してください。

**一時 IAM 認証情報**  
リソースをプロビジョニングまたは削除する際、RDS Custom は呼び出し元の IAM プリンシパルの認証情報から取得した一時的な認証情報を使用することがあります。これらの IAM 認証情報は、そのプリンシパルにアタッチされている IAM ポリシーによって制限され、そのオペレーションが完了すると失効します。RDS Custom を使用する IAM プリンシパルに必要なアクセス許可については、「[ステップ 5: IAM ユーザーまたはロールに必要なアクセス許可を付与する](custom-setup-orcl.md#custom-setup-orcl.iam-user)」を参照してください。

**Amazon EC2 インスタンスプロファイル**  
EC2 インスタンスプロファイルは IAM ロールのコンテナであり、EC2 インスタンスにロール情報を渡すために使用できます。EC2 インスタンスは RDS Custom DB インスタンスの基礎となります。RDS Custom DB インスタンスを作成するときに、インスタンスプロファイルを提供します。RDS Custom は、バックアップなどのホストベースの管理タスクを実行する際に EC2 インスタンスプロファイルの認証情報を使用します。詳細については、「[IAM ロールおよびインスタンスプロファイルをマニュアルで作成する](custom-setup-orcl.md#custom-setup-orcl.iam)」を参照してください。

**SSH キーペア**  
RDS Custom が DB インスタンスの基盤となる EC2 インスタンスを作成すると、ユーザーに代わって SSH キーペアが作成されます。キーは命名プレフィックス `do-not-delete-rds-custom-ssh-privatekey-db-` または `rds-custom!oracle-do-not-delete-db_resource_id-uuid-ssh-privatekey` を使用します。AWS Secrets Manager はこの SSH プライベートキーをシークレットとして AWS アカウントに保存します。Amazon RDS はこれらの認証情報を保存、アクセス、または使用しません。詳細については、「[Amazon EC2 キーペアおよび Linux インスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)」を参照してください。

## SSL 証明書
<a name="custom-security.ssl"></a>

RDS Custom DB インスタンスは、マネージド SSL 証明書をサポートしていません。SSL をデプロイする場合は、SSL 証明書を自分のウォレットでセルフマネージし、SSL リスナーを作成してクライアントデータベース間の接続を保護したり、データベースのレプリケーションを行ったりできます。詳細については、Oracle Database ドキュメントの「[Transport Layer Security 認証の構成](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-6AD89576-526F-4D6B-A539-ADF4B840819F)」を参照してください。

# Amazon S3 バケットを、「混乱した代理」問題から保護する
<a name="custom-security.confused-deputy"></a>

Amazon RDS Custom for Oracle カスタムエンジンバージョン (CEV) または RDS Custom for SQL Server DB インスタンスを作成すると、RDS Custom は Amazon S3 バケットを作成します。S3 バケットには、CEV アーティファクト、REDO (トランザクション) ログ、サポートペリメーターの設定項目、AWS CloudTrail ログなどのファイルが保存されます。

これらの S3 バケットをより安全にするために、グローバル条件コンテキストキーを使用することで、*「混乱した代理」問題*を防止することができます。(詳しくは、「[サービス間での混乱した代理問題の防止](cross-service-confused-deputy-prevention.md)」を参照してください。)

次の RDS Custom for Oracle の例では、S3 バケットポリシーで `aws:SourceArn` と`aws:SourceAccount` のグローバル条件コンテキストキーを使用することを示します。RDS Custom for Oracle の場合は、CEV と DB インスタンスの Amazon リソースネーム (ARN) を必ず含めてください。RDS Custom for SQL Server の場合は、DB インスタンスの ARN を必ず含めてください。

```
...
{
  "Sid": "AWSRDSCustomForOracleInstancesObjectLevelAccess",
  "Effect": "Allow",
  "Principal": {
     "Service": "custom.rds.amazonaws.com"
  },
  "Action": [
     "s3:GetObject",
     "s3:GetObjectVersion",
     "s3:DeleteObject",
     "s3:DeleteObjectVersion",
     "s3:GetObjectRetention",
     "s3:BypassGovernanceRetention"
  ],
  "Resource": "arn:aws:s3:::do-not-delete-rds-custom-123456789012-us-east-2-c8a6f7/RDSCustomForOracle/Instances/*",
  "Condition": {
     "ArnLike": {
        "aws:SourceArn": [
            "arn:aws:rds:us-east-2:123456789012:db:*",
            "arn:aws:rds:us-east-2:123456789012:cev:*/*"
        ]
     },
     "StringEquals": {
        "aws:SourceAccount": "123456789012"
    }
  }
},
...
```

# コンプライアンスプログラムのための RDS Custom for Oracle の認証情報のローテーション
<a name="custom-security.cred-rotation"></a>

一部のコンプライアンスプログラムでは、データベースユーザーの認証情報を定期的に (例えば、90 日ごとに) 変更する必要があります。RDS Custom for Oracle は、一部の定義済みデータベースユーザーの認証情報を自動的にローテーションします。

**Topics**
+ [事前定義済みユーザーの認証情報の自動ローテーション](#custom-security.cred-rotation.auto)
+ [ユーザー認証情報のローテーションに関するガイドライン](#custom-security.cred-rotation.guidelines)
+ [ユーザー認証情報の手動ローテーション](#custom-security.cred-rotation.manual)

## 事前定義済みユーザーの認証情報の自動ローテーション
<a name="custom-security.cred-rotation.auto"></a>

RDS Custom for Oracle DB インスタンスが Amazon RDS でホストされている場合、以下の事前定義された Oracle ユーザーの認証情報は 30 日ごとに自動的にローテーションされます。前述のユーザーの認証情報は AWS Secrets Manager にあります。


| データベースユーザー | Created by (作成者) | サポート対象エンジンバージョン | 注意事項 | 
| --- | --- | --- | --- | 
|  `SYS`  |  Oracle  |  custom-oracle-ee custom-oracle-ee-cdb custom-oracle-se2 custom-oracle-se2-cdb  |  | 
|  `SYSTEM`  |  Oracle  |  custom-oracle-ee custom-oracle-ee-cdb custom-oracle-se2 custom-oracle-se2-cdb  |  | 
|  `RDSADMIN`  |  RDS  |  custom-oracle-ee custom-oracle-se2  |  | 
|  `C##RDSADMIN`  |  RDS  |  custom-oracle-ee-cdb custom-oracle-se2-cdb  | C\$1\$1 プレフィックスが付いたユーザー名は CDB にのみ存在します。CDB の詳細については、「[Amazon RDS Custom for Oracle アーキテクチャの概要](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-creating.html#custom-creating.overview)」を参照してください。 | 
|  `RDS_DATAGUARD`  |  RDS  |  custom-oracle-ee  | このユーザーは、リードレプリカ、リードレプリカのソースデータベース、および Oracle Data Guard を使用して RDS Custom に物理的に移行したデータベースにのみ存在します。 | 
|  `C##RDS_DATAGUARD`  |  RDS  |  custom-oracle-ee-cdb  | このユーザーは、リードレプリカ、リードレプリカのソースデータベース、および Oracle Data Guard を使用して RDS Custom に物理的に移行したデータベースにのみ存在します。C\$1\$1 プレフィックスが付いたユーザー名は CDB にのみ存在します。CDB の詳細については、「[Amazon RDS Custom for Oracle アーキテクチャの概要](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-creating.html#custom-creating.overview)」を参照してください。 | 

自動認証情報のローテーションの例外は、スタンバイデータベースとして手動で設定した RDS Custom for Oracle DB インスタンスです。RDS は、`create-db-instance-read-replica` CLI コマンドまたは `CreateDBInstanceReadReplica` API を使用して作成したリードレプリカの認証情報のみを更新します。

## ユーザー認証情報のローテーションに関するガイドライン
<a name="custom-security.cred-rotation.guidelines"></a>

コンプライアンスプログラムに従って資格情報が更新されるように、次のガイドラインに注意してください。
+ DB インスタンスが認証情報を自動的にローテーションする場合、「[事前定義された Oracle ユーザー](#auto-rotation)」にリストされているユーザーのシークレット、パスワードファイル、またはパスワードを手動で変更または削除しないでください。そうしないと、RDS Custom が DB インスタンスをサポート範囲外に配置し、自動ローテーションが停止する可能性があります。
+ RDS マスターユーザーは事前に定義されていないため、パスワードを手動で変更するか、Secrets Manager で自動ローテーションを設定する必要があります。詳細については、「[AWS Secrets Manager シークレットのローテーション](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)」を参照してください。

## ユーザー認証情報の手動ローテーション
<a name="custom-security.cred-rotation.manual"></a>

次のカテゴリのデータベースでは、RDS は「[事前定義済み Oracle ユーザー](#auto-rotation)」にリストされているユーザーの認証情報を自動的に更新しません。
+ スタンバイデータベースとして機能するように手動で設定したデータベース。
+ オンプレミスのデータベース
+ サポート範囲外にある DB インスタンス、または RDS Custom オートメーションを実行できない状態にある DB インスタンス。この場合、RDS Custom はキーをローテーションしません。

データベースが上記のカテゴリのいずれかに該当する場合は、ユーザー認証情報を手動でローテーションする必要があります。

**DB インスタンスのユーザー認証情報を手動でローテーションするには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. **データベース**で、RDS が現在 DB インスタンスをバックアップしていないか、高可用性の設定などの操作を実行していないことを確認します。

1. データベースの詳細ページで、**[設定]** を選択し、DB インスタンスのリソース ID を書き留めます。または、AWS CLI コマンド `describe-db-instances` を使用できます。

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/) から Secrets Manager コンソールを開きます。

1. 検索ボックスにデータベースのリソース ID を入力し、次のいずれかの命名規則を使用してシークレットを検索します。

   ```
   do-not-delete-rds-custom-resource_id-uuid
   rds-custom!oracle-do-not-delete-resource_id-uuid
   ```

   このシークレットには、`RDSADMIN`、`SYS`、および `SYSTEM` のパスワードが保存されます。次のサンプルキーは、DB リソース ID `db-ABCDEFG12HIJKLNMNOPQRS3TUVWX` および UUID `123456` の DB インスタンス用です。

   ```
   do-not-delete-rds-custom-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-123456
   rds-custom!oracle-do-not-delete-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-123456
   ```
**重要**  
DB インスタンスがリードレプリカで `custom-oracle-ee-cdb` エンジンを使用する場合、サフィックス `db-resource_id-uuid` が付いた 2 つのシークレットが存在します。1 つはマスターユーザー用で、もう 1 つは `RDSADMIN`、`SYS` および `SYSTEM` です。正しいシークレットを見つけるには、次のコマンドをホストで実行します。  

   ```
   cat /opt/aws/rdscustomagent/config/database_metadata.json | python3 -c "import sys,json; print(json.load(sys.stdin)['dbMonitoringUserPassword'])"
   ```
この `dbMonitoringUserPassword` 属性は、`RDSADMIN`、`SYS`、および `SYSTEM` のシークレットを示します。

1. DB インスタンスが Oracle Data Guard 設定に存在する場合は、次のいずれかの命名規則を使用してシークレットを検索します。

   ```
   do-not-delete-rds-custom-resource_id-uuid-dg
   rds-custom!oracle-do-not-delete-resource_id-uuid-dg
   ```

   このシークレットには、`RDS_DATAGUARD` のパスワードが保存されます。次のサンプルキーは、DB リソース ID `db-ABCDEFG12HIJKLNMNOPQRS3TUVWX` および UUID **789012** の DB インスタンス用です。

   ```
   do-not-delete-rds-custom-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-789012-dg
   rds-custom!oracle-do-not-delete-db-ABCDEFG12HIJKLNMNOPQRS3TUVWX-789012-dg
   ```

1. 「[定義済みの Oracle ユーザー](#auto-rotation)」に記載されているすべてのデータベースユーザーについて、「[AWS Secrets Manager シークレットの変更](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_update-secret.html)」の指示に従ってパスワードを更新します。

1. データベースがスタンドアロンデータベースまたは Oracle Data Guard 設定のソースデータベースの場合:

   1. Oracle SQL クライアントを起動し、`SYS` としてログインします。

   1. 「[事前定義済み Oracle ユーザー](#auto-rotation)」にリストされているデータベースユーザーごとに、次の形式の SQL ステートメントを実行します。

      ```
      ALTER USER user-name IDENTIFIED BY pwd-from-secrets-manager ACCOUNT UNLOCK;
      ```

      例えば、Secrets Manager に保存されている `RDSADMIN` の新しいパスワードが `pwd-123` の場合、次のステートメントを実行します。

      ```
      ALTER USER RDSADMIN IDENTIFIED BY pwd-123 ACCOUNT UNLOCK;
      ```

1. DB インスタンスが Oracle Database 12c リリース 1 (12.1) を実行していて、Oracle Data Guard によって管理されている場合は、プライマリ DB インスタンスから各スタンバイ DB インスタンスにパスワードファイル (`orapw`) を手動でコピーします。

   DB インスタンスが Amazon RDS でホストされている場合、パスワードファイルの場所は `/rdsdbdata/config/orapw` です。Amazon RDS でホストされていないデータベースの場合、デフォルトの場所は、Linux と UNIX では `$ORACLE_HOME/dbs/orapw$ORACLE_SID`、Windows では `%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora` です。