LDAP
(→Linux - prihlasovanie uzivatelov) |
(→Linux - prihlasovanie uzivatelov) |
||
| Řádka 273: | Řádka 273: | ||
== Linux - prihlasovanie uzivatelov == | == Linux - prihlasovanie uzivatelov == | ||
| − | Je to strasny oser, priprav si kybel nervov. Tak, podme do toho! | + | Je to strasny oser, priprav si kybel nervov. Ach, zlaty stary NIS. Tak, podme do toho! |
Navod testovany na cistej instalacii systemu Debian Squeeze | Navod testovany na cistej instalacii systemu Debian Squeeze | ||
Splnime [[#Prerekvizita SSL]] | Splnime [[#Prerekvizita SSL]] | ||
| + | |||
| + | === NSS === | ||
| + | NSS je sluzba ktora resolvuje uid na mena uzivatelov (napr. ls aby zobrazilo mena) | ||
<pre>aptitude install libnss-ldap ldap-utils nscd nslcd</pre> | <pre>aptitude install libnss-ldap ldap-utils nscd nslcd</pre> | ||
| Řádka 312: | Řádka 315: | ||
tls_reqcert never | tls_reqcert never | ||
</pre> | </pre> | ||
| + | |||
| + | === PAM === | ||
| + | |||
| + | PAM sluzi pre samotne prihlasovanie uzivatelov, napr. cez SSH | ||
| + | |||
=== Dolezite! === | === Dolezite! === | ||
Verze z 8. 11. 2012, 13:17
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 passwdnebude 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í
- 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š