LDAP
(Není zobrazeno 92 mezilehlých verzí od 10 uživatelů.) | |||
Řádka 1: | Řádka 1: | ||
+ | '''!!!POZOR!!! PŘÍSTUP K LDAPU JDE NYNÍ JEN Z WHITELISTOVANÉ ADRESY A POUŽÍVÁ SE JEN PRO INTERNÍ UŽITÍ KLUBOVÝCH SLUŽEB!''' | ||
− | LDAP je protokol pro získávání/zapisování informací v stromové struktuře. Dnes se používá zejména pro jednotné přihlašování uživatelů do více aplikací. | + | '''LDAP''' je protokol pro získávání/zapisování informací v stromové struktuře. Dnes se používá zejména pro jednotné přihlašování uživatelů do více aplikací. |
[http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol LDAP na wikipedii] | [http://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol LDAP na wikipedii] | ||
− | Klub Silicon Hill v rámci | + | Klub Silicon Hill v rámci [[IS|ISu]] provozuje LDAP server, vůči kterým se můžou další aplikace ověřovat pomocí uživatelova hesla. Umožňujeme jak bind tak fastbind. Stávající implementace je pro všechny uživatele Read-only, veškeré změny uživatelských účtů je třeba dělat přes rozhraní informačního systému. |
− | + | ||
= Informace o serveru = | = Informace o serveru = | ||
Řádka 11: | Řádka 11: | ||
* Port: 636 | * Port: 636 | ||
* Používá SSL (ldaps://) | * Používá SSL (ldaps://) | ||
− | * Správce: [[ | + | * Správce: [[Vladimír Kincl]] |
* Uživatelé v ou=People,dc=sh,dc=cvut,dc=cz | * Uživatelé v ou=People,dc=sh,dc=cvut,dc=cz | ||
+ | * Atribút uživateľského mena: uid | ||
* Uživatel pro servery: cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz | * Uživatel pro servery: cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz | ||
* Heslo na vyžádání u správce | * Heslo na vyžádání u správce | ||
+ | * Overenie cez userPassword, SSHA hash | ||
+ | * Vo výnimočných prípadoch možnosť NTLM overenia | ||
+ | * Důležité atributy uživatelů: | ||
+ | ** uid: username | ||
+ | ** givenName: křestní jméno | ||
+ | ** sn: příjmení | ||
+ | ** cn: celé jméno | ||
+ | ** mail: ______@sh.cvut.cz | ||
+ | ** SHservice: zaklad - Pro každou službu, kterou má uživatel aktivní, obsahuje Alias služby z ISu | ||
+ | ** SHadmin: is1 - Pro každý server, kterého je uživatel správce | ||
+ | ** SHmailExternal: _____@____.__ - Pro každý externí email, který si uživatel autorizoval pro odesílání | ||
+ | ** SHrole: SHrole: nazev_role:rozsah | nazev_role - Pro každou roli / oprávnění v ISu existuje záznam SHrole, pokud není uvedena : jedná se o neomezené oprávnění, Příklady: | ||
+ | *** SHrole: registrator:wifi - Registrátor WiFi | ||
+ | *** SHrole: admin:10 - Admin B10 | ||
+ | *** SHrole: admin - Admin neomezený | ||
+ | *** SHrole: service_admin:zimbra - Správce služby Zimbra | ||
+ | *** SHrole: mail_admin:su.cvut.cz - Správce mailů domény su.cvut.cz | ||
+ | *** Platné názvy rolí: registrator, tags_admin, cameras_admin, student_representative, extended_member, payments_admin, netadmin, dns_admin, service_admin, mail_admin, superuser, admin, secretary, roles_admin, card_readers_admin | ||
+ | *** Dokumentace k rolím: https://is.sh.cvut.cz/users/20288/user_roles | ||
+ | |||
+ | == Autentizačné módy == | ||
+ | |||
+ | * FastBind - Bind priamo užívateľom, pod ktorým sa hlási náš klient | ||
+ | * uid={username},ou=People,dc=sh,dc=cvut,dc=cz | ||
+ | * {password} | ||
+ | * Bind cez auth-user | ||
+ | * Horeuvedené údaje | ||
+ | * Vhodné pre mnohonásobné overovanie užívateľov s použitím jediného spojenia. | ||
+ | |||
+ | = Prerekvizita SSL = | ||
+ | |||
+ | '''Dôležité!''' Na Linuxe pokiaľ sa používajú ldap knižnice z OS (používa ich OS samotný, PHP, ...), je potrebné pridať certifikát autority. | ||
+ | |||
+ | Postup je nasledovný: | ||
+ | |||
+ | * V /etc/ldap/ldap.conf pridáme riadok | ||
+ | TLS_CACERT /etc/ssl/certs/ldap.pem | ||
+ | |||
+ | * Do spomínaného súboru /etc/ssl/certs/ldap.pem vložíme certifikát autority AddTrust: | ||
+ | -----BEGIN CERTIFICATE----- | ||
+ | MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU | ||
+ | MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs | ||
+ | IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 | ||
+ | MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux | ||
+ | FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h | ||
+ | bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v | ||
+ | dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt | ||
+ | H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 | ||
+ | uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX | ||
+ | mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX | ||
+ | a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN | ||
+ | E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 | ||
+ | WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD | ||
+ | VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 | ||
+ | Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU | ||
+ | cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx | ||
+ | IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN | ||
+ | AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH | ||
+ | YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 | ||
+ | 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC | ||
+ | Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX | ||
+ | c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a | ||
+ | mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= | ||
+ | -----END CERTIFICATE----- | ||
= Příklady použití / nastavení = | = Příklady použití / nastavení = | ||
+ | |||
== LDAP z příkazové řádky - ldapsearch == | == LDAP z příkazové řádky - ldapsearch == | ||
Řádka 71: | Řádka 137: | ||
} | } | ||
else { | else { | ||
− | echo "Spatne jmeno nebo heslo" | + | echo "Spatne jmeno nebo heslo"; |
} | } | ||
</pre> | </pre> | ||
+ | == Ruby - FastBind == | ||
+ | |||
+ | <pre> | ||
+ | require 'rubygems' | ||
+ | require 'net/ldap' | ||
+ | require 'io/console' | ||
+ | |||
+ | puts "Username:" | ||
+ | username = gets | ||
+ | puts "Password:" | ||
+ | password = STDIN.noecho(&:gets) | ||
+ | |||
+ | ldap = Net::LDAP.new(:encryption => :simple_tls) | ||
+ | ldap.host = "ldap.sh.cvut.cz" | ||
+ | ldap.port = 636 | ||
+ | ldap.base = "ou=People,dc=sh,dc=cvut,dc=cz" | ||
+ | ldap.auth "uid=#{username.strip},"+ldap.base, password.strip | ||
+ | if ldap.bind | ||
+ | puts "authentication succeeded" | ||
+ | p ldap.search( | ||
+ | base: "ou=People,dc=sh,dc=cvut,dc=cz", | ||
+ | filter: Net::LDAP::Filter.eq("uid", username.strip), | ||
+ | attributes: %w[ givenName sn email SHservice ], | ||
+ | return_result:true | ||
+ | ).inspect | ||
+ | else | ||
+ | puts "authentication failed" | ||
+ | end | ||
+ | </pre> | ||
+ | |||
+ | == PHP - bez frameworku == | ||
+ | <?php | ||
+ | $user = "tomassrna"; | ||
+ | $pass = "..."; | ||
+ | $ldapConn = ldap_connect("ldaps://ldap.sh.cvut.cz", 636); | ||
+ | if($ldapConn) | ||
+ | { | ||
+ | $ldapBind = ldap_bind($ldapConn, "uid=".$user.",ou=People,dc=sh,dc=cvut,dc=cz", $pass); | ||
+ | if($ldapBind) | ||
+ | echo "SUCCESS\n"; | ||
+ | else | ||
+ | { | ||
+ | echo "FAILED: "; | ||
+ | echo ldap_error($ldapConn)."\n"; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | == Apache HTTP auth == | ||
+ | |||
+ | Je nutne splnit prerekvizitu - viz. obsah wiki stranky. | ||
+ | |||
+ | <pre> | ||
+ | |||
+ | <Directory /var/www/*> | ||
+ | Options Indexes FollowSymLinks MultiViews | ||
+ | |||
+ | Order allow,deny | ||
+ | Deny from all | ||
+ | |||
+ | AuthType Basic | ||
+ | AuthBasicProvider ldap | ||
+ | AuthName "ldap auth" | ||
+ | AuthLDAPURL "ldaps://ldap.sh.cvut.cz:636/dc=sh,dc=cvut,dc=cz" | ||
+ | |||
+ | AuthzLDAPAuthoritative On | ||
+ | AuthLDAPBindAuthoritative On | ||
+ | AuthLDAPBindDN "cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz" | ||
+ | AuthLDAPBindPassword "****************" | ||
+ | |||
+ | Require ldap-filter &(SHrole=netadmin) | ||
+ | Satisfy Any | ||
+ | |||
+ | </Directory> | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | == Microsoft Visual C# == | ||
+ | |||
+ | Tak toto bol tazky boj... | ||
+ | |||
+ | * Pridame reference System.DirectoryServices | ||
+ | |||
+ | <pre> | ||
+ | using System; | ||
+ | using System.Collections.Generic; | ||
+ | using System.Linq; | ||
+ | using System.Text; | ||
+ | using System.Threading.Tasks; | ||
+ | using System.DirectoryServices; | ||
+ | using System.Collections; | ||
+ | |||
+ | namespace LDAP | ||
+ | { | ||
+ | class Program | ||
+ | { | ||
+ | static void Main(string[] args) | ||
+ | { | ||
+ | Dictionary<string, string[]> attrs; | ||
+ | if ((attrs = shLdap("tomassrna", "xxxxxx", | ||
+ | new[] { "mail", "uid", "SHservice", "SHadmin" }, "(&(uid=tomassrna)(SHservice=net))")) != null) | ||
+ | { | ||
+ | Console.WriteLine("Auth success!"); | ||
+ | // Priklad vypisu vsetkych atributov | ||
+ | foreach(KeyValuePair<string, string[]> kv in attrs) | ||
+ | { | ||
+ | string k = kv.Key; | ||
+ | foreach (string v in kv.Value) | ||
+ | { | ||
+ | Console.WriteLine(k + "=" + v); | ||
+ | } | ||
+ | } | ||
+ | // Priklad ziskania single value | ||
+ | Console.WriteLine("E-mail: " + attrs["mail"][0]); | ||
+ | // Priklad ziskania multi value | ||
+ | Console.WriteLine("Spravovane servery: "); | ||
+ | foreach (string s in attrs["shadmin"]) | ||
+ | { | ||
+ | Console.WriteLine(s); | ||
+ | } | ||
+ | } | ||
+ | else | ||
+ | Console.WriteLine("Auth failed!"); | ||
+ | |||
+ | Console.Read(); | ||
+ | } | ||
+ | static Dictionary<string, string[]> shLdap(string username, string password, string[] attrs, string filter = "") | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | DirectoryEntry de = new DirectoryEntry("LDAP://ldap.sh.cvut.cz:636/OU=People,DC=sh,DC=cvut,DC=cz", | ||
+ | "uid=" + username + ",ou=People,dc=sh,dc=cvut,dc=cz", password, | ||
+ | AuthenticationTypes.SecureSocketsLayer); | ||
+ | DirectorySearcher ds = new DirectorySearcher(de); | ||
+ | if (filter == "") | ||
+ | ds.Filter = "(uid=" + username + ")"; | ||
+ | else | ||
+ | ds.Filter = filter; | ||
+ | foreach (string attr in attrs) | ||
+ | ds.PropertiesToLoad.Add(attr); | ||
+ | SearchResult sr = ds.FindOne(); | ||
+ | |||
+ | Dictionary<string, string[]> res = new Dictionary<string, string[]>(); | ||
+ | foreach (string prop in sr.Properties.PropertyNames) | ||
+ | { | ||
+ | var ar = new List<string>(); | ||
+ | foreach (object oval in sr.Properties[prop]) | ||
+ | { | ||
+ | string val = ""; | ||
+ | if (oval is string) | ||
+ | val = (string)oval; | ||
+ | else if(oval is Byte[]) | ||
+ | val = Encoding.UTF8.GetString((Byte[])oval, 0, ((Byte[])oval).Length); | ||
+ | ar.Add(val); | ||
+ | } | ||
+ | res[prop] = (string[])ar.ToArray(); | ||
+ | } | ||
+ | return res; | ||
+ | } | ||
+ | catch (Exception) | ||
+ | { | ||
+ | return null; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | == Linux - prihlasovanie uzivatelov == | ||
+ | |||
+ | Existuje niekolko sposobov, ako nakonfigurovat LDAP prihlasovanie na Linuxe. Niektore cesty su strastiplne, nechas u nich vsetky svoje nervy a potis krv. | ||
+ | Podme si ukazat sposob, ktory je jednoduchy a funguje. | ||
+ | |||
+ | Hned na zaciatku by som podotkol, ze <pre>getent passwd</pre> nikdy nebude fungovat na zobrazenie vsetkych uzivatelov. Je to politika zabezpecenia SH LDAP, ktora hovori, ze pouzivany '''auth-user''' nema pravo vidiet vsetkych uzivatelov, moze len hladat a autentifikovat. To nam staci. | ||
+ | |||
+ | Pre debug pouzivaj | ||
+ | <pre>id tomassrna</pre> | ||
+ | |||
+ | '''Poznamka:''' Vsetko je testovane na cistej instalacii Debian Squeeze | ||
+ | |||
+ | === Prerekvizita === | ||
+ | [[#Prerekvizita SSL]] | ||
+ | |||
+ | === NSS === | ||
+ | |||
+ | NSS resolvuje ciselne uidNumber na meno uzivalela. Stara sa napr. o prikaz id, alebo pri listovani adresara zobrazi uzivatela miesto cisla. | ||
+ | |||
+ | Nainstalujeme balik libnss-ldap'''d''' (pozor, existuje aj libnss-ldap, ktory je stary a tazky na konfiguraciu) | ||
+ | |||
+ | <pre> | ||
+ | aptitude install libnss-ldapd | ||
+ | </pre> | ||
+ | |||
+ | Pocas instalacie sa nas modra obrazovka spyta na: | ||
+ | * '''Name services to configure:''' group, passwd, shadow | ||
+ | * '''Meno LDAP servera:''' ldaps://ldap.sh.cvut.cz | ||
+ | * '''Base:''' dc=sh,dc=cvut,dc=cz | ||
+ | |||
+ | Doladime /etc/nslcd.conf | ||
+ | <pre> | ||
+ | uri ldaps://ldap.sh.cvut.cz | ||
+ | base dc=sh,dc=cvut,dc=cz | ||
+ | ldap_version 3 | ||
+ | binddn cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz | ||
+ | bindpw <heslo na vyziadanie od admina LDAP> | ||
+ | ssl on | ||
+ | tls_reqcert allow | ||
+ | </pre> | ||
+ | |||
+ | Skontrolujeme, ze /etc/nsswitch.conf obsahuje: | ||
+ | <pre> | ||
+ | passwd: compat ldap | ||
+ | group: compat ldap | ||
+ | shadow: compat ldap | ||
+ | </pre> | ||
+ | |||
+ | Otestujeme | ||
+ | <pre> | ||
+ | root@test:~# id tomassrna | ||
+ | uid=16405(tomassrna) gid=513(shuser) groups=513(shuser) | ||
+ | </pre> | ||
+ | |||
+ | Ak nefunguje, tak: | ||
+ | <pre> | ||
+ | root@test:~# /etc/init.d/nscd restart | ||
+ | Restarting Name Service Cache Daemon: nscd. | ||
+ | root@test:~# /etc/init.d/nslcd restart | ||
+ | Restarting LDAP connection daemon: nslcd. | ||
+ | </pre> | ||
+ | |||
+ | === PAM === | ||
+ | |||
+ | PAM zaistuje samotne prihlasovanie na SSH, pripadne desktopu. Skvele je to, ze instalacia libnss-ldapd ako zavislost uz nakonfiguruje libpam-ldapd a dokonca s nim cez nslcd zdiela konfiguraciu /etc/nslcd.conf. Hovoril som, ze to bude bezbolestne, nie? :) | ||
+ | |||
+ | PAM mozeme ale este doladit, napr. vytvaranie home adresarov pri prvom prihlaseni, restrikcia moznosti prihlasit sa na SH sluzby, resp. ldap atributy obecne. | ||
+ | |||
+ | ==== Automaticke vytvaranie home ==== | ||
+ | |||
+ | Upravime /etc/pam.d/common-session, pridame na koniec suboru | ||
+ | <pre> | ||
+ | session required pam_mkhomedir.so skel=/etc/skel umask=0022 | ||
+ | </pre> | ||
+ | |||
+ | ==== Filtrovanie uzivatelov ==== | ||
+ | |||
+ | Obmedzenie na sluzbu, napr. shell (/etc/nslcd.conf) | ||
+ | <pre> | ||
+ | filter passwd (SHservice=shell) | ||
+ | filter shadow (SHservice=shell) | ||
+ | </pre> | ||
+ | |||
+ | Obmedzenie ine: Ako filter retazec tam moze byt vsetko, co akceptuje LDAP ako filter, kludne i kombinacie, zlozene vyrazy, alebo obmedzenie na konkretneho uzivatela | ||
+ | <pre> | ||
+ | (|(&(SHservice=shell)(SHservice=net))(SHservice=sport)) | ||
+ | (|(uid=tomassrna)(uid=robenek)) | ||
+ | (uid=tomassrna) | ||
+ | (SHadmin=git) | ||
+ | </pre> | ||
= Seznam služeb a jejich správců, které LDAP používají = | = Seznam služeb a jejich správců, které LDAP používají = | ||
− | * | + | |
− | * | + | Autentizaci pomoci LDAP by mely pouzivat pouze sluby, ktere nemohou jinak. V zadnem pripade by na seznamu nemela byt webova aplikace, pro ty je urcene overovani pomoci OAuth ISu https://is.sh.cvut.cz/oauth_api. V pripade, ze spravce sluzby neni schopen/odmita migrovat, tak je treba, aby si pro sluzby vyrobil lokalni ucty. |
− | * | + | |
+ | Fastbind a sdileny auth-user budou k 1.1.2014 vypnuty. Pro sluzby, ktere vyzaduji LDAP i presto je nutne vytvorit vlastniho auth-usera. | ||
+ | |||
+ | * tacacs [[Vladimír Kincl]] a [[Dalibor Šicner]] | ||
+ | * radius | ||
+ | * shell.sh [[Václav Mach]] | ||
+ | * vpn.sh (ASA) [[Viktor Bohuslav Bohdal]] | ||
+ | |||
+ | Potreba prebrat / zmigrovat na OAuth: | ||
+ | * mbox.sh [[Václav Mach]] HTTPS, prevedeno na vlastniho auth-usera | ||
+ | * icinga ? | ||
+ | * hudebny.sh.cvut.cz ? (HTTP aplikace bez certifikátu! - BUDE ZABLOKOVÁNA) | ||
+ | * observium [[Uživatel:Gregy | Petr Gregor - Gregy]] HTTPS, prevedeno na vlastniho auth-usera | ||
+ | * cloudadmin [[Uživatel:Gregy | Petr Gregor - Gregy]] HTTPS, prevedeno na vlastniho auth-usera | ||
+ | |||
+ | [[category:servery]] |
Aktuální verze z 27. 7. 2014, 17:30
!!!POZOR!!! PŘÍSTUP K LDAPU JDE NYNÍ JEN Z WHITELISTOVANÉ ADRESY A POUŽÍVÁ SE JEN PRO INTERNÍ UŽITÍ KLUBOVÝCH SLUŽEB!
LDAP je protokol pro získávání/zapisování informací v stromové struktuře. Dnes se používá zejména pro jednotné přihlašování uživatelů do více aplikací. LDAP na wikipedii
Klub Silicon Hill v rámci ISu provozuje LDAP server, vůči kterým se můžou další aplikace ověřovat pomocí uživatelova hesla. Umožňujeme jak bind tak fastbind. Stávající implementace je pro všechny uživatele Read-only, veškeré změny uživatelských účtů je třeba dělat přes rozhraní informačního systému.
Obsah |
[editovat] Informace o serveru
- Adresa: ldap.sh.cvut.cz
- Port: 636
- Používá SSL (ldaps://)
- Správce: Vladimír Kincl
- Uživatelé v ou=People,dc=sh,dc=cvut,dc=cz
- Atribút uživateľského mena: uid
- Uživatel pro servery: cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz
- Heslo na vyžádání u správce
- Overenie cez userPassword, SSHA hash
- Vo výnimočných prípadoch možnosť NTLM overenia
- Důležité atributy uživatelů:
- uid: username
- givenName: křestní jméno
- sn: příjmení
- cn: celé jméno
- mail: ______@sh.cvut.cz
- SHservice: zaklad - Pro každou službu, kterou má uživatel aktivní, obsahuje Alias služby z ISu
- SHadmin: is1 - Pro každý server, kterého je uživatel správce
- SHmailExternal: _____@____.__ - Pro každý externí email, který si uživatel autorizoval pro odesílání
- SHrole: SHrole: nazev_role:rozsah | nazev_role - Pro každou roli / oprávnění v ISu existuje záznam SHrole, pokud není uvedena : jedná se o neomezené oprávnění, Příklady:
- SHrole: registrator:wifi - Registrátor WiFi
- SHrole: admin:10 - Admin B10
- SHrole: admin - Admin neomezený
- SHrole: service_admin:zimbra - Správce služby Zimbra
- SHrole: mail_admin:su.cvut.cz - Správce mailů domény su.cvut.cz
- Platné názvy rolí: registrator, tags_admin, cameras_admin, student_representative, extended_member, payments_admin, netadmin, dns_admin, service_admin, mail_admin, superuser, admin, secretary, roles_admin, card_readers_admin
- Dokumentace k rolím: https://is.sh.cvut.cz/users/20288/user_roles
[editovat] Autentizačné módy
- FastBind - Bind priamo užívateľom, pod ktorým sa hlási náš klient
* uid={username},ou=People,dc=sh,dc=cvut,dc=cz * {password}
- Bind cez auth-user
* Horeuvedené údaje * Vhodné pre mnohonásobné overovanie užívateľov s použitím jediného spojenia.
[editovat] Prerekvizita SSL
Dôležité! Na Linuxe pokiaľ sa používajú ldap knižnice z OS (používa ich OS samotný, PHP, ...), je potrebné pridať certifikát autority.
Postup je nasledovný:
- V /etc/ldap/ldap.conf pridáme riadok
TLS_CACERT /etc/ssl/certs/ldap.pem
- Do spomínaného súboru /etc/ssl/certs/ldap.pem vložíme certifikát autority AddTrust:
-----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE-----
[editovat] Příklady použití / nastavení
[editovat] LDAP z příkazové řádky - ldapsearch
# Balíček aptitude install ldap-utils # ~ Fastbind (zepta se na heslo pro username) ldapsearch -h ldap.sh.cvut.cz -b "dc=sh,dc=cvut,dc=cz" -D "uid=username,ou=People,dc=sh,dc=cvut,dc=cz" -W uid=username # ~ Bind (se systémovým účtem) ldapsearch -h ldap.sh.cvut.cz -b "dc=sh,dc=cvut,dc=cz" -D "cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz" -w *heslo_auth_usera* uid=username
[editovat] Zend_Auth_Adapter_Ldap
application.ini
ldap.is.host = ldap.sh.cvut.cz ldap.is.port = 636 ldap.is.useSsl = true ldap.is.useStartTls = true ldap.is.bindRequiresDn = true ldap.is.baseDn = "ou=People,dc=sh,dc=cvut,dc=cz" ldap.is.accountCanonicalForm = 2 ldap.is.username = "cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz" ldap.is.password = "********"
Přiklad přihlášení v kontextu Zend_Controller_Action, Více v dokumentaci
$auth=new Zend_Auth(); $username=$this->_getParam("username"); $password=$this->_getParam("password"); $bootstrap = $this->getInvokeArg('bootstrap'); $config=$bootstrap->getOptions(); $options = $config["ldap"]; $authAdapter=new Zend_Auth_Adapter_Ldap($options,$username,$password); $result=$auth->authenticate($authAdapter); if($result->isValid()) { $ldap=$authAdapter->getLdap(); $user = $ldap->getEntry("uid=".$username.",".$options["is"]["baseDn"]); echo "Uzivatel prihlasen"; print_r($user); } else { echo "Spatne jmeno nebo heslo"; }
[editovat] Ruby - FastBind
require 'rubygems' require 'net/ldap' require 'io/console' puts "Username:" username = gets puts "Password:" password = STDIN.noecho(&:gets) ldap = Net::LDAP.new(:encryption => :simple_tls) ldap.host = "ldap.sh.cvut.cz" ldap.port = 636 ldap.base = "ou=People,dc=sh,dc=cvut,dc=cz" ldap.auth "uid=#{username.strip},"+ldap.base, password.strip if ldap.bind puts "authentication succeeded" p ldap.search( base: "ou=People,dc=sh,dc=cvut,dc=cz", filter: Net::LDAP::Filter.eq("uid", username.strip), attributes: %w[ givenName sn email SHservice ], return_result:true ).inspect else puts "authentication failed" end
[editovat] PHP - bez frameworku
<?php $user = "tomassrna"; $pass = "..."; $ldapConn = ldap_connect("ldaps://ldap.sh.cvut.cz", 636); if($ldapConn) { $ldapBind = ldap_bind($ldapConn, "uid=".$user.",ou=People,dc=sh,dc=cvut,dc=cz", $pass); if($ldapBind) echo "SUCCESS\n"; else { echo "FAILED: "; echo ldap_error($ldapConn)."\n"; } }
[editovat] Apache HTTP auth
Je nutne splnit prerekvizitu - viz. obsah wiki stranky.
<Directory /var/www/*> Options Indexes FollowSymLinks MultiViews Order allow,deny Deny from all AuthType Basic AuthBasicProvider ldap AuthName "ldap auth" AuthLDAPURL "ldaps://ldap.sh.cvut.cz:636/dc=sh,dc=cvut,dc=cz" AuthzLDAPAuthoritative On AuthLDAPBindAuthoritative On AuthLDAPBindDN "cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz" AuthLDAPBindPassword "****************" Require ldap-filter &(SHrole=netadmin) Satisfy Any </Directory>
[editovat] Microsoft Visual C#
Tak toto bol tazky boj...
- Pridame reference System.DirectoryServices
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.DirectoryServices; using System.Collections; namespace LDAP { class Program { static void Main(string[] args) { Dictionary<string, string[]> attrs; if ((attrs = shLdap("tomassrna", "xxxxxx", new[] { "mail", "uid", "SHservice", "SHadmin" }, "(&(uid=tomassrna)(SHservice=net))")) != null) { Console.WriteLine("Auth success!"); // Priklad vypisu vsetkych atributov foreach(KeyValuePair<string, string[]> kv in attrs) { string k = kv.Key; foreach (string v in kv.Value) { Console.WriteLine(k + "=" + v); } } // Priklad ziskania single value Console.WriteLine("E-mail: " + attrs["mail"][0]); // Priklad ziskania multi value Console.WriteLine("Spravovane servery: "); foreach (string s in attrs["shadmin"]) { Console.WriteLine(s); } } else Console.WriteLine("Auth failed!"); Console.Read(); } static Dictionary<string, string[]> shLdap(string username, string password, string[] attrs, string filter = "") { try { DirectoryEntry de = new DirectoryEntry("LDAP://ldap.sh.cvut.cz:636/OU=People,DC=sh,DC=cvut,DC=cz", "uid=" + username + ",ou=People,dc=sh,dc=cvut,dc=cz", password, AuthenticationTypes.SecureSocketsLayer); DirectorySearcher ds = new DirectorySearcher(de); if (filter == "") ds.Filter = "(uid=" + username + ")"; else ds.Filter = filter; foreach (string attr in attrs) ds.PropertiesToLoad.Add(attr); SearchResult sr = ds.FindOne(); Dictionary<string, string[]> res = new Dictionary<string, string[]>(); foreach (string prop in sr.Properties.PropertyNames) { var ar = new List<string>(); foreach (object oval in sr.Properties[prop]) { string val = ""; if (oval is string) val = (string)oval; else if(oval is Byte[]) val = Encoding.UTF8.GetString((Byte[])oval, 0, ((Byte[])oval).Length); ar.Add(val); } res[prop] = (string[])ar.ToArray(); } return res; } catch (Exception) { return null; } } } }
[editovat] Linux - prihlasovanie uzivatelov
Existuje niekolko sposobov, ako nakonfigurovat LDAP prihlasovanie na Linuxe. Niektore cesty su strastiplne, nechas u nich vsetky svoje nervy a potis krv. Podme si ukazat sposob, ktory je jednoduchy a funguje.
Hned na zaciatku by som podotkol, zegetent passwdnikdy nebude fungovat na zobrazenie vsetkych uzivatelov. Je to politika zabezpecenia SH LDAP, ktora hovori, ze pouzivany auth-user nema pravo vidiet vsetkych uzivatelov, moze len hladat a autentifikovat. To nam staci.
Pre debug pouzivaj
id tomassrna
Poznamka: Vsetko je testovane na cistej instalacii Debian Squeeze
[editovat] Prerekvizita
[editovat] NSS
NSS resolvuje ciselne uidNumber na meno uzivalela. Stara sa napr. o prikaz id, alebo pri listovani adresara zobrazi uzivatela miesto cisla.
Nainstalujeme balik libnss-ldapd (pozor, existuje aj libnss-ldap, ktory je stary a tazky na konfiguraciu)
aptitude install libnss-ldapd
Pocas instalacie sa nas modra obrazovka spyta na:
- Name services to configure: group, passwd, shadow
- Meno LDAP servera: ldaps://ldap.sh.cvut.cz
- Base: dc=sh,dc=cvut,dc=cz
Doladime /etc/nslcd.conf
uri ldaps://ldap.sh.cvut.cz base dc=sh,dc=cvut,dc=cz ldap_version 3 binddn cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz bindpw <heslo na vyziadanie od admina LDAP> ssl on tls_reqcert allow
Skontrolujeme, ze /etc/nsswitch.conf obsahuje:
passwd: compat ldap group: compat ldap shadow: compat ldap
Otestujeme
root@test:~# id tomassrna uid=16405(tomassrna) gid=513(shuser) groups=513(shuser)
Ak nefunguje, tak:
root@test:~# /etc/init.d/nscd restart Restarting Name Service Cache Daemon: nscd. root@test:~# /etc/init.d/nslcd restart Restarting LDAP connection daemon: nslcd.
[editovat] PAM
PAM zaistuje samotne prihlasovanie na SSH, pripadne desktopu. Skvele je to, ze instalacia libnss-ldapd ako zavislost uz nakonfiguruje libpam-ldapd a dokonca s nim cez nslcd zdiela konfiguraciu /etc/nslcd.conf. Hovoril som, ze to bude bezbolestne, nie? :)
PAM mozeme ale este doladit, napr. vytvaranie home adresarov pri prvom prihlaseni, restrikcia moznosti prihlasit sa na SH sluzby, resp. ldap atributy obecne.
[editovat] Automaticke vytvaranie home
Upravime /etc/pam.d/common-session, pridame na koniec suboru
session required pam_mkhomedir.so skel=/etc/skel umask=0022
[editovat] Filtrovanie uzivatelov
Obmedzenie na sluzbu, napr. shell (/etc/nslcd.conf)
filter passwd (SHservice=shell) filter shadow (SHservice=shell)
Obmedzenie ine: Ako filter retazec tam moze byt vsetko, co akceptuje LDAP ako filter, kludne i kombinacie, zlozene vyrazy, alebo obmedzenie na konkretneho uzivatela
(|(&(SHservice=shell)(SHservice=net))(SHservice=sport)) (|(uid=tomassrna)(uid=robenek)) (uid=tomassrna) (SHadmin=git)
[editovat] Seznam služeb a jejich správců, které LDAP používají
Autentizaci pomoci LDAP by mely pouzivat pouze sluby, ktere nemohou jinak. V zadnem pripade by na seznamu nemela byt webova aplikace, pro ty je urcene overovani pomoci OAuth ISu https://is.sh.cvut.cz/oauth_api. V pripade, ze spravce sluzby neni schopen/odmita migrovat, tak je treba, aby si pro sluzby vyrobil lokalni ucty.
Fastbind a sdileny auth-user budou k 1.1.2014 vypnuty. Pro sluzby, ktere vyzaduji LDAP i presto je nutne vytvorit vlastniho auth-usera.
- tacacs Vladimír Kincl a Dalibor Šicner
- radius
- shell.sh Václav Mach
- vpn.sh (ASA) Viktor Bohuslav Bohdal
Potreba prebrat / zmigrovat na OAuth:
- mbox.sh Václav Mach HTTPS, prevedeno na vlastniho auth-usera
- icinga ?
- hudebny.sh.cvut.cz ? (HTTP aplikace bez certifikátu! - BUDE ZABLOKOVÁNA)
- observium Petr Gregor - Gregy HTTPS, prevedeno na vlastniho auth-usera
- cloudadmin Petr Gregor - Gregy HTTPS, prevedeno na vlastniho auth-usera