Amazon Aurora PostgreSQL でのセキュリティ - Amazon Aurora

Amazon Aurora PostgreSQL でのセキュリティ

Amazon Aurora PostgreSQL のセキュリティは次の 3 つのレベルで管理されます。

  • Aurora PostgreSQL DB クラスターと DB インスタンスに対し Amazon RDS 管理アクションを実行できるユーザーを管理するには、AWS Identity and Access Management (IAM) を使用します。IAM 認証情報を使用して AWS に接続している場合、AWS アカウントには、Amazon RDS の管理オペレーションを実行するためのアクセス許可を付与する IAM ポリシーが必要です。詳細については、「Amazon Aurora での Identity and Access Management」を参照してください。

    IAM を使用して Amazon RDS コンソールにアクセスする場合は、まず、IAM ユーザーの認証情報を使用して AWS Management Console にサインインしてください。次に、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) に移動します。

  • Aurora DB クラスターを Amazon VPC サービスに基づいて仮想パブリッククラウド (VPC) で作成してください。VPC 内の Aurora DB クラスター用の DB インスタンスのエンドポイントとポートに対して接続を開くことができるデバイスと Amazon EC2 インスタンスを制御するには、VPC セキュリティグループを使用します。これらのエンドポイントとポート接続は、Secure Sockets Layer (SSL) を使用して作成できます。さらに、会社のファイアウォールルールでも、社内のいずれのデバイスが DB インスタンスへの接続を開くことができるかを制御できます。VPC の詳細については、「Amazon Virtual Private Cloud VPC および Amazon Aurora」を参照してください。

    サポートされている VPC テナンシーは、Aurora PostgreSQL DB クラスターで使用しているインスタンスクラスによって異なります。default VPC テナントでは、VPC は共有ハードウェアで実行されます。dedicated VPC テナンシーでは、VPC は専有のハードウェアインスタンスで実行されます。バーストパフォーマンス DB インスタンスクラスでは、デフォルト VPC テナンシーのみがサポートされています。バーストパフォーマンス DB インスタンスクラスには、db.t3 および db.t4g DB インスタンスクラスが含まれます。その他すべての Aurora PostgreSQL DB インスタンスクラスでは、デフォルトと専用 VPC テナンシーの両方がサポートされています。

    インスタンスクラスの詳細については、「Aurora DB インスタンスクラス」を参照してください。default および dedicated VPC テナントの詳細については、Amazon Elastic Compute Cloud ユーザーガイドの「ハードウェア専有インスタンス」を参照してください。

  • Amazon Aurora DB クラスターに対するログインとアクセス権限を認証するには、PostgreSQL のスタンドアロンインスタンスと同じ方法を使用します。

    CREATE ROLEALTER ROLEGRANTREVOKE などのコマンドは、オンプレミスデータベースでの方法と同様に、データベーススキーマテーブルを直接変更します。詳細については、PostgreSQL ドキュメントの Client authentication を参照してください。

    注記

    SCRAM (Salted Challenge Response Authentication Mechanism) は Aurora PostgreSQL ではサポートされていません。

注記

詳細については、「Amazon Aurora でのセキュリティ」を参照してください。

Amazon Aurora PostgreSQL DB インスタンスを作成すると、マスターユーザーには以下のデフォルト権限が付与されます。

  • LOGIN

  • NOSUPERUSER

  • INHERIT

  • CREATEDB

  • CREATEROLE

  • NOREPLICATION

  • VALID UNTIL 'infinity'

各 DB クラスターに管理サービスを提供するために、DB インスタンスの作成時に rdsadmin ユーザーが作成されます。rdsadmin アカウントの権限をドロップ、名前変更、パスワード変更、または変更しようとするとエラーになります。

パスワード管理を制限する

データベースユーザーのパスワードの管理担当者を特定のロールに限定できます。これにより、クライアント側でのパスワード管理をより柔軟に制御できます。

静的パラメータ rds.restrict_password_commands でパスワード管理の制限を有効にし、rds_password というロールを使用します。パラメータ rds.restrict_password_commands を 1 に設定すると、rds_password ロールのメンバーユーザーのみが特定の SQL コマンドを実行できます。制限された SQL コマンドは、データベースユーザーのパスワードとパスワードの有効期限を変更するコマンドです。

制限されたパスワード管理を使用するには、必要があります。 DB インスタンスで Amazon Aurora for PostgreSQL 10.6 以上を実行している必要があります。rds.restrict_password_commands パラメータは静的であるため、このパラメータを変更するにはデータベースの再起動が必要です。

制限されたパスワード管理がデータベースで有効になっている場合、制限された SQL コマンドを実行しようとすると、「エラー: パスワードを変更するには rds_password のメンバーであることが必要です」というエラーが表示されます。

制限されたパスワード管理を有効にした場合に制限される SQL コマンドの例は以下のとおりです。

postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword'; postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword'; postgres=> ALTER ROLE myrole VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole RENAME TO myrole2;

ALTER ROLE が含まれている RENAME TO コマンドのいくつかも制限される場合があります。これらのコマンドが制限されるのは、MD5 パスワードが含まれている PostgreSQL ロールの名前を変更すると、パスワードが消去されるためです。

rds_superuser ロールは、rds_password ロールのデフォルトメンバーであるため、これを変更することはできません。他のロールに対して rds_password ロールのメンバーシップを付与するには、SQL の GRANT コマンドを使用します。rds_password のメンバーシップは、パスワード管理専用の少数のロールにのみ付与することをお勧めします。これらのロールは、他のロールを変更するために、CREATEROLE 属性を必要とします。

パスワード要件 (クライアント側の有効期限や必要な複雑さなど) を確認してください。クライアント側の独自のユーティリティを使用してパスワード関連の変更を制限することをお勧めします。このユーティリティには、rds_password のメンバーであり、CREATEROLE 属性を持つロールが必要です。

SSL/TLS での Aurora PostgreSQL データの保護

Amazon RDS では、Aurora PostgreSQL DB クラスターの Secure Socket Layer (SSL) 暗号化と Transport Layer Security (TLS) 暗号化をサポートしています。SSL/TLS を使用して、アプリケーションと Aurora PostgreSQL DB クラスターとの接続を暗号化できます。また、Aurora PostgreSQL DB クラスターへのすべての接続に SSL/TLS の使用を強制することができます。Amazon Aurora PostgreSQL は、Transport Layer Security (TLS) バージョン 1.1 および 1.2 をサポートしています。暗号化された接続には TLS 1.2 を使用することをお勧めします。

SSL/TLS サポートおよび PostgreSQL データベースの一般情報については、PostgreSQL ドキュメントの「SSL Support」を参照してください。JDBC を介した SSL/TLS 接続の使用については、PostgreSQL ドキュメントの「Configuring the Client」を参照してください。

Aurora PostgreSQL の SSL/TLS サポートは、すべての AWS リージョンで利用可能です。DB クラスターが作成される際、Amazon RDS により、Aurora PostgreSQL DB クラスター用の SSL/TLS 証明書が作成されます。SSL/TLS 証明書認証を有効にした場合、SSL/TLS 証明書には、なりすまし攻撃から保護するために、SSL/TLS 証明書の共通名 (CN) として DB クラスターのエンドポイントが含まれます。

SSL/TLS を使用して Aurora PostgreSQL DB クラスターに接続する方法

  1. 証明書をダウンロードします。

    証明書のダウンロードについては、SSL/TLS を使用した DB クラスターへの接続の暗号化 を参照してください。

  2. オペレーティングシステムに証明書をインポートします。

  3. SSL/TLS を使用して Aurora PostgreSQL DB クラスターに接続します。

    SSL/TLS を使用して接続するとき、クライアントでは証明書チェーンを検証するかどうかを選択できます。接続パラメータで sslmode=verify-ca または sslmode=verify-full を指定すると、RDS CA 証明書が信頼ストアに存在するか、または接続 URL で参照されることをクライアントは要求します。この要求は、データベース証明書に署名する証明書チェーンを検証するためのものです。

    psql や JDBC など、クライアントに SSL/TLS サポートが設定されている場合、クライアントは初期にデフォルトで SSL/TLS を使用してデータベースへの接続を試みます。クライアントが SSL/TLS を使用して接続できない場合、SSL/TLS を使用しない接続に戻ります。使用されるデフォルトの sslmode モードは、libpq ベースのクライアント (psql など) と JDBC では異なります。libpq ベースのクライアントはデフォルトで prefer に設定されますが、JDBC クライアントは verify-full に設定されます。

    sslrootcert パラメータを使用して証明書を参照します (sslrootcert=rds-ssl-ca-cert.pem など)。

psql を使用して Aurora PostgreSQL DB クラスターに接続する例は次のとおりです。

$ psql -h testpg.cdhmuqifdpib.us-east-1.rds.amazonaws.com -p 5432 \ "dbname=testpg user=testuser sslrootcert=rds-ca-2015-root.pem sslmode=verify-full"

Aurora PostgreSQL DB クラスターへの SSL/TLS 接続を必須にする

rds.force_ssl パラメータを使用することで、Aurora PostgreSQL DB クラスターへの接続で SSL/TLS の使用を必須にすることができます。デフォルトでは、rds.force_ssl パラメータが 0 (オフ) に設定されています。rds.force_ssl パラメータを 1 (オン) に設定すれば、DB クラスターへの接続で SSL/TLS を必須にすることができます。rds.force_ssl パラメータを更新することでも PostgreSQL ssl パラメータは 1 (オン) に設定され、新しい SSL/TLS 設定をサポートするように DB クラスターの pg_hba.conf ファイルが変更されます。

rds.force_ssl パラメータの値は、DB クラスターの DB クラスターパラメータグループを更新することで設定できます。DB クラスターパラメータグループがデフォルトのものではなく、ssl パラメータを 1 に設定するときに rds.force_ssl パラメータが 1 に設定済みである場合は、DB クラスターを再起動する必要はありません。それ以外の場合は、変更を反映するために DB クラスターを再起動する必要があります。パラメータグループの詳細については、「パラメータグループを使用する」を参照してください。

DB クラスターで rds.force_ssl パラメータが 1 に設定されている場合、次のような出力が接続時に表示され、SSL/TLS が必須であることが示されます。

$ psql postgres -h SOMEHOST.amazonaws.com -p 8192 -U someuser psql (9.3.12, server 9.4.4) WARNING: psql major version 9.3, server major version 9.4. Some psql features might not work. SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. postgres=>

SSL/TLS 接続ステータスを確認する

接続の暗号化ステータスは、DB クラスターに接続するときにログオンバナーに表示されます。

Password for user master: psql (9.3.12) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help.   postgres=>

また、sslinfo エクステンションをロードしてから、ssl_is_used() 関数を呼び出して、SSL/TLS が使用されているかどうかを確認することもできます。この関数は、この接続が SSL/TLS を使用している場合に t を返し、それ以外の場合に f を返します。

postgres=> create extension sslinfo; CREATE EXTENSION postgres=> select ssl_is_used(); ssl_is_used --------- t (1 row)

select ssl_cipher() コマンドを使用して、SSL/TLS 暗号を確認することができます。

postgres=> select ssl_cipher(); ssl_cipher -------------------- DHE-RSA-AES256-SHA (1 row)

set rds.force_ssl を有効にして DB クラスターを再起動すると、次のメッセージが表示され SSL 以外の接続は拒否されます。

$ export PGSSLMODE=disable $ psql postgres -h SOMEHOST.amazonaws.com -p 8192 -U someuser psql: FATAL: no pg_hba.conf entry for host "host.ip", user "someuser", database "postgres", SSL off $

sslmode オプションの詳細については、PostgreSQL ドキュメントの「Database Connection Control Functions」を参照してください。

Aurora PostgreSQL DB クラスターへの接続用の暗号スイートの設定

設定可能な暗号スイートを使用すると、データベース接続のセキュリティをより詳細に制御できます。データベースへのクライアント SSL/TLS 接続を保護するために許可する暗号スイートのリストを指定できます。設定可能な暗号スイートを使用すると、データベースサーバーが受け入れる接続暗号化を制御できます。これにより、安全でない暗号や非推奨の暗号の使用を防ぐことができます。

設定可能な暗号スイートは、Aurora PostgreSQL バージョン 11.8 以降でサポートされています。

接続を暗号化するために許容できる暗号のリストを指定するには、ssl_ciphers クラスターパラメータを変更します。AWS Management Console、AWS CLI、または RDS API を使用して、クラスターパラメータグループ内の ssl_ciphers パラメータを設定します。クラスターパラメータを設定するには、「DB クラスターパラメータグループのパラメータの変更」を参照してください。

ssl_ciphers パラメータを、カンマ区切りの暗号値の文字列に設定します。有効な暗号の例を次に示します。

  • DHE-RSA-AES128-SHA

  • DHE-RSA-AES128-SHA256

  • DHE-RSA-AES128-GCM-SHA256

  • DHE-RSA-AES256-SHA

  • DHE-RSA-AES256-SHA256

  • DHE-RSA-AES256-GCM-SHA384

  • ECDHE-RSA-AES128-SHA

  • ECDHE-RSA-AES128-SHA256

  • ECDHE-RSA-AES128-GCM-SHA256

  • ECDHE-RSA-AES256-SHA

  • ECDHE-RSA-AES256-SHA384

  • ECDHE-RSA-AES256-GCM-SHA384

また、CLI コマンドの describe-engine-default-cluster-parameters を使用して、特定のパラメータグループファミリーで現在サポートされている暗号スイートを特定することもできます。次の例では、Aurora PostgreSQL 11 の ssl_cipher クラスターパラメータで許可される値を取得する方法を示しています。

aws rds describe-engine-default-cluster-parameters --db-parameter-group-family aurora-postgresql11 ...some output truncated... { "ParameterName": "ssl_ciphers", "Description": "Sets the list of allowed TLS ciphers to be used on secure connections.", "Source": "engine-default", "ApplyType": "dynamic", "DataType": "list", "AllowedValues": "ECDHE-RSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-SHA384,AES256-SHA,AES128-SHA,DES-CBC3-SHA,ADH-DES-CBC3-SHA,EDH-RSA-DES-CBC3-SHA,EDH-DSS-DES-CBC3-SHA,ADH-AES256-SHA,DHE-RSA-AES256-SHA,DHE-DSS-AES256-SHA,ADH-AES128-SHA,DHE-RSA-AES128-SHA,DHE-DSS-AES128-SHA,HIGH", "IsModifiable": true, "MinimumEngineVersion": "11.8", "SupportedEngineModes": [ "provisioned" ] }, ...some output truncated...

ssl_ciphers パラメータには、デフォルトの暗号スイートの文字列がありません。暗号の詳細については、PostgreSQL ドキュメントに記載されている変数 ssl_ciphers を参照してください。暗号スイートの形式の詳細については、OpenSSL ウェブサイトの「openssl-ciphers list format」(openssl 暗号リスト形式) と「openssl-ciphers string format」(openssl 暗号文字列形式) のドキュメントを参照してください。