Project

General

Profile

Segnalazione #856

interfaccia con LDAP asincrona per tornado

Added by Elena Grandi 3 months ago. Updated 2 months ago.

Status:
In elaborazione
Priority:
Normale
Assignee:
Start date:
06/28/2019
Due date:
% Done:

0%

Resolution:

Description

documentare poi come questa interfaccia esporta le informazioni ottenute da LDAP (utente e gruppi di cui fa parte) al resto del codice tornado.


Related issues

Blocks fuss-manager - Segnalazione #858: file di configurazione che associa i permessi ad utenti/gruppi Commenti 06/28/2019
Blocks fuss-manager - Segnalazione #860: inserire nome utente e permessi attivi all'interno dell'HTML nel template di base Nuovo 06/28/2019
Blocks fuss-manager - Segnalazione #861: Mostrare il nome utente corrente nei template html Nuovo 06/28/2019
Blocks fuss-manager - Segnalazione #863: Aggiungere permission checking a operation e API Nuovo 06/28/2019
Blocks fuss-manager - Segnalazione #862: form/view di login In elaborazione 06/28/2019

Associated revisions

Revision 372babd7 (diff)
Added by Enrico Zini 2 months ago

Initial LDAP wrapper class. refs: #856

Revision ea015a01 (diff)
Added by Enrico Zini 2 months ago

Implemented to test authentication. refs: #856

Revision c7d81823 (diff)
Added by Enrico Zini 2 months ago

Print auth results. refs: #856

Revision 4811999c (diff)
Added by Enrico Zini 2 months ago

To facilitate repeated iterations, pick the password from ldap_password if it exists. refs: #856

Revision 18228fc7 (diff)
Added by Enrico Zini 2 months ago

Lookup group information. refs: #856

Revision 80e8ce97 (diff)
Added by Enrico Zini 2 months ago

Use a dataclass to model the User object. refs: #856

Revision 3e2bfdee (diff)
Added by Enrico Zini 2 months ago

Moved user infrastructure in a separate submodule. refs: #856

Revision f7020d10 (diff)
Added by Enrico Zini 2 months ago

Added a generic infrastructure for user databases. refs: #856

Revision d9c6225b (diff)
Added by Enrico Zini 2 months ago

Fixed a race condition when it failed to stop a service before it had started. refs: #856

Revision 1b34327e (diff)
Added by Enrico Zini 2 months ago

Added a fallback local user database to work on non-ldap systems. refs: #856

Revision 222921ea (diff)
Added by Enrico Zini 2 months ago

Use a Group dataclass for groups. refs: #856

Revision 93f26bfe (diff)
Added by Enrico Zini 2 months ago

Do not stick to confusing ldap names for User and Group fields. refs: #856

Revision 146039be (diff)
Added by Enrico Zini 2 months ago

Revove need for ldap_bind_dn_template. refs: #856

Revision 6b30fa58 (diff)
Added by Enrico Zini 2 months ago

Added a mock user database, and instantiate a user database in Manager. refs: #856

Revision db81b177 (diff)
Added by Enrico Zini 2 months ago

Fixed mock user db. refs: #856

Revision 482e7954 (diff)
Added by Elena Grandi 2 months ago

Mock users only have the admin group when called root or admin. refs: #856

Revision 1aa38c03 (diff)
Added by Elena Grandi 2 months ago

New auth backend: master password. refs: #856

History

#1 Updated by Elena Grandi 3 months ago

  • Blocks Segnalazione #858: file di configurazione che associa i permessi ad utenti/gruppi added

#2 Updated by Elena Grandi 3 months ago

  • Blocks Segnalazione #860: inserire nome utente e permessi attivi all'interno dell'HTML nel template di base added

#3 Updated by Elena Grandi 3 months ago

#4 Updated by Elena Grandi 3 months ago

#5 Updated by Elena Grandi 3 months ago

  • Target version set to 0.7 Autenticazione e autorizzazione

#6 Updated by Mark Caglienzi 3 months ago

#7 Updated by Elena Grandi 3 months ago

Segnalo da #742 che oltre alle utenze ldap, nelle scuole è anche in uso un utente root con la master password del fuss-server (in /etc/fuss-server/fuss-server.yaml, se presente)

#8 Updated by Enrico Zini 2 months ago

  • Status changed from Nuovo to In elaborazione
  • Assignee changed from Enrico Zini to Elena Grandi

Nel branch t856 ho committato un comando di esempio, che sarà poi da rimuovere:

usage: fuss-manager ldap [-h] uid

positional arguments:
  uid         user id to use to test authentication

Che tenta l'autenticazione con un server ldap (la password la chiede con getpass()).

In config.py ci sono 3 parametri necessari da configurare per l'autenticazione:

    'ldap_uri': "ldap://server:port",   
    'ldap_search_base': 'dc=fuss,dc=example,dc=it',
    'ldap_bind_dn_template': 'uid={uid},dc=fuss,dc=example,dc=it',

L'implementazione è in manager/ldap.py, asincrona.

Ho un po' di domande:

  • Cosa mettiamo come configurazione di default per lo sviluppo?
  • Decidiamo un formato per passare i dati su un utente invece di una Entry ldap3?
  • ldap_bind_dn_template ha un senso come parametro di configurazione per mappare come passare da username a bind DN di LDAP?

Per esportare i gruppi servirà anche fare una ulteriore query in _sync_authenticate, immagino: vediamo dopo aver deciso con quale struttura dati restituire i risultati.

#9 Updated by Enrico Zini 2 months ago

Ho aggiunto la lettura dei gruppi dell'utente. Per un login, e per avere informazioni su un utente, ci sono da fare 3 query LDAP: dati utente, nome gruppo primario, elenco nomi e gid gruppi secondari.

Probabilmente è possibile togliere ldap_bind_dn_template e aggiugnere sempre uid=$UID a ldap_user_search_base. Chiedo feedback a Simone.

Ho improvvisato una struttura User in ldap.py, che sarà poi da tirar fuori da ldap.py e mettere in un qualcosa di piú generico in fuss-manager. Accetto suggerimenti sul suo layout.

#10 Updated by Enrico Zini 2 months ago

La configurazione di esempio per LDAP ora è:

    'ldap_uri': "ldap://server:port",
    'ldap_bind_dn_template': 'uid={uid},ou=People,dc=fuss,dc=example,dc=it',
    'ldap_user_search_base': 'ou=People,dc=fuss,dc=example,dc=it',
    'ldap_group_search_base': 'ou=Group,dc=fuss,dc=example,dc=it',

#11 Updated by Simone Piccardi 2 months ago

Allora ldap_bind_dn_template secondo me è inutile, per ogni utente il DN sarà sempre nella forma uid=username,{{ldap_user_search_base}}.

Inoltre sul fuss-server l'albero ha sempre la seguente struttura (creata dal playbook) sulla base del dominio specificato in fase di lancio (ex. fuss.lan) ed in genere si contatta sempre su localhost, per cui l'elenco sopra lo esprimerei come (in yaml):

ldap_uri: "ldap://localhost:port" 
ldap_base: dc=fuss,dc=lan
ldap_user_search_base: ou=Users,{{ldap_base}}
ldap_group_search_base: ou=Groups,{{ldap_base}}

ci son pure dei rami ou=Computers e ou=Idmap ad uso di Samba, che si possono ignorare, visto che non mi risulta usino più il fuss-server come PDC.

#12 Updated by Enrico Zini 2 months ago

Ho tolto ldap_bind_dn_template e uso invece ldap_user_search_base.

Ho implementato un'astrazione per User, Group, e database utenti e gruppi.

Ho implementato l'autenticazione per LDAP e per db utenti unix locale. Possiamo usare il db utenti unix locale come fallback se ldap non è configurato. Per autenticare utenti però serve essere root.

#13 Updated by Enrico Zini 2 months ago

A questo punto ti passo il ticket per review, e per eventualmente:

  • vedere come impostare la configurazione di default
  • documentare le chiavi di configurazione LDAP

#14 Updated by Enrico Zini 2 months ago

Per la gestione della master password si può fare un MasterPasswordMixin per i vari user database, che controlla la master password prima di fare super().authenticate(...)

#15 Updated by Enrico Zini 2 months ago

Ho aggiunto anche un user database mock, e l'autodetect del database da usare con lo stesso meccanismo is_viable usato per le machine data source

#16 Updated by Elena Grandi 2 months ago

Fatto il merge in master, mi tengo il ticket per quanto nei commenti 13 e successivi

#17 Updated by Elena Grandi 2 months ago

Aggiunto un nuovo backend per la master password (al posto di un mixin, sembrava più coerente col resto).

È sul branch t853, mi tengo il ticket per il resto.

Also available in: Atom PDF