Istoriškai sudo leidimus valdė failų turinys iš /etc/sudoers.d и visado, o rakto autorizacija buvo atlikta naudojant ~/.ssh/authorized_keys. Tačiau augant infrastruktūrai kyla noras šias teises valdyti centralizuotai. Šiandien gali būti keletas sprendimo variantų:
- Konfigūracijos valdymo sistema – Virėjas, Marionetė, Galimas, Druska
- "Active Directory" + ssd
- Įvairūs iškrypimai scenarijų ir rankinio failų redagavimo forma
Mano subjektyvia nuomone, geriausias centralizuoto valdymo variantas vis tiek yra derinys "Active Directory" + ssd. Šio metodo pranašumai yra šie:
- Tikrai vienas centralizuotas vartotojų katalogas.
- Teisių paskirstymas : sudo vartotojas turi būti įtrauktas į konkrečią saugos grupę.
- Įvairių „Linux“ sistemų atveju, naudojant konfigūravimo sistemas, reikia atlikti papildomus patikrinimus, siekiant nustatyti OS.
Šios dienos rinkinys bus skirtas būtent ryšiui "Active Directory" + ssd teisių valdymui : sudo ir saugojimas sSH raktus vienoje saugykloje.
Taigi, salė sustingo įtemptoje tyloje, dirigentas pakėlė lazdelę ir orkestras susiruošė.
Eik.
Dano:
- Active Directory domenas testopf.local „Windows Server 2012 R2“.
— „Linux“ priegloba, kurioje veikia „Centos 7“.
- Sukonfigūruotas autorizavimas naudojant ssd
Abu sprendimai keičia schemą "Active Directory", todėl viską patikriname testinėje aplinkoje ir tik tada atliekame darbo infrastruktūros pakeitimus. Norėčiau pastebėti, kad visi pakeitimai yra tikslingi ir, tiesą sakant, pridedami tik būtini atributai ir klasės.
1 veiksmas: kontrolė : sudo vaidmenis per "Active Directory".
Norėdami išplėsti grandinę "Active Directory" jums reikia atsisiųsti naujausią leidimą
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(Nepamirškite pakeisti savo vertybių)
Atidaryti adsiedit.msc ir prisijunkite prie numatytojo konteksto:
Sukurkite padalijimą domeno šaknyje megztiniai. (Buržuazija atkakliai tvirtina, kad būtent šiame padalinyje demonas ssd ieško daikto sudoRole objektų. Tačiau įjungus išsamų derinimą ir ištyrus žurnalus paaiškėjo, kad paieška buvo atlikta visame katalogų medyje.)
Padalinyje sukuriame pirmąjį klasei priklausantį objektą sudoRole. Vardas gali būti pasirinktas visiškai savavališkai, nes jis skirtas tik patogiam identifikavimui.
Tarp galimų atributų iš schemos plėtinio pagrindiniai yra šie:
- sudoCommand — nustato, kurias komandas leidžiama vykdyti pagrindiniame kompiuteryje.
- sudoHost – nustato, kuriems priegloboms taikomas šis vaidmuo. Galima nurodyti kaip VISI PAPUOŠALAIo individualiam prieglobos vardu. Taip pat galima naudoti kaukę.
- sudoUser — nurodyti, kuriems vartotojams leidžiama vykdyti : sudo.
Jei nurodote saugos grupę, pavadinimo pradžioje pridėkite ženklą „%“. Jei grupės pavadinime yra tarpų, nėra ko jaudintis. Sprendžiant iš rąstų, užduotį ištrūkti iš erdvių perima mechanizmas ssd.
1 pav. sudoRole objektai sudoers poskyryje katalogo šaknyje
2 pav. Narystė saugos grupėse, nurodytose sudoRole objektuose.
Ši sąranka atliekama „Linux“ pusėje.
Byloje /etc/nsswitch.conf pridėkite eilutę prie failo pabaigos:
sudoers: files sss
Byloje /etc/sssd/sssd.conf skyriuje [sssd] pridėti prie paslaugų : sudo
cat /etc/sssd/sssd.conf | grep services
services = nss, pam, sudo
Po visų operacijų turite išvalyti sssd demono talpyklą. Automatiniai atnaujinimai vyksta kas 6 valandas, bet kodėl turėtume taip ilgai laukti, kai to norime dabar?
sss_cache -E
Dažnai atsitinka, kad talpyklos išvalymas nepadeda. Tada sustabdome paslaugą, išvalome duomenų bazę ir paleidžiame paslaugą.
service sssd stop
rm -rf /var/lib/sss/db/*
service sssd start
Prisijungiame kaip pirmasis vartotojas ir patikriname, kas jam pasiekiama naudojant 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
Tą patį darome su antruoju vartotoju:
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
Šis metodas leidžia centralizuotai apibrėžti sudo vaidmenis skirtingoms vartotojų grupėms.
SSH raktų saugojimas ir naudojimas „Active Directory“.
Šiek tiek išplėtus schemą, galima saugoti ssh raktus Active Directory vartotojo atributuose ir naudoti juos autorizuojant Linux pagrindiniuose kompiuteriuose.
Turi būti sukonfigūruotas autorizavimas per sssd.
Pridėkite reikiamą atributą naudodami PowerShell scenarijų.
AddsshPublicKeyAttribute.ps1Funkcija 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 = naujas atributoID
$attributes = @{
lDAPDisplayName = 'sshPublicKey';
atributoId = $oid;
oMSyntaksė = 22;
atributoSyntaksė = "2.5.5.5";
isSingleValued = $true;
adminDescription = 'Vartotojo viešasis SSH prisijungimo raktas';
}
Naujas ADOobjektas - Pavadinimas sshPublicKey - Tipo atributasSchema - Kelias $schemapath - KitiAtributai $atributai
$userSchema = get-adobject -SearchBase $schemapath -Filtras 'name -eq "user"'
$userSchema | Set-ADOBject -Add @{mayContain = 'sshPublicKey'}
Pridėję atributą, turite iš naujo paleisti „Active Directory“ domeno paslaugas.
Pereikime prie „Active Directory“ vartotojų. Sugeneruosime ssh ryšio raktų porą bet kokiu jums patogiu būdu.
Paleidžiame „PuttyGen“, paspaudžiame mygtuką „Generuoti“ ir pašėlusiai perkeliame pelę tuščioje srityje.
Baigę procesą galime išsaugoti viešuosius ir privačius raktus, įkelti viešąjį raktą į Active Directory vartotojo atributą ir mėgautis procesu. Tačiau viešasis raktas turi būti naudojamas iš "Viešasis raktas, skirtas įklijuoti į OpenSSH authorised_keys failą:"
Pridėkite raktą prie vartotojo atributo.
1 parinktis – GUI:
2 parinktis – „PowerShell“:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
Taigi, šiuo metu turime: vartotoją su užpildytu atributu sshPublicKey, sukonfigūruotą „Putty“ klientą autorizacijai naudojant raktus. Lieka vienas mažas dalykas: kaip priversti sshd demoną iš vartotojo atributų išgauti mums reikalingą viešąjį raktą. Mažas scenarijus, rastas buržuaziniame internete, gali sėkmingai su tuo susidoroti.
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'
Mes nustatėme jo teises į 0500 root.
chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP
Šiame pavyzdyje administratoriaus paskyra naudojama susieti su katalogu. Kovos sąlygomis turi būti atskira sąskaita su minimaliu teisių rinkiniu.
Mane asmeniškai labai supainiojo gryna slaptažodžio momentas scenarijuje, nepaisant nustatytų teisių.
Sprendimo variantas:
- Išsaugau slaptažodį atskirame faile:
echo -n Supersecretpassword > /usr/local/etc/secretpass
- Aš nustatiau failo teises į 0500 root
chmod 0500 /usr/local/etc/secretpass
- Ldapsearch paleidimo parametrų keitimas: parametras -w superSecretPassword Keičiu į -y /usr/local/etc/secretpass
Paskutinis šios dienos rinkinio akordas yra sshd_config redagavimas
cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe"
PubkeyAuthentication yes
AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP
AuthorizedKeysCommandUser root
Dėl to gauname šią seką su rakto įgaliojimu, sukonfigūruotu ssh kliente:
- Vartotojas prisijungia prie serverio nurodydamas savo prisijungimo vardą.
- Sshd demonas, naudodamas scenarijų, ištraukia viešojo rakto reikšmę iš vartotojo atributo „Active Directory“ ir atlieka autorizaciją naudodamas raktus.
- Sssd demonas toliau autentifikuoja vartotoją pagal narystę grupėje. Dėmesio! Jei tai nesukonfigūruota, bet kuris domeno vartotojas turės prieigą prie pagrindinio kompiuterio.
- Kai bandote sudo, sssd demonas ieško vaidmenų Active Directory. Jei yra vaidmenų, tikrinami vartotojo atributai ir narystė grupėje (jei sudoRoles sukonfigūruotas naudoti vartotojų grupes)
Santrauka.
Taigi, raktai saugomi „Active Directory“ vartotojo atributuose, sudo leidimuose – panašiai domeno paskyrų prieiga prie „Linux“ kompiuterių atliekama tikrinant narystę „Active Directory“ grupėje.
Paskutinė dirigento lazdos banga – ir salė sustingsta pagarbioje tyloje.
Rašymui naudojami ištekliai:
Šaltinis: www.habr.com