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í
(Seznam služeb a jejich správců, které LDAP používají)
(Seznam služeb a jejich správců, které LDAP používají)
Řádka 431: Řádka 431:
 
* tacacs
 
* tacacs
 
* radius
 
* radius
 +
* shell.sh [[Václav Mach]]
 +
* vpn.sh (ASA) [[Viktor Bohuslav Bohdal]]
 +
  
 
* finance.sh [[Bronislav Robenek]]
 
* finance.sh [[Bronislav Robenek]]
Řádka 437: Řádka 440:
 
* msdnaa.sh [[Michal Naiman]]
 
* msdnaa.sh [[Michal Naiman]]
 
* git.sh [[Tomáš Srna]]
 
* git.sh [[Tomáš Srna]]
* shell.sh [[Václav Mach]]
 
 
* studovna4.sh [[Viktor Bohuslav Bohdal]]
 
* studovna4.sh [[Viktor Bohuslav Bohdal]]
* vpn.sh (ASA) [[Viktor Bohuslav Bohdal]]
 
 
* mbox.sh [[Václav Mach]]
 
* mbox.sh [[Václav Mach]]
 
* piwik.sh [[Bronislav Robenek]]
 
* piwik.sh [[Bronislav Robenek]]

Verze z 1. 10. 2013, 12:52

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í, 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í

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

  1. 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.
  2. stáhnout a nainstalovat plugin Contacts LDAP - https://play.google.com/store/apps/details?id=fr.prados.contacts.providers.ldap.generic.beta&hl=cs.
  3. spustit aplikaci Contacts in line
  4. dát tlačítko "volby" na mobilu (vpravo dole)
  5. volba "Accounts"
  6. vybrat "LDAP inline"
  7. LDAP host name: ldap.sh.cvut.cz
  8. 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";
       }
}

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>

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, 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

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-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í

V idealnim pripade by na seznamu nemela byt zadna webova aplikace, pro ty je urcene overovani pomoci OAuth ISu https://is.sh.cvut.cz/oauth_api.

Autentizaci pomoci LDAP by mely pouzivat pouze sluby, ktere nemohou jinak. Webove aplikace, ktere i presto pouzivaji LDAP by meli pouzivat bind pomoci auth-usera (aby se vedl striktni seznam) a musi vynucovat HTTPS spojeni.


Jmenné prostory

Varianty
Akce