Estou tentando executar um arquivo .ldif personalizado no início da inicialização do servidor OpenLDAP e consegui usando o seguinte comando:
ldapadd -x -D cn=admin,dc=vlad,dc=lan -w admin -H ldap:// -f ldap/ldap-test.ldif
Infelizmente, quero poder adicionar atributos personalizados e classes de objetos ao esquema usando o seguinte:
dn: cn=schema,cn=config
changetype: modify
add: olcObjectClasses
olcObjectClasses: ( 1.2.3.4.5.6.7.8.9.0 NAME 'myCustomObjectClass'
DESC 'My Custom Object Class'
AUXILIARY
MAY ( customAttribute1 $ customAttribute2 $ customAttribute3 $
customAttribute4 $ customAttribute5 $ customAttribute6 $
customAttribute7 $ customAttribute8 $ customAttribute9 $
customAttribute10 $ customAttribute11 $ customAttribute12 $
customAttribute13 $ customAttribute14 $ customAttribute15 ) )
Infelizmente, isso gera o erro de acesso insuficiente 50. Esta é a saída de slapcat -n0
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcRootDN: cn=admin,cn=config
structuralObjectClass: olcDatabaseConfig
entryUUID: 3e49b716-55fd-103e-8582-a14a85261557
creatorsName: cn=config
createTimestamp: 20240202095739Z
olcRootPW:: e1NTSEF9d3J4NGVYaUFvaGRmc2dDOXlqT0V0cEFmSWhZYklxWXo=
entryCSN: 20240202095739.321947Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20240202095739Z
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=vlad,dc=lan
olcLastMod: TRUE
olcRootDN: cn=admin,dc=vlad,dc=lan
olcRootPW:: -----
olcDbCheckpoint: 512 30
olcDbMaxSize: 1073741824
structuralObjectClass: olcMdbConfig
entryUUID: 3e49fae6-55fd-103e-8589-a14a85261557
creatorsName: cn=admin,cn=config
createTimestamp: 20240202095739Z
olcDbIndex: uid eq
olcDbIndex: mail eq
olcDbIndex: memberOf eq
olcDbIndex: entryCSN eq
olcDbIndex: entryUUID eq
olcDbIndex: objectClass eq
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword,shadowLastChange by self write by dn="cn
=admin,dc=vlad,dc=lan" write by anonymous auth by * none
olcAccess: {2}to * by self read by dn="cn=admin,dc=vlad,dc=lan" wri
te by dn="cn=user-ro,dc=vlad,dc=lan" read by * none
entryCSN: 20240202095739.438344Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20240202095739Z
Como posso executar o comando acima usando ldapadd ou ldapmodify? Qual usuário é necessário para autenticação.
ATUALIZAR:
dn: cn=schema,cn=config changetype: modify add: olcObjectClasses olcObjectClasses: ( 1.2.3.4.5.6.7.8.9.0 NAME 'myCustomObjectClass' DESC 'My Custom Object Class' AUXILIARY MAY ( name ) )
Usado o código acima com o comando: ldapmodify -Y EXTERNAL -H ldapi:// -f ldap/ldap-modify.ldif
Tudo parece bem, deve ser adicionado.
Tentei usar a classe:
dn: OU=CustomOU,DC=vlad,DC=lan
ou: CustomOU
objectClass: top
objectClass: organizationalUnit
objectClass: myCustomObjectClass
Com o comando e diz:
ldapadd -x -D cn=admin,dc=vlad,dc=lan -w admin -H ldap:// -f ldap/ldap-test.ldif
additional info: objectClass: value #2 invalid per syntax
E ao verificar o slapcat -n0, não parece que o objeto personalizado foi adicionado.
Você tem dois bancos de dados separados (o banco de dados "cn=config" e seu banco de dados "normal") e precisa ter em mente que eles possuem políticas de acesso diferentes configuradas.
O DN é listado apenas
cn=admin,dc=vlad,dc=lan
como o rootDN do seu banco de dados "normal" - ele não obtém automaticamente privilégios "root" para outros bancos de dados - e os atributos são igualmente definidos por banco de dados, concedendo a este DN alguns privilégios (e de forma redundante) apenas em o banco de dados "normal", enquanto o banco de dados "config" não possui nenhuma dessas concessões de acesso.olcAccess
Como você está tentando modificar uma entrada em
..., cn=config
, você deve primeiro examinar a configuração de "olcDatabase={0}config". Ele tem um olcRootDN completamente diferente para acesso de "superusuário" (a senha pode ser idêntica ou diferente), e seus atributos olcAccess apenas concedem acesso total a conexões locais identificadas por UID - não ao DN que você está atualmente tentando vincular (fazer login) como.Então você tem duas opções:
ligue como
cn=admin,cn=config
qual é o rootDN deste banco de dados (supondo que você saiba a senha):ou faça uma conexão local identificada pelo seu UID do Linux (que recebe acesso via olcAccess). A lista de acesso especifica uidNumber=0 que é root, então você precisa 'sudo' tudo.
Observe que não existe
-x
ou-D
neste caso; em vez disso, você usa o SASL bind com a-Y
opção. A URLldapi://
se conectará por meio de um soquete Unix local, permitindo que a autenticação baseada em UID funcione. (Se fosse uma conexão TCP, EXTERNAL significaria autenticação de certificado de cliente mTLS, que não é o que você precisa aqui.)Isso é semelhante ao modo como o Postgres e recentemente também o MariaDB funcionam (por exemplo, no Debian, ao fazer isso, você
sudo mariadb
se conectará imediatamente como usuário root do MariaDB).