条件付き ACE 用のセキュリティ記述子定義言語

条件付きアクセス制御エントリ (ACE) を使用すると、アクセスチェックの実行時にアクセス条件を評価できます。 セキュリティ記述子定義言語 (SDDL) には、文字列形式で条件付き ACE を定義するための構文が用意されています。

条件付き ACE の SDDL は、ACE の場合と同じで、条件付きステートメントの構文が ACE 文字列の末尾に追加されます。 SDDL の詳細については、「セキュリティ記述子定義言語」を参照してください。

"#" 記号は、リソース属性の "0" と同意語です。 たとえば、D:AI(XA;OICI;FA;;;WD;(OctetStringType==#1#2#3##)) は D:AI(XA;OICI;FA;;;WD;(OctetStringType==#01020300)) と同様で、解釈されます。

条件付き ACE 文字列形式

セキュリティ記述子文字列内の各 ACE は、かっこで囲まれています。 ACE のフィールドは次の順序で、セミコロン (;) で区切られます。

AceType**;AceFlags;Rights;ObjectGuid;InheritObjectGuid;AccountSid;(ConditionalExpression)**

フィールドは ACE 文字列 で説明されているように、次の例外があります。

  • AceType フィールドには、次のいずれかの文字列を指定できます。

    ACE 型の文字列 Sddl.h の定数 AceType 値
    "XA"
    SDDL_CALLBACK_ACCESS_ALLOWED
    ACCESS_ALLOWED_CALLBACK_ACE_TYPE
    "XD"
    SDDL_CALLBACK_ACCESS_DENIED
    ACCESS_DENIED_CALLBACK_ACE_TYPE
  • ACE 文字列には、文字列の末尾にかっこで囲まれた 1 つ以上の条件式が含まれます。

条件式

条件式には、次のいずれかの要素を含めることができます。

式の要素 説明
AttributeName
指定した属性に 0 以外の値があるかどうかをテストします。
existsAttributeName
指定した属性がクライアント コンテキストに存在するかどうかをテストします。
AttributeNameOperatorValue
指定した操作の結果を返します。
ConditionalExpression**||**ConditionalExpression
指定した条件式のいずれかが true かどうかをテストします。
ConditionalExpression&&ConditionalExpression
指定した条件式の両方が true かどうかをテストします。
!(ConditionalExpression)
条件式の逆関数。
Member_of{SidArray}
クライアント コンテキストの SID_AND_ATTRIBUTES 配列に、SidArray で指定されたコンマ区切りリスト内のすべてのセキュリティ識別子 (SID) が含まれているかどうかをテストします。
Allow ACE の場合、クライアント コンテキスト SID には、Standard Edition_GROUP_ENABLED 属性が一致と見なされるように設定されている必要があります。
Deny ACE の場合、クライアント コンテキスト SID には、 SE_GROUP_ENABLED または SE_GROUP_USE_FOR_DENY_ONLY 属性のいずれかが一致と見なされるように設定されている必要があります。
SidArray 配列には、SID 文字列 ("S-1-5-6" など) または SID エイリアス ("BA" など) を含めることができます。

属性

属性は、クライアント コンテキストの AUTHZ_SECURITY_ATTRIBUTES_INFORMATION 配列内の要素を表します。 属性名には、任意の英数字と以下の任意の文字 ":"、"/"、"."、および "_" を含めることができます。

属性値には、次のいずれかの型を指定できます。

値の型 説明
整数
10 進または 16 進表記の 64 ビット整数。
String
引用符で区切られた文字列値。
SID
SID(S-1-1-0) または SID(BA)。 Member_of または Device_Member_of の RHS 上にある必要があります。
BLOB
# の後に 16 進数が続きます。 数値の長さが奇数の場合、# は 0 に変換され、偶数になります。 また、値の他の場所に表示される # は 0 に変換されます。

演算子

次の演算子は、条件式で属性の値をテストするために使用するために定義されています。 これらはすべて二項演算子であり、AttributeName 演算子の形式で使用されます。

Operator 説明
==
従来の定義。
!=
従来の定義。
<
従来の定義。
<=
従来の定義。
>
従来の定義。
>=
従来の定義。
Contains
指定した属性の値が指定した値のスーパーセットである場合は TRUE。それ以外の場合は FALSE です。
Any_of
指定した値が、指定した属性の値のスーパーセットである場合は TRUE。それ以外の場合は、FALSE です。

さらに、単項演算子 Exists、Member_of、および否定 (!) は、条件式の表で説明されているように定義されます。

"Contains" 演算子の前と後に空白を付け、"Any_of" 演算子の前に空白を付ける必要があります。

演算子の優先順位

演算子は次の優先順位で評価され、等しい優先順位の演算が左から右に評価されます。

  1. Exists、Member_of
  2. Contains、Any_of
  3. ==, !=, <, <=, >, >=
  4. !
  5. &&
  6. ||

さらに、条件式の任意の部分をかっこで囲むことができます。 かっこ内の式は最初に評価されます。

不明な値

条件式の結果は、Unknown の値を返すことがあります。 たとえば、指定した属性が存在しない場合、リレーショナル操作は Unknown を返します。

次の表では、ConditionalExpression1ConditionalExpression2 という 2 つの条件式の間の論理 AND 演算の結果について説明します。

ConditionalExpression1 ConditionalExpression2 ConditionalExpression1&&ConditionalExpression2
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
TRUE
UNKNOWN
UNKNOWN
FALSE
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
UNKNOWN
FALSE
UNKNOWN
TRUE
UNKNOWN
UNKNOWN
FALSE
FALSE
UNKNOWN
UNKNOWN
UNKNOWN

次の表では、ConditionalExpression1ConditionalExpression2 という 2 つの条件式の間の論理 OR 演算の結果について説明します。

ConditionalExpression1 ConditionalExpression2 ConditionalExpression1||ConditionalExpression2
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
TRUE
UNKNOWN
TRUE
FALSE
TRUE
TRUE
FALSE
FALSE
FALSE
FALSE
UNKNOWN
UNKNOWN
UNKNOWN
TRUE
TRUE
UNKNOWN
FALSE
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN

値が UNKNOWN の条件式の否定も UNKNOWN です。

条件付き ACE 評価

次の表では、条件式の最終的な評価に応じて、条件付き ACE のアクセスチェック結果について説明します。

ACE の型 TRUE FALSE UNKNOWN
Allow
Allow
ACE を無視する
ACE を無視する
拒否
拒否
ACE を無視する
Deny

次の例は、SDDL を使用して定義された条件付き ACE によって、指定されたアクセス ポリシーがどのように表されるかを示しています。

ポリシー

次の両方の条件が満たされている場合は、すべてのユーザーに対して実行を許可します:

  • Title = PM
  • Division = 財務 または Division = 営業

SDDL

D:(XA; ;FX;;;S-1-1-0; (@User.Title=="PM" && (@User.Division=="Finance" || @User.Division ==" Sales")))

ポリシー

ユーザーのプロジェクトのいずれかがファイルのプロジェクトと交差する場合は、実行を許可します。

SDDL

D:(XA; ;FX;;;S-1-1-0; (@User.Project Any_of @Resource.Project))

ポリシー

ユーザーがスマート カードでログインし、バックアップ オペレーターであり、Bitlocker が有効になっているコンピューターから接続している場合は、読み取りアクセスを許可します。

SDDL

D:(XA; ;FR;;;S-1-1-0; (Member_of {SID(Smartcard_SID), SID(BO)} &&@Device.Bitlocker))

[MS-DTYP]: セキュリティ記述子の説明言語