7-bo‘lim
sudo va imtiyozlarni boshqarish
Root bo'lmasdan root ishini bajarish - qoidalar, jurnal va eng ko'p uchraydigan xavfli sozlamalar.
Ushbu bo‘lim mundarijasi
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 #
| Xavf | Root bo'lganda | sudo bilan |
|---|---|---|
| Xato buyruq | Hech kim so'ramaydi | Parol so'raydi - o'ylashga vaqt |
| Kim nima qildi | Bilib bo'lmaydi | Jurnalda yozilgan |
| Buzilgan sessiya | Butun server | Faqat o'sha foydalanuvchi |
| Huquqni cheklash | Imkonsiz | Buyruq darajasida |
rm -rf / va bo'shliqKlassik voqea - zaxira skriptidagi bitta bo'shliq:
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.
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
getent group sudo
sudo:x:27:husanboy
Foydalanuvchini qo'shish - bitta buyruq:
usermod -aG sudo malika
getent group sudo | cut -d: -f4
husanboy,malika
-aG ni yana bir bor eslatamiz6-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 #
sudo -l -U nodira | sed "s/$(hostname)/srv-01/g"
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.
Faylni to'g'ri tahrirlash #
/etc/sudoers ni hech qachon oddiy muharrirda ochmang.
| Buyruq | Vazifa |
|---|---|
visudo | Asosiy faylni qulflab tahrirlaydi va tekshiradi |
visudo -f /etc/sudoers.d/nom | Alohida faylni |
visudo -c | Barcha fayllarni tekshiradi |
visudo -cf fayl | Aniq faylni tekshiradi |
visudo -cf /etc/sudoers.d/zz-sinov
/etc/sudoers.d/zz-sinov: parsed OK
Xato sintaksis qanday ko'rinadi:
echo 'nodira ALL=(ALL) NOPASSWD /usr/bin/systemctl' > /tmp/xato
visudo -cf /tmp/xato 2>&1
/tmp/xato:1:45: syntax error
nodira ALL=(ALL) NOPASSWD /usr/bin/systemctl
^
Bitta ikki nuqta (:) tushib qolgan.
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:
| Qadam | Nima uchun |
|---|---|
Faqat visudo ishlating | U saqlashdan oldin tekshiradi |
/etc/sudoers.d/ da alohida fayl yarating | Asosiy faylga tegmaysiz |
| Ikkinchi SSH sessiyasini ochiq qoldiring | Xato 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 #
ls /etc/sudoers.d/ | grep sinov
stat -c "%a %U:%G %n" /etc/sudoers.d/zz-sinov
zz-sinov
440 root:root /etc/sudoers.d/zz-sinov
| Talab | Sabab |
|---|---|
Ruxsat 440 | Yozish mumkin bo'lsa - har kim o'ziga root beradi |
Egasi root:root | Xuddi shu sabab |
| Nomda nuqta yo'q | Nuqtali fayllar e'tiborsiz qoldiriladi |
Nomda ~ yo'q | Xuddi shunday |
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.
grep -A2 Cmnd_Alias /etc/sudoers.d/zz-sinov
Cmnd_Alias VEB = /usr/bin/systemctl restart nginx, \
/usr/bin/systemctl status nginx
nodira ALL=(root) NOPASSWD: VEB
| Element | Vazifa |
|---|---|
Cmnd_Alias | Buyruqlar to'plamiga nom berish |
User_Alias | Foydalanuvchilar to'plamiga |
%guruh | Butun guruhga qoida (%sudo ALL=(ALL) ALL) |
NOPASSWD: | Parol so'ramaslik |
!buyruq | Aniq taqiqlash |
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:
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:
| Buyruq | Nima uchun xavfli |
|---|---|
vim, less, man | Ichidan :!sh bilan qobiq ochiladi |
python, perl, awk | Istalgan 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.
Sep 10 07:14:22 srv-01 sudo: malika : TTY=pts/1 ; PWD=/home/malika ;
USER=root ; COMMAND=/usr/bin/systemctl restart nginx
| Maydon | Ma'no |
|---|---|
malika | Kim chaqirdi |
TTY=pts/1 | Qaysi terminaldan |
PWD= | Qaysi katalogda edi |
USER=root | Kim bo'lib bajardi |
COMMAND= | Aynan nima |
13-bo'limda bu yozuvlarni journalctl bilan qidirishni
o'rganamiz:
journalctl -t sudo --since "1 hour ago"
Ruxsat berilmagan buyruqqa urinish alohida yoziladi:
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 #
| Sozlama | Vazifa |
|---|---|
Defaults timestamp_timeout=5 | Parol necha daqiqa eslab qolinadi |
Defaults timestamp_timeout=0 | Har safar parol so'rash |
Defaults logfile=/var/log/sudo.log | Alohida jurnal fayli |
Defaults requiretty | Faqat terminaldan (skriptlarni bloklaydi) |
Defaults passwd_tries=2 | Necha marta urinish mumkin |
Defaults env_reset | Muhit o'zgaruvchilarini tozalash (standart) |
sudo -l -U malika | grep -o 'env_reset'
env_reset
env_reset nima uchun standartsudo 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.
getent shadow root | cut -d: -f2
*
* - parol hech qachon o'rnatilmagan. Ya'ni root nomiga
parol bilan kirishning iloji yo'q.
Ikkinchi maydonda uch xil qiymat bo'lishi mumkin:
| Qiymat | Ma'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:
sudo passwd -l root
Bu xeshning oldiga ! qo'yadi - parol saqlanadi, lekin
ishlamaydi.
| Buyruq | Farqi |
|---|---|
sudo -i | Root ning to'liq login sessiyasi (~/.bashrc o'qiladi) |
sudo -s | Root qobig'i, lekin sizning muhitingiz |
sudo su - | Eskicha usul - sudo -i afzalroq |
sudo -u malika buyruq | Boshqa foydalanuvchi nomidan |
sudoguruhida kim borligini tekshiring.- Foydalanuvchini
-aGbilansudoguruhiga qo'shing. sudo -l -Ubilan uning huquqlarini ko'ring./etc/sudoers.d/da cheklangan qoidali fayl yarating.visudo -cfbilan uni tekshiring.- Ataylab xato yozing va xato xabarini o'qing.
- Nuqtali nomli fayl yaratib, nega ishlamasligini tushuntiring.
Cmnd_Aliasbilan ikkita buyruqni guruhlang.- Nima uchun
vimgasudoberish xavfli ekanini tushuntiring. sudojurnalidagi beshta maydonni nomlab bering.
Xulosa #
- Root bo'lib ishlamang -
sudocheklaydi, yozadi va so'raydi. usermod -aG sudo--asiz boshqa guruhlarni yo'qotasiz.- Qoida shakli: kim - qayerda - kim bo'lib - parolsizmi - nima.
- Faqat
visudoishlating; u saqlashdan oldin tekshiradi. - Sozlamalarni
/etc/sudoers.d/ga qo'ying,440varoot:root. - Fayl nomida nuqta bo'lmasin - u jimgina e'tiborsiz qoldiriladi.
- Buyruqni to'liq yo'l bilan yozing; jokerlardan qoching.
vim,python,find,targasudobermang - ular qobiq ochadi.sudoo'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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.