LDAP
(→LDAP Kontakty v Telefonu) |
|||
Řádka 399: | Řádka 399: | ||
* piwik.sh [[Bronislav Robenek]] | * piwik.sh [[Bronislav Robenek]] | ||
* pm.sh.cvut.cz [[Dominik Mališ]] | * pm.sh.cvut.cz [[Dominik Mališ]] | ||
+ | * grill.sh.cvut.cz [[Jiří Dostál]] | ||
[[category:servery]] | [[category:servery]] |
Verze z 28. 4. 2013, 20:10
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
|
Informace o serveru
- Adresa: ldap.sh.cvut.cz
- Port: 636
- Používá SSL (ldaps://)
- Správce: Tomáš Srna
- 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í
- 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í
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í
LDAP Kontakty v Telefonu
iPhone Nastavení -> Pošta, Kontakty, Kalendáře -> Přidat účet -> Jiný -> "Přidat účet LDAP"
- Server: ldap.sh.cvut.cz
- Uživatel: uid=**tvůj username**,ou=People,dc=sh,dc=cvut,dc=cz
- Heslo: Tvé heslo do ISu
- Popis: ldap.sh.cvut.cz
- Použít SSL: Ano
- Kritéria hledání: dc=sh,dc=cvut,dc=cz
Android - byla použita aplikace Constacts in line s pluginem Contacts LDAP
- stáhnout a naistalovat aplikaci Contacts in line - https://play.google.com/store/apps/details?id=fr.prados.contacts&feature=more_from_developer#?t=W251bGwsMSwxLDEwMiwiZnIucHJhZG9zLmNvbnRhY3RzIl0.
- stáhnout a nainstalovat plugin Contacts LDAP - https://play.google.com/store/apps/details?id=fr.prados.contacts.providers.ldap.generic.beta&hl=cs.
- spustit aplikaci Contacts in line
- dát tlačítko "volby" na mobilu (vpravo dole)
- volba "Accounts"
- vybrat "LDAP inline"
- LDAP host name: ldap.sh.cvut.cz
- vyplnit informace
* Username: uid="tvůj username do ISu",ou=People,dc=sh,dc=cvut,dc=cz * Password: "heslo do ISu" * Security: SSL * Base DN: "ou=People,dc=sh,dc=cvut,dc=cz"
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
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"; }
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
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"; } }
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; } } } }
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
Prerekvizita
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.
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
session required pam_mkhomedir.so skel=/etc/skel umask=0022
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)
Seznam služeb a jejich správců, které LDAP používají
- finance.sh Bronislav Robenek
- imap.sh Radim Roška
- zimbra.sh Radim Roška
- msdnaa.sh Michal Naiman
- git.sh Tomáš Srna
- news.sh Dominik Mališ
- shell.sh Václav Mach
- siliconhill.cz Dominik Mališ
- studovna4.sh Viktor Bohuslav Bohdal
- vpn.sh (ASA) Viktor Bohuslav Bohdal
- mbox.sh Václav Mach
- piwik.sh Bronislav Robenek
- pm.sh.cvut.cz Dominik Mališ
- grill.sh.cvut.cz Jiří Dostál