SSH va sudo xalqaro musobaqalari g‘oliblari yana sahnaga chiqdi. Hurmatli Active Directory dirijyori tomonidan boshqariladi

Tarixiy jihatdan, sudo ruxsatlari fayllarning mazmuni bilan boshqariladi /etc/sudoers.d и viza, va kalit avtorizatsiya yordamida amalga oshirildi ~/.ssh/authorized_keys. Biroq, infratuzilmaning o'sishi bilan bu huquqlarni markazlashtirilgan holda boshqarish istagi paydo bo'ladi. Bugungi kunda bir nechta echim variantlari bo'lishi mumkin:

  • Konfiguratsiyani boshqarish tizimi - bosh, Qo'g'irchoq, E'tirof etiladi, tuz
  • Active Directory + SSD
  • Skriptlar va qo'lda fayllarni tahrirlash ko'rinishidagi turli xil buzilishlar

Mening sub'ektiv fikrimcha, markazlashtirilgan boshqaruvning eng yaxshi varianti hali ham kombinatsiyadir Active Directory + SSD. Ushbu yondashuvning afzalliklari quyidagilardan iborat:

  • Haqiqatan ham yagona markazlashtirilgan foydalanuvchi katalogi.
  • Huquqlarni taqsimlash sudo foydalanuvchini ma'lum bir xavfsizlik guruhiga qo'shish bilan bog'liq.
  • Turli xil Linux tizimlarida, konfiguratsiya tizimlaridan foydalanganda OTni aniqlash uchun qo'shimcha tekshiruvlarni joriy qilish kerak bo'ladi.

Bugungi to'plam ulanishga bag'ishlangan bo'ladi Active Directory + SSD huquqlarni boshqarish uchun sudo va saqlash sSH kalitlar bitta omborda.
Shunday qilib, zal jim bo'lib qotib qoldi, dirijor tayoqchasini ko'tardi va orkestr tayyorlandi.
Ketdik.

May:
- Active Directory domeni testopf.local Windows Server 2012 R2 da.
— Centos 7 bilan ishlaydigan Linux xosti
— sozlangan avtorizatsiya yordamida SSD
Ikkala yechim ham sxemaga o'zgartirishlar kiritadi Active Directory, shuning uchun biz hamma narsani sinov muhitida tekshiramiz va shundan keyingina ishchi infratuzilmaga o'zgartirishlar kiritamiz. Shuni ta'kidlashni istardimki, barcha o'zgarishlar maqsadli va aslida faqat kerakli atributlar va sinflarni qo'shadi.

1-harakat: nazorat qilish sudo orqali rollar Active Directory.

Sxemani kengaytirish uchun Active Directory so'nggi versiyani yuklab olishingiz kerak sudo — bugungi kunga kelib 1.8.27. Faylni o'rash va nusxalash sxemasi. ActiveDirectory ./doc katalogidan domen boshqaruvchisiga. Fayl nusxa ko'chirilgan katalogdan administrator huquqlariga ega buyruq qatoridan quyidagilarni bajaring:
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(Qiymatlaringizni almashtirishni unutmang)
Biz ochamiz adsiedit.msc va standart kontekstga ulaning:
Domenning ildizida bo'lim yarating terlar. (Burjuaziya o'jarlik bilan bu birlikda jin borligini da'vo qiladi SSD elementni qidiradi sudoRole ob'ektlar. Biroq, batafsil disk raskadrovkani yoqqaningizdan va jurnallarni o'rganganingizdan so'ng, qidiruv butun katalog daraxti bo'ylab amalga oshirilganligi aniqlandi.)
Biz bo'limda sinfga tegishli birinchi ob'ektni yaratamiz sudoRole. Ism mutlaqo o'zboshimchalik bilan tanlanishi mumkin, chunki u faqat qulay identifikatsiya qilish uchun xizmat qiladi.
Sxema kengaytmasining mumkin bo'lgan atributlari orasida asosiylari quyidagilardir:

  • sudoCommand — xostda qaysi buyruqlarni bajarishga ruxsat berilganligini aniqlaydi.
  • sudoHost — bu rol qaysi xostlarga tegishli ekanligini aniqlaydi. sifatida belgilanishi mumkin BARCHA, va alohida xost uchun nomi bilan. Bundan tashqari, niqobni ishlatish ham mumkin.
  • sudoUser — qaysi foydalanuvchilarga bajarishga ruxsat berilganligini ko'rsating sudo.
    Agar siz xavfsizlik guruhini belgilasangiz, ismning boshiga "%" belgisini qo'shing. Guruh nomida bo'sh joylar mavjud bo'lsa, tashvishlanadigan hech narsa yo'q. Jurnallarga qaraganda, bo'shliqlardan qochish vazifasi mexanizm tomonidan qabul qilinadi SSD.

SSH va sudo xalqaro musobaqalari g‘oliblari yana sahnaga chiqdi. Hurmatli Active Directory dirijyori tomonidan boshqariladi
1-rasm. Katalog ildizidagi sudoers bo'limidagi sudoRole ob'ektlari

SSH va sudo xalqaro musobaqalari g‘oliblari yana sahnaga chiqdi. Hurmatli Active Directory dirijyori tomonidan boshqariladi
Shakl 2. SudoRole obyektlarida ko'rsatilgan xavfsizlik guruhlariga a'zolik.

Quyidagi sozlash Linux tomonida amalga oshiriladi.
Fayl ichida /etc/nsswitch.conf faylning oxiriga qator qo'shing:

sudoers: files sss

Fayl ichida /etc/sssd/sssd.conf bo'limida [sssd] xizmatlarga qo'shing sudo

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

Barcha operatsiyalardan so'ng siz sssd daemon keshini tozalashingiz kerak. Avtomatik yangilanishlar har 6 soatda sodir bo'ladi, lekin nima uchun biz hozir xohlaganimizda shunchalik uzoq kutishimiz kerak?

sss_cache -E

Ko'pincha keshni tozalash yordam bermaydi. Keyin biz xizmatni to'xtatamiz, ma'lumotlar bazasini tozalaymiz va xizmatni boshlaymiz.

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

Biz birinchi foydalanuvchi sifatida ulanamiz va sudo ostida unga nima borligini tekshiramiz:

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

Biz ikkinchi foydalanuvchi bilan ham shunday qilamiz:

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

Ushbu yondashuv turli foydalanuvchilar guruhlari uchun sudo rollarini markaziy ravishda aniqlash imkonini beradi.

Active Directory-da ssh kalitlarini saqlash va ishlatish

Sxemaning biroz kengaytirilishi bilan ssh kalitlarini Active Directory foydalanuvchi atributlarida saqlash va ularni Linux xostlarida avtorizatsiya qilishda foydalanish mumkin.

Sssd orqali avtorizatsiya sozlanishi kerak.
PowerShell skripti yordamida kerakli atributni qo'shing.
AddsshPublicKeyAttribute.ps1Funktsiya New-AttributeID {
$Prefiks="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 = Yangi atribut identifikatori
$atributlar = @{
lDAPDisplayName = 'sshPublicKey';
attributeId = $oid;
oMSsintaksisi = 22;
attributeSyntax = "2.5.5.5";
isSingleValued = $true;
adminDescription = 'SSH login uchun foydalanuvchi umumiy kaliti';
}

New-ADObject -Name sshPublicKey -Type attributeSchema -Path $schemapath -OtherAttributes $attributes
$userSchema = get-adobject -SearchBase $schemapath -Filtr 'name -eq "user"'
$userSchema | Set-ADObject -Qo'shish @{mayContain = 'sshPublicKey'}

Atributni qo'shgandan so'ng, Active Directory domen xizmatlarini qayta ishga tushirishingiz kerak.
Keling, Active Directory foydalanuvchilariga o'tamiz. Biz siz uchun qulay bo'lgan har qanday usul yordamida ssh ulanishi uchun kalit juftligini yaratamiz.
Biz PuttyGen-ni ishga tushiramiz, "Yaratish" tugmasini bosing va sichqonchani bo'sh maydon ichida harakatlantiramiz.
Jarayon tugagandan so'ng, biz ochiq va shaxsiy kalitlarni saqlashimiz, ochiq kalitni Active Directory foydalanuvchi atributiga yuklashimiz va jarayondan bahramand bo'lishimiz mumkin. Biroq, ochiq kalitdan foydalanish kerak "OpenSSH authorized_keys fayliga joylashtirish uchun ochiq kalit:".
SSH va sudo xalqaro musobaqalari g‘oliblari yana sahnaga chiqdi. Hurmatli Active Directory dirijyori tomonidan boshqariladi
Kalitni foydalanuvchi atributiga qo'shing.
Variant 1 - GUI:
SSH va sudo xalqaro musobaqalari g‘oliblari yana sahnaga chiqdi. Hurmatli Active Directory dirijyori tomonidan boshqariladi
Variant 2 - PowerShell:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
Shunday qilib, bizda hozir bor: sshPublicKey atributiga ega foydalanuvchi, kalitlar yordamida avtorizatsiya qilish uchun tuzilgan Putty mijozi. Bitta kichik nuqta qolmoqda: sshd demonini foydalanuvchi atributlaridan bizga kerak bo'lgan ochiq kalitni chiqarishga qanday majburlash kerak. Burjua Internetida topilgan kichik skript buni muvaffaqiyatli engishi mumkin.

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'

Undagi ruxsatlarni root uchun 0500 ga o'rnatdik.

chmod 0500  /usr/local/bin/fetchSSHKeysFromLDAP

Ushbu misolda ma'mur hisob qaydnomasi katalogga ulanish uchun ishlatiladi. Jang sharoitida minimal huquqlar to'plamiga ega alohida hisob bo'lishi kerak.
Men shaxsan o'rnatilgan huquqlarga qaramay, skriptdagi sof shakldagi parolni juda hayratda qoldirdim.
Qaror varianti:

  • Men parolni alohida faylda saqlayman:
    echo -n Supersecretpassword > /usr/local/etc/secretpass

  • Men root uchun fayl ruxsatlarini 0500 ga o'rnatdim
    chmod 0500 /usr/local/etc/secretpass

  • Ldapsearch ishga tushirish parametrlarini o'zgartirish: parametr -w superSecretPassword Men uni o'zgartiraman -y /usr/local/etc/secretpass

Bugungi to'plamdagi oxirgi akkord sshd_config-ni tahrirlashdir

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

Natijada, biz ssh mijozida konfiguratsiya qilingan kalit avtorizatsiya bilan quyidagi ketma-ketlikni olamiz:

  1. Foydalanuvchi o'z loginini ko'rsatib serverga ulanadi.
  2. Sshd demoni skript orqali Active Directorydagi foydalanuvchi atributidan ochiq kalit qiymatini chiqaradi va kalitlar yordamida avtorizatsiyani amalga oshiradi.
  3. Sssd demoni foydalanuvchini guruh a'zoligi asosida autentifikatsiya qiladi. Diqqat! Agar bu sozlanmagan bo'lsa, har qanday domen foydalanuvchisi xostga kirish huquqiga ega bo'ladi.
  4. Sudo-ga harakat qilganingizda, sssd demoni Active Directory-da rollarni qidiradi. Agar rollar mavjud bo'lsa, foydalanuvchi atributlari va guruh a'zoligi tekshiriladi (agar sudoRoles foydalanuvchi guruhlarini ishlatish uchun sozlangan bo'lsa)

Natija.

Shunday qilib, kalitlar Active Directory foydalanuvchi atributlarida, sudo ruxsatlarida saqlanadi - xuddi shunday, Linux xostlariga domen hisoblari orqali kirish Active Directory guruhiga a'zolikni tekshirish orqali amalga oshiriladi.
Dirijyor tayoqchasining so'nggi to'lqini - va zal hurmatli sukunatda muzlaydi.

Yozishda foydalaniladigan manbalar:

Active Directory orqali Sudo
Active Directory orqali Ssh kalitlari
Powershell skripti, Active Directory sxemasiga atribut qo'shish
sudo barqaror versiyasi

Manba: www.habr.com

a Izoh qo'shish