Ensure that encryption is enabled for RDS instances
Severity: Medium
Resource Types: AWS::RDS::DBInstance
Description
Amazon RDS encrypted DB instances use the industry standard AES-256 encryption algorithm to encrypt your data on the server that hosts your Amazon RDS DB instances. After your data is encrypted, Amazon RDS handles authentication of access and decryption of your data transparently with a minimal impact on performance.
Databases that hold sensitive and critical data, it is highly recommended to implement encryption in order to protect your data from unauthorized access. With RDS encryption enabled, the data stored on the instance underlying storage, the automated backups, Read Replicas, and snapshots, become all encrypted.
Remediation
From Console
- Login to the AWS RDS console.
- In the left navigation panel, click on
Databases
- Select the Database instance that needs to encrypt.
- Click on Actions button placed at the top right and select Take Snapshot.
- On the Take Snapshot page, enter a database name of which want to take snapshot in the Snapshot Name field and click Take Snapshot.
- Select the newly created snapshot and click the Copy from the dashboard top menu.
- On the Make Copy of DB Snapshot page, perform the following:
- In the New DB Snapshot Identifier field, Enter a name for the
new snapshot
. - Check
Copy Tags
, New snapshot must have the same tags as the source snapshot. - Select Yes from the Enable Encryption dropdown list to enable encryption, Can choose to use the AWS default encryption key or custom key from Master Key dropdown list.
- In the New DB Snapshot Identifier field, Enter a name for the
- Click Copy Snapshot to create an encrypted copy of selected instance snapshot.
- Select the new Snapshot Encrypted Copy and click Restore Snapshot button from the dashboard top menu, This will restore the encrypted snapshot to a new database instance.
- On the Restore DB Instance page, enter a unique name for the new database instance in the DB Instance Identifier field.
- Review the instance configuration details and click Restore DB Instance.
- As the new instance provisioning process is completed can update application configuration to refer to the endpoint of the new Encrypted database instance once the database endpoint is changed at the application level, can remove the unencrypted instance.
From Command Line
- Run describe-db-instances command to list all RDS database names available in the selected AWS region, The command output should return database instance identifier.
aws rds describe-db-instances --region <region-name> --query 'DBInstances[*].DBInstanceIdentifier'
- Run create-db-snapshot command to create a snapshot for the selected database instance, The command output will return the new snapshot with name DB Snapshot Name.
aws rds create-db-snapshot --region <region-name> --db-snapshot-identifier <DB-Snapshot-Name> --db-instance-identifier <DB-Name>
- Now run list-aliases command to list the KMS keys aliases available in a specified region, The command output should return each key alias currently available. For our RDS encryption the activation process, locate the ID of the AWS default KMS key.
aws kms list-aliases --region <region-name>
- Run copy-db-snapshot command using the default KMS key ID for RDS instances returned earlier to create an encrypted copy of the database instance snapshot, the command output will return the encrypted instance snapshot configuration.
aws rds copy-db-snapshot --region <region-name> --source-db-snapshotidentifier <DB-Snapshot-Name> --target-db-snapshot-identifier <DB-SnapshotName-Encrypted> --copy-tags --kms-key-id <KMS-ID-For-RDS>
- Run restore-db-instance-from-db-snapshot command to restore the encrypted snapshot created at the previous step to a new database instance, if successful, the command output should return the new encrypted database instance configuration.
aws rds restore-db-instance-from-db-snapshot --region <region-name> --dbinstance-identifier <DB-Name-Encrypted> --db-snapshot-identifier <DBSnapshot-Name-Encrypted>
- Run describe-db-instances command to list all RDS database names, available in the selected AWS region, output will return database instance identifier name. Select encrypted database name that we just created DB-Name-Encrypted.
aws rds describe-db-instances --region <region-name> --query 'DBInstances[*].DBInstanceIdentifier'
- Run again describe-db-instances command using the RDS instance identifier returned earlier, to determine if the selected database instance is encrypted, the command output should return the encryption status True.
aws rds describe-db-instances --region <region-name> --db-instance-identifier <DB-Name-Encrypted> --query 'DBInstances[*].StorageEncrypted'