web-dev-qa-db-ja.com

xp_cmdshellを使用するリスクを最小化できますか?

xp_cmdshellの使用は非常に役立つ場合があり、場合によってはいくつかのシナリオに対する唯一の答えになることがあります。 xp_cmdshellを有効にするとデータベース/サーバーのセキュリティが危険にさらされる可能性があるというインターネット上の投稿をいくつか読んだことがあります。

私の質問は、リスクを低減するために私たちにできることは何ですか?たとえば、リスクを軽減するための保護手段を提供するなど、いくつかの制限/ユーザーロールの適用などを設定できますか?

ありがとう。

6
Sky

ええと、エンドユーザーに明示的に実行を許可することはできず(それを拒否することもできません)、が実行するログインでEXECUTE ASを使用するストアドプロシージャでのみ有効にする(== --- ==)実行権限を持っている。次に、コマンドを実行する必要があるユーザーに、そのストアドプロシージャのみの実行を許可します。

まず、インスタンスでxp_cmdshellが有効になっていることを確認します。

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'show advanced options', 0;
GO
RECONFIGURE WITH OVERRIDE;

オペレーティングシステムとSQL Serverサービスアカウントによっては、プロキシアカウントを設定する必要がある場合があります(UACのおかげで、これを行うには 昇格が必要で、管理者としてSSMSを起動する必要があります ):

EXEC master..sp_xp_cmdshell_proxy_account 'Domain\User', 'Password';

次に、必要なことをすべて実行するラッパーをデータベースに作成します(これは、何からも実際に保護されない、非常に汎用的なラッパーのサンプルにすぎません。これを使用して、デモンストレーションのみを行います)。

USE yourdb;
GO
CREATE PROCEDURE dbo.uxp_cmdshell
  @cmd VARCHAR(2048)
WITH EXECUTE AS OWNER
AS
BEGIN
  EXEC master.dbo.xp_cmdshell @cmd;
END
GO

次に、プロシージャを実行するための権限をユーザーまたはロールに付与します。

GRANT EXECUTE ON dbo.uxp_cmdshell TO [your_user_or_role!];

ここで、your_userがログインし、xp_cmdshellへのwilly-nilly呼び出しを実行しようとすると、次のようになります。

EXEC master.dbo.xp_cmdshell 'dir c:\';

彼らは得るでしょう:

メッセージ229、レベル14、状態5、手順xp_cmdshell、行1
オブジェクト「xp_cmdshell」、データベース「mssqlsystemresource」、スキーマ「sys」に対するEXECUTE権限が拒否されました。

ただし、新しいプロシージャに同じコマンドを渡した場合:

EXEC dbo.uxp_cmdshell 'dir c:\';

これは正常に機能します(プロキシアカウントが正しく設定されているか、SQL Serverサービスアカウントに適切な権限があると仮定しています)。

これには多少の作業が必要になる場合がありますが、実際には、ユーザーがxp_cmdshellで実行できることを正確に制御できます。

9
Aaron Bertrand

sp_xp_cmdshell_proxy_account を使用してプロキシアカウントを設定し、非管理者がxp_cmdshellを使用できるようにすることもできます。これにより、常にSQL Serverサービスアカウントを使用してxp_cmdshellを使用するのではなく、特権の少ないWindowsアカウントをセットアップできます。これは、SQLエージェントジョブ用のプロキシアカウントの設定に似ています。

6
Patrick Keisler