Amazon Web Services ブログ
Amazon Redshift で列レベルのアクセス制御を行い、よりきめ細かなデータセキュリティを実現する
Amazon Redshift は低コストで迅速な分析情報を提供する、大変人気の高いクラウドデータウェアハウスです。Amazon Redshift にはすぐに利用できるセキュリティとコンプライアンスが付属しており、規制の厳しい業界のお客様でもミッションクリティカルなワークロードを自信を持って実行できます。セキュリティ機能には、データをインプレース形式およびオープン形式で簡単に分析できる機能が組み合わさっているだけでなく、コンピューティングとストレージの回復性や使いやすさも備えているため、数万人ものお客様に Amazon Redshift をご利用いただいています。
個人を特定できる情報 (PII) または機密性の高い個人情報 (SPI) として一般的に分類される機密データを、Amazon Redshift に保存している組織は多くあり、こうしたデータへ組織内の異なる人物からのアクセス制限を行っています。たとえば、人事、財務、販売、データサイエンス、マーケティングのどの部門も、顧客データを表示するために必要なアクセス権をすべて持っている場合もありますが、個人を特定できる情報 (PII) や支払カード業界 (PCI) などの機密データには財務部門しかアクセスできないようになっている必要があります。
以前は、ビューまたは AWS Lake Formation (Amazon Redshift Spectrum にある) を使ってそのようなシナリオを管理していましたが、ビューや Amazon Redshift Spectrum の作成や管理には余分なオーバーヘッドがかかります。ビューベースのアプローチは拡張が難しく、セキュリティ管理が手薄となる可能性があります。Amazon Redshift の列レベルのアクセス制御は、Amazon Redshift のデータを列レベルでアクセス制御する新機能です。列レベルの GRANT ステートメントや REVOKE ステートメントを使用することで、データベースオブジェクトを管理するように、セキュリティとコンプライアンスのニーズを満たすことができます。
この投稿では、テーブル、ビュー、マテリアライズドビューで Amazon Redshift の列レベルのアクセス制御を設定する方法をご紹介します。
ユースケース
こちらに、顧客の人口統計データと口座残高データを格納する 2 つのテーブルがあります。財務部門はすべての顧客データを表示できますが、顧客名、電話番号、国籍などの顧客の人口統計データは PII データと見なされ、アクセスを制限する必要があるため、営業部門は市場セグメントと口座残高データのみを表示および更新できます。このユースケースは、PII データを保護するための列レベルのアクセス制御の良い例です。以下は、2 つのテーブルのシンプルなエンティティ関係図です。
前提条件
このブログにある図を試す前に、次の前提条件をご確認ください。
環境の設定
環境をセットアップしてユースケースを実装するには、次の手順を実行してください。
- テーブルまたはスーパーユーザーを作成するアクセス許可を持つユーザーが選択した任意の SQL クライアントを使用して、Amazon Redshift クラスターに接続します。
- 次のコードで 2 つのテーブルを作成します。
- 次のコードを使用して、サンプルデータをいくつか 2 つのテーブルに入力します。
- 次のコードを使用して、ビューとマテリアライズドビューを作成します。
- ビュー
customer_vw
は、customer
データセットに基づく顧客の収入グループを分類するビジネスルールを実装するためのものです。 - 分析ダッシュボードは、
customer
とnation
のテーブルを結合し集計することで、このデータセットに頻繁にアクセスします。その結果、マテリアライズドビューcustomernation_mv
が作成され、このようなクエリのパフォーマンスが大幅に高速化します。 - 財務部門のユーザーを表すユーザー
finance
に、テーブルレベルのアクセス許可を作成して付与します。以下のユーザーは、ここでの説明のためだけに作成しています。Amazon Redshift で手動で企業ユーザーを作成するのではなく、企業ユーザーを持ちこんで AWS IAM フェデレーションを使用することをお勧めします。詳細については、以下をご参照ください https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html#authentication。 - ユーザー
finance
には、SELECT
およびUPDATE
へのcustomer
テーブルのすべての列に対するアクセス許可があることに注意してください。 - ユーザー
finance
がcustomer
テーブル、customer_vw
ビュー、customernation_mv
マテリアライズドビューのすべてのデータを表示でき、customer
テーブルのデータを更新できることをテストおよび検証する必要があります。 - 以下のコードを入力します。
上記のコードでは、SQL ステートメント
SET SESSION AUTHORIZATION 'finance'
を使用してユーザーfinance
を偽装しています。各 SELECT ステートメントは 5 行を返し、UPDATE ステートメントは更新した 1 行を返します。次のコードをご参照ください。
これで、テーブルレベルのアクセス許可が正常に設定され、ユーザー finance
がすべての顧客データを表示および更新できるようになりました。
Amazon Redshift の列レベルのアクセス制御のセットアップ
次の構文で GRANT
ステートメントおよび REVOKE
ステートメントを使用することで、列レベルのアクセス制御を有効または無効にできます。
列レベルの特権をセットアップするには、以下の手順を実行します。
- 列レベルのアクセス制御を持っているユーザーを特定するには、 PG_ATTRIBUTE_INFO システムビューのクエリを実行します。以下のコードを入力します。
- 列レベルのアクセス制御をまだ実装していない場合、クエリはゼロのレコードを返します。
- ユーザー
sales SELECT
に、列marketsegment
とaccountbalance
に対するアクセス許可を付与します。この列は、テーブルcustomer
、ビューcustomer_vw
、マテリアライズドビューcustomernation_mv
にあります。次のコードを入力することで、UPDATE
のアクセス許可も付与します。これは、列marketsegment
とaccountbalance
(テーブルcustomer
内) にあります。 - 最初のステートメントで「
Grant options are not supported for column privileges
」というエラーメッセージが返されます。これは、テーブルの所有者またはスーパーユーザーのみが列レベルの特権を付与でき、シンプルなセキュリティモデルを維持できるためです。 - 上記のアクセス許可が、次のコードで付与されているかどうかを検証します。
- クエリは 6 行を返します。次のコードをご参照ください。
上記の出力は、次のとおりです。
ユーザー:sales
(attacl
列)
アクセス許可:read/write
(attacl
列値 “rw”)
列:accountbalance
、marketsegment
(attname
列)
テーブル:customer
(relname
列)
付与者:fqdemo
(attacl
列)ユーザー:
sales
(attacl
列)
アクセス許可:read
(attacl
列値 “r”)
列:accountbalance
、marketsegment
(attname
列)
テーブル:customer_vw
、customernation_mv
(relname
列)
付与者:fqdemo
(attacl
列) - 列レベルのアクセス制御が正しいことを確認したら、ユーザー
sales
として実行し、次のコードを使用して、テーブルcustomer
、ビューcustomer_vw
、マテリアライズドビューcustomernation_mv
のクエリを実行します。 - クエリされているオブジェクトのすべての列に対するアクセス許可をユーザーが持っていない場合、各 SELECT ステートメントはアクセス許可拒否エラーを返します。次のコードをご参照ください。
- 次のコードを使って、列
marketsegment
とaccountbalance
のみを、テーブルcustomer
、ビュー customer_vw
、マテリアライズドビューcustomernation_mv
からクエリします。 - ユーザー
sales
には列marketsegment
とaccountbalance
のクエリを実行するアクセス許可があるため、各 SELECT ステートメントは 5 行を返します。次のコードをご参照ください。 - 次のコードで、
accountbalance
列を更新します。 - SELECT ステートメントで 2000 の値が含まれている 1 行を返します。次のコードをご参照ください。
- 次のコードを使用して、
accountbalance
列を条件nationid=1
で更新します。 - ユーザー sales は where 句の列 nationid に対する列レベルの特権を持たないため、UPDATE ステートメントはアクセス許可拒否エラーを返します。
- 次のコードを使用して、nationid でレコードグループの数のクエリを実行します。
- ユーザー
sales
は group by 句の列nationid
に対する列レベルの特権を持たないため、SELECT ステートメントはアクセス許可拒否エラーを返します。 - 列レベルの特権は、SELECT リスト内の列だけでなく、
where
句、order by
句、group by
句、having
句、列のSELECT/UPDATE
特権を必要とするクエリのその他の句についても確認します。 - ユーザー sales の列レベルのアクセス制御から列
marketsegment
を削除し (REVOKE
コマンドを使用)、何が起こるかを確認します。以下のコードを入力します。 - ご覧のように、ユーザー
sales
はテーブル customer からmarketsegment
を表示できなくなりました。 - 次のコードを入力して、列
marketsegment
をビューcustomer_vw
からクエリします。 - ユーザー
sales
はビューの列marketsegment
にアクセスできるため (テーブルcustomer
から列レベルの特権が取り消されても)、ステートメントは 5 行を返します。ビューの所有者のアクセス許可でビューを実行するため、ビューが使用するベーステーブルに対する列またはテーブルレベルの特権をビューの所有者が持っている限り、引き続き機能し続けます。機密データへの不正アクセスを防ぐために、ユーザー sales に対する列レベルの特権もビューから取り消す必要があります。 - 次のコードを使用して、ユーザー
sales
のすべてのアクセス許可を取り消します。 - 次のコードを使用して、ユーザー
sales
でテーブル、ビュー、マテリアライズドビューを再度クエリします。 - アクセス許可拒否エラーが返されます。これは、
REVOKE
がすべてのアクセス許可を削除できることを示しています。
つまり、シンプルな GRANT
ステートメントで、Amazon Redshift のテーブル、ビュー、マテリアライズドビューで列レベルのアクセス制御を有効にできるということです。REVOKE
ステートメントは、アクセス許可を削除するために必要です。これで、レガシービューベースのアクセス制御の複雑さが解消されるため、読み込みと書き込みのきめ細かなアクセス制御が実現します。
クリーンアップ
上記のテストが完了したら、次のコードでオブジェクトとユーザーを削除します。
まとめ
Amazon Redshift はデフォルトでもセキュアなため、セキュリティに追加費用がかかりません。認証 (Active Directory、Okta、Ping Federate、Azure AD) とフェデレーションを提供しており、また、AWS IAM および KMS と統合済みです。さらに、2019 年 9 月以降、Amazon Redshift のデータに対するテーブルベースでのアクセス制御と、Amazon Redshift Spectrum を介した Amazon S3 のデータに対する列レベルのアクセス制御もサポートされるようになりました。Amazon Redshift ではローカルテーブルの列レベルのアクセス制御をサポートするようになったため、ビューベースのアクセス制御を実装したり、別のシステムを使用したりする必要がなくなりました。
この投稿では、Amazon Redshift の列レベルのアクセス制御を簡単に設定する方法をご紹介しました。この投稿のユースケースでは、テーブル、ビュー、マテリアライズドビューに対するきめ細かなアクセスを確認する方法を解説しました。こうした機能を活用することで、ビジネスニーズをサポートできます。
ご不明な点がございましたら、下記へコメントをお寄せください。
著者について
BP Yau は AWS のデータウェアハウススペシャリストソリューションアーキテクトです。 彼の役割は、お客様がビッグデータソリューションを構築して大規模にデータを処理するのをサポートすることです。AWS に加わる前は、Amazon.com の Supply Chain Optimization Technologies が Oracle Data Warehouse を Amazon Redshift に移行するのを支援し、AWS テクノロジーを使用して次世代のビッグデータ分析プラットフォームを構築しました。
Srikanth Sopirala はシニアスペシャリストソリューションアーキテクトで、AWS のアナリティクスに力を入れています。 彼は、お客様がクラウドでスケーラブルなデータと分析ソリューションを構築するのをサポートすることに情熱を傾けています。