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 にとって特に価値があります。

実装は以下のハイレベルなステップに従います:

  1. マルチテナントデータベースとログインを含む RDS for SQL Server インスタンスを準備します。
  2. 特定のログインに対してデータベースの可視性を拒否するカスタムストアドプロシージャを適用します。
  3. 制限された可視性を確認して設定を検証します。
  4. 必要に応じて変更を元に戻す機能を維持します。

このソリューションは、情報開示のリスクを軽減することでセキュリティ体制を強化し、データベース名をテナントに公開することなく、クリーンなテナント体験を提供します。以下の図は、実装前後のセキュリティ体制を示しています。

Diagram comparing Amazon RDS for SQL Server database visibility before and after hiding tenant database names for improved security

前提条件

以下の前提条件を満たしている必要があります:

Amazon RDS for SQL Server をデプロイすると料金が発生します。続行する前に AWS 料金を確認してください。

RDS for SQL Server インスタンスの準備

2 つの新しいデータベースと 2 つのログインを作成し、適切な権限を付与する:

  1. AWS CLI または AWS Management Console を使用して RDS for SQL Server インスタンスを作成します。
  2. Primary ログインを使用して RDS for SQL Server インスタンスに接続します。
  3. Tenant1DBTenant2DB の 2 つのデータベースを作成します:
    CREATE DATABASE Tenant1DB
    GO
    CREATE DATABASE Tenant2DB
    GO
    Code
  4. 2 つのログインオブジェクトTenant1Tenant2 を作成してください:
    USE [master]
    GO
    CREATE LOGIN [Tenant1] WITH PASSWORD=N'xxxxxx' 
    GO
    USE [master]
    GO
    CREATE LOGIN [Tenant2] WITH PASSWORD=N'xxxxxx' 
    GO
    SQL
  5. Tenant1Tenant1DB への権限を付与します:
    USE [Tenant1DB]
    GO
    CREATE USER [Tenant1] FOR LOGIN [Tenant1]
    GO
    USE [Tenant1DB]
    GO
    ALTER ROLE [db_owner] ADD MEMBER [Tenant1]
    GO
    SQL
  6. Tenant2Tenant2DB への権限を付与します:
    USE [Tenant2DB]
    GO
    CREATE USER [Tenant2] FOR LOGIN [Tenant2]
    GO
    USE [Tenant2DB]
    GO
    ALTER ROLE [db_owner] ADD MEMBER [Tenant2]
    GO
    SQL

データベース権限の確認

各テナントのログインを使用してログインし、すべてのデータベース名が表示されるデフォルトの動作を検証します:

  1. SSMS を開きます。
  2. Tenant1 を使用してログインします。
  3. Databases フォルダを展開します。
  4. Tenant1 がすべてのデータベース名を確認できることを確認します。
    SQL Server Management Studio Object Explorer showing Tenant1 connection to version 16.0.4175.1 with multi-tenant databases including Tenant1DB and Tenant2DB
  5. 同様に、Tenant2 を使用してインスタンスにログインします。
  6. Tenant2 がすべてのデータベース名を確認できることを確認します。
    SQL Server Management Studio Object Explorer showing Tenant2 connection to version 16.0.4175.1 with multi-tenant databases including Tenant1DB and Tenant2DB

データベース名の表示権限を変更

このセクションでは、Amazon RDS for SQL Server のカスタムストアドプロシージャを適用して、ログインのデータベース可視性を変更します:

  1. Primary ログイン を使用してインスタンスに接続してください。
  2. 以下のスクリプトを実行してください:
    EXEC msdb.dbo.rds_manage_view_db_permission @permission='DENY', @server_principal='Tenant1'
    SQL

前述したように、ストアドプロシージャはデータベースの権限を制御するのではなく、データベース名を非表示にするだけです。

データベース名表示の権限を検証

Tenant1 がデータベース名を表示されていないことを確認できます:

  1. SSMSを開きます。
  2. Tenant1 を使用してログインします。
  3. Databases フォルダを展開します。
  4. Tenant1が データベース名を一切見ることができないことを確認します。
    SQL Server Management Studio Object Explorer for Tenant1 showing expanded Databases folder with annotation indicating database names are hidden for security

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

SQL Server Management Studio Object Explorer for Tenant2 showing visible database names including rdsadmin, Tenant1DB, and Tenant2DB with annotation highlighting database visibility

データベース名が表示されています。

変更を元に戻す

変更を元に戻すには、以下の手順を実行してください:

  1. 以下のコマンドを実行して変更を元に戻してください:
    EXEC msdb.dbo.rds_manage_view_db_permission @permission='GRANT', @server_principal= ‘Tenant1’
    SQL
  2. ログアウトして、Tenant1 ログインを使用して RDS インスタンスへの新しいクエリセッションを開きます。
  3. データベース名を再度確認できることを確認してください。

SQL Server Management Studio Object Explorer for Tenant1 reverting permissions showing visible database names including rdsadmin, Tenant1DB, and Tenant2DB with annotation highlighting database visibility

データベース名が表示されています。

制限事項

  • ログインが削除され再作成された場合、権限を再適用するためにストアドプロシージャを再実行する必要があります。
  • このストアドプロシージャはデータベースアクセス権限を管理しません。データベースアクセス権限は、適切なセキュリティ対策を通じて別途管理する必要があります。
  • この権限が適用されている場合でも、データベース名は 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 が担当しました。原文はこちらです。


著者について

Swarndeep Singh

Swarndeep Singh

Swarndeep は、AWS のシニアデータベース専門ソリューションアーキテクトです。データベースエンジニアリングとアーキテクチャにおいて 20 年以上の経験を持ち、商用およびオープンソースのデータベースエンジン全般にわたって革新的なソリューションの提供を専門としています。

Alex Pawvathil

Alex Pawvathil

Alex は、データベースソリューションと実装を専門とする AWS のシニアテクニカルアカウントマネージャーです。データベースエンジニアリングと SQL Server テクノロジーにおいて 14 年以上の経験を持ち、Amazon RDS for SQL Server の実装とエンタープライズ規模の展開に関する専門家として活動しています。