OpenLDAP 클러스터

OpenLDAP 클러스터

OpenLDAP 클러스터를 구현하려고 시도하는 동안 미러링 모드에서 두 개의 백엔드 LDAP 서버를 설정했습니다.

LDAP 서비스(iRedMail)를 사용하는 애플리케이션은 LDAP 서버와 동일한 시스템에서 실행됩니다. 이 애플리케이션에는 CONFIG-DB 방식이 아닌 이전 slapd.conf 방식의 LDAP 구성이 필요합니다. 그래서 slapd.conf 파일에 미러링 매개변수를 추가했습니다. 파일은 첫 번째 백엔드 노드에서 다음과 같습니다.

include     /etc/openldap/schema/core.schema
include     /etc/openldap/schema/corba.schema
include     /etc/openldap/schema/cosine.schema
include     /etc/openldap/schema/inetorgperson.schema
include     /etc/openldap/schema/nis.schema
include     /etc/openldap/schema/calentry.schema
include     /etc/openldap/schema/calresource.schema
include     /etc/openldap/schema/amavisd-new.schema
include     /etc/openldap/schema/iredmail.schema

pidfile     /var/run/openldap/slapd.pid
argsfile    /var/run/openldap/slapd.args

# The syncprov overlay
moduleload syncprov.la

disallow    bind_anon
require     LDAPv3
loglevel    0

access to attrs="userPassword,mailForwardingAddress,employeeNumber"
    by anonymous    auth
    by self         write
    by dn.exact="cn=vmail,dc=myCompany,dc=de"   read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users        none

access to attrs="cn,sn,gn,givenName,telephoneNumber"
    by anonymous    auth
    by self         write
    by dn.exact="cn=vmail,dc=myCompany,dc=de"   read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users        read

access to attrs="objectclass,domainName,mtaTransport,enabledService,domainSenderBccAddress,domainRecipientBccAddress,domainBackupMX,domainMaxQuotaSize,domainMaxUserNumber,domainPendingAliasName"
    by anonymous    auth
    by self         read
    by dn.exact="cn=vmail,dc=myCompany,dc=de"   read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users        read

access to attrs="domainAdmin,domainGlobalAdmin,domainSenderBccAddress,domainRecipientBccAddress"
    by anonymous    auth
    by self         read
    by dn.exact="cn=vmail,dc=myCompany,dc=de"   read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users        none

access to attrs="mail,accountStatus,domainStatus,userSenderBccAddress,userRecipientBccAddress,mailQuota,backupMailAddress,shadowAddress,memberOfGroup,member,uniqueMember,storageBaseDirectory,homeDirectory,mailMessageStore,mailingListID"
    by anonymous    auth
    by self         read
    by dn.exact="cn=vmail,dc=myCompany,dc=de"   read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users        read

access to dn="cn=vmail,dc=myCompany,dc=de"
    by anonymous                    auth
    by self                         write
    by users                        none

access to dn="cn=vmailadmin,dc=myCompany,dc=de"
    by anonymous                    auth
    by self                         write
    by users                        none

access to dn.regex="domainName=([^,]+),o=domains,dc=myCompany,dc=de$"
    by anonymous                    auth
    by self                         write
    by dn.exact="cn=vmail,dc=myCompany,dc=de"   read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by dn.regex="mail=[^,]+@$1,o=domainAdmins,dc=myCompany,dc=de$" write
    by dn.regex="mail=[^,]+@$1,ou=Users,domainName=$1,o=domains,dc=myCompany,dc=de$" read
    by users                        none

access to dn.subtree="o=domains,dc=myCompany,dc=de"
    by anonymous                    auth
    by self                         write
    by dn.exact="cn=vmail,dc=myCompany,dc=de"    read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users                        read

access to dn.subtree="o=domainAdmins,dc=myCompany,dc=de"
    by anonymous                    auth
    by self                         write
    by dn.exact="cn=vmail,dc=myCompany,dc=de"    read
    by dn.exact="cn=vmailadmin,dc=myCompany,dc=de"  write
    by users                        none

access to dn.regex="cn=[^,]+,dc=myCompany,dc=de"
    by anonymous                    auth
    by self                         write
    by users                        none

access to *
    by anonymous                    auth
    by self                         write
    by users                        read

database monitor
access to dn="cn=monitor"
    by dn.exact="cn=Manager,dc=myCompany,dc=de" read
    by dn.exact="cn=vmail,dc=myCompany,dc=de" read
    by * none

database    mdb
suffix      dc=myCompany,dc=de
directory   /var/lib/ldap/myCompany.de
rootdn      cn=Manager,dc=myCompany,dc=de
rootpw      {SSHA}V5/UQXm9SmzRGjKK2zAKB79eFSaysc2wG9tPIg==
sizelimit   unlimited
maxsize     2147483648
checkpoint  128 3
mode        0700

index objectclass,entryCSN,entryUUID                eq
index uidNumber,gidNumber,uid,memberUid,loginShell  eq,pres
index homeDirectory,mailMessageStore                eq,pres
index ou,cn,mail,surname,givenname,telephoneNumber,displayName  eq,pres,sub
index nisMapName,nisMapEntry                        eq,pres,sub
index shadowLastChange                              eq,pres
index member,uniqueMember eq,pres

index domainName,mtaTransport,accountStatus,enabledService,disabledService  eq,pres,sub
index domainAliasName    eq,pres,sub
index domainMaxUserNumber eq,pres
index domainAdmin,domainGlobalAdmin,domainBackupMX    eq,pres,sub
index domainSenderBccAddress,domainRecipientBccAddress  eq,pres,sub

index accessPolicy,hasMember,listAllowedUser,mailingListID   eq,pres,sub

index mailForwardingAddress,shadowAddress   eq,pres,sub
index backupMailAddress,memberOfGroup   eq,pres,sub
index userRecipientBccAddress,userSenderBccAddress  eq,pres,sub
index mobile,departmentNumber eq,pres,sub

#Mirror Mode
serverID    001

# Consumer
syncrepl rid=001 \
provider=ldap://rm2.myCompany.de \
bindmethod=simple \
binddn="cn=vmail,dc=myCompany,dc=de" \
credentials="gtV9FwILIcp8Zw8YtGeB1AC9GbGfti" \
searchbase="dc=myCompany,dc=de" \
attrs="*,+" \
type=refreshAndPersist \
interval=00:00:01:00 \
retry="60 +"
# Provider
overlay syncprov
syncprov-checkpoint 50 1
syncprov-sessionlog 50

mirrormode on

두 번째 노드의 구성 파일은 다음 두 가지 면에서만 다릅니다.

[...]
#Mirror Mode
serverID    002
[...]

# Consumer
[...]
provider=ldap://rm2.myCompany.de \
[...]

앞서 언급했듯이 미러링은 정말 잘 작동합니다.

이제 인증 메커니즘으로 LDAP를 사용하는 웹 애플리케이션인 LDAP 클라이언트에 대한 단일 연결 주소가 필요합니다.

이를 달성하기 위해 OpenLDAP 프록시를 사용할 수 있다는 것을 읽었습니다. LDAP 클라이언트(여기서는 웹 애플리케이션)는 여러 백엔드 LDAP 서버에서 인증 데이터를 검색하는 LDAP 프록시에 연결됩니다.

저는 고대 방식 대신 CONFIG-DB를 사용하는 OpenLDAP 프록시를 설정했습니다. slapd.conf 파일은 다음과 같습니다:

include         /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/duaconf.schema
include         /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/java.schema
include         /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/openldap.schema
include         /etc/openldap/schema/ppolicy.schema

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

modulepath  /usr/lib/openldap
modulepath  /usr/lib64/openldap
moduleload  back_ldap.la       
loglevel    0

database        ldap
readonly        yes            
protocol-version    3
rebind-as-user
uri         "ldap://rm1.myCompany.de:389"
suffix              "dc=myCompany,dc=de"
uri                     "ldap://rm2.myCompany.de:389"
suffix              "dc=myCompany,dc=de"

주요 문제:

slaptest를 사용하여 CONFIG-DB를 생성하면 명령이 실패하고 다음과 같이 주장합니다.

5dc44107 /etc/openldap/slapd.conf: line 48: suffix already served by this backend!.
slaptest: bad configuration directory!

slaptest 명령은 다음과 같습니다:

slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

내가 찾은 모든 가이드는 다른 LDAP 백엔드 서버에 대해 하위 도메인 접두사를 사용하기 때문에 이 개념을 완전히 이해하지 못할 수도 있습니다.

uri         "ldap://rm1.myCompany.de:389"
suffix              "dc=myCompany,dc=de"
uri                     "ldap://rm2.myCompany.de:389"
suffix              "dc=myCompany,dc=de"

그들은 다음을 사용합니다:

uri            "ldap://rm1.myCompany.de:389"
suffix         "dc=ou1,dc=myCompany,dc=de"
uri            "ldap://rm2.myCompany.de:389"
suffix         "dc=ou2,dc=myCompany,dc=de"

내가 이해하지 못하는 것은 백엔드 서버에 각각 ou1과 ou2가 없다는 것입니다. DN이 일치하지 않으면 백엔드 LDAP에서 항목을 어떻게 찾을 수 있습니까?

이 문제 외에 LDAP 프록시에 대한 LDAP 쿼리가 성공했는지 확인하기 위해 일시적으로 두 번째 URI를 주석 처리했지만 두 번째 문제가 발생했습니다.

두 번째 용어:

두 백엔드 LDAP 서버 모두에 대해 직접 ldapsearch를 실행하면(순서대로) 모든 LDAP 사용자가 열거됩니다.

LDAP 프록시에 대해 동일한 ldapsearch를 실행하면 "vmail" 사용자만 열거됩니다. 직접 쿼리와 동일한 사용자가 나열되어야 한다고 생각합니다.

ldapsearch 명령은 다음과 같습니다.

ldapsearch -D "cn=vmail,dc=myCompany,dc=de" -w gtV9FwILIcp8Zw8YtGeB1AC9GbGfti -p 389 -h 192.168.0.92 -b "dc=myCompany,dc=de" -s sub "(objectclass=person)"

내가 뭐 놓친 거 없니?

당신의 배려에 감사합니다!

감사합니다, 플로리안

관련 정보