Foydalanuvchilar va guruhlar — useradd, groups, /etc/passwd

~12 daq · Linux · Foydalanuvchilar va ruxsatlar

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/shadow da (shifrlangan, faqat root o'qiy oladi)
  • shell /usr/sbin/nologin yoki /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 -aG da -a (append) ni unutmang! usermod -G docker otabek (-a siz) — foydalanuvchini barcha boshqa guruhlardan chiqaradi, shu jumladan sudo dan. 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 — guruhlar
  • adduser — odamlar uchun; useradd --system — xizmatlar uchun
  • usermod -aG guruh foydalanuvchi — -a majburiy!
  • 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