OpenLDAP を Active Directory プロキシとして構成する

OpenLDAP を Active Directory プロキシとして構成する

会社全体の認証用に Active Directory サーバーをセットアップしようとしています。

AD に対して認証する必要があるサーバーの一部は DMZ 内に配置されているため、LDAP サーバーをプロキシとして使用して、DMZ 内の 1 つのサーバーのみが AD サーバーが配置されている LAN に接続できるようにすることを考えました。

グーグルで調べてみると、slapd の設定は問題なく (下記の slapd.conf を参照)、ldapsearch ツールを使用すると機能するようだったので、apache2 htaccess でそれを使用して LDAP プロキシ経由でユーザーを認証しようとしました。

ここで問題が発生します。AD のユーザー名が属性「sAMAccountName」に保存されていることがわかったので、.htaccess でそれを設定しましたが (下記参照)、ログインは機能しませんでした。

syslog で、ldapsearch のフィルターが (あるべきように) ' になっていないことがわかりました。(&(オブジェクトクラス=*)(sAMAccountName=authtest01))' しかし '(&(オブジェクトクラス=*)(?=未定義))これは、属性が存在しない、またはこの属性の値が構文的に間違っていることを示す slapd の方法であることがわかりました。

欠けているスキーマを考え、マイクロソフト スキーマ(およびその .std / .ext のもの) を slapd.conf に含めようとしましたが、うまくいきませんでした。機能するスキーマが見つからなかったため、sAMAccountName に関する部分だけを抽出し、含めた microsoft.minimal.schema (以下を参照) を作成しました。これで、syslog にさらに正確なログが記録されるようになりました。

Jun 16 13:32:04 breauthsrv01 slapd[21229]: get_ava: illegal value for attributeType sAMAccountName
Jun 16 13:32:04 breauthsrv01 slapd[21229]: conn=0 op=1 SRCH base="ou=xxx,dc=int,dc=xxx,dc=de" scope=2 deref=3 filter="(&(objectClass=\*)(?sAMAccountName=authtest01))"
Jun 16 13:32:04 breauthsrv01 slapd[21229]: conn=0 op=1 SRCH attr=sAMAccountName
Jun 16 13:32:04 breauthsrv01 slapd[21229]: conn=0 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=

ただし、LDAP 経由で AD で直接 Apache htaccess を使用すると機能します。 動作するセットアップをお持ちの方はいらっしゃいますか? ご協力をよろしくお願いします:

slapd.conf:

allow bind_v2
include         /etc/ldap/schema/core.schema
...
include         /etc/ldap/schema/microsoft.minimal.schema
...
backend         ldap
database        ldap

suffix "ou=xxx,dc=int,dc=xxx,dc=de"
uri "ldap://80.156.177.161:389"
acl-bind bindmethod=simple binddn="CN=authtest01,ou=GPO-Test,ou=xxx,dc=int,dc=xxx,dc=de" credentials=xxxxx

.htaccess:

AuthBasicProvider ldap
AuthType basic
AuthName "AuthTest"
AuthLDAPURL "ldap://breauthsrv01.xxx.de:389/OU=xxx,DC=int,DC=xxx,DC=de?sAMAccountName?sub"
AuthzLDAPAuthoritative On
AuthLDAPGroupAttribute member
AuthLDAPBindDN  CN=authtest02,OU=GPO-Test,OU=xxx,DC=int,DC=xxx,DC=de
AuthLDAPBindPassword test123
Require valid-user

microsoft.minimal.schema:

attributetype ( 1.2.840.113556.1.4.221
      NAME 'sAMAccountName'
      SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
      SINGLE-VALUE )

答え1

slapd.conf ファイルにマッピングを追加する必要があります。

moduleload rwm
...
overlay rwm
rwm-map attribute uid sAMAccountName
rwm-map objectClass posixGroup group 
rwm-map objectClass posixAccount person
rwm-map objectClass memberUid member

次に、ユーザID属性の代わりにsAMAccountName.htaccess ファイルの属性:

AuthLDAPURL "ldap://breauthsrv01.xxx.de:389/OU=xxx,DC=int,DC=xxx,DC=de?uid?sub"

答え2

次のエラー メッセージが表示されます:

get_ava: attributeType sAMAccountName の値が不正です

sAMAccountNameこれは、属性の定義に一致ルールがないために発生しますmicrosoft.minimal.schema。簡単に言うと、OpenLDAP のスキーマ定義では、どのような種類の検索が許可されるか (存在、完全一致、部分文字列一致など) を指定できますが、この定義にはそのような検索がありません。

これを試して:

 attributetype ( 1.2.840.113556.1.4.221
   NAME 'sAMAccountName'
   EQUALITY caseIgnoreMatch
   SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
   SINGLE-VALUE )

答え3

ジョナサンの答えは私を正しい方向に導き、次の問題を乗り越えさせてくれました。

additional info: sAMAccountName: attribute type undefined

問題です。しかし、この属性を個人のエントリの有効な値として定義する必要があり、各個人にその属性を持つことが許可されている objectClass を与える必要があることに気付きました。すべての属性と同様に、inetOrgPerson に与えることができます。

私の microsoft.minimal.schema ファイルは次のようになります。

attributetype ( 1.2.840.113556.1.4.221
          NAME 'sAMAccountName'
          SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
          SINGLE-VALUE )

attributetype ( 1.2.840.113556.1.4.146
          NAME 'objectSid'
          SYNTAX '1.3.6.1.4.1.1466.115.121.1.40'
          SINGLE-VALUE )

objectclass ( 1.2.840.113556.1.5.6
        NAME 'securityPrincipal'
        SUP top
        AUXILIARY
        MUST (objectSid $ sAMAccountName )
        MAY () )

 #            MAY (nTSecurityDescriptor $ securityIdentifier $ supplementalCredentials $
 #                rid $ sAMAccountType $ sIDHistory $ altSecurityIdentities $ tokenGroups $
 #                    tokenGroupsNoGCAcceptable $ accountNameHistory  $
 #                                              tokenGroupsGlobalAndUniversal))

MS オプション属性を何も定義せずに置き換えているので、定義する必要はありません。

ユーザーエントリの例は次のようになります。

dn: uid=user2,ou=example,dc=aa,dc=ad,dc=example,dc=gov                                                                          
uid: user2                                                                                                              
sAMAccountName: user2                                                                                                   
objectSid: user2                                                                                                        
cn: User Two                                                                                                            
displayName: User Two                                                                                                   
givenName: User2                                                                                                        
sn: One                                                                                                                 
objectClass: inetOrgPerson                                                                                              
objectClass: securityPrincipal                                                                                          
mail: [email protected]                                                                                                 
 # password from slappasswd is 'user2'                                                                                   
userPassword: {SSHA}sjB5fmIIPTrUUammtmonP+6DdC93+P4L    

関連情報