Amazon Web Services ブログ

Amazon RDS for SQL Server でマスターユーザーの権限をクローンする方法

新しい Amazon Relational Database Service (Amazon RDS) for SQL Server インスタンスを作成すると、そのデータベースインスタンスに対して特定の権限がマスターユーザーに付与されます。アプリケーションでマスターユーザーを直接使用しないことを強くお勧めします。代わりに、最小権限の原則とベストプラクティスに従い、アプリケーションに必要な最小限の権限を持つデータベースユーザーを作成してください。

この手法は、次のようなユースケースに適用できます。

  • アプリケーション固有の SQL Server ログインを使用する代わりにマスターユーザーを使用する
  • セキュリティと説明責任のために、データベース管理者 (DBA) に名前付きアカウントを使用する
  • Amazon RDS for SQL Server に接続するアプリケーションとサービスに対して、最小権限のセキュリティモデルを実装し、特定の名前付きアカウントを使用する

この投稿では、マスターユーザーを新しいログインにクローンし、必要最小限の権限を確認する方法について説明します。アプリケーションに必要のない権限を削除することで、最小権限の セキュリティモデルを実装できます。

ソリューション概要

このソリューションでは、マスターユーザーをクローンするために以下の手順を実行します。

  • ユーザーを複製したい環境で、usp_rds_clone_login という名前のストアドプロシージャを作成します。これは、SQL Server Management Studio (SSMS) を使用して Amazon RDS for SQL Server インスタンスに接続することで実現できます。
  • ストアドプロシージャを実行すると、実行した時点での権限が記述された T-SQL スクリプトが生成されます。
  • SSMS の結果ペインからスクリプトをコピーし、新しいクエリウィンドウで実行します。

ストアドプロシージャが実行された後、マスターログインと同様のサーバーレベルおよびデータベースレベルの権限を持つ「create login」スクリプトが生成されます。

前提条件

RDS インスタンスでマスターユーザーをクローンする前に、次の準備が整っている必要があります。

  • Amazon RDS for SQL Server インスタンス
  • データベースへの接続が可能な SSMS
  • 必要な権限を持つユーザー

ストアドプロシージャの作成

ユーザーを複製したい環境で、usp_rds_clone_login (ダウンロード) という名前のストアドプロシージャを作成します。次のステップで、特定のログインアカウント、データベースユーザー、サーバーレベルの権限、およびデータベースレベルの権限のクローンを作成するためにこのストアドプロシージャを使用します。Amazon RDS for SQL Server のシステムデータベース以外の任意のユーザーデータベースにストアドプロシージャを作成できます。

プロセスの一部として、スクリプトは次のアクションを実行します。

  • 指定されたパスワードを使用して新しいログインを作成する
  • 新しいログインにサーバーロールのメンバーシップを割り当てる
  • 新しいログインにサーバーレベルの権限を割り当てる
  • LoginToDuplicate に従って、新しいログイン用のデータベースユーザーを作成する
  • LoginToDuplicate に従って、新しいユーザーにデータベースロールメンバーシップを割り当てる
  • LoginToDuplicate に従って、新しいユーザーにデータベースレベルの権限を割り当てる

ストアドプロシージャを実行する際、ストアドプロシージャを実行するユーザーにこれらの権限を付与するアクセス権がない場合、スクリプトは結果を生成しません。ユーザーに権限を付与するアクセス権がない場合、出力スクリプトにはその権限が表示されません。これは、スクリプトにアクセスするために使用されるログインに表示権限がないためです。さらに、権限を付与する権限がないのに手動で権限スクリプトを追加しようとするとスクリプトは失敗します。

ストアドプロシージャの実行

ストアドプロシージャを作成した後、新しい T-SQL ウィンドウを開き、次の形式でストアドプロシージャを実行します。スクリプトを実行する前に、キーボードの CTRL + T を押して、結果がテキスト形式になっていることを確認してください。

-- SQL server authentication login 
EXEC usp_rds_clone_login @NewLogin = [<duplicate_login_name>],
                         @NewLoginPwd = 'Password_for_new_login_here',
                         @LoginToDuplicate = master_login,
                         @WindowsAuth = 0;

-- Windows authentication login 
EXEC usp_rds_clone_login @NewLogin = [<domain\duplicate_login_name>],
                         @NewLoginPwd = NULL,
                         @LoginToDuplicate = master_login,
                         @WindowsAuth = 1;
SQL

次は、管理者アカウントを新しいドメインユーザーアカウントにクローニングした際の出力例です。

EXEC dbo.usp_rds_clone_login @NewLogin = 'MyDomain\MyDomainUser',
                             @NewLoginPwd = NULL,
                             @WindowsAuth = 1,
                             @LoginToDuplicate = 'admin';
SQL

出力:

/*Cloning Process Steps*/
/*==================================================*/
/*1 - Create new login*/
/*2 - Server role membership for new login*/
/*3 - Server level permissions for the new login*/
/*4 - Create database user for new login*/
/*5 - Database role membership for db user*/
/*6 - Database level permissions*/
/*==================================================*/
/*1 - Create new login*/
CREATE LOGIN [MyDomain\MyDomainUser] FROM WINDOWS;
/*2 - Server role memberships for new login*/
EXEC sp_addsrvrolemember @loginame = 'MyDomain\MyDomainUser', @rolename = 'setupadmin';
EXEC sp_addsrvrolemember @loginame = 'MyDomain\MyDomainUser', @rolename = 'processadmin';
/*3 - Server level permissions for the new login*/
USE master;GRANT ALTER ANY EVENT SESSION TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ADMINISTER BULK OPERATIONS TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER ANY SERVER AUDIT TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER ANY CONNECTION TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER ANY LOGIN TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER ANY LINKED SERVER TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER ANY SERVER ROLE TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER SERVER STATE TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT ALTER TRACE TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT CREATE ANY DATABASE TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT VIEW ANY DEFINITION TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT VIEW ANY DATABASE TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE master;GRANT VIEW SERVER STATE TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
GRANT ALTER ANY CREDENTIAL TO [MyDomain\MyDomainUser] ;
/*4 - Create database user for new login*/
USE [DBATools]; 
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'admin')
BEGIN
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'MyDomain\MyDomainUser') 
EXEC sys.sp_change_users_login 'Update_One', 'MyDomain\MyDomainUser', 'MyDomain\MyDomainUser' 
ELSE CREATE USER [MyDomain\MyDomainUser] FROM LOGIN [MyDomain\MyDomainUser];
END;
USE [master]; 
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'admin')
BEGIN
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'MyDomain\MyDomainUser') 
EXEC sys.sp_change_users_login 'Update_One', 'MyDomain\MyDomainUser', 'MyDomain\MyDomainUser' 
ELSE CREATE USER [MyDomain\MyDomainUser] FROM LOGIN [MyDomain\MyDomainUser];
END;
USE [msdb]; 
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'admin')
BEGIN
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'MyDomain\MyDomainUser') 
EXEC sys.sp_change_users_login 'Update_One', 'MyDomain\MyDomainUser', 'MyDomain\MyDomainUser' 
ELSE CREATE USER [MyDomain\MyDomainUser] FROM LOGIN [MyDomain\MyDomainUser];
END;
USE [rdsadmin]; 
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'admin')
BEGIN
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'MyDomain\MyDomainUser') 
EXEC sys.sp_change_users_login 'Update_One', 'MyDomain\MyDomainUser', 'MyDomain\MyDomainUser' 
ELSE CREATE USER [MyDomain\MyDomainUser] FROM LOGIN [MyDomain\MyDomainUser];
END;
USE [tempdb]; 
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'admin')
BEGIN
IF EXISTS(SELECT name FROM sys.database_principals WHERE name = 'MyDomain\MyDomainUser') 
EXEC sys.sp_change_users_login 'Update_One', 'MyDomain\MyDomainUser', 'MyDomain\MyDomainUser' 
ELSE CREATE USER [MyDomain\MyDomainUser] FROM LOGIN [MyDomain\MyDomainUser];
END;
/*5 - Database role membership for db user*/
USE [DBATools]; EXEC sp_addrolemember @rolename = 'db_owner', @membername = 'MyDomain\MyDomainUser';
USE [msdb]; EXEC sp_addrolemember @rolename = 'SQLAgentUserRole', @membername = 'MyDomain\MyDomainUser';
/*6 - Database level permissions*/
USE [DBATools]; DENY BACKUP DATABASE ON DATABASE::[DBATools] TO [MyDomain\MyDomainUser];
USE [DBATools]; DENY BACKUP LOG ON DATABASE::[DBATools] TO [MyDomain\MyDomainUser];
USE [msdb]; GRANT ALTER ANY USER ON DATABASE::[msdb] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_restore_tde_certificate] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_task_status] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_tlog_copy_setup] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_tlog_backup_copy_to_S3] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_output] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_task_status] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_shrink_tempdbfile] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_cdc_disable_db] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_cdc_enable_db] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_tuninglog] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_get_audit_file] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_download_from_s3] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_database] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_delete_from_filesystem] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_gather_file_details] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_list_file_details] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_add_profile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_partitionfunction] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_sqlagent_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_update_profile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_msbi_task] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_delete_profile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_upload_to_s3] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_profile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_partitionscheme] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_msdtc_transaction_tracing] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_drop_ssrs_databases] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_drop_ssis_database] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_table] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_failover_time] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_add_account_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_update_account_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_changedbowner_to_rdsa] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_delete_account_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_account_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_tableview] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_add_profileaccount_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_purge_jobhistory] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_update_profileaccount_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_query] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_dms_tlog_download] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_delete_profileaccount_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_dms_tlog_list_current_lsn] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_profileaccount_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_dms_tlog_read] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_querytable] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_configure_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_add_principalprofile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_querydatabase] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_update_principalprofile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_delete_principalprofile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_principalprofile_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_index] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_status_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_help_queue_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_queryindex] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_column] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_indexcolumn] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_send_dbmail] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_reports_querycolumn] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_delete_database_backuphistory] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysjobhistory] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysjobs] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysjobactivity] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_add_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_delete_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_update_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_grant_login_to_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_revoke_login_from_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_enum_proxy_for_subsystem] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_sysmail_control] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sp_enum_login_for_proxy] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_sysmail_allitems] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_sysmail_event_log] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_sysmail_mailattachments] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_sysmail_delete_mailitems_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysmail_allitems] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_server_object_last_sync_time] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysmail_sentitems] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_get_system_database_sync_objects] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysmail_unsentitems] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_set_system_database_sync_objects] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysmail_faileditems] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_input] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_delete_mailitems_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_backup_database] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_backup_tde_certificate] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysmail_mailattachments] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_cancel_task] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_drop_tde_certificate] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[sysmail_event_log] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_finish_restore] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[sysmail_delete_log_sp] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_list_tlog_backup_metadata] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[rds_fn_list_user_tde_certificates] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT SELECT ON OBJECT::[dbo].[DTA_progress] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_restore_database] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT EXECUTE ON OBJECT::[dbo].[rds_restore_log] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT ALTER ON ROLE::[SQLAgentUserRole] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [msdb]; GRANT ALTER ON ROLE::[SQLAgentOperatorRole] TO [MyDomain\MyDomainUser] WITH GRANT OPTION;
USE [tempdb]; GRANT CONTROL ON DATABASE::[tempdb] TO [MyDomain\MyDomainUser];
SQL

出力されたスクリプトをコピーして実行

スクリプトが出力を生成した後、SSMS の結果タブから出力されたスクリプトをコピーし、新しいクエリウィンドウから実行します。スクリプトが実行された後、マスターログインと同様のサーバーレベルとデータベースレベルの権限を持つ新しいログインアカウントが作成されます。

この例では、SSISDB データベースの ssis_admin と ssis_logreader の権限は除外されています。これらの権限が必要な場合は、別途指定してください。

ALTER ROLE [ssis_admin] ADD MEMBER [mydomain\user_name];
ALTER ROLE [ssis_logreader] ADD MEMBER [mydomain\user_name];
SQL

クリーンアップ

ログインを複製した後、(例えば、コンプライアンスの理由で) ストアドプロシージャを保持したくない場合は、次のスクリプトを使用してドロップできます。

USE [DB_NAME]
GO
DROP PROCEDURE [dbo].[usp_rds_clone_login];
GO
SQL

結論

この投稿では、Amazon RDS for SQL Server でマスターユーザーを新しいログインにクローンする方法について説明しました。また、アプリケーションでマスターユーザーを使用しないための主な考慮事項とベストプラクティスについても説明しました。このソリューションは、ビジネスニーズに必要な最小限の権限を持つ新しいログインを作成するのに役立ちます。

翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文は こちらです。


著者について

Alvaro Costa-Neto は AWS のデータベーススペシャリストソリューションアーキテクトで、クラウド上でのデータベースソリューションの設計と実装を支援しています。彼はデータベース技術に興味があり、主に Microsoft SQL Server を使って 19 年以上にわたり活動してきました。彼はフロリダ州クレルモントに妻と 2 人の子供たちと住んでおり、家族と航空と旅行の愛好家です。仕事を離れると、家族や友人とクックアウトを主催したり、新しい場所を探索したりするのが好きです。

Rakesh Ramanukolanu は、Amazon Web Services のシニアデータベーススペシャリストソリューションアーキテクトです。様々な業界のお客様に対し、SQL Server のワークロードを Amazon RDS や Amazon RDS Custom のようなマネージド データベース プラットフォームに設計、移行、最適化するのを支援しています。

Mesgana Gormley は Amazon Web Services のシニアデータベーススペシャリストソリューションアーキテクトです。彼女は Amazon RDS チームで働き、お客様に技術的なガイダンスを提供し、リレーショナルデータベースワークロードの移行、設計、展開、最適化を支援しています。