ラベル SharePoint の投稿を表示しています。 すべての投稿を表示
ラベル SharePoint の投稿を表示しています。 すべての投稿を表示

2018年8月15日水曜日

サービス終了間際のAzure ACS無しでSharePoint ServerへAzure ADでログインする

こんにちは、富士榮です。

前回も書きましたが今年の11月でAzure Access Control Service(ACS)のサービス提供が終了します。

Azure ACSを自前サービス用に使っているようなB2B/B2C向けサービスを提供している企業の方はある程度切り替えは終わっているとは思いますが、意外と見落としがちなのがオンプレミスでSharePointを構築して使っている企業の方々です。

現状、SharePointサーバは最新バージョンであるSharePoint Server 2016でさえClaimベース認証を構成しようとするとプロトコルとしてws-federation、トークンはSAML1.1しかサポートしていません。

この制限により、SAML2.0トークンしかサポートしていないAzure ADとSharePoint Serverの間で直接のフェデレーションを構成することが出来ませんでした。

このことを解決するために、これまではAD FSやAzure ACSなど割と柔軟にws-federationの構成が出来る製品やサービスを間に噛ませてシングルサインオンを実現していました

こんな構成です。



が、いよいよAzure ACSのサービス提供が終了、ということでそろそろ対策を行わないと手遅れになってしまいます。
となると、引き続きAD FSを使う、というのも一つの手段ではありますが、今更オンプレミスにサーバを配置して管理するのも面倒なので、出来ることならSharePointとAzure ADを直接接続しておきたいところです。

と、言うことで今回はAzure ADにSAML1.1のトークンを発行させることでSharePoint Serverと直接接続するための方法を解説します。
尚、この手法は特に裏技というわけではなく、オフィシャルに(ひっそりと)公開されている手順です。
Using Azure AD for SharePoint Server Authentication
https://docs.microsoft.com/en-us/Office365/Enterprise/using-azure-ad-for-sharepoint-server-authentication

簡単に言うと、Azure ADのトークン発行ポリシーをカスタマイズしてSAML1.1のトークンを発行させることによって、SharePoint Serverが解釈できるようにしてやろう、という作戦です。

以下の順に構成を行います。

  • Azure ADのエンタープライズ・アプリケーションにSharePoint Server接続用のアプリケーションを登録する
    • SharePointのEntityID、Reply URLを登録する
    • トークン署名用の証明書を生成し、公開鍵をダウンロードする
    • ユーザの割り当てを行う
  • 作成したAzure AD上のアプリケーション(ServicePrincipal)にリンクされたトークン発行ポリシーを変更する
    • SAML1.1トークンを発行するカスタム・ポリシーを作成する
    • 元々ServicePrincipalにリンクされているSAML2.0トークン発行のポリシーとのリンクを解除する
    • 新規作成したカスタム・ポリシーをServicePrincipalにリンクする
  • SharePoint Serverの信頼済みアイデンティティ・トークン発行者としてAzure ADを構成する
    • Azure ADからダウンロードした公開鍵を登録する
    • クレームマッピング、識別用属性を指定し、アイデンティティ・トークン発行者登録を行う
  • SharePoint Serverのユーザ・ポリシーを構成する
    • サイトへのAzure AD上のユーザへのアクセス権限を設定する


◆まずはありのままを

はじめる前に、まずは何もしない素の状態のAzure ADのws-federationでSharePoint Serverと接続するとどうなるのか?について確認しておきたいと思います。
要はSAML2.0のトークンをSharePoint Serverが受け取ったらどういう挙動をするか?の確認です。
(上記の手順のトークン発行ポリシーの変更をしないとどうなるか?という話しです)

結果、ID4014エラーが出てSAML2.0はサポートされていない、と言って怒られます。
※エラー内容がわかりやすくなるように、web.configのcustomErrors modeをoffに設定しています。


では早速。

◆Azure ADのエンタープライズ・アプリケーションにSharePoint Serverを登録する

当然ギャラリーには無いアプリケーションなので、「ギャラリー以外のアプリケーション」を選択してアプリケーションを登録していきます。
つまり、この段階ではプロトコルもトークンもSAML2.0のアプリケーションとして登録します。


アプリケーションの作成が終わったら、シングルサインオン設定を行います。
必要な設定はSharePoint ServerのEntityIDとサインオンURLです。

  • EntityID
    • 任意の文字列(後でSharePoint Server側に登録するRealmの文字列と同一の文字列) ※通常は「urn:sharepoint:{サーバ名}」とか「http://{サーバ名}」を使うことが多いです。
  • サインインURL
    • https://{SharePointサーバ名}/_trust/default.aspx ※httpsが必要なので、先にSharePointのSSL化は済ませておくこと

こんな感じです。

次に、トークン署名用の証明書をダウンロードしておきます。

また、他にも後でAzure ADのサインインURLと作成したアプリケーションのオブジェクトIDが必要になるのでメモしておきましょう。
SSO URLはシングルサインオンの構成のページに表示されているものを使います。(実際はSAMLではなくws-federationを使うので、URLのパスはwsfedに変更する必要があります)

オブジェクトIDはプロパティのページにあります。


アプリケーションIDと間違えやすいの注意です。オブジェクトIDの方を使います。

また、同じページにユーザの割り当ての設定もあるので、Azure AD上のユーザでSharePointを利用するユーザの限定が必要なければ「割り当てが必要ですか?」は「いいえ」を設定しておきます。

◆SAML1.1トークン発行用のカスタム・ポリシーの作成とリンクを行う

この作業が一番のキモです。
PowerShellを使って構成することも可能ですが、結局はInvoke-RestMethodでGraph APIを叩いているだけなので、Azure AD Graph Explorer(https://graphexplorer.azurewebsites.net/)で直接実行した方が手っ取り早いと思います。(トラブルを避けるために、先のエンタープライズ・アプリケーションの登録に使ったグローバル管理者権限を持った組織アカウントでログインしてください。マイクロソフトアカウントは不可です)

実行するのは、以下のAPIです。

  • 現状のポリシーを確認する
    • メソッド:GET
    • リソース:https://graph.windows.net/myorganization/servicePrincipals/{先ほどメモしたエンタープライズ・アプリケーションのオブジェクトID}/policies
これで、現在アプリケーションにリンクされているトークン発行ポリシー(SAML2.0のトークンを発行するポリシー)のIDが取得できます。同時に複数のトークン発行ポリシーを一つのServicePrincipalにリンクすることは出来ないので、このポリシーとのリンクは削除してしまいます。(ポリシーそのものは他のアプリケーションで使っているので削除しない様に気を付けてください)

  • ポリシーとのリンクを削除する
    • メソッド:DELETE
    • リソース:https://graph.windows.net/myorganization/servicePrincipals/{先ほどメモしたエンタープライズ・アプリケーションのオブジェクトID}/$links/policies/{直前の手順で取得したリンクしているポリシーのオブジェクトID}
ちなみに、Graph Explorerを使うとDELETEなどHTTP 204 no contentsが返ってくるようなクエリはいつまでたっても結果が表示されずにプログレスバーがじりじりと動くだけですが、ちゃんと処理は実行されているので、遠慮なく止めてしまってOKです。

再度、リンクされているポリシーを確認するとnullが返ってくるのでトークン発行ポリシーとのリンクが解除されたことがわかります。

次は、いよいよカスタムポリシーを作成します。

  • SAML1.1トークン発行ポリシーを作成する
    • メソッド:POST
    • リソース:https://graph.windows.net/myorganization/policies/
    • ボディ:{"displayName":"SPSAML11","type":"TokenIssuancePolicy","definition":["{\"TokenIssuancePolicy\":{\"TokenResponseSigningPolicy\":\"TokenOnly\",\"SamlTokenVersion\":\"1.1\",\"SigningAlgorithm\":\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\",\"Version\":1}}"]}
作成が完了したら、作成したポリシーのオブジェクトIDを確認しておきます。

  • 作成したポリシーを確認する
    • メソッド:GET
    • リソース:https://graph.windows.net/myorganization/policies

ここで先ほど作ったカスタム・ポリシーのオブジェクトIDを取得しておき、エンタープライズ・アプリケーションとリンクします。

  • ポリシーのリンクを作成する
    • メソッド:POST
    • リソース:https://graph.windows.net/myorganization/servicePrincipals/{先ほど作成したエンタープライズ・アプリケーションのオブジェクトID}/$links/policies
    • ボディ:{"url":"https://graph.windows.net/myorganization/policies/{作成したカスタム・ポリシーのオブジェクトID}?api-version=1.6"}


このクエリも返事がない(no contents)のでポリシーのリンク状態を確認しておきます。


  • ポリシーのリンク状態を確認する
    • メソッド:GET
    • リソース:https://graph.windows.net/myorganization/servicePrincipals/{先ほど作成したエンタープライズ・アプリケーションのオブジェクトID}/policies


これでAzure AD側の準備は完了です。

◆SharePoint Serverに信頼済みアイデンティティ・トークン発行者を登録する

先ほどAzure AD上に登録したSharePoint ServerのEntityID、Azure ADのサインオンURL、ダウンロードした証明書を用意しておき、SharePoint管理シェル(PowerShell)を管理者権限で起動、以下のコマンドを実行します。

  • $realm : SharePoint ServerのEntityIDとしてAzure AD上に設定した文字列
  • $wsfedurl : Azure ADのサインオンURL。最後のsaml2をwsfedに変更する
  • $filepath : ダウンロードした証明書ファイルのパス


$realm = "urn:sharepoint:xxxx"
$wsfedurl="https://login.microsoftonline.com/{tenantid}/wsfed"
$filepath="C:\users\Administrator\desktop\sharepoint.cer"
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($filepath)
New-SPTrustedRootAuthority -Name "AzureAD" -Certificate $cert
$map = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" -IncomingClaimTypeDisplayName "name" -LocalClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"
$map2 = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname" -IncomingClaimTypeDisplayName "GivenName" -SameAsIncoming
$map3 = New-SPClaimTypeMapping -IncomingClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname" -IncomingClaimTypeDisplayName "SurName" -SameAsIncoming
$ap = New-SPTrustedIdentityTokenIssuer -Name "AzureAD" -Description "SharePoint secured by Azure AD" -realm $realm -ImportTrustCertificate $cert -ClaimsMappings $map,$map2,$map3 -SignInUrl $wsfedurl -IdentifierClaim "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"

これで信頼済みのアイデンティティ・トークン発行者の登録が完了しますので、SharePoint Serverの管理ページのWebアプリケーションの管理で認証プロバイダとして設定を行います。

対象のWebアプリケーションを選択して認証プロバイダの設定を開き、信頼済みアイデンティティ・トークン発行者の設定で先ほど作成したAzure ADを選択します。


これで、SharePoint ServerのSSO設定も完了です。

いよいよ最後です。

◆ユーザーポリシー(ユーザへの権限付与)を構成する

最後に信頼済みアイデンティティ・トークン発行者からわたってくるユーザがサイトへアクセスできるように権限を付与します。
この手順が抜けると認証は出来ても認可がされないのでログインすることが出来ません。

対象のWebアプリケーションを選択してユーザ・ポリシーを開きます。
ユーザの追加より、ピープル・ピッカーを開き、Azure ADのname(今回は識別子をname属性にしているので)を選択した状態で画面上部の検索窓にAzure AD上のユーザ名を入れて検索ボタンをクリックし、出てくるユーザを追加します。


これで全ての設定が完了です。
早速サイトへアクセスするとAzure ADへリダイレクトされ、認証が終わるとコンテンツが表示されるはずです。

SAML Tracerでトレースをしてみると、ちゃんとトークンのバージョンがSAML1.1になっていることがわかります。

<t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
    <t:Lifetime>
        <wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2018-08-12T13:00:58.881Z</wsu:Created>
        <wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2018-08-12T14:00:58.881Z</wsu:Expires>
    </t:Lifetime>
    <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
        <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
            <wsa:Address>urn:sharepoint:xxxxx</wsa:Address>
        </wsa:EndpointReference>
    </wsp:AppliesTo>
    <t:RequestedSecurityToken>
        <saml:Assertion MajorVersion="1"
                        MinorVersion="1"
                        AssertionID="_d9aa279a-50f5-4f42-a553-ea45faa33ce4"
                        Issuer="https://sts.windows.net/{tenant id}/"
                        IssueInstant="2018-08-12T13:05:58.881Z"
                        xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
                        >



いかがでしょうか?まだACSを使っている人は早めにAzure ADと直接フェデレーションする様に構成を変更しておきましょう。

2018年8月13日月曜日

サービス終了間際!Azure ACSの状況を確認する

こんにちは、富士榮です。

数年前に一世を風靡したAzure ACS(Access Control Service)ですが、いよいよ11月でサービス提供が終了されます。

ということで過去に作ったACSネームスペースの整理を進めようと思います。

しかし、旧Azure Portalが既にアクセスできず、現在のAzure PortalからはACSのWeb管理コンソールへのリンクがどこにもない、そして作ったネームスペースの名前も忘れている、という状態で途方に暮れているのは私だけではないはずです。

そういう人のためのPowerShellのモジュールがこちらです。

Acs.Namespaces
https://www.powershellgallery.com/packages/Acs.Namespaces/1.0.2


これを使うと、過去に作成したネームスペースの一覧の参照や有効化・無効化・削除などが可能です。

早速使ってみましょう。
手順に従いモジュールのインストールをしたら、まずは「Connect-AcsAccount」でACSに接続します。
ACSのログイン画面がポップアップするのでMicrosoft Accountでログインします。

次に、Microsoft Accountが紐づいているサブスクリプションを「Get-AcsSubscription」取得します。ACSのネームスペースはサブスクリプションに紐づいているので、サブスクリプションIDを指定して検索する必要があるためです。

サブスクリプション一覧が取得できたら、「Get-AcsNamespace」ネームスペースの状態を確認してみます。パラメータには先ほど取得したサブスクリプションのIDを指定します。

こんな感じでネームスペースと管理URLが取得できます。

ちなみに、しばらく放置していたACSネームスペースは無効化されているので、StateがDisabledになっているものは再度有効化しないと管理コンソールへログインできません。
たしかこんな名前のネームスペースがあったはずだけどアクセスできなくなってる・・・という人は無効化されている可能性があるので、確認してみてください。

ネームスペースを有効化するには、「Enable-AcsNamespace」を使います。


これで管理URLへアクセスすると懐かしのACSの管理コンソールが使えます。


昔作ったリソースの移行忘れが無いようにしておきましょう。

特に久しぶりに触るSharePointの実験環境など、私も忘れていたモノがあったのでACSからAzure ADへの切り替えをしておこうと思います。(ちなみにAzure ADでSAML1.1のトークンが発行出来ない問題は密かに解決しているので、既にACSが無くても直接Azure ADでオンプレSharePointのClaim Based Authenticationは使えるようになっています。手順などはまた紹介します)







2017年1月10日火曜日

Office365管理者は要対応。外部共有により不要なアクセス権が付与される

こんにちは、富士榮です。

OneDrive for Business上のコンテンツやSharePoint Onlineのチームサイトを他組織のユーザと共有をするB2Bシナリオで利用している企業・組織が増えている中、Office365(およびそのID基盤であるAzure AD)の構造上の問題により、意図しないアクセス権を外部ユーザへ付与してしまう場合があるので、注意喚起の意味で本エントリを書きます。

[3/7 Update]
一部修正が行われ、ポータルからのディレクトリ構成情報へのアクセスがデフォルトでブロックされるようになりました。
詳しくはこちらをご覧ください。
 http://idmlab.eidentity.jp/2017/03/office365.html

現在、この課題については米国マイクロソフトのAzure AD開発チームへエスカレーションしており早期の改善を求めていますが、場合によっては長期化する可能性もあるため、自組織でOffice365を管理しており、外部ユーザとのコンテンツ共有をエンドユーザへ開放している管理者は一読の上、対応を行うことをお勧めします。
(いわゆる製品やサービスの脆弱性の類ではないため)


◆課題の概要

OneDrive for Business上のコンテンツ共有やSharePoint Onlineのチームサイトへの招待を受けた外部ユーザは、共有されたコンテンツ以外にも、「Azure AD上ですべてのユーザに対して割り当てを行われたアプリケーションや、Azure Portalを経由したディレクトリ情報へのアクセスが許可されてしまいます。かつ、事前に共有した本人および管理者がこのことに気が付くことはほぼ不可能です(どこにもそのような記述はないため)」。

これは招待されたユーザが自組織でOffice365やAzure ADを使っておらず個人でマイクロソフトアカウントを使っている場合においても発生します。


◆実際の動き

実際にどのような動きになるのか、動画を撮っていますので、まずはこちらをご覧ください。
わかりにくいですが、以下が環境です。

<組織「eIdentity」:招待する側>
・Office365を運用しています
・一般ユーザ「test001@ems.adfs20.net」でOneDrive for Businessで外部ユーザ「test001@gapps21.adfs20.net」に対してコンテンツを共有します
・Azure AD上で「ts2016」というアプリケーションをAll Usersグループに対して公開しています

<組織「InternetWeek」:招待される側>
・Office365は使っていませんが、Azure ADを利用しています
 (マイクロソフトアカウントの場合も同じ動きになります)
・「test001@gapps21.adfs20.net」という一般ユーザが所属しています




単純にeIdentityテナントのユーザでOneDrive for Businessでフォルダを共有しただけなのに、共有前はInternetWeekテナントのユーザがアクセス出来なかったts2016アプリへアクセスが出来てしまい、かつAzure Portal経由でeIdentityディレクトリの構成情報(ドメイン一覧)が参照できてしまっています。
※アプリケーションのURLを知らなくてもアクセスパネル(https://myapps.microsoft.comへアクセスすると利用できるアプリケーション一覧が表示されてしまいます。
※SharePoint Onlineのチームサイトへの招待の場合は、アプリケーションアクセスは出来ませんが、Azure Portal経由でのディレクトリ情報の参照は可能な状態になります。
(「All Usersグループ」へ自動追加されないため)


ディレクトリ上(ドメイン一覧)の参照


アプリケーションへのアクセス

上記のスクリーンショットはいずれもゲストユーザによりアクセスした状態で撮っています。


管理者としては、特定のコンテンツのみの共有なら、、という気持ちで許可した外部共有がこのような形で他の情報へのアクセスへ影響を与えるということは意図していないことが多いと思われるため、非常に大きな問題となる可能性があります。


◆なぜ発生するのか

OneDrive for BusinessやSharePoint Onlineで外部ユーザを招待すると、招待されたユーザが招待したOffice365側のAzure AD上にゲストユーザとして登録されます。
これはAzure AD B2Bで外部ユーザを招待するのと同じ動作であり、Office365が内部的にAzure AD B2Bの機能を利用しているために発生しています。

そして現状では、ゲストとして登録されたユーザは、
1.ディレクトリへのサインイン(認証)
2.ディレクトリ上の自プロファイルへのアクセス
に加えて、
3.ディレクトリ構成情報へのアクセス(少なくともドメイン一覧の参照)
4.(場合により)All Usersグループへの自動登録
が行われてしまいます。

1、2については本来のゲストユーザとしてアクセスを行うために最低限必要な機能なので、仕方がありませんが、問題は3、4です。


◆Office365/Azure ADの内部構造の課題

ここまで見てきたとおり、Azure ADにゲストとして登録された外部ユーザが想定以上に権限を持ってしまっていることが根本的な課題です。
少なくとも、
・自プロファイル以外のディレクトリ情報へのアクセス
・ディレクトリに登録されたアプリケーションへのアクセス
はデフォルトでは禁止されるべきでしょう。

早々にマイクロソフトが対応してくれることを望みます。


◆推奨される対応

このような状況なので管理者が出来ることと出来ないことがあるのですが、少なくとも以下の対応をしておくべきでしょう。

1.ゲストユーザが自ディレクトリ上に存在するかどうかの確認

まず、自ディレクトリ上にゲストユーザが存在しているかどうかは定期的に確認をしておくべきでしょう。
以下のAzure Active DirectoryのPowerShellを使い、以下のコマンドレットを実行することでゲストの存在を確認できます。
Get-MsolUser | Where-Object { $_.userType -eq 'Guest' }



2.All Usersではなく、自ディレクトリ上の本来のメンバだけが含まれるグループの作成

動的メンバシップグループをカスタムで作成し、userType=Memberのユーザだけが所属する様に構成することで自ディレクトリ上で作成されたユーザのみが含まれるグループを作成することが可能です。


逆にuserType=Guestだけが含まれるグループを作成するとゲストだけが含まれるグループを作成することが出来ます。



3.All Usersグループへ割り当てられているアプリケーションの割り当て変更

All Usersグループへのアプリケーション割り当ては非常に便利なので使ってしまいがちなのですが、ここは先の2で作成したメンバだけが所属しているグループへの付け替えを検討しましょう。

こうしておけば、Azure ADからプロビジョニングを行っているアプリケーションであっても、ゲストユーザはプロビジョニングされませんし、アクセスパネル(https://myapps.microsoft.com)にもアプリケーションは出てきませんので安心です。

<変更前>

<変更後>



4.アプリケーション側でしっかり認可を行う

この問題は最終的にはアプリケーションの作りに依存するので、認証されただけでは利用できないようにアプリケーションを構成する(きちんと認可する)ことが最も大切です。

例えば、今回の動画の中でアクセスしている「ts2016」というアプリケーションはディレクトリ上にユーザが存在していれば使える、という簡易な実装にしてしまっているためゲストであっても使えてしまいます。

しかし、アプリケーション側の実装で、認証されてアクセスしてきたユーザへのアクセス制御を他の属性(所属など)を用いてしっかりと管理を行うことで、少なくとも重要なデータへのアクセスを防ぐことが出来ます。

5.ポータルへのアクセスを禁止する(要注意:影響度大)

設定を間違えると管理者でさえ管理ポータルへアクセスできなくなったり、他のAPIを使うアプリケーションへのアクセスが一切できなくなるので、この設定を行う場合は十分にテストを行った上で慎重に実施してください。著者は一切責任をとれません。

かなり強引なやり方ですが、条件付きアクセスを利用してゲストユーザからWindows Azure Service Management APIへのアクセスをブロックしてしまえば管理ポータルへのアクセスが出来なくなります。

以下の条件付きアクセスポリシーを作成します。
・Users and groups:All Guests(先ほど作成したゲストだけのグループ)
・Cloud apps:Windows Azure Service Management API
・Grant:Block access
・Enable policy:On






このポリシーを有効にすると、管理ポータルへアクセスしようとするとアクセスがブロックされます。

ディレクトリを切り替えようとすると、

アクセスがブロックされます。

◆今後の対応

現状、この動作はサービスの仕様の問題であり、いわゆるバグ等の不具合には該当しないためサービスのエンハンス要求を挙げている状態です。

この状態で出来ることは管理者の自衛が中心となりますので、動作および自テナントの状態をよく理解して運用をしていってください。

今後、動作に変更などあれば本ブログでも更新情報を発信していきたいと思います。

2015年10月10日土曜日

[MIM]同一サーバにMIM Service/PortalとSynchronization Serviceを同居する際の注意点

こんにちは、富士榮です。

本番環境ではMicrosoft Identity Manager(MIM)Synchronization ServiceとMIM Service/Portalは分離すると思うので、あまり問題になることはありませんが、開発や検証環境では一台のサーバ上に環境を作ることも多いと思います。

しかし、本番環境になるべく近い構成にするためにMIM Service/PortalのベースとしてStandard/Enterprise EditionのSharePointをインストールすると、同梱されているUser Profile Service(実体はFIM Synchronization Service)がインストールされてしまいます。

このことにより、MIM Synchronization Serviceの構成が壊れてしまうので、検証環境等でMIM Synchronization ServiceとMIM Service/Portal(およびベースとなるSharePoint)を同一のサーバにインストールする場合は注意が必要です。
(SharePoint FoundationにはUser Profile Serviceが入っていないので問題は起きません)


Microsoft Identity Manager 2016 のポータル


早速見ていきましょう。

◆発生条件
・MIM Synchronization ServiceとMIM Service/Portalを一台のサーバに同居する
・Standard/EnterpriseエディションのSharePointを利用する

◆発生する不具合
・MIM Synchronization Serviceをインストールした後でSharePointをインストールするとSynchronization Service Managerが起動しなくなる。
 ・サービス実行ファイルのパスがSharePoint側のFIM Synchronization Serviceになってしまう


 ・サービス実行アカウントが「\」となってしまう


 ・サービス起動設定が無効化となってしまう
 ・アカウントをSynchronization Service用に設定しなおしてもAccess Deniedエラーが出てサービスが起動しない


◆対策
結局のところ、サービスの設定のパス関係がすべて置き換わってしまっているので修正をする必要があります。
レジストリをガンガン触りますので、基本自己責任です。

①レジストリのサービス関連ファイルのパス修正

対象キー①
HKLM\SYSTEM\CurrentControlSet\Services\FIMSynchronizationServive\ImagePath

修正前)
"C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\Bin\miiserver.exe"
修正後)
"C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\Bin\miiserver.exe"



対象キー②
HKLM\SYSTEM\CurrentControlSet\Services\FIMSynchronizationServive\Parameters\Path

修正前)
C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\
修正後)
C:\Program Files\Microsoft Forefront Identity Manager\2010\Synchronization Service\

※その他、Management Agent関連のパスも修正が必要になる場合もあります。


②サービス実行ユーザの修正
「\」となっているのでSynchronization Service実行ユーザに変更する



③パーミッションの変更
上記①、②でサービス自体の修正は終わりなのですが、どうやらPeopleILMなどSharePoint側の設定で消えないものがあるらしく、Synchronization Service起動ユーザにSharePoint側のSynchronization Serviceのパスへの読み取り・実行権限を与える必要があります。

C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\



一応ここまでで使えるようになります。


◆他の解決方法
インストールする順番をSharePoint⇒MIM Synchronization Serviceの順にすることでSharePoint側の設定を逆にMIMが上書きするのでレジストリの修正は不要になります。
が、やはりPeopleILM関係の問題は出るので、上記③の権限付与は必要です。


◆根本的な解決方法
「SharePoint Foundationを使う」。これに限ります。
基本は同居構成の場合はSharePoint Foundationを使いましょう。

2015年8月24日月曜日

[告知]9月はイベント三昧。ID&IT Management ConferenceとJapan SharePoint Group

こんにちは、富士榮です。

9月にある2つのイベントに登壇することになったので、告知です。

1.ID&IT Management Conference 2015

世界3大アイデンティティ・イベントの一つである「ID&IT Management Conference」が9月18日に開催されます。今年で5回目になるんですね。

私もなんだかんだでほぼ毎年関わらせていただいているんですが、今年もパネル・セッションにパネリストとして参加させていただきます。

私は「エンタープライズIDの正しい捉え方、活用方法」というセッションでNTTデータの山田さん、NIIの中村先生、エクスジェンの江川さんと一緒にパネルディスカッションをする予定です。社内管理部門、学認、パッケージ、SIerという複数の立場からエンタープライズにおけるアイデンティティのあり方みたいな話ができると思います。

以下、セッション概要(イベントページより引用)です。
エンタープライズIDの正しい捉え方、活用方法 (パネルセッション)
認証基盤システム整備のための予算を確保するのに苦労する組織は、大変多いのではないでしょうか。
これは認証基盤整備が、セキュリティ確保や内部統制を主目的とし、また既に稼働中の基盤システムに対する再構築である場合が多く、利益増を主目的とする企業にとっては優先課題にはなりづらいからではないでしょうか。
IDを適切に運用、管理することで実現される理想像を描けているにも関わらず、我々には乗り越えないといけない様々な現実的な(技術論ではない)問題が多くあります。大規模認証基盤システム構築事例を元に、パネリストがそれぞれの立場から、様々な壁を乗り越える策を議論します。

以下のURLから申し込みが可能なので、お早めに!
 http://nosurrender.jp/idit2015/index.html



2.Japan SharePoint Group

2つ目はこれまでもたまにお手伝いさせていただいておりますMVP山崎さんが主宰しているJapan SharePoint Groupで9月12日に開催されます。こちらも20回目の開催になるんですね。

同日にSystem Center User Group Japanが品川で開催され、そちらがActive Directory特集ということなので、スピーカー不足ということで招集がかかりましたw

SharePointグループということでどちらかというと情報系アプリケーションの開発者の方や社内管理者の方が多く参加されると思いますので、テクニカルというよりもハイブリッドな認証/ID管理基盤の基礎的な話、プロジェクトの進め方、Windows 10のAzure AD Joinなんかの話が出来ればいいかな、と考えています。

こちらも以下のURLから申し込みが可能です。
 http://jpsps.com/event/20150912/

時間的に国井さんのセッションとダダ被りですね。。。。

2015年3月7日土曜日

[告知]Japan SharePoint Group勉強会でお話します

なんだか久しぶりの大阪でのイベントです。

SharePoint MVPの山崎さんにお誘いいただき、少々お話をすることになりました。 
と、言っても特にSharePointについてネタがあるわけではないので、Web Application Proxy(WAP:旧AD FS Proxy)とAzure WAPについて話をしようかな、と。

WAPの使い方ってOffice365をインターネット経由で使う時に、Active Directory Federation Services(AD FS)にアクセスするための単純なリバースプロキシ、という認識の方も多いと思うのですが、個人的にその真の価値はws-federation / ws-trustで使われるSAMLトークンをWindows統合認証で使われるKerberosトークンに変換するところにあると考えています。

例えば、オンプレにWindows統合認証で組まれた古いSharePointがあり、そのポータル上には同じくWindows統合認証で組まれたClassic ASPのIISアプリがあって、という環境において、スマホをはじめとする非ドメイン端末からアクセスすると、認証ダイアログが山の様に出てきて、というような問題が起きるわけです。
そんな場合、本来であればアプリケーションを利用環境に合わせて修正していくのが筋なんでしょうが、そんなに簡単に修正・移行できるわけではないので、一時的なワークアラウンドとしてWAPを間に挟み、社外や非ドメイン端末はAD FSでフォーム認証し、発行されたSAMLトークンをWAPがKerberosトークンに変換してWindows統合認証を行う、ということも可能になるわけです。

そのあたりを少しデモも交えつつ紹介できればなぁ、、と。

以下が申込みサイトです。
 Japan SharePoint Group 勉強会 #18
 http://jpsps.com/event/20150314/

3/14(土)に大阪ですが、お暇な方はどうぞ。

2013年5月21日火曜日

[SharePoint]JPSPSフォローアップ:認証設定①~フォームベース認証

先日(5/18)に Japan SharePoint Group (http://jpsps.com/)さんの定例勉強会にお邪魔して SharePoint のアイデンティティ管理の話をしてきました。

当日の資料はこちら


当日は時間もなかったので、簡単なデモを見せることしか出来なかったので、環境の構築の方法について解説しておこうと思います。

まずは、認証の設定についてです。
当日はフォームベース認証と SAML トークンベース認証の2つのデモをお見せしましたが、今回はフォームベース認証について解説します。(Active Directory を LDAP の認証データベースとして利用します)

認証の設定を行い、実際にサイトを利用するには、大まかに以下の手順が必要です。
1.認証プロバイダの作成
2.Web アプリケーションの認証プロバイダの設定
3.Web アプリケーションのユーザーポリシーの設定
4.ユーザープロファイルとの紐づけ設定
5.動作確認 では順番に手順を解説します。

1.認証プロバイダの作成

 この手順では、SharePoint Server が認識する認証プロバイダを作成します。フォームベース認証の場合は、以下の3つの Web サイトの web.config ファイルの編集を行う必要があります。
  - サーバの全体管理(SharePoint Central Administration v4)
  - Security Token Service(SharePoint Web Services - SecurityTokenServiceApplication)
  - 対象の SharePoint Web アプリケーション(作成した名前)
   ※括弧内は IIS マネージャより見える Web サイトの名前

 IIS マネージャより上記それぞれの Web サイトに対応するフォルダを開き、 web.config を編集します。対象の Web サイトを右クリックしてエクスプローラを開いたところにある web.config が編集対象です。



 各 Web サイトの web.config を以下の用に設定します。

  - サーバの全体管理(SharePoint Central Administration v4)

  ・<system.web> セクションの以下をコメントアウト
    <roleManager>
      <providers>
      </providers>
    </roleManager>
    <membership>
      <providers>
      </providers>
    </membership>

 ・以下を追記
<membership defaultProvider="AspNetSqlMembershipProvider">
      <providers>
        <add name="LDAPMember"
             type="Microsoft.Office.Server.Security.LdapMembershipProvider, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
             server="ADサーバ名.xxx.xxx"
             port="389"
             useSSL="false"
             userDNAttribute="distinguishedName"
             userNameAttribute="sAMAccountName"
             userContainer="OU=フォームベース認証するユーザを入れるOU,DC=xxx,DC=xxx"
             userObjectClass="person"
             userFilter="(ObjectClass=person)"
             scope="Subtree"
             otherRequiredUserAttributes="sn,givenname,cn" />
      </providers>
    </membership>
    <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" >
      <providers>
        <add name="LDAPRole"
             type="Microsoft.Office.Server.Security.LdapRoleProvider, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
             server="ADサーバ名.xxx.xxx" 
             port="389"
             useSSL="false"
             groupContainer="OU=フォームベース認証するユーザを入れるOU,DC=xxx,DC=xxx"
             groupNameAttribute="cn"
             groupNameAlternateSearchAttribute="samAccountName"
             groupMemberAttribute="member"
             userNameAttribute="sAMAccountName"
             dnAttribute="distinguishedName"
             groupFilter="((ObjectClass=group)"
             userFilter="((ObjectClass=person)"
             scope="Subtree" />
      </providers>
 </roleManager>

 - Security Token Service(SharePoint Web Services - SecurityTokenServiceApplication)

  ・<Configuration>セクションに以下を追記
<system.web>
    <membership>
      <providers>
        <add name="LDAPMember"
             type="Microsoft.Office.Server.Security.LdapMembershipProvider, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
             server="ADサーバ名.xxx.xxx"
             port="389"
             useSSL="false"
             userDNAttribute="distinguishedName"
             userNameAttribute="sAMAccountName"
             userContainer="OU=フォームベース認証するユーザを入れるOU,DC=xxx,DC=xxx"
             userObjectClass="person"
             userFilter="(&amp;(ObjectClass=person))"
             scope="Subtree"
             otherRequiredUserAttributes="sn,givenname,cn" />
      </providers>
    </membership>
    <roleManager enabled="true" >
      <providers>
        <add name="LDAPRole"
             type="Microsoft.Office.Server.Security.LdapRoleProvider, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
             server="ADサーバ名.xxx.xxx"
             port="389"
             useSSL="false"
             groupContainer="フォームベース認証するユーザを入れるOU,DC=xxx,DC=xxx"
             groupNameAttribute="cn"
             groupNameAlternateSearchAttribute="samAccountName"
             groupMemberAttribute="member"
             userNameAttribute="sAMAccountName"
             dnAttribute="distinguishedName"
             groupFilter="(&amp;(ObjectClass=group))"
             userFilter="(&amp;(ObjectClass=person))"
             scope="Subtree" />
      </providers>
    </roleManager>
  </system.web>

 - 対象の SharePoint Web アプリケーション(作成した名前)

  ・<membership defaultProvider="i">の<providers>セクションに以下を追記

        <add name="LDAPMember" type="Microsoft.Office.Server.Security.LdapMembershipProvider, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" server="ADサーバ名.xxx.xxx" port="389" useSSL="false" userDNAttribute="distinguishedName" userNameAttribute="sAMAccountName" userContainer="OU=フォームベース認証するユーザを入れるOU,DC=xxx,DC=xxx" userObjectClass="person" userFilter="(&amp;(ObjectClass=person))" scope="Subtree" otherRequiredUserAttributes="sn,givenname,cn" />

 ・<roleManager defaultProvider="c" enabled="true" cacheRolesInCookie="false">の<providers>セクションに以下を追記

        <add name="LDAPRole" type="Microsoft.Office.Server.Security.LdapRoleProvider, Microsoft.Office.Server, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" server="ADサーバ名.xxx.xxx" port="389" useSSL="false" groupContainer="OU=フォームベース認証するユーザを入れるOU,DC=xxx,DC=xxx" groupNameAttribute="cn" groupNameAlternateSearchAttribute="samAccountName" groupMemberAttribute="member" userNameAttribute="sAMAccountName" dnAttribute="distinguishedName" groupFilter="(&amp;(ObjectClass=group))" userFilter="(&amp;(ObjectClass=person))" scope="Subtree" />


2.Web アプリケーションの認証プロバイダの設定

 次は、Web アプリケーションに使用する認証プロバイダの設定を行います。
 [サーバの全体管理]から[Web アプリケーションの管理]を開き、対象の Web アプリケーションを選択し、[認証プロバイダー]を開きます。



認証プロバイダの領域では[既定]をクリックし、設定画面を開きます。



クレーム認証の種類のセクションで、[フォームベース認証(FBA)の有効化]にチェックを入れ、[ASP.NETメンバーシッププロバイダ名]に「LDAPMember(先ほど web.config に書いた名前)」、[ASP.NETロールマネージャ名]に「LDAPRole(先ほど web.config に書いた名前)」を設定し、保存します。





3.Web アプリケーションのユーザーポリシーの設定

 次は設定した認証プロバイダで認証されたユーザが Web アプリケーションへアクセスできるように設定します。
 先の手順と同様に[サーバの全体管理]から[Web アプリケーションの管理]を開き、対象の Web アプリケーションを選択し、[ユーザーポリシー]を開き、Web アプリケーションのポリシー画面で[ユーザーの追加]を開きます。



 対象の領域を聞かれるので[すべて]を選択し、[ユーザーの追加]画面の[ユーザーの選択]からユーザピッカーを開きます。


 [すべてのユーザー]から[すべてのユーザー(LDAPMember)]を追加し、元の画面に戻り、[権限の選択]で必要な権限を付与します。(画面は読み取り権限を与えています)




4.ユーザープロファイルとの紐づけ設定

 ここまでで認証とログインまでは出来るようになりましたが、SharePoint 上のユーザとの紐づけが出来ていません。つまり、認証とログインは出来ますが別途 User Profile Service 等で ID ストアから読み込んだユーザ情報と紐づけが出来ませんので、顔写真や姓・名などがうまく表示されない状態です。

 そこで、認証されたユーザと SharePoint 上のユーザプロファイルの紐づけ設定を行います。概念としては下図の通りです。



 今回作ったフォームベース認証プロバイダでは LDAP(AD)の sAMAccountName 属性を識別子として利用しているので、ユーザプロファイルの[クレームユーザーID]という属性が LDAP の sAMAccountName 属性の値と一致していれば同じユーザとみなす、という設定を行います。

 User Profile Service の詳しい設定については後日解説しますが、まず[サーバの全体管理]から[サービスアプリケーション]、[サービスアプリケーションの管理]、[User Profile Service Application]を開き、[ひと]セクションの[ユーザープロパティの管理]を開きます。
 この中の[クレームユーザーID]属性の編集を開きます。



 ここで認証プロバイダ LDAP の sAMAccountName をインポートするように設定し、保存します。



 この状態で[プロファイル同期の開始]で[完全同期]を行うと新しいマッピング状態を含めプロファイルが同期されます。  これで設定は完了です。


5.動作確認

 では、先ほどのサイトへアクセスしてみます。設定が上手く行っていればサインイン方法の選択が出来るようになっています。



 ここでフォーム認証を選択すると認証フォームが表示されますので、認証DB(今回は Active Directory)上に作成したユーザの sAMAccountName とパスワードでログインします。



 ちなみに Active Directory 上に作成したユーザは以下の通りです。



 認証がうまくいくとサイトが使えるようになっており、プロファイルには Active Directory 上に設定したユーザの情報が反映されているはずです。下図は Active Directory 上に顔写真を入れておき、SharePoint へ同期した例です。




今回はここまでです。次回は SAML トークンベース認証を Windows Azure Access Control Service と設定し、Facebook や Google アカウントでログインする方法を解説します。