web-dev-qa-db-ja.com

Windows以外のユーザーとしてxp_cmdshellを実行する

そのため、xp_cmdshellを呼び出してプロシージャを実行できるデータベースユーザーがたくさんいます。これらはWindowsドメインアカウントではなく、単にsql-serverログインです。プロキシ##xp_cmdshell_proxy_account##を使用したい。私はそれがもたらすかもしれないセキュリティの脅威を知っています。会社の内部バージョン管理のため、「WITH EXECUTE AS admin」を使用できません。すべてのユーザーにxp_cmdshellを実行する権利を与えたくないので、これが私の唯一の選択肢です(ここにいますか?)プロキシアカウントを使用しています。

Xp_cmdshellの実行権限を付与した特別なWindowsドメインアカウントを持っています。このアカウントを使用してcmdshellを正常に実行できます。次のコマンドを使用してプロキシアカウントを作成しました。

EXEC sp_xp_cmdshell_proxy_account  [my_domain\special_account],'SuperSecretPassword'

Xp_cmdshell権限のないデータベースユーザーとしてxp_cmdshellコマンドを実行しようとすると、エラーが表示されます。

The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.

私の質問は-SQLサーバーログインを使用してxp_cmdshellコマンドを実行できますか?ここで何か不足しているのですか、それともドメインアカウントを使用してのみ可能ですか?それを実現するためにここに従う他の手順はありますか?

上記の作業に失敗した場合は、ロジックをCLRプロシージャに切り替える必要がありますが、私はそれを機能させることにしました。

私はsql-server 2012を使用しています。どんな助けにも感謝します、ありがとう!

4
PacoDePaco

Sql serverログインのためにxp_cmdshellへのアクセスを許可する必要があるようです。ユーザーがxp_cmdshellを実行する権限を持つと、非特権ユーザーであるため、プロキシアカウントを使用して実行します。

もう1つの方法は、証明書を使用してストアドプロシージャに署名し、そのストアドプロシージャを実行するユーザーに追加の権限を付与できるようにすることです。

https://msdn.Microsoft.com/en-us/library/bb283630.aspx

証明書の欠点は、変更するたびに手順に再署名する必要があることです。

1
Shane Estelle

SQL Serverログインを使用できます。

次の手順は [〜#〜] msdn [〜#〜] で説明されています:

非管理者がxp_cmdshellを使用できるようにし、SQL Serverが特権の少ないアカウントのセキュリティトークンを使用して子プロセスを作成できるようにするには、次の手順に従います。

  1. プロセスに必要な最小限の特権を持つWindowsローカルユーザーアカウントまたはドメインアカウントを作成してカスタマイズします。
  2. Sp_xp_cmdshell_proxy_accountシステムプロシージャを使用して、その最小特権アカウントを使用するようにxp_cmdshellを構成します。注SQL Server Management Studioを使用して、オブジェクトエクスプローラーでサーバー名の[プロパティ]を右クリックし、[サーバープロキシアカウント]セクションの[セキュリティ]タブでこのプロキシアカウントを構成することもできます。
  3. Management Studioで、マスターデータベースを使用して、GRANT exec ON xp_cmdshell TO ''ステートメントを実行し、特定の非sysadminユーザーにxp_cmdshellを実行する権限を与えます。指定されたログインは、masterデータベースのユーザーにマップされる必要があります。
3
Magier

問題は、xp_cmdshellを正確に何に使用していますか?ランダムなプログラムを実行することですか、それともディレクトリのリストを取得することですか? SQLCLRを回避しているようですが、その理由はわかりません。多くの場合、SQLCLRはより安全で効率的です。しかし、最終的な目標が何であるかについて追加の詳細が提供されない限り、より具体的にすることは不可能です。

それ以外では、署名を使用して、ターゲットを絞った方法でアクセス許可を付与できます(@Shaneもこれに言及しています)。

これを行う例は、次の質問への私の回答で見つけることができます。ここでもDBA.StackExchangeにあります。

SQL Serverエージェントサービスのステータスを確認できるように、ユーザーに最低限必要なアクセス許可を提供する必要がありますか?

基本的な概念は、次のことを行うことです。

  1. masterデータベースに証明書を作成する
  2. この証明書に基づいてログインを作成します
  3. このログインにxp_cmdshellを実行するための適切な権限を付与します
  4. 証明書をバックアップする
  5. xp_cmdshellを呼び出しているストアドプロシージャを含むデータベースに証明書を復元します
  6. ADD SIGNATURE を介してxp_cmdshellを呼び出しているストアドプロシージャに署名する

例の他のバリエーションへの追加リンクは、この質問への私の回答にあります。

ストアドプロシージャは他のデータベースのテーブルを選択および更新できます-最小限の権限が付与されています

1
Solomon Rutzky