Role openldap:
- Nainstaluje
OpenLDAP
server. - Provede jeho konfiguraci.
- Vytvoří požadované datové objekty v OpenLDAP databázi.
- Zprovozní master <-> backup replikaci.
- Nastaví pravidelné zálohování OpenLDAP databáze.
Závislosti:
- Je nutné mít nainstalovaný balík
python-ldap
na počítači, který spouští Ansible.
Proměnná | Povinná | Výchozí | Popis |
---|---|---|---|
openldap | ano | Slovník pro konfiguraci | |
.anonymous_bind | ne | false | Umožní anononymní přístup k databázi |
.datadir_path | ne | /srv/database/ldap |
Cesta k souborům databáze OpenLDAP |
.domain | ne | logicworks.cz | Výchozí doména pro konfiguraci |
.groups | ne | Čárkou oddělený seznam systémových skupin, do kterých bude přidán uživatel openldap |
|
.indices | ne | Pole nastavení indexů OpenLDAP databáze | |
.organization | ne | logicworks | O výchozí databáze |
.searchbase | ne | dc=logicworks,dc=cz | DC výchozí databáze |
.admin | ano | Slovník nastavení admin uživatele | |
..cn | ne | admin | CN OpenLDAP root uživatele. Nesmí být jiné než CN v admin.dn |
..dn | ne | cn=admin,dc=logicworks,dc=cz | DN OpenLDAP root uživatele. Musí obsahovat admin.cn CN |
..password | ano | Heslo OpenLDAP root uživatele | |
.backup | ne | Slovník pro nastavení zálohování | |
..dir | ne | /var/backups | Adresář, kam se bude zálohovat. |
..enabled | ne | true | Zapíná zálohovací skript |
..schedule.(minute|hour|day|month|weekday) | ano | Nastavení intervalu záloh v cron |
|
..retention.days | ne | 1 | Proměnná pro snippet remove_backups |
..retention.min | ne | 24 | Proměnná pro snippet remove_backups |
.replication | ne | Slovník pro nastavení replikace | |
..enabled | ne | false | Zapíná replikaci |
..retry | ne | 1 10 10 + | Retry interval viz replikace |
..user | ne | Slovník replikačního uživatele | |
...cn | ne | replicator | CN replikačního uživatele. Nesmí být jiné než CN v replication.user.dn |
...create | ne | true | Vytvoří uživatele v OpenLDAP databázi |
...dn | ne | cn=replicator,dc=logicworks,dc=cz | DN replikačního uživatele. Musí obsahovat replication.user.cn CN |
...password | ano | Heslo uživatele pro replikaci | |
.tls | ne | Slovník nastavení TLS (StartTLS) | |
..enabled | ne | false | Zapne STARTTLS metodu na standardním portu 389 |
..ldaps | ne | false | Zapne navíc LDAPS na portu 636; STARTTLS musí být zapnuto (tls.enabled musí být true ) |
..force | ne | false | Vynutí TLS pro každé spojení |
..ca_file | ne | /etc/ssl/certs/ca-certificates.crt | Cesta k pem souboru s certifikáty CA. Nemělo by být potřeba nastavovat. |
..cert_file | ne | /etc/ssl/certs/ssl-cert-snakeoil.pem | Cesta k pem souboru s certifikátem |
..key_file | ne | /etc/ssl/private/ssl-cert-snakeoil.key | Cesta k souboru s privátním klíčem |
.priority_string | ne | Viz defaults | Priority string pro GnuTLS, které OpenLDAP využívá v Debianu |
openldap_acl | ne | Pole pro nastavení ACL | |
openldap_data | ne | Slovník pro vytvoření objektů v databázi | |
.attributes | ne | Pole k nastavení specifických atributů | |
.users | ne | Pole k vytvoření specifických uživatelů | |
.objects | ne | Pole k vytvoření specifických objektů | |
.usergroups | ne | Slovník pro konfiguraci základních skupin a jejich uživatelů viz sekce Vytváření objektů | |
..users | ne | Pole uživatelů | |
...name | ano | Jméno uživatele | |
...password | ano | Heslo uživatele | |
...description | ne | Basic user | Popis objektu uživatele |
..groups | ne | Pole skupin | |
...name | ano | Jméno skupiny | |
...members | ano | Pole jmen uživatelů, kteří jsou členy skupiny | |
...description | ne | Basic group | Popis objektu skupiny |
Pro master<->backup využíváme OpenLDAP multimaster replikaci.
Používáme režim olcMirrorMode
, díky kterému je možné zapisovat do master i backup databáze.
Předpokládá se, že souběžný zápis si ošetříme sami, což děláme pomocí keepalived
.
Atribut olcSyncrepl
nastavujeme následovně (více info v man
stránce):
rid=001
: ID replikačního procesuprovider=ldap://{{ failover_mirror }}
: URL serveru, ze kterého replikujemestarttls={{ "critical" if openldap.tls.force else "yes" }}
: Vynucujeme TLS pomocícritical
, když víme, že je TLS nastaveno.searchbase="{{ openldap.searchbase }}"
binddn="{{ openldap.replication.user.dn }}"
: Uživatel pro replikaci.credentials="{{ openldap.replication.user.password }}"
: Heslo uživatele pro replikaci.retry="{{ openldap.replication.retry }}"
: Nastavení intervalu pokusů o znovunavázání spojení.schemachecking=on
: Validita každého write update je ověřena vůči schématu.type=refreshAndPersist
: Nastavení neustálé replikace.interval=00:00:01:00
: Nastavujeme dd:hh:mm:ss interval pro jistotu. Z man stránky by se dalo usuzovat, že když nastane nějaký problém během neustálé replikace, mohl by další pokud proběhnout až zainterval
, který je defaultně den.
V LDAP databázi můžeme pomocí vytvořit objekty. K tomu používáme slovník openldap_data
.
Máme dvě možnosti, jak objekty vytvářet.
Pro snadnou obsluhu základní LDAP skupin a uživatelů, můžeme použít proměnnou
openldap_data.usergroups
. Její existence zajistí vytvoření:
- objektů
ou=groups,{{ openldap.searchbase }}
aou=users,{{ openldap.searchbase }}
, - uživatelů z
openldap_data.usergroups.users
vou=users,{{ openldap.searchbase }}
a nastavení jejich hesla, - skupin z
openldap_data.usergroups.groups
vou=groups,{{ openldap.searchbase }}
a nastavení jejich členů.
Příklad:
openldap_data:
usergroups:
users:
- name: 'someuser'
password: '{{ somepassword }}'
description: 'Some user description'
groups:
- name: 'somegroup'
description: "Some group description"
members:
- 'someuser'
Pokud chceme upravovat objekty či jejich atributy kdekoliv v LDAP stromu, použijeme
proměnné openldap_data.attributes
, openldap_data.objects
a speciálně pro uživatele
openldap_data.users
.
Příklad:
openldap_data:
attributes:
- dn: 'dc=logicworks,dc=cz'
attribute: 'description'
value: 'LDAP je cool'
users:
- dn: 'cn=drak,dc=logicworks,dc=cz'
attributes:
description: "Drak user"
cn: 'drak'
userPassword: 'heslo'
objects:
- dn: 'ou=users,dc=logicworks,dc=cz'
objectClass: organizationalUnit
attributes:
description: 'LDAP access users'
ou: 'users'
Proměnná openldap_data.users
existuje pro usnadnění nastavení hesla objektu uživatele.
Uživatele můžeme vytvořit také pomocí proměnné openldap_data.objects
, ale musíme již
v Ansible správně vyřešit hash hesla.
Nastavení TLS. Použijeme Let's Encrypt certifikát získaný pomocí simp_le
.
Také vynutíme zabezpečená spojení.
openldap:
groups: 'letsencrypt'
tls:
enabled: true
force: true
cert_file: '/var/lib/letsencrypt/simp_le/{{ inventory_hostname_short }}/fullchain.pem'
key_file: '/var/lib/letsencrypt/simp_le/{{ inventory_hostname_short }}/key.pem'
Nastavení indexů:
openldap:
indices:
- 'o,ou eq'
- 'mail eq'
- 'entryCSN,entryUUID eq'
Nastavení ACL:
openldap_acl:
- >-
{0}to attrs=userPassword
by self write
by group.exact="cn=ldapwrite,ou=groups,dc=logicworks,dc=cz" write
by dn="{{ openldap.replication.user.dn }}" read
by anonymous auth
by * none
- >-
{1}to attrs=shadowLastChange
by self write
by group.exact="cn=ldapwrite,ou=groups,dc=logicworks,dc=cz" write
by dn="{{ openldap.replication.user.dn }}" read
by * read
- >-
{2}to *
by anonymous auth
by group.exact="cn=ldapwrite,ou=groups,dc=logicworks,dc=cz" write
by users read
Původně jsme chtěli nastavit parametr olcRequires
-> authc
i pro frontend databázi.
To však nefunguje dobře s macOS klienty LDAP. Budeme tedy používat zákaz anonymního bindu
olcDisallows
-> bind_anon
, vyžádání autentizace pro backend databázi a ACL.
Rozdíl mezi parametry se řeší např. v OpenLDAP mailing listu.
Původní Ansible task k vyžádání autentizace na frontend databázi.
- name: Vyžádání autentizace
ldap_attr:
dn: 'olcDatabase={-1}frontend,cn=config'
name: 'olcRequires'
values: 'authc'
state: "exact"