2012年5月27日日曜日

[IDaaS] Intel Cloud SSO を試してみた


前回に引き続き IDaaS の話です。

今回はインテル(というかマカフィー)の IAMaaS である Intel Cloud SSO のトライアルをしてみました。
http://intelcloudsso.com/


■トライアル版へのサインアップ
まずはトライアルの始め方から。
まずはサービスのページにアクセスすると右側のあたりからトライアルの申し込み出来ます。
























色々と情報を登録するとメールにログインIDとログインURLが送られてくるので早速アクセスしパスワードを登録し、ログオンして基本設定を行います。


■基本設定
Admin タブをクリックし、基本設定画面で管理ユーザの情報とセキュリティトークンの設定を行います。
Admin Username:先ほどログインしたユーザ名
Admin Password:先ほど設定したパスワード
Security Token:画面上の赤く囲った部分の[HERE]をクリックした先で[Reset Security Token]ボタンをクリックするとメールでセキュリティトークンが送られてくるのでそれを設定


































■アプリケーションの設定
Admin タブでアプリケーションリストから対象となるアプリケーションを選択します。
かなりの数のアプリケーションが登録されています。

























この中から今回はオーソドックスに Google Apps を選んでみます。


























早速設定です。以下を設定します。
Application Name:任意の名前
GoogleApps Domain Name:GoogleApps に設定したドメイン名
Enable User Provisioning:プロビジョニングを行う場合はチェック
























同時に Google Apps 側にも設定をします。(高度な設定メニューより)・シングルサインオンを有効にする:チェック
ログインページの URL:Intel Cloud SSO の設定画面で表示された URL
ログアウトページ URL:https://www.google.com/a/[ドメイン名]
パスワード変更 URL:Intel Cloud SSO の設定画面で表示された URL
認証の確認:Intel Cloud SSO の設定画面からダウンロードできる証明書
ドメイン固有の発行元を使用:チェック
























ユーザプロビジョニングを行う場合は、GoogleApps のドメイン設定よりユーザ設定画面でプロビジョニング API を有効にします。
















次に、このアプリケーションを使えるユーザを設定します。設定方法としては
グループを作成し、そのグループメンバをアサインする
 ※グループメンバはユーザのロールや特定の属性値からダイナミックに設定が可能
個別にユーザをアサインする
という2通りの設定があります。

今回は個別にユーザを割り当てます。
アプリケーションの設定の中から、[Assign Users]メニューより[Assign by Users]を選択し、虫眼鏡をクリックすると登録されているユーザ一覧が表示されるので、必要なユーザにチェックを入れ、[Save]をクリックします。
























最後に設定したアプリケーションを有効化します。
Admin タブからアプリケーションを見ると作成したアプリケーションは Inactive Applications の中に入っていますので、Activate をクリックします。
Activate 後は以下の状態になるはずです。



































これでアプリケーションの設定は完了です。


■アプリケーションを利用する
この状態で MyApps タブを開くと GoogleApps 関連のアプリケーションアイコンが出来上がっているはずです。






















Gmail のアイコンをクリックするとそのまま Gmail へ遷移するはずです。

















※プロビジョニングが完了するまでに少し時間がかかるので失敗する場合は時間を置く必要があります。
※デフォルトで Intel Cloud SSO の firstname.lastname というユーザ名で GoogleApps にアカウントを作成しに行くので同一名のアカウントがいたり、削除したばかりだったりすると Google Provisioning API 側がプロビジョニング操作をはじきます。一向にアカウントが作成されないようならそのあたりを確認する必要があります。

2012年5月26日土曜日

[IDaaS] ようやく流行ってきた?


1年半ほど前に IDaaS について紹介しましたが、ここにきて続々とサービス化がされてきています。

5/24 の Intel Cloud SSO に関する記事です。
インテル、クラウド型シングル・サインオン・サービス「Cloud SSO」をリリース

5/23 の Windows Azure Active Directory に関する公式 blog ポストです。
Reimagining Active Directory for the Social Enterprise (Part 1)

同じく 5/23 の Kim Cameron 氏の blog です。
Identity Management As A Service


他にもクラウド・アイデンティティ界の雄である PingIdentity が日本にオフィスを開設したり IIJ と協業を開始してサービスを開始したり、ちょっと前ですが salesforce.com が SAML RP だけでなく IdP としても動作するようになりました。


最近の IDaaS の特徴を見ていると、

  • フェデレーション
  • プロビジョニング
  • 認証強化

の3つの機能要素で構成されています。

それぞれの機能についてどんな選択肢が用意されているのか、が差別化の要因になると思います。

  • フェデレーション
    • 対応プロトコルはもちろん、接続先があらかじめメニューとして組み込まれていたりウィザードで簡単に設定できる、という部分が強みとなると思います。
  • プロビジョニング
    • サービス側の対応がまだ限られているので Google Apps、salesforce.com、WebEx、Office365 など限定的ですが実際には一番管理者にとってメリットが出る部分なので今後のサービス側の対応が望まれます。
  • 認証強化
    • ワンタイムパスワード(OTP)や SeucureID、IP 制限、モバイル対応など色々と選択肢がありますが、インターネット経由のアクセスを考えるとここも気になる点だと言えます。


現段階でのメジャーなサービスを比べてみます。(Windows Azure Active Directory の詳細はこれからなので微妙ですが)

ベンダサービス/製品特長フェデレーションプロビジョニング認証強化
IntelIntel Cloud SSO対応APLが多数○(サービスによる)OTP、IP制限、モバイル、時間帯、曜日
MicrosoftWindows Azure Active DirectoryOffice365連携Office365AD FS2.x ベースのカスタマイズ
PingIdentityPingFederateオンプレミス○(サービスによる)証明書、RSA SecureID、Symantec VIP、PhoneFactor
※ちなみに Intel は IAMaaS 、Microsoft は IdMaaS という表現を使うこともあります。

後は、やはり CSA のガイドライン対応や LoA などプロバイダの信頼性が一番気になるところかと。
また日本国内での普及についてはアイデンティティ情報がサービスプロバイダ側での物理的配置の問題など色々と気にすることになると思いますので、そのあたりを踏まえると国産の IDaaS プロバイダがもっと前面に出てくると良いかな、、と思います。

2012年5月21日月曜日

[FIM2010] ポータルのナビゲーションバーをカスタマイズする


以前のポストで FIM ポータルの表示項目をカスタマイズする方法を一部紹介しました。
その時はどちらかというと管理ユーザだけでなく一般ユーザでログインした時にもメニューを表示するための方法、という切り口で紹介をしましたが、今回は好きなメニューをナビゲーションバーに表示させる方法を紹介します。

では早速。
試しに管理者が良く使う項目で何故かナビゲーションバーに存在しない「同期規則」の項目をナビゲーションバーに追加してみます。

デフォルト状態では「同期規則」が表示されていない。







































画面右側の管理メニューより「ナビゲーション バー リソース」をクリックすると、ナビゲーションバーに表示するリソースの一覧が表示されます。この中を見ると「同期規則」が存在しないので、新規に作ってあげます。























子ウィンドウが開くので、以下を入力します。
タブ項目入力値備考
全般表示名Synchronization Rules任意の名称(英字名)
使用法キーワードなし(空白)一般ユーザにも公開する場合はここに「BasicUI」と入力
UI位置親の順序7デフォルトの「管理」が上から6番目なのでその下の7を入力
並び順0サブメニューを作る場合は親項目の中での並び順を入力
動作ナビゲーションURL~/IdentityManagement/aspx/syncrule/AllSyncRules.aspx相対パスもしくは絶対パスでリソースのURLを入力。同期規則はこのURL
ローカライズサポートされる言語日本語(日本)マルチ言語の場合のみ
ローカライズ済みの表示名同期規則マルチ言語の場合のみ

ちなみにリソースの URL は実際にその画面に遷移すればブラウザのアドレスバーから取得可能です。

最後に[送信]をクリックして作成が完了したら iisreset コマンドで IIS を再起動します。

無事にナビゲーションバーに「同期規則」が表示されるようになりました。








































尚、途中でお気づきかと思いますが、絶対パスでリソースを登録することも可能なので、外部のリンクや社内の他のリソースを登録することも可能です。

こんな感じです。

































いかがでしょうか?
基本的にリソースの設定ベースで画面のカスタマイズや設定が可能なので、自分仕様の FIM ポータルを作ってみると良いでしょう。

2012年5月17日木曜日

AD FS2.0 Rollup 2 がリリース


前回の Rollup 1 から半年強、AD FS 2.0 Rollup 2 がリリースされました。

Rollup 1 では Office 365 との連携を強く意識したアップデートでしたが、今回は不具合解消および SAML プロトコルへの準拠対応が中心の様です。

説明およびダウンロードURL
 http://support.microsoft.com/?id=2681584


アップデート情報を簡単にピックアップします。


  1. 高負荷時に AD FS 2.0 サーバ(および Proxy サーバ)が停止してしまう問題を解決
  2. ホームレルムディスカバリを行う際にアプリケーションが指定した whr パラメータの内容で、それ以前から保持していたホームレルム cookie を上書きしてしまう問題を解決
  3. 証明書がアーカイブ状態になった時に AD FS 2.0 サービスが予期せず終了してしまう問題を解決
  4. WID(Windows Internal Database)のファームに AD FS 2.0 サーバを設定するとエラーが発生する問題を解決
  5. SAML プロトコルの RelayState パラメータのサポート


一番大きなトピックスは最後の RelayState のサポートです。

 詳細は
  http://technet.microsoft.com/en-us/library/jj127245(WS.10).aspx
 で解説されています。

この問題は AD FS 2.0 が RC 版の頃から MSDN フォーラムや Google Apps フォーラムで頻繁に取り上げられていた問題で、AD FS 2.0 が Idp-Initiated SAML Response を受け取った際に RelayState パラメータを無視・破棄してしまうという問題でした。
結果的に本来は RelayState で指定した URL に自動的に遷移するところをユーザが手動で遷移しなければならない、という状態となっていました。

詳細は上記の URL に記載されていますが、web.config に以下の様なオプションを設定することで RelayState を無視しなくなります。
<microsoft.identityServer.web>
    ...
    <useRelayStateForIdpInitiatedSignOn enabled="true" />
</microsoft.identityServer.web>


SP にも依存する話なので、新機能が出ても動作の確認がしにくいのですが追々動作を見てみるつもりなので、結果をまた紹介させてもらいます。

2012年5月11日金曜日

[FIM 2010 / Scripts] FIM Portal からユーザを削除する


前々回、前回と FIM Portal のユーザをスクリプトで作成、変更と来たので今回は削除します。

こちらも Technet Wiki にスクリプトがアップされているのでこちらを使います。

http://social.technet.microsoft.com/wiki/contents/articles/2092.how-to-use-powershell-to-delete-a-user-in-the-fim-portal-en-us.aspx

念のためこちらもソースを転記しておきます。

#----------------------------------------------------------------------------------------------------------
 set-variable -name URI -value "http://localhost:5725/resourcemanagementservice' " -option constant 
#----------------------------------------------------------------------------------------------------------
 function DeleteObject
 {
    PARAM($objectType, $objectId)
    END
    {
       $importObject = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportObject
       $importObject.ObjectType = $objectType
       $importObject.TargetObjectIdentifier = $objectId
       $importObject.SourceObjectIdentifier = $objectId
       $importObject.State = 2 
       $importObject | Import-FIMConfig -uri $URI
     } 
 }
#----------------------------------------------------------------------------------------------------------
 if(@(get-pssnapin | where-object {$_.Name -eq "FIMAutomation"} ).count -eq 0) {add-pssnapin FIMAutomation}
 clear-host

 if($args.count -ne 1) {throw "Missing name parameter"}
 $objectName = $args[0]

 if(0 -eq [String]::Compare($objectName,"administrator", $true))
 {throw "You can't delete administrator"}
 if(0 -eq [String]::Compare($objectName,"Built-in Synchronization Account", $true))
 {throw "You can't delete Built-in Synchronization Account"}

 $exportObject = export-fimconfig -uri $URI `
 -onlyBaseResources `
 -customconfig "/Person[DisplayName='$objectName']"

 if($exportObject -eq $null) {throw "L:Object not found"}
 $objectId = (($exportObject.ResourceManagementObject.ObjectIdentifier).split(":"))[2]

 DeleteObject -objectType "Person" `
              -objectId $objectId

 write-host "`nObject Deleted successfully`n"
#----------------------------------------------------------------------------------------------------------
 trap 
 { 
    $exMessage = $_.Exception.Message
    if($exMessage.StartsWith("L:"))
    {write-host "`n" $exMessage.substring(2) "`n" -foregroundcolor white -backgroundcolor darkblue}
    else {write-host "`nError: " $exMessage "`n" -foregroundcolor white -backgroundcolor darkred}
    Exit
 }
#----------------------------------------------------------------------------------------------------------


こちらはシンプルに引数に削除したいユーザの表示名を指定して実行します。

.\DeleteFIMUser.ps1 テスト太郎

うまく行くと、

Object Deleted successfully

と表示され FIM Portal ユーザが削除されているはずです。

尚、前々回、前回も書きましたが、あくまで本環境では CSV Management Agent + ISR を使うのを推奨します。

[FIM 2010 / Scripts] FIM Portal のユーザ属性を変更する

前回は FIM Portal に直接ユーザを作る、というスクリプトを紹介しましたが、今回は FIM Portal 上のユーザの属性を直接変更するためのスクリプトです。


以下のコードを ps1 ファイルとして保存して実行します。(例では ModifyFIMUser.ps1 として保存)

#
# 引数
# 0 : 対象ユーザの表示名(DisplayName)
# 1 : 属性名、属性値ペア(「:」区切り)
#
set-variable -name URI -value "http://localhost:5725/resourcemanagementservice" -option constant 

clear

If(@(Get-PSSnapin | Where-Object {$_.Name -eq "FIMAutomation"} ).count -eq 0) {Add-PSSnapin FIMAutomation} 

$accountName=$args[0]
$Filter = "/Person[DisplayName=$accountName]"
$attribute = ($args[1]).split(":")[0]
$value = ($args[1]).split(":")[1]

$object = export-fimconfig -uri $URI -onlyBaseResources -customconfig ($Filter) -ErrorVariable Err -ErrorAction SilentlyContinue

function GetAttributeValue($exportObject,[string] $name) {
    $attribute = $exportObject.ResourceManagementObject.ResourceManagementAttributes | 
        Where-Object {$_.AttributeName -eq $name}
    if ($attribute -ne $null -and $attribute.Value) {
        $attribute.Value
    }
}

$objectID = GetAttributeValue $object "ObjectID"
$objectType = GetAttributeValue $object "ObjectType"

$importChange = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportChange
$importChange.Operation = 1
$importChange.AttributeName = $attribute
$importChange.AttributeValue = $value
$importChange.FullyResolved = 1
$importChange.Locale = "Invariant"

$importObject = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportObject
$importObject.ObjectType = $objectType
$importObject.TargetObjectIdentifier = $objectID
$importObject.SourceObjectIdentifier = $objectID
$importObject.State = 1 
$importObject.Changes = (,$importChange)

$importObject | Import-FIMConfig -uri $URI -ErrorVariable Err -ErrorAction SilentlyContinue


write-host "completed"


引数は、以下の通りです。
第1引数:対象ユーザの表示名
第2引数:変更したい属性名と更新する値のペア(「:(コロン)」区切り)

例えば、表示名が「テスト太郎」のユーザの姓を「テスト1」に変えたければ、

.\ModifyFIMUser.ps1 テスト太郎 "LastName:テスト1"

という形でスクリプトを実行します。

うまく行くと

completed

と出てくるのでポータル画面で確認します。
(実際はエラーハンドル処理を全く入れていないので失敗しても completed とでますw)

























尚、前回も書きましたが、あくまで本環境では CSV Management Agent + ISR を使うのを推奨します。

2012年5月10日木曜日

[FIM 2010 / Scripts] FIM Portal にユーザを登録する


先日に引き続き PowerShell で FIM を操作する小ネタです。

ID 管理システムを構築する時、一番多いのは CSV から従業員情報を取り込んで Active Directory など様々なリソースへアカウントを作成・変更・削除していく、というシナリオです。
当然のことながら FIM にも CSV からデータを取り込む Management Agent が用意されているので、着信同期規則(ISR)を設定すれば CSV 上のデータをもとにアカウント情報の保守を行うことが可能です。

もちろん本筋はこの機能を使って CSV データを取り込んで Metaverse を経由して FIM Service / Portal へアカウントを作成し、そこから Active Directory などへプロビジョニングを行う、というのがベストプラクティスですし、特に複数の CSV データソースがある場合、属性単位の優先順位設定などを行えたり、ログを取得出来たりするという点ではこの機能を使うべきです。

ただ、一時的な実装を行う場合や、あくまで例外的にユーザを差し込みたい場合などは FIM Portal に直接ユーザを作成したくなる場合もあるのが実情です。

そんな場合に今回紹介するスクリプトを使うことが出来ます。

記載サイト
 http://social.technet.microsoft.com/wiki/contents/articles/2083.how-to-use-powershell-to-create-a-user-in-the-fim-portal-en-us.aspx

一応コードを転記しておきます。

#----------------------------------------------------------------------------------------------------------
 set-variable -name URI -value "http://localhost:5725/resourcemanagementservice' " -option constant 
#----------------------------------------------------------------------------------------------------------
 function SetAttribute
 {
    PARAM($object, $attributeName, $attributeValue)
    END
    {
        $importChange = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportChange
        $importChange.Operation = 1
        $importChange.AttributeName = $attributeName
        $importChange.AttributeValue = $attributeValue
        $importChange.FullyResolved = 1
        $importChange.Locale = "Invariant"
        if ($object.Changes -eq $null) {$object.Changes = (,$importChange)}
        else {$object.Changes += $importChange}
    }
} 
#----------------------------------------------------------------------------------------------------------
 function CreateObject
 {
    PARAM($objectType)
    END
    {
       $newObject = New-Object Microsoft.ResourceManagement.Automation.ObjectModel.ImportObject
       $newObject.ObjectType = $objectType
       $newObject.SourceObjectIdentifier = [System.Guid]::NewGuid().ToString()
       $newObject
     } 
 }
#----------------------------------------------------------------------------------------------------------
 if(@(get-pssnapin | where-object {$_.Name -eq "FIMAutomation"} ).count -eq 0) {add-pssnapin FIMAutomation}
 clear-host

 if($args.count -ne 1) {throw "You need to specify your attribute values as parameter"}
 $attributes = ($args[0]).split("|")

 if(0 -ne [String]::Compare(($attributes[0]).split(":")[0],"displayname", $true))
 {throw "You need to specify a display name"} 

 $objectName = ($attributes[0]).split(":")[1] 
 $exportObject = export-fimconfig -uri $URI `
 -onlyBaseResources `
 -customconfig "/Person[DisplayName='$objectName']"
 if($exportObject) {throw "L:User $objectName already exists"}

 $newUser = CreateObject -objectType "Person"
 foreach($attribute in $attributes)
 {
    $attrData = $attribute.split(":")
    SetAttribute -object $newUser `
                 -attributeName  $($attrData[0]) `
                 -attributeValue $($attrData[1]) 
 }              

 $newUser | Import-FIMConfig -uri $URI
 write-host "`nUser created successfully`n"
#----------------------------------------------------------------------------------------------------------
 trap 
 { 
    $exMessage = $_.Exception.Message
    if($exMessage.StartsWith("L:"))
    {write-host "`n" $exMessage.substring(2) "`n" -foregroundcolor white -backgroundcolor darkblue}
    else {write-host "`nError: " $exMessage "`n" -foregroundcolor white -backgroundcolor darkred}
    Exit
 }
#----------------------------------------------------------------------------------------------------------


使い方は上記サイトに記載されているコードを ps1 ファイルとして保存して実行します。(例では CreateFIMUser.ps1 として保存)

引数には「属性名1:属性値1|(パイプ)属性名2:属性値2」という形で「:(コロン)」区切りで属性名、属性値のペアを「|(パイプ)」で連結したものを指定します。

例えば、
・表示名(DisplayName):テスト太郎
・名(FirstName):太郎
・姓(LastName):テスト
というアカウントを FIM Portal 上に作成したければ、

.\CreateFIMUser.ps1 "DisplayName:テスト太郎|FirstName:太郎|LastName:テスト"

という形でスクリプトを実行します。

うまく行くと

User created successfully

というメッセージが表示されるので実際に FIM Portal を見てみるとユーザが作成されているはずです。































このスクリプトを応用すれば CSV ファイルから直接 FIM Portal へユーザを作成する、ということも可能なので、CSV Management Agent を使いたくない場合は工夫をしてみても良いと思います。
(あくまで本環境では CSV Management Agent + ISR を使うのを推奨します)