Amazon Web Services ブログ
Amazon RDS for SQL Server インスタンスのデータベース名の可視性制御
マルチテナント SQL Server 環境では、データベース名の公開により機密のテナント情報が漏洩するリスクという設計上の課題があります。オンプレミスまたは Amazon Elastic Compute Cloud (Amazon EC2) 上で動作するセルフマネージドな SQL Server では、特定のログインに対してサーバーレベルの権限を手動で拒否することで、この課題に対処できます。Amazon Relational Database Service (Amazon RDS) for SQL Server では、専用のストアドプロシージャを使用してデータベースの可視性を設定します。
デフォルトでは、SQL Server の PUBLIC ロールは認証されたユーザーがすべてのデータベース名を表示することを許可しています。これは透明性を意図した機能ですが、マルチテナントアーキテクチャにおいては重大な懸念事項となる可能性があります。同一インスタンス上で複数の顧客データベースをホスティングする独立系ソフトウェアベンダー (ISV) やサービスとしてのソフトウェア (SaaS) プロバイダーは、テナントの機密性を保護するためにこのデフォルト動作に対する慎重な検討対策が必要です。
この投稿では、可視性レベルでのテナント分離を実装し、各テナントが自身のリソースにはアクセスできる一方で、他の顧客のデータベース名は参照できないようにする方法を紹介します。
ソリューション概要
このソリューションは、データベース名からテナント情報が漏洩してしまう可能性があるマルチテナントの SQL Server 環境における重要なアーキテクチャ課題に対処します。Amazon RDS for SQL Server のカスタムストアドプロシージャである msdb.dbo.rds_manage_view_db_permission を使用することで、アプリケーション機能を完全に維持しながら、ログイン単位でデータベースの可視性を効果的に制御できます。
重要なことは、このソリューションはデータベースの可視性のみを管理します。適切なデータベース権限を持つログインは、SQL Server Management Studio (SSMS) やその他の SQL Server クライアントでデータベース名が表示されない場合でも、付与された権限に従ってデータベースに完全にアクセスし、使用することができます。これは、共有インスタンス上でマルチテナントデータベースをホスティングする SaaS プロバイダーや ISV にとって特に価値があります。
実装は以下のハイレベルなステップに従います:
- マルチテナントデータベースとログインを含む RDS for SQL Server インスタンスを準備します。
- 特定のログインに対してデータベースの可視性を拒否するカスタムストアドプロシージャを適用します。
- 制限された可視性を確認して設定を検証します。
- 必要に応じて変更を元に戻す機能を維持します。
このソリューションは、情報開示のリスクを軽減することでセキュリティ体制を強化し、データベース名をテナントに公開することなく、クリーンなテナント体験を提供します。以下の図は、実装前後のセキュリティ体制を示しています。

前提条件
以下の前提条件を満たしている必要があります:
- AWS アカウントへのアクセス
- SQL Server とセキュリティ概念の基本的な理解
- RDS for SQL Server DB インスタンスとそれに接続するためのログイン情報
Amazon RDS for SQL Server をデプロイすると料金が発生します。続行する前に AWS 料金を確認してください。
RDS for SQL Server インスタンスの準備
2 つの新しいデータベースと 2 つのログインを作成し、適切な権限を付与する:
- AWS CLI または AWS Management Console を使用して RDS for SQL Server インスタンスを作成します。
Primaryログインを使用して RDS for SQL Server インスタンスに接続します。Tenant1DBとTenant2DBの 2 つのデータベースを作成します:- 2 つのログインオブジェクト、
Tenant1とTenant2を作成してください: Tenant1にTenant1DBへの権限を付与します:Tenant2にTenant2DBへの権限を付与します:
データベース権限の確認
各テナントのログインを使用してログインし、すべてのデータベース名が表示されるデフォルトの動作を検証します:
- SSMS を開きます。
Tenant1を使用してログインします。Databasesフォルダを展開します。Tenant1がすべてのデータベース名を確認できることを確認します。

- 同様に、
Tenant2を使用してインスタンスにログインします。 Tenant2がすべてのデータベース名を確認できることを確認します。

データベース名の表示権限を変更
このセクションでは、Amazon RDS for SQL Server のカスタムストアドプロシージャを適用して、ログインのデータベース可視性を変更します:
Primaryログイン を使用してインスタンスに接続してください。- 以下のスクリプトを実行してください:
前述したように、ストアドプロシージャはデータベースの権限を制御するのではなく、データベース名を非表示にするだけです。
データベース名表示の権限を検証
Tenant1 がデータベース名を表示されていないことを確認できます:
- SSMSを開きます。
Tenant1を使用してログインします。Databasesフォルダを展開します。Tenant1が データベース名を一切見ることができないことを確認します。

データベース名は非表示になっています。ただし、Tenant2 ログインでインスタンスに接続すると、データベース名が表示されるはずです。これは、カスタムストアドプロシージャが Tenant2 ログインに適用されていないからです。

データベース名が表示されています。
変更を元に戻す
変更を元に戻すには、以下の手順を実行してください:
- 以下のコマンドを実行して変更を元に戻してください:
- ログアウトして、
Tenant1ログインを使用して RDS インスタンスへの新しいクエリセッションを開きます。 - データベース名を再度確認できることを確認してください。

データベース名が表示されています。
制限事項
- ログインが削除され再作成された場合、権限を再適用するためにストアドプロシージャを再実行する必要があります。
- このストアドプロシージャはデータベースアクセス権限を管理しません。データベースアクセス権限は、適切なセキュリティ対策を通じて別途管理する必要があります。
- この権限が適用されている場合でも、データベース名は SQL Server トレース、エラーログ、および特定の動的管理ビュー (DMV) に表示される可能性があります。
- 権限が取り消されると、そのログインにデータベース名が表示されるようになります。
- 権限はサーバーレベルで設定されます。復元方法を使用してデータベースが新しいインスタンスに復元される場合、権限を再適用する必要があります。
- データベース名の表示制御は
Primaryログインには適用できません。Primaryログインには常にすべてのデータベース名が表示されます。
クリーンアップ
このデモンストレーションに従うためにテストデータベースを作成した場合は、不要な料金を避けるためにリソースをクリーンアップしてください。RDS for SQL Server インスタンスからテストユーザー、ログイン、データベースを削除してください。このデモのために特別に RDS インスタンスや EC2 ホストを作成した場合は、これ以上使用しないのであれば、それぞれ Amazon RDS コンソールと Amazon EC2 コンソールを通じてこれらのリソースを削除してください。これにより、不要な料金の発生を避けることができます。
結論
この投稿では、Amazon RDS for SQL Server を使用したマルチテナント環境でのデータベース名の可視性管理方法を実演しました。 同一ホスト上の他のテナントがデータベース名を通じて漏洩する可能性のある機密性の高い顧客情報を見ることを防ぐことができるよう、Amazon RDS for SQL Server カスタムストアドプロシージャを使用してデータベース名を非表示にするプロセスを説明しました。この解決策を Amazon RDS for SQL Server 環境に適用して、アプリケーションに必要なアクセス権限を維持しながらデータベース名の可視性を制御することができます。
Amazon RDS 固有の一般的な DBA タスクについて詳しく学ぶには、「Amazon RDS for Microsoft SQL Serverの一般的な DBA タスク」を参照してください。
翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文はこちらです。