none
[memberof] に [Domain Users グループ] の情報が入らない RRS feed

  • 質問

  • AD に登録されているグループ・ユーザ情報でのログイン認証機能を搭載した WEB システムを構築しています。
    AD との連携は Ldap を使用しています。

    ■ サーバ構成
    ・AD サーバ
      OS : Windows Server 2012 R2
    ・アプリケーションサーバ, DB サーバ
      OS : Windows Server 2012 R2
      言語 : PHP 5.6 系
      Web : Apache 2.4 系
      DB : MySQL 5.6 系

    ■ AD のグループ・ユーザ構成
    A グループ

    Domain Users グループ

    A ユーザ

    ※ A グループのメンバーは Domain Users グループ、Domain Users グループのメンバーは A ユーザ、という構成です。
    ※ A ユーザは Domain Users グループ以外には所属していません。

    ■ 実現したいこと
    以下の要件を満たしたいです。
    (1) A グループに所属するユーザはログイン可能とする
    (2) A グループに所属するグループを再帰的に取得して、
     再帰的に取得したグループに所属するメンバーについてもログイン可能とする

    (2) より、Domain Users グループにしか所属していない A ユーザについてもログイン可能とする処理を実装したいです。

    ■ 試したこと
    (1) [A グループ] の所属グループを再帰的に取得して, その中([memberof] パラメータ)に [Domain Users グループ] が存在するかで判定
      ・結果 : ×
      ・原因 : [A グループ] の所属グループの中に [Domain Users グループ] が入っていないので、その後の再帰的なグループ取得ができない

    (2) [A ユーザ] が所属するグループを再帰的に取得して, その中([memberof] パラメータ)に [A グループ] が存在するかで判定
      ・結果 : ×
      ・原因 : [A ユーザ] が所属するグループとして [Domain Users グループ] が入っていないので、その後の再帰的なグループ取得ができない

    (3) primarygroupid を利用した判定
      ・結果 : ×
      ・原因 :
        [A ユーザ] の [primarygroupid] を取得することで、
        [A ユーザ] が [Domain Users グループ] に属しているかという判定をすることはできたが、
        上記の検証結果より [A グループ] に属するかという判定はできないので,
        結局、 [A ユーザ] がログイン可能か(A グループのメンバーであるか)の判定もできない。

    (4) 新規にグループを作成して [Domain Users グループ] の代わりとして差し替える
      ・結果 : 〇

    ※ (1)(2)で再帰的に取得する際、[LDAP_MATCHING_RULE_IN_CHAIN] も利用してみましたが、結果は×でした。

    ■ その他
    調べてみると、[memberof] に [Domain Users グループ] が入らないのは、
    ActiveDirectory (もしくは Ldap?) の仕様という記事を見つけました。
    http://jehupc.exblog.jp/12470608/

    仕様であれば [試したこと] の (4) の方法で乗り切るしかないとは思うのですが、
    当初のグループ構成を変更することなく解決する方法はないかと探しているところです。

    ・仕様的に不可能であるので、別の方法で乗り切る
    ・イレギュラーではあるが解決方法はある
    等、ご意見いただければありがたいです。

    よろしくお願いします。
    2016年12月22日 1:14

回答

  • チャブーンです。

    この件ですが、結論から申し上げると「ほとんど意味がない」ということはいえるかと思います。

    ドメイン環境において「Domain Users」グループはプライマリグループという特別なグループとして扱われ、すべてのアカウントが属しています(Administratorも例外ではありません)。したがってDomain Usersをリストに含める、ということは全ユーザアカウントを含めることと同じですから、フィルタの意味がありません。

    [試したこと]の(4)で対応されることが適切ですし、他に方法もありません。(プライマリグループはmemberOfとは別の属性に格納されます)


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2016年12月22日 2:12
    モデレータ
  • チャブーンです。

    追記ですが、何が何でも「Domain UsersをmemberOfに含ませたい」という場合は、したのスクリプトを実行することで、該当範囲のユーザのプライマリグループを変更すれば、可能ではあります。ただし、プライマリグループに設定するダミー的なグループを事前に作成する必要があります。

    $OldPrimaryGroup=Get-ADGroup "Domain Users"
    $NewPrimaryGroup=Get-ADGroup "<プライマリグループに設定するグループ名>"
    
    $OldPrimaryGroupSID=$OldPrimaryGroup.SID.Value
    $NewPrimaryGroupSID=$NewPrimaryGroup.SID.Value
    
    $OldPrimaryGroupID=$OldPrimaryGroupSID.substring($OldPrimaryGroupSID.LastIndexOf("-") + 1)
    $NewPrimaryGroupID=$NewPrimaryGroupSID.substring($NewPrimaryGroupSID.LastIndexOf("-") + 1)
    
    $Users=Get-ADUser -Filter {PrimaryGroupID -eq $OldPrimaryGroupID} -Property * -SearchBase "<ユーザアカウントがあるルートOUのDN>"
    
    Foreach ($User in $Users) {
    	Add-ADGroupMember $NewPrimaryGroup $User
    	Set-ADUser -Identity $User -Replace @{PrimaryGroupID="$NewPrimaryGroupID"}
    }

    なお、ビルトインアカウント(Usersコンテナ内にある)のプライマリグループを変更することは、お奨めしません。したがって、うえのスクリプトの「ルートOU」にドメインDN等は設定しないようにしてください(ディレクトリ内のシステム系アカウントを含むすべてが変更されてしまうため)。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2016年12月22日 5:32
    モデレータ

すべての返信

  • チャブーンです。

    この件ですが、結論から申し上げると「ほとんど意味がない」ということはいえるかと思います。

    ドメイン環境において「Domain Users」グループはプライマリグループという特別なグループとして扱われ、すべてのアカウントが属しています(Administratorも例外ではありません)。したがってDomain Usersをリストに含める、ということは全ユーザアカウントを含めることと同じですから、フィルタの意味がありません。

    [試したこと]の(4)で対応されることが適切ですし、他に方法もありません。(プライマリグループはmemberOfとは別の属性に格納されます)


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2016年12月22日 2:12
    モデレータ
  • チャブーンです。

    追記ですが、何が何でも「Domain UsersをmemberOfに含ませたい」という場合は、したのスクリプトを実行することで、該当範囲のユーザのプライマリグループを変更すれば、可能ではあります。ただし、プライマリグループに設定するダミー的なグループを事前に作成する必要があります。

    $OldPrimaryGroup=Get-ADGroup "Domain Users"
    $NewPrimaryGroup=Get-ADGroup "<プライマリグループに設定するグループ名>"
    
    $OldPrimaryGroupSID=$OldPrimaryGroup.SID.Value
    $NewPrimaryGroupSID=$NewPrimaryGroup.SID.Value
    
    $OldPrimaryGroupID=$OldPrimaryGroupSID.substring($OldPrimaryGroupSID.LastIndexOf("-") + 1)
    $NewPrimaryGroupID=$NewPrimaryGroupSID.substring($NewPrimaryGroupSID.LastIndexOf("-") + 1)
    
    $Users=Get-ADUser -Filter {PrimaryGroupID -eq $OldPrimaryGroupID} -Property * -SearchBase "<ユーザアカウントがあるルートOUのDN>"
    
    Foreach ($User in $Users) {
    	Add-ADGroupMember $NewPrimaryGroup $User
    	Set-ADUser -Identity $User -Replace @{PrimaryGroupID="$NewPrimaryGroupID"}
    }

    なお、ビルトインアカウント(Usersコンテナ内にある)のプライマリグループを変更することは、お奨めしません。したがって、うえのスクリプトの「ルートOU」にドメインDN等は設定しないようにしてください(ディレクトリ内のシステム系アカウントを含むすべてが変更されてしまうため)。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2016年12月22日 5:32
    モデレータ