240px-Diamond warning sign (Vienna Convention style).svg.png Content of this wiki is DEPRECATED 240px-Diamond warning sign (Vienna Convention style).svg.png

LDAP

Z old-wiki.siliconhill.cz
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Prerekvizita SSL)
 
(Není zobrazeno 79 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 Informačního systému 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.
+
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 10: Řádka 11:
 
* Port: 636
 
* Port: 636
 
* Používá SSL (ldaps://)
 
* Používá SSL (ldaps://)
* Správce: [[Tomáš Srna]]
+
* 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
 
* Atribút uživateľského mena: uid
Řádka 17: Řádka 18:
 
* Overenie cez userPassword, SSHA hash
 
* Overenie cez userPassword, SSHA hash
 
* Vo výnimočných prípadoch možnosť NTLM overenia
 
* 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 ==
 
== Autentizačné módy ==
Řádka 65: Řádka 83:
 
= Příklady použití / nastavení =
 
= 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
 
  
 
== LDAP z příkazové řádky - ldapsearch ==
 
== LDAP z příkazové řádky - ldapsearch ==
Řádka 129: Řádka 137:
 
}
 
}
 
else {
 
else {
   echo "Spatne jmeno nebo heslo"
+
   echo "Spatne jmeno nebo heslo";
 
}
 
}
 
</pre>
 
</pre>
Řádka 161: Řádka 169:
 
   puts "authentication failed"
 
   puts "authentication failed"
 
end
 
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>
 
</pre>
  
 
= Seznam služeb a jejich správců, které LDAP používají =
 
= Seznam služeb a jejich správců, které LDAP používají =
* finance.sh [[Bronislav Robenek]]
+
 
* imap.sh [[Radim Roška]]
+
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.
* zimbra.sh [[Radim Roška]]
+
 
* msdnaa.sh [[Michal Naiman]]
+
Fastbind a sdileny auth-user budou k 1.1.2014 vypnuty. Pro sluzby, ktere vyzaduji LDAP i presto je nutne vytvorit vlastniho auth-usera.
* git.sh [[Tomáš Srna]]
+
 
* news.sh [[Dominik Mališ]]
+
* tacacs [[Vladimír Kincl]] a [[Dalibor Šicner]]
 +
* radius
 
* shell.sh [[Václav Mach]]
 
* shell.sh [[Václav Mach]]
* siliconhill.cz [[Dominik Mališ]]
+
* 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, ze
getent passwd
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

id tomassrna

Poznamka: Vsetko je testovane na cistej instalacii Debian Squeeze

[editovat] Prerekvizita

#Prerekvizita SSL

[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.

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
Jmenné prostory

Varianty
Akce