Foydalanuvchilar va guruhlar — useradd, groups, /etc/passwd
Muammodan boshlaylik
Serverda uchta narsa ishlaydi: Nginx, ilovangiz (Node.js) va MySQL. Hujumchi ilovangizdagi zaiflik orqali kirib oldi. Endi u nima qila oladi?
- Agar hammasi bitta foydalanuvchi (yoki root) nomidan ishlasa — hamma narsani: bazani o'chirish, Nginx sozlamasini o'zgartirish, tizimga zararli dastur o'rnatish
- Agar har biri alohida foydalanuvchi nomidan ishlasa — faqat ilovaning o'z fayllariga yetadi
Linux — boshidan ko'p foydalanuvchili tizim sifatida yaratilgan. Har bir fayl va jarayonning egasi bor. Bu xavfsizlikning asosi.
Siz kimsiz?
whoami
id
otabek
uid=1000(otabek) gid=1000(otabek) groups=1000(otabek),4(adm),27(sudo),999(docker)
- uid (user ID) — foydalanuvchi raqami. Tizim aslida nomlar bilan emas, raqamlar bilan ishlaydi
- gid — asosiy guruh
- groups — a'zo bo'lgan barcha guruhlar
sudo guruhida bo'lish — administrator buyruqlarini bajarish huquqi (19-dars). docker guruhida — Docker ni sudo siz ishlatish.
Foydalanuvchi turlari
| Tur | UID | Misol | Nima uchun |
|---|---|---|---|
| root | 0 | root |
Hamma narsaga ruxsat |
| Tizim | 1–999 | www-data, mysql, nobody |
Xizmatlarni ishga tushirish; tizimga kira olmaydi |
| Oddiy | 1000+ | otabek, deploy |
Odamlar |
Nginx www-data nomidan ishlaydi, MySQL — mysql nomidan. Shu tufayli ular bir-birining fayllariga tegolmaydi.
/etc/passwd — foydalanuvchilar ro'yxati
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
mysql:x:110:118:MySQL Server,,,:/nonexistent:/bin/false
otabek:x:1000:1000:Otabek Hasanov,,,:/home/otabek:/bin/bash
: bilan ajratilgan 7 ta maydon:
otabek : x : 1000 : 1000 : Otabek Hasanov : /home/otabek : /bin/bash
nom parol UID GID to'liq ism uy papka shell
x— parol bu yerda emas,/etc/shadowda (shifrlangan, faqat root o'qiy oladi)- shell
/usr/sbin/nologinyoki/bin/false— bu foydalanuvchi tizimga kira olmaydi (xizmatlar uchun)
Faqat oddiy foydalanuvchilar:
awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd
Guruhlar — /etc/group:
grep sudo /etc/group
sudo:x:27:otabek,malika
Foydalanuvchi yaratish
Ubuntu da ikki buyruq bor:
sudo adduser malika
adduser — interaktiv, qulay: uy papka yaratadi, parol va ism so'raydi. Odamlar uchun shu.
sudo useradd -m -s /bin/bash malika
sudo passwd malika
useradd — past darajali, skriptlar uchun. -m — uy papka yaratish, -s — shell. Bayroqlarsiz uy papka yaratilmaydi.
Tizim foydalanuvchisi (xizmat uchun)
sudo useradd --system --no-create-home --shell /usr/sbin/nologin dokon
Ilovangizni shu foydalanuvchi nomidan ishga tushirasiz (25 va 28-darslar). U tizimga kira olmaydi, uy papkasi yo'q — faqat jarayonlar uchun "shaxs".
Guruhlar
Guruh — bir nechta foydalanuvchiga birdaniga ruxsat berish usuli.
sudo groupadd dasturchilar # guruh yaratish
sudo usermod -aG dasturchilar malika # foydalanuvchini qo'shish
sudo usermod -aG sudo malika # administrator qilish
sudo usermod -aG docker otabek # docker ni sudo siz
groups malika # tekshirish
[!WARNING]
usermod -aGda-a(append) ni unutmang!usermod -G docker otabek(-a siz) — foydalanuvchini barcha boshqa guruhlardan chiqaradi, shu jumladansudodan. Natija: administrator huquqingizni yo'qotasiz.
[!INFO] Guruhga qo'shilgandan keyin o'zgarish qayta kirgandan keyin kuchga kiradi. Yoki joriy sessiyada:
newgrp docker.
Guruhdan chiqarish:
sudo gpasswd -d malika dasturchilar
Foydalanuvchini o'zgartirish va o'chirish
sudo passwd malika # parolni o'zgartirish
passwd # o'z parolingizni
sudo usermod -s /bin/zsh malika # shell ni o'zgartirish
sudo usermod -L malika # bloklash (lock)
sudo usermod -U malika # blokdan chiqarish
sudo deluser malika # o'chirish
sudo deluser --remove-home malika # uy papkasi bilan
Boshqa foydalanuvchiga o'tish
su - malika # malika bo'lib kirish (uning parolini so'raydi)
sudo -u malika whoami # bitta buyruqni malika nomidan
sudo -u www-data ls /var/www # www-data nima ko'rishini tekshirish
sudo -i # root sessiyasi (19-dars)
exit # qaytish
sudo -u www-data ... — "Nginx bu faylni o'qiy oladimi?" degan savolni tekshirishning eng oson usuli.
Kim tizimda?
who # hozir tizimga kirganlar
w # ... va ular nima qilyapti
last # oxirgi kirishlar tarixi
lastb # muvaffaqiyatsiz urinishlar (sudo bilan)
Serverda sudo lastb | head — ko'pincha minglab begona urinishlarni ko'rsatadi: internetdagi botlar doimiy ravishda SSH parollarini tanlashga urinadi. Bu — 42-darsda parol bilan kirishni o'chirishimizning sababi.
Nima uchun shunday?
Nima uchun har bir xizmat (Nginx, MySQL, ilova) alohida foydalanuvchi nomidan ishlaydi?
Bu — eng kam imtiyoz tamoyili (principle of least privilege): har bir dastur faqat o'z ishi uchun kerakli narsaga kirish huquqiga ega bo'lsin. Nginx www-data sifatida faqat veb-fayllarni o'qiy oladi; MySQL mysql sifatida faqat /var/lib/mysql ga yoza oladi. Agar ulardan biri buzilsa, hujumchi faqat shu xizmatning "qafasi" ichida qoladi. Hammasi root nomidan ishlasa — bitta zaiflik butun serverni beradi. Docker darslaridagi "konteynerda root siz ishlang" tavsiyasi ham aynan shu g'oyadan kelib chiqadi.
Xulosa
Eslab qoling:
whoami,id— kimligingiz, UID, guruhlar- root (UID 0), tizim foydalanuvchilari (1–999), odamlar (1000+)
/etc/passwd— foydalanuvchilar;/etc/shadow— parollar;/etc/group— guruhlaradduser— odamlar uchun;useradd --system— xizmatlar uchunusermod -aG guruh foydalanuvchi—-amajburiy!- Guruh o'zgarishi — qayta kirgandan keyin
sudo -u www-data buyruq— boshqa foydalanuvchi nomidan tekshirish- Har bir xizmat — o'z foydalanuvchisi (eng kam imtiyoz)
Keyingi dars
19-dars: root va sudo — imtiyozlar qanday ishlaydi