11.2.13. ドメインの作成: Active Directory

Active Directory ID プロバイダーは、一般的な LDAP プロバイダーの拡張機能です。LDAP プロバイダーで利用可能な設定オプションはすべて、Active Directory プロバイダーでも利用可能で、ユーザーアカウントや Active Directory とシステムユーザー間の ID マッピングに関連するいくつかのパラメーターも利用可能です。

11.2.13.1. SSSD と Active Directory

標準的な LDAP サーバーと Active Directory サーバーには根本的な違いがいくつかあります。そのため、Active Directory プロバイダーの設定の際には、特別な設定を必要とする設定領域がいくつかあります。
  • Winows セキュリティー ID を使用している ID は、対応する Linux システムユーザー ID にマッピングする必要があります。
  • 検索は、範囲取得拡張の説明をする必要があります。
  • LDAP 紹介にパフォーマンスの問題がある可能性がある。
11.2.13.1.1. Active Directory セキュリティー ID と Linux ユーザー ID のマッピング
Windows と Linux がシステムユーザーに対応する方法と、Active Directory および標準 LDAPv3 ディレクトリーサービスで使用されるユーザースキーマには、内包的な構造の違いがあります。SSSD でシステムユーザーの管理に Active Directory ID プロバイダーを使用する際は、Active Directory スタイルのユーザーを新たな SSSD ユーザーに調和させる必要があります。これには以下の 2 つの方法があります。
  • Services for Unix を使用して Windows ユーザーおよびグループエントリー上に POSIX 属性を挿入し、これらの属性を PAM/NSS にプルする。
  • SSSD 上の ID マッピングを使用して、Active Directory 説明 ID (SID) と Linux 上の生成済み UID との間のマップを作成する。
ID マッピングは、新たなパッケージや Active Directory 上での設定を必要としないため、ほとんどの環境で最も簡単なオプションです。
11.2.13.1.1.1. ID マッピングのメカニズム
Linux/Unix システムはローカルのユーザー ID 番号都グループ ID 番号を使ってシステム上のユーザーを識別します。これらの UID:GID 番号は、501:501 といった単純な整数です。これらの番号は、大規模な Linux/Unix ドメインの一部のシステムでも、常にローカルで作成、管理されるので、単純なものになります。
Microsoft Windows と Active Directory は異なるユーザー ID 構造を使ってユーザーやグループ、マシンを識別します。各 ID は、セキュリティーバージョンや発行権限のタイプ、マシン、ID 自体を識別する異なるセグメントで構築されています。例えば、以下のようになります。
S-1-5-21-3623811015-3361044348-30300820-1013
3 つ目から 6 つ目のブロックは、マシン識別子です。
S-1-5-21-3623811015-3361044348-30300820-1013
最後のブロックは、特別エンティティを識別する 相対識別子 (RID) です。
S-1-5-21-3623811015-3361044348-30300820-1013
可能な ID 番号の範囲は、常に SSSD に割り当てられます。 (これはローカルの範囲なので、すべてのマシンで同じものになります。)
|_____________________________|
|                             |
minimum ID                    max ID
この範囲は (デフォルトで) 1 万セクションに分けられ、各セクションには 20 万 ID が割り当てられます。
| slice 1 | slice 2 |   ...   |
|_________|_________|_________|
|         |         |         |
minimum ID                    max ID
新たな Active Directory ドメインが検出されると、SID がハッシュ化されます。すると SSSD はこのハッシュのモジュールと利用可能なセクションの数で、Active Directory ドメインにどの ID セクションを割り当てるかを決めます。これは、ID セクション割り当て方法としては信頼性と一貫性のあるもので、ほとんどのクライアントマシン上で同一の Active Directory ドメインに同一の ID 範囲が割り当てられます。
| Active  | Active  |         |
|Directory|Directory|         |
|domain 1 |domain 2 |   ...   |
|         |         |         |
| slice 1 | slice 2 |   ...   |
|_________|_________|_________|
|         |         |         |
minimum ID                    max ID

注記

ID セクションの割り当て方法には一貫性がありますが、ID マッピングは Active Directory ドメインがクライアントマシン上で発生する順序に基づいています。このため、すべての Linux クライアントマシン上で ID 範囲の割り当てに一貫性が保たれない場合もあります。一貫性が必要な場合は、ID マッピングを無効にし、明示的な POSIX 属性の使用を検討してください。
11.2.13.1.1.2. ID マッピングパラメーター
ID マッピングは 2 つのパラメーターで有効化されます。1 つ目でマッピングを有効にし、2 つ目で適切な Active Directory ユーザースキーマをロードします。
ldap_id_mapping = True
ldap_schema = ad

注記

ID マッピングが有効になると、uidNumber および gidNumber 属性は無視されます。これにより、手動で割り当てられた値はいかなるものでも止められます。何らかの 値が手動で割り当てられる必要がある場合は、すべての 値が手動で割り当てられ、ID マッピングを無効にする必要があります。
11.2.13.1.1.3. マッピングユーザー
Active Directory ユーザーが初めてローカルシステムサービスにログイン使用とする際には、そのユーザーのエントリーが SSSD キャッシュに作成されます。リモートユーザーはシステムユーザーのように設定されます。
  • ユーザーの SID およびそのドメインの ID 範囲に基づいてシステム UID が作成されます。
  • ユーザーに GID が作成されます。これは UID と同一のものです。
  • ユーザーにプライベートグループが作成されます。
  • sssd.conf ファイルのホームディレクトリー形式に基づいて、ホームディレクトリーが作成されます。
  • システムデフォルトまたは sssd.conf ファイル内の設定に基づいて、シェルが作成されます。
  • ユーザーが Active Director 内のいずれかのグループに所属する場合、SID を使って SSSD が Linux 上のこれらのグループにユーザーを追加します。
11.2.13.1.1.4. Active Directory Users and Range Retrieval Searches
Microsoft Active Directory には、MaxValRange の属性があり、複数の値の属性に戻す値の制限数を設定するものです。これは、範囲取得 検索の拡張機能です。基本的にこれは複数のミニ検索を実行し、すべての一致が返されるまでそれぞれの検索は特定の範囲内での結果のサブセットを返します。
例えば、member 属性を検索する際に、各エントリーに複数の値があり、その属性に複数のエントリーがあり場合があります。2000 件 (またはそれ以上) の一致結果があった場合、MaxValRange は一度に表示される数を制限します。これが、値の範囲です。そして、特定の属性には新たなフラグのセットが付けられて、その結果がセット内のどの範囲にあるかを示します。
attribute:range=low-high:value
例えば、検索結果を 100 件から 500 件にするには、
member;range=99-499: cn=John Smith...
これは Microsoft ドキュメンテーションの http://msdn.microsoft.com/en-us/library/cc223242.aspx で説明されています。
SSSD は、Active Directory プロバイダーを使った範囲取得を新たな設定なしにユーザーおよびグループ管理の一部としてサポートします。
しかし、ldap_user_search_base のような検索設定に利用可能な LDAP プロバイダー属性の中には、範囲取得との効率がよくないものもあります。Active Directory プロバイダードメインで検索ベースを設定する際には注意して、検索がどの範囲取得を引き起こすかを考慮してください。
11.2.13.1.1.5. パフォーマンスと LDAP の参照
参照は、追跡を試みる時間のために、全体的なパフォーマンスにマイナスの影響を与える場合があります。参照追跡を Active Directory プロバイダー内で使用すると、特にパフォーマンスが悪化します。参照のチェックを無効にすると、パフォーマンスは大幅に改善できます。
LDAP 参照はデフォルトで有効となっているので、以下のようにLDAP ドメイン設定で明示的に無効にする必要があります。
ldap_referrals = false
11.2.13.1.2. Active Directory ID プロバイダーの設定

重要

設定ファイルの変更後には、必ず SSSD を再起動します。
[root@rhel-server ~]# service sssd restart
Active Directory は、ID や認証、アクセス制御規則、ドメインの 全*_provider パラメーターのプロバイダーとして機能できます。さらには、デフォルトの RFC 2307 を使うのではなく、ユーザーおよびグループエントリー用のネイティブの Active Directory スキーマをロードすることもできます。

例11.7 Active Directory 2008 R2 ドメイン

[root@rhel-server ~]# vim /etc/sssd/sssd.conf

[sssd]
config_file_version = 2
domains = ad.example.com
services = nss, pam

...

[domain/ad.example.com]
id_provider = ad
ipa_server = ipaserver.example.com
ipa_hostname = ipa1.example.com
auth_provider = ad
chpass_provider = ad
access_provider = ad

# defines user/group schema type
ldap_schema = ad

# using explicit POSIX attributes in the Windows entries
ldap_id_mapping = False

# caching credentials
cache_credentials = true
enumerate = false

# access controls
ldap_access_order = expire
ldap_account_expire_policy = ad
ldap_force_upper_case_realm = true

# performance
ldap_disable_referrals = true
ID マッピングに必須のパラメーターは 2 つあります。Active Directory スキーマはロードする必要があり (ldap_schema) ID マッピングは明示的に有効にする必要があります (ldap_id_mapping)。

例11.8 ID マッピングによる Active Directory 2008 R2 ドメイン

[root@rhel-server ~]# vim /etc/sssd/sssd.conf

[sssd]
config_file_version = 2
domains = ad.example.com
services = nss, pam

...

[domain/ad.example.com]
id_provider = ad
ipa_server = ipaserver.example.com
ipa_hostname = ipa1.example.com
auth_provider = ad
chpass_provider = ad
access_provider = ad

# defines user/group schema type
ldap_schema = ad

# for SID-UID mapping
ldap_id_mapping = True

# caching credentials
cache_credentials = true
enumerate = false

# access controls
ldap_access_order = expire
ldap_account_expire_policy = ad
ldap_force_upper_case_realm = true

# performance
ldap_disable_referrals = true
Active Directory ドメインに可能な設定属性はすべて、sssd-ldap(5) および sssd-ad(5) の man ページに一覧表示されます。
11.2.13.1.3. LDAP プロバイダーとしての Active Directory の設定
Active Directory はタイプ固有の ID プロバイダーとして設定できますが、Kerberos 認証プロバイダーとともに純然たる LDAP プロバイダーとしても設定可能です。
  1. SSSD は、SASL を使って Active Directory サーバーに接続することが推奨されます。これにより、ローカルホストは Linux ホスト上の Windows ドメイン 用にサービス keytab を備える必要があります。
    この keytab は Samba を使って作成できます。
    1. /etc/krb5.conf ファイルを設定して、Acti Directory レルムを使用します。
      [logging]
       default = FILE:/var/log/krb5libs.log
      
      [libdefaults]
       default_realm = AD.EXAMPLE.COM
       dns_lookup_realm = true
       dns_lookup_kdc = true
       ticket_lifetime = 24h
       renew_lifetime = 7d
       rdns = false
       forwardable = yes
      
      [realms]
      # Define only if DNS lookups are not working
      # AD.EXAMPLE.COM = {
      #  kdc = server.ad.example.com
      #  admin_server = server.ad.example.com
      # }
      
      [domain_realm]
      # Define only if DNS lookups are not working
      # .ad.example.com = AD.EXAMPLE.COM
      # ad.example.com = AD.EXAMPLE.COM
    2. Samba 設定ファイル、/etc/samba/smb.conf、を設定し、Windows Kerberos レルムに向けます。
      [global]
         workgroup = EXAMPLE
         client signing = yes
         client use spnego = yes
         kerberos method = secrets and keytab
         log file = /var/log/samba/%m.log
         password server = AD.EXAMPLE.COM
         realm = EXAMPLE.COM
         security = ads
    3. net ads コマンドを実行して、管理者プリンシパルとしてログインします。この管理者アカウントにはマシンを Windows ドメインに追加することができる権限が必要ですが、ドメイン管理者権限は必要ありません。
      [root@server ~]# net ads join -U Administrator
    4. net ads コマンドを再度実行して、ホストマシンをドメインに追加します。これは、ホストプリンシパル (host/FQDN) またはオプションで NFS サービス (nfs/FQDN) で実行できます。
      [root@server ~]# net ads join createupn="host/rhel-server.example.com@AD.EXAMPLE.COM" -U Administrator
  2. Services for Unix パッケージが Windows サーバー上にインストールされていることを確認してください。
  3. SSSD で使用する Windows ドメインを設定します。
    1. Windows マシンで サーバーマネージャー を開きます。
    2. Active Directory ドメインサービスの役割を作成します。
    3. ad.example.com といった新規ドメインを作成します。
    4. Identity Management for UNIX サービスを Active Directory ドメインサービスの役割に追加します。設定ではドメイン名に Unix NIS ドメインを使用してください。
  4. Active Directory サーバー上で Linux ユーザーのグループを作成します。
    1. 管理ツール を開いて、Active Directory ユーザーとコンピューター を選択します。
    2. Active Directory ドメインの ad.example.com を選択します。
    3. ユーザー タブで右クリックして、新しいグループの作成 を選択します。
    4. 新しいグループに unixusers と名前を付けて保存します。
    5. unixusers グループエントリーをダブルクリックして、ユーザー タブを開きます。
    6. Unix 属性 タブを開きます。
    7. ad.example.com 用に設定された NIS ドメインに NIS ドメインをセットして、オプションでグループ ID (GID) 番号を設定します。
  5. ユーザーを Unix グループの一部として設定します。
    1. 管理ツール を開いて、Active Directory ユーザーとコンピューター を選択します。
    2. Active Directory ドメインの ad.example.com を選択します。
    3. ユーザー タブで右クリックして、新しいユーザーの作成 を選択します。
    4. 新しいユーザーに aduser と名前を付けて、ユーザーは次回のログオン時にパスワード変更が必要Lock account のチェックボックスにチェックマークがついていないことを確認します。
      ユーザーを保存します。
    5. aduser ユーザーエントリーをダブルクリックして、Unix 属性 タブを開きます。Unix 設定が、Active Directory ドメインと unixgroup グループのものと合致していることを確認します。
      • NIS ドメイン、Active Directory ドメイン用に作成されたもの
      • UID
      • /bin/bash へのログインシェル
      • /home/aduser へのホームディレクトリー
      • unixusers へのプライマリーグループ名

    注記

    大きなディレクトリーの パスワードルックアップ は、要求 1 件あたり数秒かかります。最初のユーザールックアップは、LDAP サーバーへのコールです。インデックス化されていない検索は、よりリソース集約的なのでインデックス化されている検索よりも時間が長くかかります。これは、サーバーが一致を求めてディレクトリー内のすべてのエントリーをチェックするためです。ユーザールックアップを迅速化するには、SSSD が検索する属性をインデックス化します。
    • uid
    • uidNumber
    • gidNumber
    • gecos
  6. Linux システム上で SSSD ドメインを設定します。
    [root@rhel-server ~]# vim /etc/sssd/sssd.conf
    LDAP プロバイダーパラメーターの完全な一覧は、sssd-ldap(5) の man ページを参照してください。

    例11.9 Services for Unix による Active Directory 2008 R2 ドメイン

    [sssd]
    config_file_version = 2
    domains = ad.example.com
    services = nss, pam
    
    ...
    
    [domain/ad.example.com]
    cache_credentials = true
    enumerate = false
    
    # for performance
    ldap_referrals = false
    
    id_provider = ldap
    auth_provider = krb5
    chpass_provider = krb5
    access_provider = ldap
    
    ldap_schema = rfc2307bis
    
    ldap_sasl_mech = GSSAPI
    ldap_sasl_authid = host/rhel-server.example.com@AD.EXAMPLE.COM 
    
    #provide the schema for services for unix
    ldap_schema = rfc2307bis
    
    ldap_user_search_base = ou=user accounts,dc=ad,dc=example,dc=com
    ldap_user_object_class = user
    ldap_user_home_directory = unixHomeDirectory
    ldap_user_principal = userPrincipalName
    
    # optional - set schema mapping
    # parameters are listed in sssd-ldap
    ldap_user_object_class = user
    ldap_user_name = sAMAccountName
    
    ldap_group_search_base = ou=groups,dc=ad,dc=example,dc=com
    ldap_group_object_class = group
    
    ldap_access_order = expire
    ldap_account_expire_policy = ad
    ldap_force_upper_case_realm = true
    ldap_disable_referrals = true
    
    krb5_realm = AD-REALM.EXAMPLE.COM
    # required
    krb5_canonicalize = false
  7. SSSD を再開始します。
    [root@rhel-server ~]# service sssd restart