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í
(Linux - prihlasovanie uzivatelov)
(PAM)
Řádka 319: Řádka 319:
  
 
PAM sluzi pre samotne prihlasovanie uzivatelov, napr. cez SSH
 
PAM sluzi pre samotne prihlasovanie uzivatelov, napr. cez SSH
 
  
 
=== Dolezite! ===
 
=== Dolezite! ===

Verze z 8. 11. 2012, 14:22

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

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

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

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

Je to strasny oser, priprav si kybel nervov. Ach, zlaty stary NIS. Tak, podme do toho!

Navod testovany na cistej instalacii systemu Debian Squeeze

Splnime #Prerekvizita SSL

NSS

NSS je sluzba ktora resolvuje uid na mena uzivatelov (napr. ls aby zobrazilo mena)

aptitude install libnss-ldap ldap-utils nscd nslcd

Upravime "/etc/libnss-ldap.conf"

base dc=sh,dc=cvut,dc=cz
uri ldaps://ldap.sh.cvut.cz
port 636
rootbinddn cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz
bind_policy soft
binddn cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz
bindpw <heslo sdeli spravca LDAP>

nss_base_passwd ou=People,dc=sh,dc=cvut,dc=cz?one
nss_base_shadow ou=People,dc=sh,dc=cvut,dc=cz?one
nss_base_group          ou=Groups,dc=sh,dc=cvut,dc=cz?one

Ulozime heslo auth usera do "/etc/libnss-ldap.secret" (nic ine tam nesmie byt, len retazec s heslom) Upravime "/etc/nsswitch.conf"

passwd:         files ldap
group:          files ldap
shadow:         files ldap

Upravime /etc/nslcd.conf

uri ldaps://ldap.sh.cvut.cz
base dc=sh,dc=cvut,dc=cz
binddn cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz
bindpw <heslo da spravca LDAP>
ssl on
tls_reqcert never

PAM

PAM sluzi pre samotne prihlasovanie uzivatelov, napr. cez SSH

Dolezite!

getent passwd
nebude zobrazovat vsetkych uzivatelov, auth user nema pravo na listovanie. Je to zamer, netreba sa bat :)

Miesto toho pre testovanie pouzivaj

root@test-srna:~# id tomassrna
uid=16405(tomassrna) gid=513(shuser) groups=513(shuser)

Debug

Test spojenia

ldapsearch -d 1 -xLLL -H ldaps://ldap.sh.cvut.cz/ -b "ou=People,dc=sh,dc=cvut,dc=cz" -D "cn=auth-user,ou=System,dc=sh,dc=cvut,dc=cz" -W uid=tomassrna

nscd

/etc/nscd.conf:
        logfile                 /var/log/nscd.log
        debug-level             5

tail /var/log/nscd.log

Seznam služeb a jejich správců, které LDAP používají

Jmenné prostory

Varianty
Akce