Amazon Redshift DB開発者ガイド – データベースセキュリティ管理
データベースセキュリティは、ユーザーがそのDBオブジェクトにどのようなアクセス権をもたせるかを制御する事によって管理します。データベースオブジェクトへのアクセスは、ユーザーアカウントまたはグループに付与する権限に依存します。次のガイドラインでは、データベースのセキュリティがどのように機能するかを要約して行きます。
- デフォルトでは、権限はオブジェクトの所有者に付与されます。
- Amazon Redshiftのデータベースユーザーはデータベースに接続出来るユーザーアカウント名が付けられています。ユーザーアカウントは、権限を直接アカウントに割り当てられる、または暗黙的に権限を付与されたグループのメンバーとなる事によって権限を明示的に付与されます。
- グループは、セキュリティ維持をより簡易にする為の、あるひとまとめの権限を割り当てられたユーザーの集まりです。
- スキーマはデータベーステーブルと他のデータベースオブジェクトの集合です。スキーマは(入れ子にする事が出来ないという点を除いて)オペレーティング・システムのディレクトリに似ています。ユーザーが単一又は復数のスキーマへのアクセス権を付与する事が出来ます。
セキュリティ実装の詳細については、ユーザーとグループアクセス制御のサンプルをご参照ください。
目次
Amazon Redshiftセキュリティ概要
Amazon Redshiftデータベースセキュリティは、Amazon Redshiftのセキュリティの他のタイプとは異なります。このセクションで説明されているデータベースセキュリティに加え、セキュリティを管理する為に以下の機能を提供します。
- サインイン認証(Sign-in credentials)
- Amazon Redshiftの管理コンソールへのアクセスは、AWSアカウントの権限によって制御されます。詳細については、Sign-In Credentialsをご参照ください。
- アクセス管理(Access management)
- 特定のAmazon Redshiftリソースへのアクセスを制御するには、AWSのID及びアクセス管理(IAM)nアカウントを定義します。詳細については、Controlling Access to Amazon Redshift Resourcesをご参照ください。
- クラスタセキュリティグループ(Cluster security groups)
- 他のユーザーにAmazon Redshiftクラスタへのインバウンドアクセスを付与するには、クラスタセキュリティグループを定義し、クラスタに関連付けます。詳細については、Amazon Redshift Cluster Security Groupsをご参照ください。
- VPC
- 仮想ネットワーク環境を使用してクラスタへのアクセスを保護するには、仮想プライベートクラウド(VPC)でクラスタを起動する事が出来ます。詳細については、Managing Clusters in Virtual Private Cloud (VPC)をご参照ください。
- クラスタ暗号化(Cluster encryption)
- 全てのユーザーが作成したテーブルのデータを暗号化するために、クラスタ起動時にクラスタの暗号化を有効にする事が出来ます。詳細については、Amazon Redshift Clustersをご参照ください。
- SSL接続(SSL connections)
- SQLクライアントとクラスタ間の接続を暗号化するには、SSL(Secure Sockets Layer)の暗号化を使用する事が出来ます。詳細については、Connect to Your Cluster Using SSLをご参照ください。
- データロード暗号化(Load data encryption)
- Amazon S3にアップロードするテーブルロードデータファイルを暗号化する場合、Amazon S3 クライアントサイドの暗号化を使う事が出来ます。Amazon S3からデータをRedshiftへロードする時、COPYコマンドがデータの暗号化を行います。詳細については、Uploading encrypted data to Amazon S3をご参照ください。
- 転送中のデータ(Data in transit)
- AWSクラウド内トランジットであなたのデータを保護する為に、Amazon Redshiftはハードウェア加速SSL(hardware accelerated SSL:上手い訳し方が分からん)を使用しています。Amazon S3やAmazon DynamoDBにと通信を行い、COPY, UNLOAD, バックアップやリストア操作を行います。
デフォルトDBユーザの制約
データベースを作成する場合、あなたはその所有者(オーナー)となります。デフォルトでは、オブジェクトの唯一のスーパーユーザー又は所有者は、照会、変更、またはオブジェクトに対する権限付与が行えます。ユーザーがオブジェクトを使用する為には、ユーザーが、またはユーザーが含まれているグループに必要な権限を付与する必要があります。データベーススーパーユーザーは、データベースの所有者と同じ権限を持ちます。
Amazon Redshiftは以下の権限をサポートしています。
- SELECT
- INSERT
- UPDATE
- DELETE
- REFERENCES
- TEMPORARY
- CREATE
- EXECUTE
- USAGE
異なる権限が異なるオブジェクトタイプに関連付けられています。Amazon Redshiftによってサポートされているデータベースオブジェクト権限の詳細については、GRANTコマンドを参照してください。
オブジェクトを変更また破壊する権限は、常に所有者のみが特権として持っています。
以前に付与された権限を取り消すには、REVOKEコマンドを使用します。DROP,GRANTやREVOKE権限のようなオブジェクト所有者の権限については、暗黙的なものであり付与または取り消すと言った操作は出来ません。オブジェクトの所有者は通常の自らの権限を取り消す事が出来ます。例えば、(自分自身だけでなく、他人のための)読み取り専用のテーブルを作成する事などです。スーパーユーザーはGRANTやREVOKEコマンドに関わらず、全ての権限を保持します。
スーパーユーザー
データベーススーパーユーザーは、全てのデータベースのデータベース所有者と同じ権限を持ちます。
マスターユーザー(クラスタを起動時にそのクラスタを作成したユーザー)=スーパーユーザーです。
スーパーユーザーを作成する際は、あなたはスーパーユーザでなければなりません。
Amazon Redshiftのシステムテーブルとシステムビューは共に"superuser visible"又は"user visible"が指定されています。スーパーユーザーだけが"superuser visible"で設計されたシステムテーブルやシステムビューを照会する事が出来ます。その他情報についてはSystem tables and viewsをご参照ください。
スーパーユーザーは、全てのPostgreSQLのカタログテーブルを照会する事が出来ます。詳細については、System catalog tablesをご参照ください。
データベーススーパーユーザーは、全ての権限チェックをバイパス(避けて通る)します。スーパーユーザーのロール(役割)を用いる時は、十分に注意してください。我々はスーパーユーザーでは無いロールで作業を行う事をお勧めします。スーパーユーザーはGRANTやREVOKEコマンドに関係なく、全ての権限を取り消します。
新しいデータベーススーパーユーザーを作成するには、スーパーユーザーとしてデータベースにログオンし、CREATE USER権限を持つCREATE ROLEコマンドまたはALTER USERコマンドを発行します。
create user adminuser createuser password '1234Admin'; alter user adminuser createuser;
ユーザー
Amazon Redshiftのユーザーアカウントは、データベーススーパーユーザーによってのみ作成する事が出来ます。
ユーザーはAmazon Redshiftにログインする際に、そのユーザーが認証されます。ユーザーはデータベース及びデータベースオブジェクト(例えばテーブル)を所有する事が出来ますし、オブジェクトへのアクセス権を持つユーザーを制御するためのユーザー、グループ、およびスキーマにこれらのオブジェクトに対する権限を付与することができます。CREATE DATABASE権限を持つユーザーは、データベースを作成し、それらのデータベースに権限を付与することができます。
スーパーユーザは、すべてのデータベースのデータベース所有者権限を持っています。
ユーザーの作成、変更、削除
データベースユーザーアカウントはデータウェアハウス全体に跨ってグローバルな位置付けです。(個々のデータベースに対して、ではありません)
- ユーザーを作成するにはCREATE USERコマンドを使用します。
- 存在するユーザーを削除するにはDROP USERコマンドを使用します。
- ユーザーアカウントに対する変更を加える(例えばパスワード変更のような)には、ALTER USERコマンドを使用します。
- ユーザーのリストを表示するには、PG_USERテーブルを検索します。
select * from pg_user;
グループ
グループは付与された権限がグループに割り当てられたユーザーの集まりです。あなたは、ロールによって権限を割り当てるグループを使用する事が出来ます。
例えば、販売、管理、及びサポートの為の様々なグループを作成し、各グループ内のユーザーに対して仕事に必要なデータへの適切なアクセス権を与える事が出来ます。グループレベルで権限を付与または取り消す事が出来、そしてそれらの変更はスーパーユーザーを除いてグループの全てのメンバーに適用されます。
全てのユーザーグループを表示するには、PG_GROUPシステムカタログテーブルを照会します。
select * from pg_group;
グループの作成、変更、削除
全てのユーザーがグループを作成し、所有グループを変更または削除する事が出来ます。以下の操作を実行出来ます。
- グループを作成する時は、コマンドを使用します。
- ユーザーを既存のグループに追加したり、既存グループから削除するには、ALTER GROUPコマンドを使用します。
- グループを削除するには、DROP GROUPコマンドを使用します。このコマンドは、グループだけでなく所属するユーザーも削除します。
スキーマ
データベースには1つ以上の名前付きスキーマが含まれています。データベース内の各スキーマには、テーブルと名前付きオブジェクトの他の種類が含まれています。デフォルトでは、データベースはPUBLICという名前の単一のスキーマを持っています。共通の名前の下に、グループデータベースオブジェクトに対してスキーマを使用する事が出来ます。スキーマは入れ子にする事が出来ない、という点を除いて、OSシステムのディレクトリに似ています。
同一のデータベースオブジェクト名は、競合する事無く、同じデータベースに異なるスキーマで使用する事が出来ます。例えば、MY_SCHEMAとYOUR_SCHEMAの両方がMY_TABLEという名前のテーブルを含める事が出来ます。必要な権限を持つユーザーは、データベース内の復数のスキーマ間でオブジェクトにアクセスする事が出来ます。
デフォルトでは、オブジェクトはデータベースの検索パスの最初のスキーマ内で作成されます。詳細については、この後のセクションの検索パスをご参照ください。
スキーマの作成・変更・削除
全てのユーザーがグループを作成し、自分が所有グループを変更または削除する事が出来ます。そして以下の操作を実行出来ます。
- スキーマを作成するには、CREATE SCHEMAコマンドを実行します。
- スキーマの所有者を変更するには、ALTER SCHEMAコマンドを使用します。
- スキーマとそのオブジェクトを削除するには、DROP SCHEMAコマンドを使用します。
- スキーマ内のテーブルを作成するには、フォーマットschema_name.table_mameを持つテーブルを作成します。
全てのユーザーグループを表示するには、ページPG_NAMESPACE上のシステムカタログテーブルを照会します。
select * from pg_namespace;
検索パス
検索パスは、スキーマ名のカンマ区切りリストと共にsearch_pathパラメータで定義されています。検索パスは、このようなテーブルや関数等のオブジェクトがスキーマ修飾子を含まない単純な名前で検索された時に、スキーマが検索される順番を指定します。
オブジェクトがターゲットスキーマを指定せずに作成された場合、オブジェクトは検索パスに記載されている最初のスキーマに追加されます。同じ名前のオブジェクトが異なるスキーマに存在する場合は、スキーマを指定しないオブジェクト名はその名前のオブジェクトが含まれている検索パスの最初のスキーマを参照します。
現在のセッションのデフォルトのスキーマを変更するには、SETコマンドを使用します。
詳細については、設定リファレンスのsearch_pathをご参照ください。
スキーマベースの権限
スキーマベース権限は、スキーマの所有者によって決定されています。
- デフォルトでは、全てのユーザーは、データベースのPUBLICスキーマにCREATE権限とUSAGE権限を持っています。データベースのPUBLICスキーマにオブジェクトを作成する事を許可しないようにするには、権限を剥奪するためにREVOKEコマンドを使用します。
- これらはオブジェクトの所有者でUSAGE権限を付与されていない限り、ユーザーは所有していないスキーマ内のオブジェクトにアクセスする事が出来ません。
- ユーザーが別のユーザーによって作成されたスキーマにCREATE権限を付与されている場合、それらのユーザーはそのスキーマ内のオブジェクトを作成する事が出来ます。
ユーザーとグループアクセス制御のサンプル
この例では、ユーザーグループとユーザーアカウントを作成し、Webアプリケーションクライアントに接続して、Amazon Redshiftのデータベースに対して様々な権限を付与していきます。この例では、以下3つのユーザーグループを想定しています。
- Webアプリケーションの通常ユーザー
- Webアプリケーションのパワーユーザー
- Web開発者
1.ユーザーアカウントが割り当てられるグループを作成します。以下コマンドでは3つの異なるユーザーグループを作成しています。
create group webappusers; create group webpowerusers; create group webdevusers;
2.異なる権限を持つ復数のデータベースユーザーアカウントを作成し、グループに追加します。
- a.2人のユーザーを作成し、WEBAPPUSERSグループにそれらを追加します。
create user webappuser1 password 'webAppuser1pass' in group webappusers; create user webappuser2 password 'webAppuser2pass' in group webappusers;
create user webdevuser1 password 'webDevuser2pass' in group webdevusers;
create user webappadmin password 'webAppadminpass1' createuser;
3.Webアプリケーションで使用されるデータベーステーブルに関連付けられるスキーマを作成し、このスキーマへ様々なユーザーグループがアクセスする事を許可します。
- a.WEBAPPスキーマを作成します。
create schema webapp;
grant usage on schema webapp to group webappusers;
grant usage on schema webapp to group webpowerusers;
grant all on schema webapp to group webdevusers;
4.例えば、以下のコマンドはWEBAPPUSER1に対し、search_pathのパラメータを変更します。SEARCH_PATHは、オブジェクトが指定されていないスキーマの単純な名前で参照される際、テーブルや関数などのデータベース·オブジェクトのスキーマ検索順序を指定します。
alter user webappuser1 set search_path to webapp, public;
5.また、以下のようにWEBPOWERUSERSグループにWEBAPPUSER2を追加するように、グループを作成後、そのグループにユーザーを追加する事が出来ます。
alter group webpowerusers add user webappuser2;