現在、SQL Server開発スタッフのためのTEST環境を作成しています。
本番環境には3つのSQLサーバーがあり、SQL01
にはSQL02
にミラーリングされたいくつかのデータベースが含まれています。 SQL03
は、「自動フェイルオーバーによる高い安全性」または同期構成での証人として機能します。
VMWare P2Vを使用して、3台のマシンすべてを個別のハードウェアに仮想化し、マシンのSIDを再構成し、これらの新しいマシンから本番サーバーのIPアドレスをブラックホール化しました。
私は最初にプロダクション監視マシンをブラックホール化するのを忘れていたので、TESTマシンのデータベースはまだSQL03
マシンを監視として使用していました。この問題に気付いて、私はTESTのデータベースを再構成して、新しく仮想化されたTESTの監視を指すようにし、TEST03
と呼びます。
新しいミラーリング監視を使用するようにデータベースを再構成するには、プライマリサーバーTEST01
で次のコマンドを入力しました。
ALTER DATABASE [TestDB] SET WITNESS = 'TCP://TEST03.domain.inet:5022';
予期しない応答がありました:
The ALTER DATABASE command could not be sent to the remote server instance
'TCP://TEST03.domain.inet:5022'. The database mirroring configuration was
not changed. Verify that the server is connected, and try again.
構成は運用マシンで機能し、テストマシンでは変更されていないため、このエラーメッセージに非常に困惑しました。
これを機能させるために、テストウィットネスにLOGIN
を作成する必要がありました。
CREATE LOGIN [DOMAIN\SQLServiceAccount] FOR WINDOWS WITH DEFAULT_DATABASE [Master];
問題のエンドポイントに対するGRANT
it CONNECT
権限:
GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\SQLServiceAccount];
その後、テスト環境のミラーリングされたデータベースを新しいテストの目撃者に正しくポイントすることができました。
プロダクション監視エンドポイントを検査して、それに関連付けられているセキュリティを確認するにはどうすればよいですか?
私は検査できるシステムカタログがいくつかあるはずだと思いますが、Books-on-LineにはEndpointsに固有のものはなく、BingはBinglessです。
追加情報:
SELECT ep.endpoint_id, p.class_desc, p.permission_name, ep.name, sp.name
FROM sys.server_permissions p
INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
INNER JOIN sys.server_principals sp ON p.grantee_principal_id = sp.principal_id
WHERE class = '105';
戻り値:
endpoint_id class_desc permission_name endpoint_name principal_name
2 ENDPOINT CONNECT TSQL Local Machine public
3 ENDPOINT CONNECT TSQL Named Pipes public
4 ENDPOINT CONNECT TSQL Default TCP public
5 ENDPOINT CONNECT TSQL Default VIA public
そして:
SELECT name, endpoint_id, protocol_desc, type_desc, role_desc
FROM sys.database_mirroring_endpoints;
戻り値:
name endpoint_id protocol_desc type_desc role_desc
Mirroring 65536 TCP DATABASE_MIRRORING WITNESS
ミラーリングエンドポイントオブジェクトのsys.server_permissions
にエントリがないようです。 65536に一致するmajor_id
およびminor_id
はありません。また、エンドポイントへの参照を含むシステムデータベースはありません。
私は途方に暮れています。
SQL Server 2012への移行の準備として、DEV環境でミラーデータベースをサーバーからサーバーに移動することに1日の一部を費やした後、ENDPOINTセキュリティが決定されていることを説明する this MSDNドキュメントに出会いましたSQL Serverが実行されているアカウントの種類にのみ基づいています。 SQL Serverがドメインアカウントを使用している場合、そのアカウントは自動的にエンドポイントにアクセスできます。 SQL Serverが[ネットワークサービス]や[ローカルシステム]などのビルトインアカウントを使用している場合、エンドポイントはセキュリティ証明書で構成する必要があり、証明書の所有者のみがエンドポイントにアクセスできます。
ドキュメントの関連セクション:
データベースミラーリングエンドポイントの認証の種類の決定
サーバーインスタンスのSQL Serverサービスアカウントによって、データベースミラーリングエンドポイントに使用できる認証の種類が次のように決まることを理解することが重要です。
すべてのサーバーインスタンスがドメインサービスアカウントで実行されている場合は、データベースミラーリングエンドポイントにWindows認証を使用できます。すべてのサーバーインスタンスが同じドメインユーザーアカウントとして実行されている場合、正しいユーザーログインが両方のマスターデータベースに自動的に存在します。これにより、可用性データベースのセキュリティ構成が簡素化され、推奨されます。
可用性グループの可用性レプリカをホストしているサーバーインスタンスが異なるアカウントとして実行されている場合、各アカウントのログインは、他のサーバーインスタンスのマスターに作成する必要があります。次に、そのログインに、そのサーバーインスタンスのデータベースミラーリングエンドポイントに接続するためのCONNECT権限を付与する必要があります。
サーバーインスタンスがWindows認証を使用している場合、Transact-SQL、PowerShell、または新しい可用性グループウィザードを使用して、データベースミラーリングエンドポイントを作成できます。
注意:
可用性レプリカをホストするサーバーインスタンスにデータベースミラーリングエンドポイントがない場合、新しい可用性グループWizardは、Windows認証を使用するデータベースミラーリングエンドポイントを自動的に作成できます。
ローカルシステム、ローカルサービス、ネットワークサービスなどの組み込みアカウント、または非ドメインアカウントでサーバーインスタンスが実行されている場合は、エンドポイント認証に証明書を使用する必要があります。データベースミラーリングエンドポイントに証明書を使用している場合、システム管理者は、送信接続と受信接続の両方で証明書を使用するように各サーバーインスタンスを構成する必要があります。
証明書を使用してデータベースミラーリングのセキュリティを構成する自動化された方法はありません。 CREATE ENDPOINT Transact-SQLステートメントまたはNew-SqlHadrEndpoint PowerShellコマンドレットを使用する必要があります。詳細については、「CREATE ENDPOINT(Transact-SQL)」を参照してください。
Remus Rusanu(彼の答えで)は、ミラーリングエンドポイントに設定されているセキュリティを決定する方法を正しく識別しました。のように:
SELECT ep.name, sp2.name AS Grantee, sp.name AS Grantor, p.permission_name, ep.state_desc
FROM sys.server_permissions p
INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
INNER JOIN sys.server_principals sp ON p.grantor_principal_id = sp.principal_id
INNER JOIN sys.server_principals sp2 ON p.grantee_principal_id = sp2.principal_id
WHERE p.class_desc = 'ENDPOINT' AND ep.type_desc = 'DATABASE_MIRRORING'
ただし、SQL Server 2005の場合、元のミラーリングエンドポイントはこのクエリの結果に表示されません。これは、デフォルトのセキュリティにより、SQL Serverが実行されているアカウントへのCONNECTアクセスが許可されているためです(上記で説明)。
したがって、ENDPOINTへのCONNECTアクセス権を持つユーザーをどのようにして知ることができるかという質問に対する正規の回答は、上記のクエリと、エンドポイントへのアクセス権を使用して構成した可能な証明書とともに、SQL Serverが使用しているアカウントの合計です。 。
私はたまたま本番のデータベースにこれを設定しましたが、同じことを考えていたため、構成を別のミラーリングセッションと比較して、正しく一致させる必要がありました。
sys.dm_db_mirroring_connections
は必要なものを提供します。 principal_name
が含まれています。
接続許可について検証されたログインの名前。 Windows認証の場合、この値はリモートユーザー名です。証明書認証の場合、この値は証明書の所有者です。
一時停止しているセッションで作業している場合でも、情報が返されるかどうかはわかりませんが、アクティブな接続しかないと考えてください。
sys.database_mirroring_endpoints
サーバーオブジェクトのアクセス許可については、通常の場所 sys.server_permissions
。 Windowsのセキュリティが関係するすべての場合と同様に、Windowsグループのメンバーシップのために物事はより複雑になり、 権限階層 も考慮する必要があります。