Připojení Linuxového serveru do Windows domény

Ve světě aplikací určených pro MS Windows a napojených na databázi MS SQL Server nebylo moc důvodu začlenit do infrastruktury jiné servery než s operačním systémem MS Windows Server. S příklonem Microsoftu k otevřeným technologiím a obzvláště po uvedení SQL Serveru pro Linux se však situace může změnit. Lze tedy očekávat, že se stále častěji bude objevovat heterogenní infrastruktura, kde budou spolu komunikovat servery s nainstalovaným OS Windows Server a Linuxem. Jedním s požadavků tedy může být začlenit Linuxové servery do stávající infrastruktury s Windows. Rozebereme si podrobněji, jak lze připojit samostatný Linuxový server do Windows domény.

System Security Services Daemon (SSSD)

Nejdůležitější součástí je schopnost ověřovat přihlašovací údaje proti doméně. Každý server, na který se přihlašují uživatelé svým doménovým účtem, musí být schopen ověřovat, zda jsou zadané uživatelské údaje potřebné pro přihlášení v pořádku. Právě k tomuto účelu slouží SSSD. SSSD je tedy pro ostatní aplikace mezivrstvou, která jim zprostředkovává ověření. SSSD si navíc uchovává uživatelské identity v paměti. Dojde-li k přerušení spojení s doménovým kontrolerem, uživatelé se i přesto mohou přihlašovat k serveru svým doménovým účtem.

Abychom mohli používat Windows účet pro přihlášení k Linuxovému serveru, je zapotřebí provést mapování uživatelů z Windows do světa Linuxu. Linux a Windows jsou dva naprosto odlišné systémy, které si řeší administraci uživatelů po svém. Ve Windows každý uživatel dostane přidělen identifikátor Security Identifier (SID). Pokud vás zajímá popis vlastní struktury SIDu, můžete jej nalézt na stránkách Security Identifier Structure. Linux naproti tomu přiděluje uživatelům dvě čísla oddělená dvojtečkou UID:GID. Jedná se o User ID a Group ID. Jak je vidět, je zapotřebí namapovat Windows a Linux uživatele tak, aby tomu oba systémy rozuměly. Naštěstí i o mapování uživatelů se dobře postará SSSD.

Vlastní ověření probíhá pomocí protokolu Kerberos. Nicméně pokud je z nějakého důvodu vyžadováno ověření pomocí NTLM, SSSD nám nepomůže a je nutné se obrátit na Winbind.

Realmd

Jak jsem popsal výše, je potřeba provést správné nastavení SSSD proto, aby nám fungovalo ověření pomocí AD. Realmd podstatně zjednodušuje připojování klientů do domény tím, že dokáže nakonfigurovat SSSD a další potřebné subsystémy.

Nyní se můžeme vrhnout na praktickou ukázku. Mějme tedy již existující infrastrukturu, která se skládá ze tří serverů.

Server InfrastructureNa SQLDC01 je nainstalován Windows Server 2012 R2. Na linuxové servery jsem nainstaloval CentOS 7.2 a Ubuntu 16.04 LTS určené pro serverové instalace. Oba linuxové servery budeme chtít připojit do domény tak, aby se existující uživatelé mohli přihlásit svým účtem i k linuxovým serverům.
Nejprve si nainstalujeme SSSD a REALMD

CentOS

sudo yum install realmd sssd krb5-workstation krb5-libs

Ubuntu

sudo apt-get install realmd krb5-user packagekit

Pokusíme se získat informace o doméně sqlab.local. Tím zjistíme, zda máme správně nakonfigurované síťové připojení linuxových serverů.

realm discover sqlab.local

Realm Discover Domain
Pokud se nám zobrazí informace o doméně, je vše v pořádku. Na obrázku si můžete také všimnout, které balíčky jsou potřeba pro správnou funkci realm.

Po instalaci realmd se defaultně nevytváří konfigurační soubor /etc/realmd.conf
Lze jej vytvořit ručně a nastavit tak některé zajímavé hodnoty

[active-directory]
default-client = sssd

[users]
default-home = /home/%D/%U
default-shell = /bin/bash

[sqlab.local]
computer-ou = OU=Linux,DC=sqlab,DC=local
computer-name = SQL01CentOS

Za zmínku stojí nastavení domovského adresáře pro doménové uživatele. V adresáři home bude podadresář se jménem domény a v něm bude zanořen adresář pro konkrétního uživatele. Existuje-li struktura Organizational Unit (OU) pod kterou má patřit připojovaný server, můžete ji nastavit obdobným způsobem jako v ukázce. Celá struktura OU již musí existovat.

Nyní je vše připraveno k připojení do domény

sudo realm join --verbose SQLAB.LOCAL -U 'domainadmin@SQLAB.LOCAL'

Následuje výpis, kde je podrobně uvedeno, co se provedlo a kde došlo k selhání.

Realm Join Domain
Podíváme se na Active Directory Users and Computers, abychom zjistili, zda se server přidal do správné OU.

Realm OU
Na obrázku vidíme, že server se nachází přesně tam, kam jsme si určili v konfiguračním souboru.

Jak jsem uvedl již dříve, realm vytvořil konfigurační soubor /etc/sssd/sssd.conf

[sssd]
domains = sqlab.local
config_file_version = 2
services = nss, pam

[domain/sqlab.local]
ad_domain = sqlab.local
krb5_realm = SQLAB.LOCAL
realmd_tags = manages-system joined-with-samba
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_sasl_authid = SQL01CentOS$
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%d/%u
access_provider = ad

Pro ověření, že je server připojen k doméně, se zkuste přihlásit pomocí Windows účtu.

Login as domain User
Jak je z obrázku patrné přihlásil jsem se k serveru pomocí předem připraveného účtu sqlab\domainuser. Po přihlášení se vytvořil domovský adresář přesně podle nastavení provedeného v jednom z předchozích kroků.

Automatické vytváření domovského adresáře ovšem nebude fungovat v Ubuntu, pokud neprovedeme dodatečnou konfiguraci.
V konfiguračním souboru /etc/pam.d/common-session přidejte řádek:

session required      pam_mkhomedir.so  skel=/etc/skel umask=0022

Nyní budeme chtít aplikovat práva pro skupinu uživatelů. V AD jsem si vytvořil zvláštní skupinu uživatelů LinuxAdmins. Všichni uživatelé ve skupině budou mít administrátorská práva pro systém. Ostatním uživatelům bude přístup odepřen.

sudo realm deny --all

Odebere přístup všem uživatelům. Zkusíme se opět přihlásit pomocí sqlab\domainuser a uvidíme, zda se zákaz aplikoval.

Realm Deny All Users
Dle obdrženého výpisu uživatel sqlab\domainuser opravdu ztratil k serveru přístup.

Přístup naopak povolíme skupině uživatelů sqlab\linuxadmins

sudo realm permit -g linuxadmins@sqlab.local

Dalším krokem je přiřazení práv pro spouštění příkazů jako administrátor. Stačí do souboru /etc/sudoers přidat oprávnění pro celou skupinu do sekce

#Members of the admin group may gain root privileges
%linuxadmins@sqlab.local ALL=(ALL)  ALL

Tímto řádkem všichni členové skupiny dostanou administrátorská oprávnění k serveru.

Vyzkoušíme, zda se vše podařilo a přihlásíme se jako sqlab\linadmin

Realm Permit Domain Group
Přihlášení proběhlo v pořádku. Uvidíme jestli se podařilo nastavit i administrátorská práva. Pokusíme se spustit následující příkaz pomocí sudo

sudo id linadmin@sqlab.local

Příkaz provede výpis doménových oprávnění pro zadaný login.

Sudo Domain User
Jak je z výpisu patrné uživatel linadmin je členem dvou skupin sqlab\Domain Users a sqlab\LinuxAdmins.