SQL ServerでCLRを使用する際に、特定のセキュリティまたはパフォーマンスのリスクはありますか?
SQL ServerでCLRを使用する際に、特定のセキュリティまたはパフォーマンスのリスクはありますか?
回答:
Remusが指摘したように、質問は一般的すぎて回答を得ることができません。回答は、使用する機能のコンテキストとその使用方法に依存するためです。
「セキュリティ」について:
でマークされたアセンブリで実行できることについて質問している場合PERMISSION_SET = SAFE
、私がこれまでに発見した問題はありません。また、SQLCLRはxp_cmdshell
、すばらしい(皮肉な)sp_OA*
プロシージャ(または拡張ストアドプロシージャ)を使用するよりも "安全"ですが、誰も作成していないことを願っています。
「SAFE」が実際に何を意味するかについてのウォークスルーが必要な場合は、SQLCLRレベル3への階段:セキュリティ(一般およびSAFEアセンブリ)(無料登録が必要)の記事を参照してください。
でマークされたアセンブリで実行できることについて質問する場合PERMISSION_SET = EXTERNAL_ACCESS
、使用されている機能に応じて、確かにリスクがあります。ディレクトリとファイル名を読み取るルーチン(つまり、読み取り専用)を作成する場合は、何を表示するか、何を表示しないかが問題になります。ファイルを削除できるコードを作成している場合、リスクが高まります。しかし、これらの外部リソースで何ができるかは、以下によって制御されます。
でマークされたアセンブリで実行できることについて質問している場合 PERMISSION_SET = UNSAFE
、それはかなりオープンエンドです。多くの機能は、セキュリティやパフォーマンスよりも安定性や一貫した動作の問題であるため、UNSAFEアセンブリでのみ使用可能と見なされます。たとえば、UNSAFEアセンブリでは、書き込み可能な静的変数を持つことが可能です。SQLCLRクラスはすべてのセッションで共有されるため、これは通常、適切なことではありません。すべてのセッションでメモリ内のデータを共有し、競合状態を計画した(そして十分なテストを行った)場合は、この動作を期待しているので問題ありません。しかし、特定のセッションの値をキャッシュして書き込み可能な静的変数に再検索または再計算する必要がなく、他のセッションがその値を読み取っており、場合によっては上書きしていることを認識していない場合は、それが問題になるでしょう。
しかし、誰かがレジストリに書き込むことを心配しているが、実際にレジストリに書き込むコードがない場合は、おそらくこれについて心配する必要はありません;-)。
EXTERNAL_ACCESSとUNSAFEが実際にどのように機能するかのウォークスルー、および設定TRUSTWORTHY ON
(推奨されない)と非対称キーまたは証明書ベースのログインの使用の違いについては、この記事を参照してください:SQLCLRレベル4への階段:セキュリティ(EXTERNALおよびUNSAFEアセンブリ)(無料登録が必要です)。
「パフォーマンス」について:
これは、あなたが何をしようとしているか、どうやってそれをどうやってやるかの問題です。あるいくつかのものがありますずっと速くSQLCLRで、かつ遅いいくつかのものは。しかし、T-SQLの場合と同様に、やや単純で効率的なタスクを実行し、誤った処理を行うことで、タスクを複雑かつ/または非効率的にすることができます。ただし、SQL CLRを使用しても、本質的に低速ではありません。
SQLCLRアセンブリは、3つのレベルのセキュリティアクセスでインストールできますSAFE | EXTERNAL_ACCESS | UNSAFE
。これは十分に文書化されています。アセンブリの参照CREATE ASSEMBLY
と設計:
アセンブリセキュリティの
管理マネージコードを実行するときに、アセンブリが.NETコードアクセスセキュリティによって保護されているリソースにアクセスできる量を制御できます。これを行うには、アセンブリを作成または変更するときに、SAFE、EXTERNAL_ACCESS、またはUNSAFEの3つの権限セットのいずれかを指定します。
SAFE
SAFEはデフォルトのアクセス権セットであり、最も制限的です。SAFE権限を持つアセンブリによって実行されるコードは、ファイル、ネットワーク、環境変数、レジストリなどの外部システムリソースにアクセスできません。SAFEコードは、ローカルSQL Serverデータベースのデータにアクセスしたり、ローカルデータベース外のリソースへのアクセスを必要としない計算やビジネスロジックを実行したりできます。
ほとんどのアセンブリは、SQL Serverの外部のリソースにアクセスする必要なく、計算およびデータ管理タスクを実行します。したがって、アセンブリ許可セットとしてSAFEをお勧めします。
EXTERNAL_ACCESS
EXTERNAL_ACCESSにより、アセンブリは、ファイル、ネットワーク、Webサービス、環境変数、レジストリなどの特定の外部システムリソースにアクセスできます。EXTERNAL ACCESS権限を持つSQL ServerログインのみがEXTERNAL_ACCESSアセンブリを作成できます。SAFEおよびEXTERNAL_ACCESSアセンブリには、検証可能に型保証されているコードのみを含めることができます。つまり、これらのアセンブリは、型定義に有効な明確に定義されたエントリポイントを介してのみクラスにアクセスできます。したがって、コードが所有していないメモリバッファに任意にアクセスすることはできません。さらに、SQL Serverプロセスの堅牢性に悪影響を及ぼす可能性のある操作を実行することはできません。
UNSAFE
UNSAFEは、SQL Server内外のリソースへの無制限のアクセスをアセンブリに提供します。UNSAFEアセンブリ内から実行されているコードは、アンマネージコードを呼び出すことができます。また、UNSAFEを指定すると、アセンブリ内のコードで、CLRベリファイアによって型が安全でないと見なされる操作を実行できます。これらの操作は、SQL Serverプロセススペースのメモリバッファーに制御されていない方法でアクセスする可能性があります。UNSAFEアセンブリは、SQL Serverまたは共通言語ランタイムのセキュリティシステムを破壊する可能性もあります。UNSAFE権限は、経験豊富な開発者または管理者が非常に信頼できるアセンブリにのみ付与する必要があります。sysadmin固定サーバーロールのメンバーだけがUNSAFEアセンブリを作成できます。
許可されるCLR属性にはさらに制限があり、.Net Frameworkアセンブリのサブセットのみがサポートされます。再度、リンクされたドキュメントを参照してください。
パフォーマンスに関しては、SQL Serverは協調的なマルチタスク環境ですが、CLRはそうではないことを覚えておくことは最も重要です。SQLCLRコードはThread.BeginThreadAffinity()
、任意の期間(ブロッキングを含む)CPUを占有するときはいつでも呼び出す必要があります。Adam Machanicは、このトピックに関する優れたプレゼンテーションを行っています。データをより速く:SQLCLRによるMicrosoft SQL Serverパフォーマンステクニックをご覧ください。
トピックは広大で、質問は曖昧です。SQLCLRは、他の機能では対応できない独自のタスクを実行できます。また、SQLCLRはSQL Serverの武器の1つであり、パフォーマンスやセキュリティを駆使して自分の足で撃つことができます。ドキュメントをお読みください。