AD (Active Directory) バックエンド
==================================

概要
-----

::

    unicornidm.conf, templates/<backendname>.py

説明
------

バックエンドセクションのうち、 *type* が *ad* となっているバックエンドは、
Active Directory ドメインコントローラー (AD DC) への接続に関する設定を行います。

各バックエンドには必ずテンプレートファイルを用意する必要があります。
テンプレートファイルとは Unicorn ID Manager の任意属性 (フロントエンド属性) を
バックエンド固有の属性 (バックエンド属性) にマッピングするためのものです。

リファレンス
------------

unicornidm.conf のパラメーター
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. envvar:: type

    バックエンドのタイプを指定します。 `ad` に設定してください。

.. envvar:: uris

    AD DC の URI を指定します。カンマ区切りで複数の URI を指定できます。
    URI が複数ある場合、通常先頭の URI への接続が実行され、失敗すれば、
    次の URI への接続を試みます。

.. envvar:: bind_user

    AD DC へ接続する際に使用するユーザー名を指定します。 DN とユーザープリンシパル名
    の両方の形式に対応しています。このユーザーには `Account Operators` グループ、
    あるいは相当する権限が必要です。

.. envvar:: bind_password_file

    AD DC へ接続するユーザーのパスワード情報を格納したファイルパスを指定します。

.. envvar:: domain

    接続する AD DC のドメイン名を指定します。

.. envvar:: ou_user

    接続する AD DC においてユーザーオブジェクトが格納されている OU (組織単位) を
    指定します。デフォルトは CN=Users です。

.. envvar:: ou_group

    接続する AD DC においてグループオブジェクトが格納されている OU (組織単位) を
    指定します。デフォルトは CN=Users です。

.. envvar:: filter_user

    ユーザー検索時に使用するフィルターを指定します。
    デフォルト値は (&(objectClass=user)(!(objectClass=computer))) です。

.. envvar:: filter_group

    グループ検索時に使用するフィルターを指定します。
    デフォルト値は (objectClass=group) です。

.. envvar:: backend_primary_key_user

    ユーザーの RDN の値を格納する属性を指定します。
    デフォルト値は cn です。

.. envvar:: backend_primary_key_group

    グループの RDN の値を格納する属性を指定します。
    デフォルト値は cn です。

.. envvar:: member_keys

    グループのメンバーに該当するバックエンド属性名を指定します。
    カンマ区切りで複数指定することもできます。
    デフォルト値は member です。

.. envvar:: assign_auto_uid_number

    ユーザーの uidNumber を自動生成するかのフラグです。
    デフォルト値は no (uidNumber を自動生成しない) です。

.. envvar:: assign_auto_uid_number_min

    ユーザーの uidNumber を自動生成する際、 uidNumber に割り当てる最小値
    を指定します。デフォルト値はありません。

.. envvar:: assign_auto_uid_number_max

    ユーザーの uidNumber を自動生成する際、 uidNumber に割り当てる最大値
    を指定します。デフォルト値はありません。

.. envvar:: assign_auto_gid_number

    グループの gidNumber を自動生成するかのフラグです。
    デフォルト値は no (gidNumber を自動生成しない) です。

.. envvar:: assign_auto_gid_number_min

    グループの gidNumber を自動生成するかのフラグです。
    デフォルト値は no (gidNumber を自動生成しない) です。

.. envvar:: assign_auto_gid_number_max

    グループの gidNumber を自動生成する際、 gidNumber に割り当てる最大値
    を指定します。デフォルト値はありません。

テンプレートファイル
^^^^^^^^^^^^^^^^^^^^

以下は、 `ad` バックエンドのテンプレートファイルの例です。

::

    User = {
        "objectClass": [
            "top",
            "person",
            "organizationalPerson",
            "user",
        ],
        "sAMAccountName": userName,
        "sn": familyName,
        "givenName": givenName,
        "unicodePwd": password,
        "userAccountControl": "512",
        "description": default(description),
        "displayName": default(displayName, "%(familyName)s %(givenName)s"),
    }


    Group = {
        "objectClass": [
            "top",
            "group",
            ],
        "sAMAccountName": groupName,
        "description": default(description),
    }

注意すべき点は以下のとおりです。

* User と Group の辞書には必ず、 *objectClass* を list 型で指定してください

* User と Group の属性定義では必ず *sAMAccountName* を ``userName`` と
  ``groupName`` に紐付けてください

* User の *objectClass* には必ず user を含めてください

* Group の *objectClass* には必ず group を含めてください


ad バックエンド特有のバックエンド属性
---------------------------------------

.. envvar:: userPrincipalName

    テンプレートファイルに *userPrincipalName* バックエンド属性が
    定義されていない場合、 *sAMAccountName* と
    *domain* から、 *userPrincipalName* を自動生成します。
    手動で入力する場合、メールアドレス形式で指定してください。

.. envvar:: cn

    テンプレートファイルに *cn* バックエンド属性が
    定義されていない場合、 *sAMAccountName* から、
    *cn* を自動生成します。

.. envvar:: unicodePwd

    *unicodePwd* バックエンド属性は AD ユーザーのパスワードを
    セットするために利用されます。

.. envvar:: accountExpires

    *accountExpires* バックエンド属性は AD ユーザーのアカウント有効期限を
    セットするために利用されます。このバックエンド属性に値をセットする際は、
    "2016-05-28" の形式か、 "2016/05/28" の形式で値をセットしてください。
    アカウントの有効期限を無期限にする場合は "NEVER_EXPIRES" という文字列を
    セットしてください。

.. envvar:: parentOu

    *parentOu* バックエンド属性はユーザーやグループの所属 OU を指定するための
    バックエンド属性です。この値がセットされた場合、 *parentOu* と
    *domain* パラメーターを元にしたルートサフィックスを結合した
    サフィックスが適用されます。 *parentOu* が存在しない場合 *ou_user* か *ou_group*
    が適用されます。

    例::

        backend_primary_key_user = "CN"
        userName = "user1
        parentOu = "ou=org1"
        domain = "example.com"
        ou_user = "CN=Users"

            ===> "CN=user1,ou=org1,DC=example,DC=com"

        backend_primary_key_user = "CN"
        userName = "user1
        parentOu = None
        domain = "example.com"
        ou_user = "CN=Users"

            ===> "CN=user1,CN=Users,DC=example,DC=com"

.. versionadded:: 3.3.0

     parentOu で所属 OU を変更できるようになりました。


.. envvar:: ADPrimaryGroup

    ``ADPrimaryGroup`` はユーザーのプライマリーグループを変更するためのバックエンド属性です。
    ユーザーを追加、更新するときにこの属性を指定すると、
    Unicorn ID Manager は操作対象のターゲットの中から ``groupName`` が
    この属性の値と一致するグループを探し、そのグループを
    ユーザーのプライマリーグループに設定します。

.. versionadded:: 3.14.1

    ``ADPrimaryGroup`` 属性が追加されました。


制限
----

* グループの入れ子 (ネスト。グループへのグループの追加) には対応していません。
* 組織単位 (`OU`) の管理には対応していません。
  ユーザーに所属させたい組織単位は別途 AD の管理ツールで作成しておいてください。

AD 由来の制限
^^^^^^^^^^^^^^^^^^

AD バックエンドでは ``userName`` , ``groupName`` を ``sAMAccountName``
に紐付ける必要があるため、以下の制限が発生します。
これらはどれも AD の ``sAMAccountName`` の仕様に基づくものです。

* ``userName`` , ``groupName`` は 20文字以下でなければなりません
* ``userName`` , ``groupName`` には以下の文字を含めてはいけません
    * ``"/ \ [ ] : ; | = , + * ? < >``
* ``userName``, ``groupName`` の値は AD 全体で一意でなければいけません。 UIDM 管理外のツリー（所属OU）やユーザー、グループ以外のオブジェクトの ``sAMAccountName`` とも被ってはいけません。

AD バックエンド属性名には ``givenName;lang-ja`` のような
``<属性名>;<属性オプション>`` 形式の属性オプションは使用できません。

UIDM 接続用の AD ドメインユーザーの権限は通常 `Account Operators`
グループ権限だけで充分です。ただし `Account Operators` 権限では
特権付きユーザー (`Administrator` など) や特権付きグループ
(`Domain Admins` など) に所属するユーザーのパスワードを変更できません。
`Administrators` 権限を付与すれば特権付きユーザーとグループの
パスワードを変更できますが、UIDM により強い特権を付与するリスクを
考慮するようご注意ください。

* Protected Users セキュリティ グループ | Microsoft Docs
    * https://docs.microsoft.com/ja-jp/windows-server/security/credentials-protection-and-management/protected-users-security-group
* Active Directory の攻撃を削減する | Microsoft Docs
    * https://docs.microsoft.com/ja-jp/windows-server/identity/ad-ds/plan/security-best-practices/reducing-the-active-directory-attack-surface
