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)
(Prerekvizita)
Řádka 283: Řádka 283:
 
=== Prerekvizita ===
 
=== Prerekvizita ===
 
[[#Prerekvizita SSL]]
 
[[#Prerekvizita SSL]]
 +
 +
=== NSS ===
  
 
= Seznam služeb a jejich správců, které LDAP používají =
 
= Seznam služeb a jejich správců, které LDAP používají =

Verze z 8. 11. 2012, 13:50

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

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

Prerekvizita

#Prerekvizita SSL

NSS

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

Jmenné prostory

Varianty
Akce