Víťazi medzinárodných súťaží SSH a sudo sú opäť na scéne. Pod vedením Distinguished Active Directory Conductor

Historicky sa oprávnenia sudo riadili obsahom súborov z /etc/sudoers.d и visudoa autorizácia kľúča bola vykonaná pomocou ~/.ssh/authorized_keys. S rastúcou infraštruktúrou však existuje túžba spravovať tieto práva centrálne. Dnes môže existovať niekoľko možností riešenia:

  • Systém správy konfigurácie - šéfkuchár, bábka, Ansible, Soľ
  • Active Directory + ssd
  • Rôzne zvrátenosti v podobe skriptov a manuálnej úpravy súborov

Podľa môjho subjektívneho názoru je stále najlepšia možnosť centralizovaného riadenia kombinácia Active Directory + ssd. Výhody tohto prístupu sú:

  • Skutočne jeden centralizovaný užívateľský adresár.
  • Rozdelenie práv sudo sa týka pridania používateľa do špecifickej bezpečnostnej skupiny.
  • V prípade rôznych systémov Linux je potrebné zaviesť dodatočné kontroly na určenie OS pri používaní konfiguračných systémov.

Dnešná suita bude venovaná špeciálne pripojeniu Active Directory + ssd pre správu práv sudo a skladovanie ssh kľúče v jednom úložisku.
Sála teda zamrzla v napätom tichu, dirigent zdvihol taktovku a orchester sa pripravil.
Choď.

Vzhľadom na to:
— Active Directory doména testopf.miestne v systéme Windows Server 2012 R2.
— Linuxový hostiteľ so systémom Centos 7
— Konfigurovaná autorizácia pomocou ssd
Obe riešenia menia schému Active Directory, takže všetko skontrolujeme v testovacom prostredí a až potom vykonáme zmeny vo fungujúcej infraštruktúre. Chcel by som poznamenať, že všetky zmeny sú cielené a v skutočnosti pridávajú iba potrebné atribúty a triedy.

Akcia 1: kontrola sudo cez role Active Directory.

Na rozšírenie okruhu Active Directory musíte si stiahnuť najnovšiu verziu sudo — 1.8.27 od dnešného dňa. Rozbaľte a skopírujte súbor schema.ActiveDirectory z adresára ./doc do radiča domény. Z príkazového riadku s právami správcu z adresára, do ktorého bol súbor skopírovaný, spustite:
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(Nezabudnite nahradiť svoje hodnoty)
Otvoriť adsiedit.msc a pripojte sa k predvolenému kontextu:
Vytvorte divíziu v koreňovom adresári domény sudoers. (Buržoázia tvrdohlavo tvrdí, že démon je v tejto jednotke ssd hľadá položku sudoRole predmety. Po zapnutí podrobného ladenia a preštudovaní protokolov sa však ukázalo, že vyhľadávanie prebiehalo v celom strome adresárov.)
Vytvoríme prvý objekt patriaci do triedy v delení sudoRole. Meno je možné zvoliť úplne ľubovoľne, pretože slúži výhradne na pohodlnú identifikáciu.
Medzi možnými dostupnými atribútmi z rozšírenia schémy sú hlavné tieto:

  • sudoCommand — určuje, ktoré príkazy sa môžu na hostiteľovi vykonávať.
  • sudoHost — určuje, na ktorých hostiteľov sa táto rola vzťahuje. Možno špecifikovať ako VŠETKOa pre jednotlivého hostiteľa podľa mena. Je možné použiť aj masku.
  • sudoUser — uveďte, ktorí používatelia môžu spustiť sudo.
    Ak zadáte bezpečnostnú skupinu, pridajte na začiatok názvu znak „%“. Ak sú v názve skupiny medzery, nie je sa čoho obávať. Súdiac podľa denníkov, úlohu uniknúť z priestorov preberá mechanizmus ssd.

Víťazi medzinárodných súťaží SSH a sudo sú opäť na scéne. Pod vedením Distinguished Active Directory Conductor
Obr 1. Objekty sudoRole v pododdiele sudoers v koreňovom adresári

Víťazi medzinárodných súťaží SSH a sudo sú opäť na scéne. Pod vedením Distinguished Active Directory Conductor
Obrázok 2. Členstvo v bezpečnostných skupinách špecifikovaných v objektoch sudoRole.

Nasledujúce nastavenie sa vykonáva na strane Linuxu.
V súbore /etc/nsswitch.conf pridajte riadok na koniec súboru:

sudoers: files sss

V súbore /etc/sssd/sssd.conf v sekcii [sssd] pridať k službám sudo

cat /etc/sssd/sssd.conf | grep services
services = nss, pam, sudo

Po všetkých operáciách musíte vymazať vyrovnávaciu pamäť démona sssd. Automatické aktualizácie sa vyskytujú každých 6 hodín, ale prečo by sme mali čakať tak dlho, keď to chceme hneď?

sss_cache -E

Často sa stáva, že vymazanie vyrovnávacej pamäte nepomôže. Potom službu zastavíme, vyčistíme databázu a spustíme službu.

service sssd stop
rm -rf /var/lib/sss/db/*
service sssd start

Pripájame sa ako prvý používateľ a kontrolujeme, čo má k dispozícii pod sudo:

su user1
[user1@testsshad log]$ id
uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_)
[user1@testsshad log]$ sudo -l
[sudo] password for user1:
Matching Defaults entries for user1 on testsshad:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin:/bin:/usr/sbin:/usr/bin

User user1 may run the following commands on testsshad:
    (root) /usr/bin/ls, /usr/bin/cat

To isté robíme s naším druhým používateľom:

su user2
[user2@testsshad log]$ id
uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root)
[user2@testsshad log]$ sudo -l
Matching Defaults entries for user2 on testsshad:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
    env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin:/bin:/usr/sbin:/usr/bin

User user2 may run the following commands on testsshad:
    (root) ALL

Tento prístup vám umožňuje centrálne definovať sudo role pre rôzne skupiny používateľov.

Ukladanie a používanie ssh kľúčov v Active Directory

S miernym rozšírením schémy je možné ukladať ssh kľúče do používateľských atribútov Active Directory a používať ich pri autorizácii na hostiteľoch Linuxu.

Musí byť nakonfigurovaná autorizácia cez sssd.
Pridajte požadovaný atribút pomocou skriptu PowerShell.
AddsshPublicKeyAttribute.ps1Funkcia New-AttributeID {
$Prefix="1.2.840.113556.1.8000.2554"
$GUID=[System.Guid]::NewGuid().ToString()
$Parts=@()
$Parts+=[UInt64]::Parse($guid.SubString(0,4)„AllowHexSpecifier“)
$Parts+=[UInt64]::Parse($guid.SubString(4,4)„AllowHexSpecifier“)
$Parts+=[UInt64]::Parse($guid.SubString(9,4)„AllowHexSpecifier“)
$Parts+=[UInt64]::Parse($guid.SubString(14,4)„AllowHexSpecifier“)
$Parts+=[UInt64]::Parse($guid.SubString(19,4)„AllowHexSpecifier“)
$Parts+=[UInt64]::Parse($guid.SubString(24,6)„AllowHexSpecifier“)
$Parts+=[UInt64]::Parse($guid.SubString(30,6)„AllowHexSpecifier“)
$oid=[String]::Format(«{0}.{1}.{2}.{3}.{4}.{5}.{6}.{7}»,$prefix,$Parts[0],
$Parts[1],$Parts[2],$Parts[3],$Parts[4],$Parts[5],$Parts[6])
$oid
}
$schemaPath = (Get-ADRootDSE).schemaNamingContext
$oid = New-AttributeID
$attributes = @{
lDAPDisplayName = 'sshPublicKey';
AtribútId = $oid;
oMSyntax = 22;
atribútSyntax = "2.5.5.5";
isSingleValued = $true;
adminDescription = 'Verejný kľúč používateľa pre prihlásenie SSH';
}

Nový-ADObject -Názov sshPublicKey -Typ atribútSchema -Cesta $schemapath -OtherAttributes $attributes
$userSchema = get-adobject -SearchBase $schemapath -Filter 'name -eq "user"'
$userSchema | Set-ADObject -Add @{mayContain = 'sshPublicKey'}

Po pridaní atribútu musíte reštartovať službu Active Directory Domain Services.
Prejdime k používateľom služby Active Directory. Vygenerujeme kľúčový pár pre ssh pripojenie akýmkoľvek spôsobom, ktorý vám vyhovuje.
Spustíme PuttyGen, stlačíme tlačidlo „Generovať“ a horúčkovito pohybujeme myšou v prázdnej oblasti.
Po dokončení procesu môžeme uložiť verejný a súkromný kľúč, nahrať verejný kľúč do atribútu používateľa služby Active Directory a užiť si proces. Verejný kľúč však musí byť použitý z "Verejný kľúč na vloženie do súboru OpenSSH author_keys:".
Víťazi medzinárodných súťaží SSH a sudo sú opäť na scéne. Pod vedením Distinguished Active Directory Conductor
Pridajte kľúč do atribútu používateľa.
Možnosť 1 – GUI:
Víťazi medzinárodných súťaží SSH a sudo sú opäť na scéne. Pod vedením Distinguished Active Directory Conductor
Možnosť 2 – PowerShell:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
Aktuálne teda máme: používateľa s vyplneným atribútom sshPublicKey, nakonfigurovaného klienta Putty na autorizáciu pomocou kľúčov. Zostáva jeden malý bod: ako prinútiť démona sshd extrahovať verejný kľúč, ktorý potrebujeme, z atribútov používateľa. Malý scenár nájdený na buržoáznom internete si s tým dokáže úspešne poradiť.

cat /usr/local/bin/fetchSSHKeysFromLDAP
#!/bin/sh
ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D [email protected] -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/n *//g;s/sshPublicKey: //gp'

Nastavili sme na ňom oprávnenia na 0500 pre root.

chmod 0500  /usr/local/bin/fetchSSHKeysFromLDAP

V tomto príklade sa na prepojenie s adresárom používa konto správcu. V bojových podmienkach musí existovať samostatný účet s minimálnym súborom práv.
Mňa osobne veľmi zmiatol moment hesla v čistej podobe v scenári, napriek nastaveným právam.
Možnosť riešenia:

  • Heslo uložím do samostatného súboru:
    echo -n Supersecretpassword > /usr/local/etc/secretpass

  • Povolenia súboru som nastavil na 0500 pre root
    chmod 0500 /usr/local/etc/secretpass

  • Zmena parametrov spustenia ldapsearch: parameter -w superSecretPassword Mením to na -y /usr/local/etc/secretpass

Posledným akordom v dnešnom balíku je úprava sshd_config

cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe"
PubkeyAuthentication yes
AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP
AuthorizedKeysCommandUser root

Výsledkom je nasledujúca postupnosť s autorizáciou kľúča nakonfigurovanou v klientovi ssh:

  1. Používateľ sa pripojí k serveru uvedením svojho prihlásenia.
  2. Démon sshd prostredníctvom skriptu extrahuje hodnotu verejného kľúča z užívateľského atribútu v Active Directory a vykoná autorizáciu pomocou kľúčov.
  3. Démon sssd ďalej autentifikuje používateľa na základe členstva v skupine. Pozor! Ak toto nie je nakonfigurované, prístup k hostiteľovi bude mať ktorýkoľvek používateľ domény.
  4. Keď sa pokúsite o sudo, démon sssd vyhľadá v Active Directory roly. Ak sú roly prítomné, skontrolujú sa atribúty používateľa a členstvo v skupine (ak je sudoRoles nakonfigurovaný na používanie skupín používateľov)

Zhrnutie.

Kľúče sú teda uložené v používateľských atribútoch Active Directory, oprávneniach sudo - podobne sa prístup k hostiteľom Linuxu podľa doménových účtov vykonáva kontrolou členstva v skupine Active Directory.
Záverečné mávnutie dirigentskej taktovky – a sála zamrzne v pietnom tichu.

Zdroje použité pri písaní:

Sudo cez Active Directory
Ssh kľúče cez Active Directory
Skript Powershell, ktorý pridáva atribút do schémy Active Directory
sudo stabilné vydanie

Zdroj: hab.com

Pridať komentár