[ILM/FIM] nTSecurityDescriptor を同期対象にして、アクセス権制御を実装にチャレンジする

皆様、ご無沙汰しております。私は コマンドラインツールの紹介以来なので、約 2 ヶ月ぶりの投稿ですね。今回の記事は、ILM や FIM 自体では機能を有していない処理を拡張ルールで実現する手法について書いてみたいと思います。ILM/FIM は、.NET Framework での拡張ルールを用いて運用できるという弊社サーバー製品には稀な類の製品になります。ですので、拡張ルールをフル活用でさまざまなことが実現できます。なので、ぜひ皆様に本機能のすばらしさ?体験していただき、実装できるインタフェースがあって、本当によかった~と思っていただけると、幸いです!

- 同期要件
作成されているグループオブジェクトのアクセス権に、JPDSFIM1\fimservice に対して Full Control を付与する。(すでに設定されている場合については、特に考慮しない : 本サンプルでは考慮しませんが、皆様が実施される際には考慮してくださいね!)

以下に実際に設定する項目や、拡張ルールをご紹介いたします!

 

- Identity Manager or Synchronization Manager での設定

1) AD-MA を開いて、[Select Attributes] を確認します。“nTSecurityDescriptor” を選択します。

image

2) [Configure Attribute Flow] を選択いただき、[Data source object type:] と [Metaverse object type:] に group を選択し、[Data source attribute:] に”nTSecurityDescriptor” を選択します。また、[Metaverse attribute:] に適当な属性を設定します(ここでは、<object-id> を設定しています)。[Mapping Type] には、もちろん ”Advanced” そして、[Flow Direction] では Export を選択します。[New] をクリックして、”Rules extension” を選択し、Flow rule name を任意の文字列にします(ここでは、nTSecurityDescriptor を記載します。この設定は、後の拡張ルールにかかわってきます)
image 

- 拡張ルールについて

拡張ルールには、次のように記載します。

     Public Sub MapAttributesForExport(ByVal FlowRuleName As String, _
    ByVal mventry As MVEntry, ByVal csentry As CSEntry) _
    Implements IMASynchronization.MapAttributesForExport
        ' TODO: Add export attribute flow code here
        Select Case FlowRuleName
            Case "nTSecurityDescriptor"
                Dim trustees() As String = {"JPDSFIM1\fimservice"}
                Dim sd As IADsSecurityDescriptor
                Dim acl As IADsAccessControlList
                Dim ace As IADsAccessControlEntry
                Dim su As IADsSecurityUtility
                Dim bsd() As Byte
                su = New ADsSecurityUtility()
                sd = CType(su.ConvertSecurityDescriptor _
                      (csentry("nTSecurityDescriptor").BinaryValue, 2, 1), _
                       SecurityDescriptor)
                bsd = CType(su.ConvertSecurityDescriptor(sd, 1, 2), Byte())
                acl = CType(sd.DiscretionaryAcl, AccessControlList)

                ace = New AccessControlEntry()
                Dim trustee As String
                For Each trustee In trustees
                    ace.AccessMask = 983551
                    ace.AceFlags = 0
                    ace.AceType = 0
                    ace.ObjectType = 0
                    ace.Trustee = trustee
                    acl.AddAce(ace)
                Next
                csentry("nTSecurityDescriptor").BinaryValue = _
                CType(su.ConvertSecurityDescriptor(sd, 1, 2), Byte())

            Case Else
                ' TODO: remove the following statement and add your default script here
                Throw New EntryPointNotImplementedException()

        End Select

    End Sub

ポイントは、ADSI の IADsSecurityDescriptor/IADsAccessControlList/IADsAccessControlEntry/IADsSecrutiUtility を用いることです。いかに参考ドキュメントを記載したので、あわせて確認ください!

 

- 参考ドキュメント

ユーザー パスワードの管理

https://msdn.microsoft.com/ja-jp/library/ms180915.aspx

IADsSecurityUtility::ConvertSecurityDescriptor Method

https://msdn.microsoft.com/en-us/library/aa706135.aspx

- 実行例

上記実装をして、Full Import/Sync/Export の順番で同期をかけてみたところ、狙い通り付与することができました!

image

ぜひ、お試しください!

~ ぴろと@ILMとADSI はなんだかんだで相性がよい ~