7-bo‘lim

sudo va imtiyozlarni boshqarish

Root bo'lmasdan root ishini bajarish - qoidalar, jurnal va eng ko'p uchraydigan xavfli sozlamalar.

🕑 19 daqiqa o‘qish 📄 1 298 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Nima uchun root bo'lib ishlamaslik kerak
  2. sudo guruhi
  3. Qoidalarni ko'rish
  4. Faylni to'g'ri tahrirlash
  5. /etc/sudoers.d/ - to'g'ri joy
  6. Cheklangan huquq berish
  7. Jurnal - sudo ning eng katta afzalligi
  8. Foydali sozlamalar
  9. Root parolini o'chirish
  10. Xulosa

Root bo'lib ishlash - serverni yo'qotishning eng qisqa yo'li. sudo uchta narsani beradi: cheklangan huquq, jurnalga yozilgan harakat va parol bilan tasdiqlangan niyat.

Nima uchun root bo'lib ishlamaslik kerak #

XavfRoot bo'lgandasudo bilan
Xato buyruqHech kim so'ramaydiParol so'raydi - o'ylashga vaqt
Kim nima qildiBilib bo'lmaydiJurnalda yozilgan
Buzilgan sessiyaButun serverFaqat o'sha foydalanuvchi
Huquqni cheklashImkonsizBuyruq darajasida
rm -rf / va bo'shliq

Klassik voqea - zaxira skriptidagi bitta bo'shliq:

Terminal
rm -rf $ZAXIRA /*

$ZAXIRA bo'sh bo'lsa, bu rm -rf /* ga aylanadi.

Root bo'lib ishlaganda - server yo'q. sudo bilan ishlaganda esa ko'p fayllar Permission denied beradi va siz to'xtatib qolasiz.

Bu kafolat emas, lekin qo'shimcha to'siq. Serverda har qo'shimcha to'siq qimmatli.

sudo guruhi #

Ubuntu va Debianda sudo guruhi a'zolari to'liq huquqqa ega.

Terminal
for u in malika nodira; do userdel -r "$u"; done 2>/dev/null
groupdel dasturchilar 2>/dev/null
groupadd -g 1200 dasturchilar
useradd -u 1101 -m -s /bin/bash -g dasturchilar malika
useradd -u 1102 -m -s /bin/bash -g dasturchilar nodira

cat > /etc/sudoers.d/zz-sinov <<'EOF'
# Malika - to'liq huquq, lekin parol bilan
malika ALL=(ALL:ALL) ALL

# Nodira - faqat nginx ni qayta ishga tushirishi mumkin
Cmnd_Alias VEB = /usr/bin/systemctl restart nginx, \
                 /usr/bin/systemctl status nginx
nodira ALL=(root) NOPASSWD: VEB
EOF
chmod 440 /etc/sudoers.d/zz-sinov
Terminal
getent group sudo
Natija
sudo:x:27:husanboy

Foydalanuvchini qo'shish - bitta buyruq:

Terminal
usermod -aG sudo malika
getent group sudo | cut -d: -f4
Natija
husanboy,malika
-aG ni yana bir bor eslatamiz

6-bo'limda ko'rganimizdek, usermod -G sudo malika Malikani boshqa barcha guruhlardan chiqarib yuboradi.

Bu yerda xato ayniqsa qimmat: agar siz o'zingizni -G bilan qo'shsangiz va sudo dan tashqari guruhlaringizni yo'qotsangiz, serverga ulanish huquqini ham yo'qotishingiz mumkin.

Guruh qo'shayotganda doim -aG.

Qoidalarni ko'rish #

Terminal
sudo -l -U nodira | sed "s/$(hostname)/srv-01/g"
Natija
Matching Defaults entries for nodira on srv-01:
    env_reset, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User nodira may run the following commands on srv-01:
    (root) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx

(sed bu yerda faqat tekshiruv mashinasining nomini srv-01 ga almashtiradi - chiqishning qolgani o'zgarmagan.)

Nodira faqat ikkita aniq buyruqni ishga tushira oladi - boshqa hech nimani.

sudoers qatori qanday o'qiladi nodira ALL =(root) NOPASSWD: /usr/bin/systemctl ... KIM QAYSI HOSTDA KIM BO'LIB PAROLSIZMI QAYSI BUYRUQNI Yaxshi qoida nodira ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx Bitta odam, bitta buyruq, aniq argument bilan. Xavfli qoidalar nodira ALL=(ALL) NOPASSWD: ALL = parolsiz to'liq root nodira ALL=(ALL) /usr/bin/vim = vim ichidan :!sh - to'liq root nodira ALL=(ALL) /usr/bin/systemctl = istalgan xizmatni boshqarish
Har qoidada besh qism bor - va har biri huquqni kengaytiradi

Faylni to'g'ri tahrirlash #

/etc/sudoers ni hech qachon oddiy muharrirda ochmang.

BuyruqVazifa
visudoAsosiy faylni qulflab tahrirlaydi va tekshiradi
visudo -f /etc/sudoers.d/nomAlohida faylni
visudo -cBarcha fayllarni tekshiradi
visudo -cf faylAniq faylni tekshiradi
Terminal
visudo -cf /etc/sudoers.d/zz-sinov
Natija
/etc/sudoers.d/zz-sinov: parsed OK

Xato sintaksis qanday ko'rinadi:

Terminal
echo 'nodira ALL=(ALL) NOPASSWD /usr/bin/systemctl' > /tmp/xato
visudo -cf /tmp/xato 2>&1
Natija
/tmp/xato:1:45: syntax error
nodira ALL=(ALL) NOPASSWD /usr/bin/systemctl
                                            ^

Bitta ikki nuqta (:) tushib qolgan.

Sintaksis xatosi - serverdan chiqib qolish yo'li

Agar /etc/sudoers da sintaksis xatosi bo'lsa, sudo butunlay ishlamay qoladi. Root paroli o'chirilgan tipik Ubuntu serverda bu serverga kira olmaslik demak.

Uchta himoya:

QadamNima uchun
Faqat visudo ishlatingU saqlashdan oldin tekshiradi
/etc/sudoers.d/ da alohida fayl yaratingAsosiy faylga tegmaysiz
Ikkinchi SSH sessiyasini ochiq qoldiringXato bo'lsa - undan tuzatasiz

Uchinchisi eng muhim: sudo, SSH yoki xavfsizlik devorini o'zgartirayotganda doim ikkinchi ulanish ochiq turadi. Yangi sozlama ishlashiga ishonch hosil qilgach yopasiz.

/etc/sudoers.d/ - to'g'ri joy #

Terminal
ls /etc/sudoers.d/ | grep sinov
stat -c "%a %U:%G %n" /etc/sudoers.d/zz-sinov
Natija
zz-sinov
440 root:root /etc/sudoers.d/zz-sinov
TalabSabab
Ruxsat 440Yozish mumkin bo'lsa - har kim o'ziga root beradi
Egasi root:rootXuddi shu sabab
Nomda nuqta yo'qNuqtali fayllar e'tiborsiz qoldiriladi
Nomda ~ yo'qXuddi shunday
Nuqtali nom - jimgina ishlamaydigan qoida

sudo /etc/sudoers.d/ dagi fayllarni o'qiyotganda ichida nuqta (.) yoki ~ bo'lgan nomlarni butunlay tashlab ketadi. Hech qanday xato chiqmaydi.

Shuning uchun nginx.conf yoki malika.rules nomli fayl yaratsangiz - qoidangiz shunchaki ishlamaydi va siz sababini uzoq qidirasiz.

To'g'ri nomlar: zz-sinov, 10-nginx, malika.

Raqamli prefiks (10-, 20-) tartibni belgilaydi: keyingi fayl oldingisini bekor qilishi mumkin.

Cheklangan huquq berish #

Amaliy misol: Nodira nginx ni qayta ishga tushira olsin, lekin boshqa hech nimani.

Terminal
grep -A2 Cmnd_Alias /etc/sudoers.d/zz-sinov
Natija
Cmnd_Alias VEB = /usr/bin/systemctl restart nginx, \
                 /usr/bin/systemctl status nginx
nodira ALL=(root) NOPASSWD: VEB
ElementVazifa
Cmnd_AliasBuyruqlar to'plamiga nom berish
User_AliasFoydalanuvchilar to'plamiga
%guruhButun guruhga qoida (%sudo ALL=(ALL) ALL)
NOPASSWD:Parol so'ramaslik
!buyruqAniq taqiqlash
To'liq yo'l yozing, aks holda qoida behuda
Terminal
nodira ALL=(root) NOPASSWD: systemctl restart nginx

Bu qoida ishlamaydi: sudo buyruqni to'liq yo'l bilan solishtiradi. To'g'ri yozuv - /usr/bin/systemctl.

Bundan ham yomoni - jokerlar:

Terminal
nodira ALL=(root) NOPASSWD: /usr/bin/systemctl restart *

Yulduzcha restart nginx; /bin/bash kabi hiylalarga yo'l ochishi mumkin. Argumentlarni aniq yozing yoki umuman yozmang.

Va hech qachon muharrir, interpretator yoki arxivator ga sudo bermang:

BuyruqNima uchun xavfli
vim, less, manIchidan :!sh bilan qobiq ochiladi
python, perl, awkIstalgan kodni bajaradi
find-exec bayrog'i bor
tar, rsync--checkpoint-action va -e bor

Bularning barchasi sudo ni to'liq root ga aylantiradi.

Jurnal - sudo ning eng katta afzalligi #

Har bir sudo chaqiruvi yoziladi: kim, qachon, qayerdan, qaysi katalogda va qaysi buyruq.

Natija
Sep 10 07:14:22 srv-01 sudo: malika : TTY=pts/1 ; PWD=/home/malika ;
  USER=root ; COMMAND=/usr/bin/systemctl restart nginx
MaydonMa'no
malikaKim chaqirdi
TTY=pts/1Qaysi terminaldan
PWD=Qaysi katalogda edi
USER=rootKim bo'lib bajardi
COMMAND=Aynan nima

13-bo'limda bu yozuvlarni journalctl bilan qidirishni o'rganamiz:

Natija
journalctl -t sudo --since "1 hour ago"
Muvaffaqiyatsiz urinishlar ham yoziladi

Ruxsat berilmagan buyruqqa urinish alohida yoziladi:

Natija
sudo: nodira : command not allowed ; TTY=pts/2 ;
  PWD=/home/nodira ; USER=root ; COMMAND=/usr/bin/systemctl stop mysql

Bunday yozuvlar - ogohlantirish belgisi. Ular ikki narsani anglatishi mumkin: xodim o'z huquqidan tashqariga chiqmoqchi, yoki uning hisobi buzilgan.

Bunday xabarlarni monitoringga ulang (14-bo'lim).

Foydali sozlamalar #

SozlamaVazifa
Defaults timestamp_timeout=5Parol necha daqiqa eslab qolinadi
Defaults timestamp_timeout=0Har safar parol so'rash
Defaults logfile=/var/log/sudo.logAlohida jurnal fayli
Defaults requirettyFaqat terminaldan (skriptlarni bloklaydi)
Defaults passwd_tries=2Necha marta urinish mumkin
Defaults env_resetMuhit o'zgaruvchilarini tozalash (standart)
Terminal
sudo -l -U malika | grep -o 'env_reset'
Natija
env_reset
env_reset nima uchun standart

sudo siz muhit o'zgaruvchilari saqlanib qolsa, hujumchi LD_PRELOAD yoki PATH orqali root huquqida o'z kodini ishga tushira olardi.

env_reset deyarli barcha o'zgaruvchilarni tashlab yuboradi va secure_path ni majburiy qiladi.

Shuning uchun sudo bilan bajarilgan skript sizning PATH ingizni ko'rmaydi - va bu to'g'ri. Skriptlarda to'liq yo'l yozing.

Root parolini o'chirish #

Ubuntu Serverda root parolsiz keladi - bu ataylab.

Terminal
getent shadow root | cut -d: -f2
Natija
*

* - parol hech qachon o'rnatilmagan. Ya'ni root nomiga parol bilan kirishning iloji yo'q.

Root parolini o'rnatmang

Ikkinchi maydonda uch xil qiymat bo'lishi mumkin:

QiymatMa'no
*Parol o'rnatilmagan - kirish yo'q
! yoki !$y$...Parol bor, lekin bloklangan
$y$...Ishlaydigan parol - kirish mumkin

Ubuntu Server standart holatda * bilan keladi va shunday qolgani yaxshi: root ga faqat sudo -i orqali o'tasiz, va bu harakat jurnalga yoziladi.

Agar parol o'rnatilgan bo'lsa, uni bloklash:

Terminal
sudo passwd -l root

Bu xeshning oldiga ! qo'yadi - parol saqlanadi, lekin ishlamaydi.

BuyruqFarqi
sudo -iRoot ning to'liq login sessiyasi (~/.bashrc o'qiladi)
sudo -sRoot qobig'i, lekin sizning muhitingiz
sudo su -Eskicha usul - sudo -i afzalroq
sudo -u malika buyruqBoshqa foydalanuvchi nomidan
Amaliy topshiriq
  1. sudo guruhida kim borligini tekshiring.
  2. Foydalanuvchini -aG bilan sudo guruhiga qo'shing.
  3. sudo -l -U bilan uning huquqlarini ko'ring.
  4. /etc/sudoers.d/ da cheklangan qoidali fayl yarating.
  5. visudo -cf bilan uni tekshiring.
  6. Ataylab xato yozing va xato xabarini o'qing.
  7. Nuqtali nomli fayl yaratib, nega ishlamasligini tushuntiring.
  8. Cmnd_Alias bilan ikkita buyruqni guruhlang.
  9. Nima uchun vim ga sudo berish xavfli ekanini tushuntiring.
  10. sudo jurnalidagi beshta maydonni nomlab bering.

Xulosa #

  • Root bo'lib ishlamang - sudo cheklaydi, yozadi va so'raydi.
  • usermod -aG sudo - -a siz boshqa guruhlarni yo'qotasiz.
  • Qoida shakli: kim - qayerda - kim bo'lib - parolsizmi - nima.
  • Faqat visudo ishlating; u saqlashdan oldin tekshiradi.
  • Sozlamalarni /etc/sudoers.d/ ga qo'ying, 440 va root:root.
  • Fayl nomida nuqta bo'lmasin - u jimgina e'tiborsiz qoldiriladi.
  • Buyruqni to'liq yo'l bilan yozing; jokerlardan qoching.
  • vim, python, find, tar ga sudo bermang - ular qobiq ochadi.
  • sudo o'zgartirayotganda ikkinchi SSH sessiyasi ochiq tursin.
  • Muvaffaqiyatsiz urinishlar ham jurnalda - ularni kuzating.

Keyingi bo'limda SSH ni ko'ramiz: kalitlar, sozlama fayli va serverga kirishni qattiqlashtirish.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.