2009年2月25日水曜日

ILM"2"のワークフロー概要

しばらく間が空いてしまいましたが、今回はILM"2"のワークフロー機能をひも解いて見ようと思います。

■ILM"2"の中のワークフロー機能の位置づけ

ILM"2"の中のワークフロー機能の位置づけは
・ILM Web Serviceの構成要素の一つ
・Management Policy Rule(MPR)が実行される際のプロセスの一つ
です。

















■動作の概要

ILM Web Serviceへの要求(属性の更新など)があると、あらかじめ定義されたMPRに基づいて要求は処理されます。
MPRは、要求(要求元、操作)と操作対象(対象となるリソース/SET、対象の属性)、実行されるフローの組み合わせで定義され、ILM Web Serviceへの要求がMPRに定義された要求と操作対象にマッチするとフローとILMSDBへの要求操作(CRUD)が実行されます。











■定義可能なフローの種類
ILM"2"では以下の3種類のフローを定義することができます。

種別説明
Authentication要求元を認証するために利用する(通常のパスワードで認証できないような状況/パスワードリマインドなどに利用)
Authorization要求の実行条件を満たすか確認するために利用する(承認フロー、操作対象の属性が適切かどうかの検査など)
ActionILMSDBへの操作完了後のアクションを定義する(通知する、OSRを使ってプロビジョニングを行うなど)


■フロー種別詳細
各フローには実行する動作(アクティビティ)を定義します。
・Authenticationフロー
Authenticationフローでは以下の2種類のアクティビティを利用することができます。

アクティビティ説明
Lockout GateAuthenticationフローのロックアウトを行うために利用する
QA Gate質問への回答で要求者を認証を行うために利用する


 また、各アクティビティにはそれぞれ詳細な設定を行うことができます。

アクティビティ設定項目初期値
Lockout Gateロックアウト閾値に達した後、ロックアウトされる期間(分)15
ロックアウト閾値(Authenticationフローで失敗できる回数)3
恒久的にロックアウトされるまでにロックアウト閾値に達して良い回数3
QA Gateトータルの質問の数3
事前登録時に表示される質問の数3
事前登録しなければならない質問の数3
ランダムに表示される質問の数3
正解しなければならない質問の数3
実際の質問-


・Authorizationフロー
Authorizationフローでは以下の2種類のアクティビティを利用することができます。

アクティビティ説明
Approval承認フローを定義するために利用する
Filter Validation操作対象の属性が適切かどうかをあらかじめ定義したフィルタを利用して確認する
Function Evaluatorフロー内で利用する関数を定義する
Group ValidationILM”2”のデフォルトのグループへの適合しているかを確認する
Notification特定の宛先へ通知を行う


 また、各アクティビティにはそれぞれ詳細な設定を行うことができます。

アクティビティ設定項目初期値
Approval承認者(ILMSDB上のユーザ/グループを静的に設定、もしくは要求者の属性などから動的に取得して設定)-
承認者の数1
エスカレーションタイムアウトまでの期間(日)7
メールテンプレート
・承認待ち(承認者へ送付)
・ 承認待ちのエスカレーション(承認者へ送付)
・ 承認完了(承認者へ送付)
・ 否認(要求者へ送付)
・ 要求のタイムアウト(要求者へ送付)
-
Filter Validationフィルタ対象属性を含むFilterScopeオブジェクト-
Function Evaluatorアクティビティ名-
本関数を実行した結果の値をストアする対象のオブジェクトと属性-
値として設定する属性名-
Group ValidationILM”2”のグループ管理でサポートされるプロパティを設定するかどうかを検証する(非サポートのプロパティを設定した場合はこのアクティビティは失敗する)-
ActiveDirectoryのグループ管理でサポートされるプロパティを設定するかどうかを検証する(非サポートのプロパティを設定した場合はこのアクティビティは失敗する)-
マルチフォレスト環境におけるActiveDirectoryのグループ管理でサポートされるプロパティを設定するかどうかを検証する(非サポートのプロパティを設定した場合はこのアクティビティは失敗する)-
Notification受信者(ILMSDB上のユーザ/グループを静的に設定、もしくは要求者の属性などから動的に取得して設定)-
メールテンプレート-


・Actionフロー
Actionフローでは以下の4種類のアクティビティを利用することができます。

アクティビティ説明
Function Evaluatorフロー内で利用する関数を定義する
Notification特定の宛先へ通知を行う
Password Reset Activityランダムパスワードの生成とリセットを行う
Synchronization Rule Activityあらかじめ定義したSynchronization Ruleを実行する(プロビジョニング/デプロビジョニング/属性毎に動作を変更)


 また、各アクティビティにはそれぞれ詳細な設定を行うことができます。

アクティビティ設定項目初期値
Function Evaluatorアクティビティ名-
本関数を実行した結果の値をストアする対象のオブジェクトと属性-
値として設定する属性名-
Notification受信者(ILMSDB上のユーザ/グループを静的に設定、もしくは要求者の属性などから動的に取得して設定)-
メールテンプレート-
Password Reset Activity生成するパスワードの文字列長10
Synchronization Rule Activity実行するSynchronization Rule-
Synchronization Ruleの対象の中で実行するアクション(プロビジョニング/デプロビジョニング/属性毎に動作を変更)-


次回は実際に承認フローを設定する手順を解説したいと思います。



2009年2月17日火曜日

MVRouterアーキテクチャ



引き続きILM(というかMIIS)の話題です。
なぜ今さら、という話もあるんですがILM"2"も結局はHybridな構造なので、レガシーな作り込みはおそらくなくならないだろうな~、と思っているからです。
ライセンス的にもILM"2"の画面系を使わなければCAL不要?みたいな話もありそうなので、管理者だけがWSS上でアカウントを管理して実ユーザにセルフサービスはさせないという使い方も実際はあり得そうですし。

さて、MIIS/ILMの最大の欠点は何か?と言われたら、Metaverseのrules extensionが実質ひとつのDLLに閉じられてしまっていて、分散開発やメンテナンスがとってもしにくい、という点があげられると思います。
MIISのDeveloperリファレンスにも載っているので、実際に商用環境で使っている方はこの方法を使っているのかな?とは思いますが、その名も「MVRouter」です。

やっていることは単純で、親DLLから各ターゲット用に用意したextension用DLLを呼び出しているだけですが、これでずいぶんメンテナンスは楽になるのかと思います。
















具体的には下記のようなコードを書きます。

■親DLL(MVExtention.dll)

Imports Microsoft.MetadirectoryServices
Imports System.IO
Imports System.Reflection

Public Class MVExtensionObject
  Implements IMVSynchronization

  ' 変数定義
  Dim arrMVDlls() As IMVSynchronization

  Public Sub Initialize() Implements IMvSynchronization.Initialize
    ' MVExtensionファイル名の取得の読み込み
    Dim arrDllNames() As String = Directory.GetFiles(Utils.ExtensionsDirectory, "MV_Ext_" & "*.dll")
    Dim numDlls As Integer = arrDllNames.Length - 1
    ReDim arrMVDlls(numDlls)
    Dim iCnt As Integer
    Dim strFileName As String
    Dim Assem As [Assembly]
    Dim type, types() As Type
    Dim objLoaded As Object
    Dim isLoaded As Boolean

    ' MVExtentionライブラリのロード
    For iCnt = 0 To numDlls
      strFileName = arrDllNames(iCnt)
      Assem = [Assembly].LoadFrom(strFileName)
      types = Assem.GetExportedTypes()

      ' MVExtentionライブラリであることを確認
      isLoaded = False
      For Each type In types
        If (Not (type.GetInterface("Microsoft.MetadirectoryServices.IMVSynchronization") Is Nothing)) Then
          ' オブジェクトインスタンスの生成
          objLoaded = Assem.CreateInstance(type.FullName)
          isLoaded = True
          Exit For
        End If
      Next

      If isLoaded = True Then
        ' ロードしたライブラリを変数へ代入
        arrMVDlls(iCnt) = objLoaded
        ' ライブラリの初期化
        arrMVDlls(iCnt).Initialize()
      Else
        ' ロード対象ライブラリが存在しなかったら例外処理
        Throw New UnexpectedDataException("MVExtensionライブラリが見つかりません")
      End If

    Next
  End Sub

  Public Sub Terminate() Implements IMvSynchronization.Terminate
    Dim objDll As IMVSynchronization
    ' ロードされたライブラリの終了処理
    For Each objDll In arrMVDlls
      objDll.Terminate()
    Next
  End Sub

  Public Sub Provision(ByVal mventry As MVEntry) Implements IMVSynchronization.Provision
    Dim objDll As IMVSynchronization
    ' 各ライブラリのProvisioning実行
    For Each objDll In arrMVDlls
      objDll.Provision(mventry)
    Next
  End Sub

  Public Function ShouldDeleteFromMV(ByVal csentry As CSEntry, ByVal mventry As MVEntry) As Boolean Implements IMVSynchronization.ShouldDeleteFromMV
    Dim objDll As IMVSynchronization
    Dim shouldDelete As Boolean = False

    ' 各ライブラリのShouldDeleteFromMV実行
    For Each objDll In arrMVDlls
      If objDll.ShouldDeleteFromMV(csentry, mventry) Then
        shouldDelete = True
        Exit For
      End If
    Next

    ShouldDeleteFromMV = shouldDelete
  End Function

End Class




■子DLL(MV_Ext_AD.dll)
Imports Microsoft.MetadirectoryServices

Public Class MVExtensionObject
  Implements IMVSynchronization

  Public Sub Initialize() Implements IMvSynchronization.Initialize
    ' TODO: Add initialization code here
  End Sub

  Public Sub Terminate() Implements IMvSynchronization.Terminate
    ' TODO: Add termination code here
  End Sub

  Public Sub Provision(ByVal mventry As MVEntry) Implements IMVSynchronization.Provision
    Select Case mventry.ObjectType
      Case "person"
        Dim conMA As ConnectedMA = mventry.ConnectedMAs("MA_AD")
        Dim strCN As String = mventry("employeeID").Value.ToString
        Dim strRDN As String = "CN=" & strCN
        Dim refDN As ReferenceValue = conMA.EscapeDNComponent(strRDN).Concat
("ou=users,ou=ilm2007objects,dc=ilm,dc=local")
        Dim numConns As Integer
        Dim csentry As CSEntry

        numConns = conMA.Connectors.Count
        If numConns = 0 Then
          ' 新規エントリ→作成
          csentry = conMA.Connectors.StartNewConnector("user")
          csentry.DN = refDN
          csentry("unicodePwd").Values.Add("P@ssw0rd")
          csentry.CommitNewConnector()
        ElseIf numConns = 1 Then
          ' 既存エントリ
          csentry = conMA.Connectors.ByIndex(0)
          csentry.DN = refDN
        Else
          ' 例外
          Throw New UnexpectedDataException("MAに複数のコネクタオブジェクトが存在します")
        End If
      Case Else
    End Select
  End Sub

  Public Function ShouldDeleteFromMV(ByVal csentry As CSEntry, ByVal mventry As MVEntry) As Boolean Implements IMVSynchronization.ShouldDeleteFromMV
  End Function
End Class



最近はもう少しスマートに実装するようで、MAとExtensionDLLの名前をXMLファイルで定義して、MVExtension.dllから構成情報を読み出してロードする、という方法もとられているようです。

ILM"2"が出てきたらISR/OSRとの合わせ技のベストプラクティスが出てくるのかな?とは思っています。

2009年2月10日火曜日

退職そして復職(ILM2007で実装してみました)



実際にあった要件で、
①人事システムからはアクティブ(在籍中の)ユーザ一覧のみしか渡せない
②非アクティブユーザのActiveDirectory上のエントリを無効化したい
③一度退職した人も復帰するケースがあるので、その際はActiveDirectory上のエントリを再度有効化してほしい(結構偉い人の場合が多いので新規IDで、というわけにはいかないらしい・・・)
という話がありました。

話を聞くだけだと「ふ~ん、なるほど」という話なんですが、実装をしてみるとそれなりに面倒です。

よくWeb上などで出回っている情報だと、人事システム側にEmployeeStatusのような状態を示す属性があり、その属性を基にActiveDirectoryのuserAccountControlを変更して、、、というようになっています。

ただ、冒頭に挙げた例も含め実際の要件ってそんなにIdMに都合のよいインプット情報が渡ってくるわけではないので、今回の様に工夫が必要になります。

まず①ですが、要するに入社するとエントリが増え、異動するとエントリの属性が変更され、退職するとエントリが消えるということになります。(下表)


入力情報の例
元情報id,sn-j,givenName-j,sn-e,givenName-e,Department
0001,田中,一郎,Tanaka,Ichiro,営業部
入社時id,sn-j,givenName-j,sn-e,givenName-e,Department
0001,田中,一郎,Tanaka,Ichiro,営業部
0002,佐藤,次郎,Sato,Jiro,開発部
異動時id,sn-j,givenName-j,sn-e,givenName-e,Department
0001,田中,一郎,Tanaka,Ichiro,営業部
0002,佐藤,次郎,Sato,Jiro,営業部
退職時id,sn-j,givenName-j,sn-e,givenName-e,Department
0001,田中,一郎,Tanaka,Ichiro,営業部


次に②ですが、これは普通に考えるとActiveDirectory用のMA(以下MA_AD)のDeprovisioning Optionにrules extensionを書いて、その中でcsentryのuserAccountControlに無効値(ADS_UF_ACCOUNTDISABLE)をセットしてあげれば問題ないんですが、今回は最後③の復帰を考えてあげないといけません。

通常のProvisioningの動きだと、MetaVerse(以下MV)と対象のConnectorSpace(以下CS)のオブジェクト間にリンクがあるかどうかによってオブジェクト(csentry)の新規作成をするか、既存エントリの更新を行うかが決定されます。
ただし今回普通にdeprovisionを使ってしまうと、MVとMA_ADのCS内オブジェクト間のリンクが切断されてしまいますし(※)、そもそもdeprovisionはMVのオブジェクトが削除されないと走らない、という制限があります。

※deprovision関数の返却値はDeprovisionActionという型で、選択肢として、
 ・DeprovisionAction.Delete → CSからの削除(AD上にオブジェクトは残したいので今回使えない)
 ・DeprovisionAction.Disconnect → 再接続可能な状態でdisconnectする
 ・DeprovisionAction.ExplicitDisconnect → 再接続不可能な状態でdisconnectする
 しか存在しません。





















この状態で再度provisioningを実行すると、MVとCSのリンクがないので新規作成という動作が選択されるのですが同じDNのcsentryは消えずにCS上に残っているので「Already Exist」という形でエラーが出てしまいます。

















これを回避するために、
・人事システム用MA(MA_HR_PERSON)のCSとMVの間のリンク状況を見てAD_MAのCS内オブジェクトの属性(userAccountControl)をコントロールする
ということをしてみます。(当然他にも方法はあると思います)

具体的には、AD_MAのAttribute Flowのrules extensionを使います。
この中で、対象のmventryがMA_HR_PERSONのCSとリンクがあるかどうかを、
 mventry.ConnectedMAs("MA_HR_PERSON").Connectors.Count
に入っている値を見ることで判断します。
値が0ならリンクはありませんし、1ならリンクされているオブジェクトがある、と判断できます。

実際のコードはこんな感じです。

Public Sub MapAttributesForExport(ByVal FlowRuleName As String, ByVal mventry As MVEntry, ByVal csentry As CSEntry) Implements IMASynchronization.MapAttributesForExport

 Const ADS_UF_ACCOUNTDISABLE As Long = &H2 ' Disable user account
 Const ADS_UF_NORMAL_ACCOUNT As Long = &H200 ' Typical user account
 Dim currentValue As Long

 Select Case FlowRuleName
  Case "cd.user:userAccountControl<-mv.person:"
   If csentry("userAccountControl").IsPresent Then
    currentValue = csentry("userAccountControl").IntegerValue
   Else
    currentValue = ADS_UF_NORMAL_ACCOUNT
   End If
   If mventry.ConnectedMAs("MA_HR_PERSON").Connectors.Count = 0 Then
    'HR_MAに存在しない→無効化
    csentry("userAccountControl").IntegerValue = currentValue Or ADS_UF_ACCOUNTDISABLE
   Else
    'HRに存在する→有効化
     csentry("userAccountControl").IntegerValue = (currentValue Or ADS_UF_NORMAL_ACCOUNT) And (Not ADS_UF_ACCOUNTDISABLE)
   End If
  Case Else
   Throw New EntryPointNotImplementedException()
 End Select
End Sub

以下、実際に実行した結果です。

■通常同期







CSVファイルの中身





















MA_HR_PERSONのfull import & full syncの結果















MA_ADのexportの結果















ADのオブジェクト状態


■退職







CSVファイルの中身





















MA_HR_PERSONのfull import & full syncの結果














MA_ADのexportの結果















ADのオブジェクト状態


■復職







CSVファイルの中身





















MA_HR_PERSONのfull import & full syncの結果














MA_ADのexportの結果














ADのオブジェクト状態


2009年2月7日土曜日

Webinar:The Business Impact of Identity Management with ILM"2"

さて、一週間間が空いてしまいましたが今週もensynchのWebinarに参加しました。

今回のテーマは前回書いたとおり、「The Business Impact of Identity Management with ILM"2"」でした。
今回は参加者数が35人程度と前回より少なめでした。















アジェンダは以下の通り。

・Intro to Ensynch
・Business Challenges vs. Technical Challenges
・Technical Issues that Identity Management Solves
・Business Benefits
・Estimate Cost and Savings/Gains
・ROI Opportunity
・QA


今回は特にILM"2"に特化した話ではなく一般論としてのビジネス上の課題と、それをIdMがどのように解決するのか、という話が中心でしたのでありふれた話ではありました。
話の中で紹介されていたのが、多少こじつけ感もありますが、以下のような内容です。

ビジネス上の課題 根本となるビジネス上の問題 原因 技術的な原因
ビジネスの立ち上がりが遅れる 従業員が受け取っていてしかるべきコミュニケーションができない eMailアカウントを持っていない
適切なメーリングリストに入っていない
メーリングリストの自動化ができていない
従業員が顧客要求を実現できない 従業員がしかるべきリソースへアクセス権限を持っていない 必要なシステムへアカウントがプロビジョニングされていない
必要なグループやロールのメンバになっていない
従業員がパスワードを忘れてしまった
グループやロールの自動管理ができていない
パスワードリセット機能が存在しない
顧客情報や株価に影響する情報の漏えいや価値のある情報の破壊が起きる 従業員がアクセスできるべきでないリソースへアクセスできてしまう
退職後の社員がリソースへのアクセス権限を保持し続けている
パーミッションが緩い
ユーザアカウントが削除されていない
グループの自動管理ができていない
自働デプロビジョニングができていない
アテステーション機能がない
従業員が顧客の問題をエスカレーションする適切な相手を見つけられない 従業員が互いに正確で最新のコンタクト先情報を見つけられない 全社アドレス帳やデータベースが同期されていない IDAツールで同期されないディレクトリが乱立している




この手の話は非常にありふれている上にかなりこじつけ(必要条件かもしれないが十分条件ではない)ので、USのユーザはどのように感じたのか微妙な感じです。

結局この話の後はCALの半額キャンペーンの話があったり、サーバライセンスが$1という超特価の案内があって、そのまま話は終わって行きました。。。。
















今後のWebinarですが、
2/25:Workflow関連
来月:Business Impact of Geneva
といった予定だそうです。

個人的にはマイクロソフトのクラウドでのビジネスモデルが気になるので、Genevaの話を是非聞いてみたいと思います。また面白かったらレポートします。

2009年1月30日金曜日

Webinar:What's new in ILM"2", Ask the exprts

昨日の夜中(1/29 2:00am-3:00am JST)にensynchのWebinarがあったので、参加しました。















Agendaは以下の通り。
■Identity Lifecycle Manager "2" general overview
・ILM Roadmap
・Managing Lifecylcle of Identities
・ILM 2 Features
・ILM Synchronization Service
・ILM Service Database
・ILM Web Service
・ILM 2 Portal "End User"
・Overview of what's new, features available -
 ・Workflows
 ・Management Policies
 ・Codeless Provisioning
・Synch Rule
・Attribute Flow
・Easy Attribute Flow
・Functions
 ・Group and Set Management
 ・User Manaement
■Specific ILM " Scenarios and "Gotcha's"
・End User experience for Password Reset Registration
・Behind the Scenes - Policies and Workflows involved
・End user Password Reset Experience
・Behind the Scenes - Policies and Workflows involved
・What can you configure
 ・Lockout
 ・QA Gate
・Guidelines for Password Reset
・"Gotcha's" with Password Reset
■Question and Answer

彼ら(アリゾナ)の10:00am-11:00amという時間帯が設定されたおかげで日本では夜中・・・
眠い中でのLiveMeetingというあんまり良い環境ではなかったので、ざっくりしか聞けませんでしたが、まぁ一発目ということなのか本当に触りレベルの話ばっかりでした。
(しかも最初の15分は主催者側のオーディオの調子が悪かったみたいで、Toll Freeの電話番号が案内されて、スライドはWeb、音声は電話で。。みたいな話になってました。日本からもToll Free?なんて聞くのも馬鹿らしかったので、ノイジーなLiveMeeting環境でそのまま我慢しましたが)

製品概要の話は置いておいて、面白かったポイントを2,3あげると、
・参加者数
・パスワードリセット時にどんな質問(秘密の答え)が良いか?のアンケート結果
・参加者からの質問の内容からうかがえる参加者のプロファイル
です。USのILM事情を垣間見た気がしました。

まず、参加者数ですがMaxで50名くらいでした。Webinarという媒体とensynchという会社のプレゼンスとILM"2"への現段階での興味度合の複合された結果の数値だとは思いますが、USの事情がわからないだけに多いのか少ないのか微妙な感じでした。

次に、パスワードリセット時にどんな質問(秘密の答え)が良いか?のアンケート結果です。
LiveMeetingでは参加者にその場でアンケートを取ることが出来るので、こんなアンケートが出ました。
















選択肢が面白くて、こんな感じでした。カッコ内は回答。
・First kiss?(17%)
・What is your name?(3%)
・What is your quest?(10%)
・What is your favorite color?(28%)
・Airspeed of unladen swallow?(39%)

日本ではこの中だと「好きな色は?」が一番しっくりくるんだろうな~と思ったのですが、最後の「荷物を持たないツバメの飛行速度は?」というアーサー王ネタがトップになるあたりがお国柄?
日本だと「山?→川」見たいなものなんだと思います。「秘密の質問」っていう主旨忘れてます。完全に。

最後に、参加者からの質問の内容からうかがえる参加者のプロファイルです。
出た質問として、
・ライセンス関係の話
 →参加していたMSの方が回答していました。
  あんまり聞き取れませんでしたが、未決だがCALモデルになりそう?みたいな感じでした。
・ILM2007からの移行の可否
 →既存のRulesExtensionはある程度そのまま持ってこれるだろうが、新しい実装(ISRやOSR)での再実装を奨めていました。
がありました。
ということで、想像ですが既存でILM2007をすでに持っているユーザさんもしくは管理者/開発者の方たちなんだろうな~と思いました。

また来週も同じ時間に今度はビジネス面からみたILM"2"というテーマでROIの話などを取り上げるそうなので、気力が持てば参加してみます。

2009年1月26日月曜日

識別、認証、認可におけるIdMの役割

たまにはプロダクトの話ではなく、IdMそのものについて書いてみようと思います。

さて、この手のシステムをやっているとお客様を含めついつい混同されがちなのが、識別と認証と認可というキーワードだと思います。そのような混同があるのでIdMツールを入れればシングルサインオンまで含め全部何とかなる、といった勘違いが起きるのだと思います。

そこで、今回は識別、認証、認可といったキーワードの定義とIdMはそれらのキーワードに対して何をしてくれるものなのか?について整理をしてみようと思います。

まずはそれぞれの言葉の定義を見てみましょう。

識別:物事の相違を見分けること
認証:何らかの知識を元に対象の正当性を確認すること
認可:認めて許すこと

たとえば、グリム童話の「7匹の子ヤギ」に当てはめてみましょう。(コンセプトはサルでもわかるIdMの役割!です)

■識別
オオカミ:お母さんだよ。扉を開けておくれ。
 →識別情報「お母さん」を与えている
子ヤギ :(ああお母さんか)
 →ドアの向こうの相手が「お母さん」という知っている対象を名乗っていると識別①

■認証(失敗の例Ⅰ)
子ヤギ :(本当にお母さんかな?声がおかしいぞ)
 →名乗った名前(お母さん)と声(オオカミの声)という属性を使って正当性を確認
子ヤギ :お母さんはそんな声じゃない。おまえはお母さんじゃない!
 →認証失敗②

■認証(失敗の例Ⅱ)
オオカミ:(チョークを食べて声を変えて再び)お母さんだよ。扉を開けておくれ。
 →識別情報「お母さん」を与えている
子ヤギ :(ああお母さんか)
 →ドアの向こうの相手が「お母さん」という知っている対象を名乗っていると識別
 →ここまでは先ほどと同じ
子ヤギ :(本当にお母さんかな?声はお母さんの声に似ているな。ん?扉から見える手が黒いぞ。おかしいぞ)
 →名乗った名前(お母さん)と手の色(オオカミの手)という属性を使って正当性を確認
子ヤギ :お母さんの手はそんな色じゃない。おまえはお母さんじゃない!
 →認証失敗③

■認証(成功の例)
オオカミ:(手に白い粉を塗って)お母さんだよ。扉を開けておくれ。
 →識別情報「お母さん」を与えている
子ヤギ :(ああお母さんか)
 →ドアの向こうの相手が「お母さん」という知っている対象を名乗っていると識別
子ヤギ :(本当にお母さんかな?声はお母さんの声に似ているな。扉から見える手もお母さんの手に似ているな)
 →名乗った名前(お母さん)と手の色(白く塗ったオオカミの手)という属性を使って正当性を確認
子ヤギ :(確かにお母さんだ)
 →認証成功④

■認可
子ヤギ :(お母さんは家族だから扉を開けても良いな)お帰りなさい。(扉を開ける)
 →認可⑤


整理すると、
①で対象が与えた情報を元に子ヤギは対象を識別します。
ここで最初から「田中です」と言っても「誰やねん」という話になり子ヤギからは識別されませんので次のフェーズ(認証)へは物事は進みません。

次に②で子ヤギは対象が与えた情報(声)を元に本当に対象があらかじめ与えた識別情報と合致しているかどうかの正当性の検証を行います。
ここでは「声」が子ヤギの知っている「お母さん」のものとは異なるので認証失敗です。

同様に③では、「声」に加えて対象が与えた情報(手の色)を元に正当性の検証を行います。
ここでも「手の色」が子ヤギの知っている「お母さん」のものとは異なるので認証失敗です。
ちなみに何故チョークを食べると声が優しくなるのかは不明です。。

続いて、④では対象が与えた「声」と「手の色」の両方が子ヤギの知っている「お母さん」のものと同じであることから子ヤギは対象の正当性を認めます。つまりやっと認証成功です。
いわゆる2要素認証ですね。

最後に、対象が正当に「お母さん」であることが確認されたので、「お母さん」の持つ属性(家族)を見てあらかじめ定義された行為(家に入ること)を許可します。
これが新聞屋だったら例え正当性が確認できても家に入れる、ということはしなかったでしょう。(つまり家族ではないので家に入ることは許可されない)


ちょっと回りくどかったと思いますが、上記が識別、認証、認可の定義です。
さて、やっとIdMの話です。

IdM(狭義のIdM=provisioning/synchronizationを中心としたもの)の役割は、
・管理対象レポジトリのエントリの追加/削除
・管理対象エントリ属性の変更
であると言うことができます。
ここにワークフローやセルフサービスが入ってきたとしてもそれはあくまでプロビジョニングの条件設定や属性変更の一手段にすぎません。

上記の童話に当てはめてみると、
・管理対象レポジトリ  → 子ヤギの脳
・エントリ       → 知識(お母さんは知っている。田中さんは知らない)
・管理対象エントリ属性 → お母さんの声は優しい。お母さんの手は白い。お母さんは家族だ。
となります。(なんかグロいですね・・・)

IdMは子ヤギが識別したり認証したり認可をしたりするために必要な情報の提供をしているだけで、実際に識別や認証や認可をしているのは子ヤギそのものなんです。
ですから、IdMシステムの定義をする際は、対象システムがどんな情報をベースに識別し認証し認可するのか、という情報の洗い出しを厳密に行うことが非常に大切です。

この例をベースに考えると、子ヤギ(システム)は、
・名前(お母さん)を識別機能に使う
・声と手の色を認証機能に使う
・続柄(家族)を認可機能に使う
という洗い出しをあらかじめしておいて、IdMシステムに対しては
・名前
・声
・手の色
・続柄
という4つの属性を子ヤギの脳(対象レポジトリ)の中で正しい状態に保つ、ということが求められる機能だ、という定義を行います。


実際は認証連携やシングルサインオンなど、他のシステムが認めたオブジェクトに対して認可を行ったりすることもあり機能の分割がややこしいのですが、よ~く考えると上記の機能分解ができるはずなので、じっくり考えてIdMで管理が必要な属性と同期先となるレポジトリの定義を整理して行きましょう。

2009年1月20日火曜日

ILM"2"の悩みどころ?(MPR、OSR)

先日の土曜日のTech Fieldersセミナーは土曜日にも関わらず結構な動員だったみたいですね。(私は別件があり、顔を出したら既にセッションはすべて終了、懇親会真っ最中でした。ビールを飲みに行ったようなものです(*´Д`)

ということで私は内容を一切聞いていないので聴講された方がどのような理解をされたのかわかりませんが、個人的に初めてILM"2"に触られる方(特にMIIS/ILM2007経験者)が最も理解しにくい概念がMPR(Management Policy Rules)とOSR(Outbound Synchronization Rules)だと思います。

MIISやILM2007のように単純にMetaVerseにあるエントリをConnector Space上にプロビジョニングコードでストレートに吐き出してあげれば、後はExportすれば実際の同期対象システムにIDができるという考え方は、とてもわかりやすいのですが実際のユーザ環境ではそのまま使うには機能が足りません。(入力データの取り込みについてはとりあえず何でも取り込んでしまってもIdMの中の話なので、キー属性さえちゃんとしていればそれほど問題になりません)

ここで、同期対象のシステムへプロビジョニングを行う際に考えられる最低限の要件を考えてみると、
・誰(何)を
・どのような条件で
・どこに
・どのように
同期/プロビジョニングするのか?というのが最低限ルールとして定義されている必要があると言えると思います。

ILM"2"ではこの要件をある程度コーディングせずに実装するための仕組みとして、
・MPR(Management Policy Rules)
・SET
・WorkFlow
・OSR(Outbound Synchronization Rules)
という概念を実装してきました。
上記の、誰を、どのような条件で、どこに、どのようにという要件をこれらの概念に当てはめると、下の表と様になります。このセット自体のことをMPRと呼びます。

要件 関連する概念 解説
誰(何)を SET ILM"2"内で定義するオブジェクトのグループ(セット)。スタティックにメンバを決めることもできますし、オブジェクトの属性をベースに動的にメンバを決めることもできます。
例)EmployeeType属性がContractorのユーザオブジェクトのセット
どのような条件で+どこに WorkFlow 承認が必要な場合などを含め条件をWorkFlowで定義します。
特にOSRと紐付をするタイプのWorkFlowをActionWorkFlow(AW)といいます。
承認後、結果によって振る舞いを変える場合はAuthorization WorkflowとActionWorkflowを組み合わせることにより実現します。
どのように OSR ISRと同様にAttributeFlowなどを設定し属性のマッピング等を行います。



ILM"2"では、ILMSDB上のエントリに対してこのMPRを適用し、各オブジェクトに対して適用されるOSRが決定されます。(これが各オブジェクトのExpected Rules List(ERL)属性となります)
その後、ILMSDB MAのConnector Spaceへのimport/synchronizationを行うと属性に入っているERLを見て関連するOSRが実行され、実際のプロビジョニング/同期が実行されます。(ERLにはOSRオブジェクトへの参照が入ります)
最近の他社の製品には普通に実装されている機能なのですが、MIIS/ILM2007ユーザにはちょっとわかりにくいかと思うので、MIIS/ILM2007との機能対比を最後に書いておきます。

要件 MIIS/ILM2007 ILM"2"
だれを同期するか MetaVerseのRules ExtensionのProvision関数内に条件分(IF、SWITCHなど)で実装 SETを利用
同期条件は何か WorkFlowを利用
どこに同期するか Action WorkflowにOSRを設定
どのように同期するか 同期対象MAの設定(Rules Extension含む) OSRを利用



ちなみに、ILM"2"でもMAやMetaVerseのRules Extensionは従来通り利用可能なので、合わせて実装することも可能です。(切り分けが難しくなりそうなので、お勧めはしませんが)