Назад | Перейти на главную страницу

Привязка к ldap серверу slapd с использованием uid вместо cn

Я пытаюсь подключиться к серверу LDAP, на котором запущен slapd, с помощью рубинового камня net_ldap. Я могу выполнить действие привязки, используя cn пользователя, но мне нужно использовать uid.

Сервер LDAP был создан ClearOS и имеет нетронутую стандартную конфигурацию.

Вот мой рубиновый код:

  Net::LDAP.new(
    {
      host: "10.1.1.3",
      port: 389,
      base: "dc=company,dc=lan",
      auth: {
        method: :simple, 
        username: 'cn=Andrew Faraday,ou=Users,ou=Accounts,dc=company,dc=lan',
        password: "secret"
      }
    }
  ).bind

Это работает нормально, но я действительно хочу войти в систему, используя uid, а не cn, например

        username: 'uid=ajfaraday,ou=Users,ou=Accounts,dc=company,dc=lan',

Вот результат успешного поиска по ldap (довольно сильно отредактированный):

dn: cn=Andrew Faraday,ou=Users,ou=Accounts,dc=edge,dc=lan

uidNumber: 2004

gidNumber: 63000

homeDirectory: /home/ajfaraday

clearAccountStatus: enabled

sambaAcctFlags: [U          ]

sambaDomainName: company

sambaBadPasswordCount: 0

sambaBadPasswordTime: 0

uid: ajfaraday

givenName: Andrew

sn: Faraday

objectClass: top

objectClass: posixAccount

objectClass: shadowAccount

objectClass: inetOrgPerson

objectClass: clearAccount

objectClass: sambaSamAccount

cn: Andrew Faraday

loginShell: /bin/bash

Я потратил несколько дней, копаясь в файлах конфигурации slap, руководствах и старых (например, более десяти лет) вопросах по этому поводу, и у меня ничего не вышло. Я пробовал варианты по всем этим вещам:

Похоже, что все это не дает желаемого эффекта. Атрибуты regexp вообще ничего не делают.

В LDAP есть два способа аутентификации: простой механизм и SASL.

Простой механизм, который вы используете, требует привязки к точному отличительному имени. Поэтому, если вы хотите использовать свое имя пользователя вместо своего полного имени, вам необходимо изменить DN, используя следующие LDIF инструкции:

dn: cn=Andrew Faraday, ou=Users, ou=Accounts, dc=company, dc=lan
changetype: modrdn
newrdn: uid=ajfaraday
deleteoldrdn: 0

Однако SASL механизмы более гибкие, и вы можете сопоставить любой логин с LDAP вход. Вы также можете выполнить LDAP поиск, чтобы найти свой DN. Например, если вы добавите правила перезаписи:

dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: gidNumber=([0-9]*)\+uidNumber=([0-9]*),cn=peercred,cn=external,cn=auth
    ldap:///ou=Users,ou=Accounts,dc=edge,dc=lan??sub?(&(gidNumber=$1)(uidNumber=$2))

вы можете локально аутентифицироваться LDAP через сокет Unix:

ldapsearch -H ldapi:/// -Y EXTERNAL

Замечание: Тебе надо начать сначала сервер после изменения olcAuthzRegexp атрибут, чтобы это было принято во внимание.