SQL Server プログラミングとホスト保護属性

SQL Server ホストにマネージド コードを読み込み、実行する機能を利用するには、コード アクセス セキュリティとホスト リソース保護の両方においてホストの要件を満たす必要があります。 コード アクセス セキュリティの要件は、SAFE、EXTERNAL-ACCESS、UNSAFE という 3 つの SQL Server アクセス許可セットのいずれかにより指定されます。 SAFE アクセス許可セット内か EXTERNAL-ACCESS アクセス許可セット内でコードを実行する場合、HostProtectionAttribute 属性が適用されている特定の型またはメンバーを避ける必要があります。 HostProtectionAttribute はセキュリティ アクセス許可ではなく、むしろ信頼性保証であり、ホストが許可しない可能性がある特定のコード コンストラクト (型またはメソッド) を識別します。 HostProtectionAttribute を使用すると、ホストの安定性確保に役立つプログラミング モデルを適用できます。

Note

コード アクセス セキュリティ (CAS) は、.NET Framework と .NET のすべてのバージョンで非推奨になりました。 最近のバージョンの .NET では、CAS 関連の API が使われている場合、CAS の注釈は使われず、エラーが発生します。 開発者は、代わりの手段を見つけてセキュリティ タスクを実現する必要があります。

ホスト保護属性

ホスト保護属性は、ホスト プログラミング モデルに合わない型またはメンバーを特定し、以下の信頼性レベルの脅威の増加を表します。

  • 他の場合には特に害のない脅威

  • サーバーで実行されるマネージ ユーザー コードの不安定化につながる脅威

  • サーバー プロセス自体の不安定化につながる脅威

SQL Server は、HostProtectionResource 値として SharedStateSynchronizationMayLeakOnAbortExternalProcessMgmt を指定する HostProtectionAttribute を持つ型またはメンバーの使用を禁止します。 これにより、共有状態を有効にし、同期を実行し、終了時にリソースを漏洩する可能性があり、SQL Server プロセスの整合性に影響を与えるメンバーの呼び出しをアセンブリに禁止します。

禁止されている型とメンバー

次の表は、HostProtectionResource 値が SQL Server により禁止される型とメンバーをまとめたものです。

名前空間 型またはメンバー
Microsoft.Win32 PowerModeChangedEventArgs クラス

PowerModeChangedEventHandler デリゲート

SessionEndedEventArgs クラス

SessionEndedEventHandler デリゲート

SessionEndingEventArgs クラス

SessionEndingEventHandler デリゲート

SessionSwitchEventArgs クラス

SessionSwitchEventHandler デリゲート

SystemEvents クラス

TimerElapsedEventArgs クラス

TimerElapsedEventHandler デリゲート

UserPreferenceChangedEventArgs クラス

UserPreferenceChangingEventArgs クラス
System.Collections ArrayList.Synchronized メソッド

Hashtable.Synchronized メソッド

Queue.Synchronized メソッド

SortedList.Synchronized メソッド

Stack.Synchronized メソッド
System.ComponentModel AddingNewEventArgs クラス

AddingNewEventHandler デリゲート

ArrayConverter クラス

AsyncCompletedEventArgs クラス

AsyncCompletedEventHandler デリゲート

AsyncOperation クラス

AsyncOperationManager クラス

AttributeCollection クラス

BackgroundWorker クラス

BaseNumberConverter クラス

BindingList<T> クラス

BooleanConverter クラス

ByteConverter クラス

CancelEventArgs クラス

CancelEventHandler デリゲート

CharConverter クラス

CollectionChangeEventArgs クラス

CollectionChangeEventHandler デリゲート

CollectionConverter クラス

ComponentCollection クラス

ComponentConverter クラス

ComponentEditor クラス

ComponentResourceManager クラス

Container クラス

ContainerFilterService クラス

CultureInfoConverter クラス

CustomTypeDescriptor クラス

DateTimeConverter クラス

DecimalConverter クラス

ActiveDesignerEventArgs クラス

ActiveDesignerEventHandler デリゲート

CheckoutException クラス

CommandID クラス

ComponentChangedEventArgs クラス

ComponentChangedEventHandler デリゲート

ComponentChangingEventArgs クラス

ComponentChangingEventHandler デリゲート

ComponentEventArgs クラス

ComponentEventHandler デリゲート

ComponentRenameEventArgs クラス

ComponentRenameEventHandler デリゲート

DesignerCollection クラス

DesignerEventArgs クラス

DesignerEventHandler デリゲート

DesignerOptionService クラス

DesignerTransaction クラス

DesignerTransactionCloseEventArgs クラス

DesignerTransactionCloseEventHandler デリゲート

DesignerVerb クラス

DesignerVerbCollection クラス

DesigntimeLicenseContext クラス

DesigntimeLicenseContextSerializer クラス

MenuCommand クラス

ComponentSerializationService クラス

ContextStack クラス

DesignerLoader クラス

InstanceDescriptor クラス

MemberRelationshipService クラス

ResolveNameEventArgs クラス

ResolveNameEventHandler デリゲート

SerializationStore クラス

ServiceContainer クラス

ServiceCreatorCallback デリゲート

StandardCommands クラス

StandardToolWindows クラス

DoubleConverter クラス

DoWorkEventArgs クラス

DoWorkEventHandler デリゲート

EnumConverter クラス

EventDescriptor クラス

EventDescriptorCollection クラス

EventHandlerList クラス

ExpandableObjectConverter クラス

HandledEventArgs クラス

HandledEventHandler デリゲート

InstanceCreationEditor クラス

Int16Converter クラス

Int32Converter クラス

Int64Converter クラス

InvalidAsynchronousStateException クラス

InvalidEnumArgumentException クラス

BeginInvoke メソッド

License クラス

LicenseContext クラス

LicenseException クラス

LicenseManager クラス

LicenseProvider クラス

LicFileLicenseProvider クラス

ListChangedEventArgs クラス

ListChangedEventHandler デリゲート

ListSortDescription クラス

ListSortDescriptionCollection クラス

MaskedTextProvider クラス

MemberDescriptor クラス

MultilineStringConverter クラス

NestedContainer クラス

NullableConverter クラス

ProgressChangedEventArgs クラス

ProgressChangedEventHandler デリゲート

PropertyChangedEventArgs クラス

PropertyChangedEventHandler デリゲート

PropertyDescriptor クラス

PropertyDescriptorCollection クラス

ReferenceConverter クラス

RefreshEventArgs クラス

RefreshEventHandler デリゲート

RunWorkerCompletedEventArgs クラス

RunWorkerCompletedEventHandler デリゲート

SByteConverter クラス

SingleConverter クラス

StringConverter クラス

SyntaxCheck クラス

TimeSpanConverter クラス

TypeConverter クラス

TypeDescriptionProvider クラス

TypeDescriptor クラス

TypeListConverter クラス

UInt16Converter クラス

UInt32Converter クラス

UInt64Converter クラス

WarningException クラス

Win32Exception クラス
System.Diagnostics Debug.Listeners プロパティ

Trace.Listeners プロパティ

EventLog.SynchronizingObject プロパティ

ConsoleTraceListener クラス

DefaultTraceListener クラス

DelimitedListTraceListener クラス

EventLogTraceListener クラス

PerformanceCounter クラス

PerformanceCounterCategory クラス

Process クラス

ProcessStartInfo クラス

TextWriterTraceListener クラス

TraceListener クラス

XmlWriterTraceListener クラス

TraceSource.Listeners プロパティ
System.IO Stream.Synchronized メソッド

TextReader.Synchronized メソッド

TextWriter.Synchronized メソッド
System.Reflection.Emit ConstructorBuilder クラス

EventBuilder クラス

FieldBuilder クラス

MethodBuilder クラス

CustomAttributeBuilder クラス

MethodRental クラス

ModuleBuilder クラス

PropertyBuilder クラス

TypeBuilder クラス

UnmanagedMarshal クラス
System.Text Group.Synchronized メソッド

Match.Synchronized メソッド
System.Threading AutoResetEvent クラス

EventWaitHandle クラス

ManualResetEvent クラス

Monitor クラス

Mutex クラス

ReaderWriterLock クラス

Semaphore クラス

Thread.AllocateNamedDataSlot メソッド

Thread.BeginCriticalRegion メソッド

Thread.EndCriticalRegion メソッド

Thread.FreeNamedDataSlot メソッド

Thread.GetData メソッド

Thread.Join メソッド

Thread.SetApartmentState メソッド

Thread.SetData メソッド

Thread.SpinWait メソッド

Thread.Start メソッド

Thread.TrySetApartmentState メソッド

ThreadPool クラス

Timer クラス
System.Timers Timer クラス
System.Web.Configuration MachineKeyValidationConverter クラス
System.Windows.Forms AutoCompleteStringCollection.SyncRoot プロパティ

SQL Server アクセス許可セット

SQL Server では、データベースに展開されたコードの信頼性要件をユーザーは指定できます。 アセンブリがデータベースにアップロードされるとき、アセンブリの作者はそのアセンブリの 3 つのアクセス許可セット (SAFE、EXTERNAL-ACCESS、UNSAFE) のいずれかを指定できます。

アクセス許可セット SAFE EXTERNAL-ACCESS UNSAFE
コード アクセス セキュリティ 実行のみ 実行および外部リソースへのアクセス 無制限
プログラミング モデルの制限事項 はい はい 制限事項なし
検証可能性の要件 はい はい いいえ
ネイティブ コードを呼び出す機能 いいえ 番号 はい

SAFE は、許可されているプログラミング モデルの中でも多くの制限事項が関連付けられており、最も信頼性が高く、セキュリティで保護されたモードです。 SAFE コードには、信頼性とセキュリティの高い機能があります。 SAFE アセンブリには、実行、計算の実行、およびローカル データベースへのアクセスを行うには十分な権限が許可されます。 SAFE アセンブリは検証可能なタイプ セーフである必要があり、アンマネージ コードを呼び出すことはできません。

EXTERNAL-ACCESS はセキュリティとして中間の選択肢であり、データベースの外にあるリソースへのアクセスをコードに許可しますが、SAFE の信頼性と安全性も備えています。

UNSAFE は、データベース管理者のみが作成できる信頼性の高いコードに指定します。 信頼性の高いこのコードにはコード アクセス制限がなく、アンマネージ (ネイティブ) コードを呼び出すことができます。

SQL Server はホスト レベルのコード アクセス セキュリティ ポリシー層を利用し、SQL Server カタログに保存されているアクセス許可セットに基づき、3 つのアクセス許可セットのいずれかを与えるホスト ポリシーを設定します。 データベース内部で実行するマネージド コードには、これらのコード アクセス権限セットのうちのいずれかが必ず許可されます。

プログラミング モデルの制限

SQL Server のマネージド コードのプログラミング モデルは、複数の呼び出しで状態を維持すること、または、複数のユーザー セッションで状態を共有することを要求しない関数、プロシージャ、型を必要とします。 さらに、既に説明したように、共有状態が存在すると、アプリケーションのスケーラビリティや信頼性に影響を与える重大な例外が発生する可能性があります。

以上を考慮した上で、SQL Server は静的変数と静的データ メンバーの使用を禁止します。 SAFE アセンブリと EXTERNAL-ACCESS アセンブリに関しては、SQL Server は CREATE ASSEMBLY 時にアセンブリのメタデータを調べ、静的データ メンバーや静的変数の使用が見つかった場合、SAFE アセンブリまたは EXTERNAL-ACCESS アセンブリの作成に失敗します。

関連項目