Ruxsatlar auditi
Fayl ruxsatlari xavfsizligi va Maxsus ruxsatlar maqolalarida hamma yoza oladigan (world-writable) fayllarni, kutilmagan setuid binary’larni va ma’lum egasi bo'lmagan fayllarni aniqlash uchun alohida find buyruqlari ko'rsatilgan edi. Ma’lum bir tekshiruv paytida bir marta ishga tushirilganda bu buyruqlarning har biri — diagnostika. Ular jadval bo'yicha ishga tushirilsa, shu modulning boshqa joylarida ko'rib chiqilgan sudoers va akkaunt tekshiruvlari bilan birlashtirilsa va o'tgan safargi holat bilan solishtirilsa, boshqa narsaga aylanadi: ruxsatlar auditiga (permission audit). Bu ma’lum bir hodisa sabab bo'lgan bir martalik tekshiruv emas, balki "bu serverdagi kirish huquqlari hali ham haqiqatan kerak bo'lgan narsaga mos keladimi" degan savolga javob berishning takrorlanadigan jarayoni.
Bu maqola alohida find chaqiruvlarini qaytadan o'rgatmaydi. U ularni va shu modulning oldingi qismlaridagi sudoers/akkaunt tekshiruvlarini bitta takrorlanadigan skriptga yig'adi va alohida usullarning hech biri o'z-o'zidan qamrab olmaydigan qismni ko'rib chiqadi: ma’lum bir topilma yangimi yoki u ikki yildan beri hech kim e’tibor bermagan holda turibdimi, buni bilish.
Nimalarni o'rganasiz
Bu maqola oxirida siz quyidagilarni qila olasiz:
- kurs bo'ylab tarqalgan alohida ruxsat tekshiruvlarini bitta audit skriptiga yig'ish;
- bir martalik ruxsat tekshiruvini takrorlanadigan audit jarayonidan farqlash;
- faqat o'zgargan narsalarni ko'rsatish uchun auditning joriy chiqishini oldingi bazaviy holat (baseline) bilan solishtirish;
- har bir natijaga bir xil darajada shoshilinch deb qarash o'rniga, audit topilmasi bilan aslida nima qilish kerakligini hal qilish;
- muntazam auditni jadvalga qo'yish va uning chiqishini haqiqatan ko'rib chiqiladigan joyga yo'naltirish.
Ruxsatlar auditiga nimalar kiradi
Foydali audit aniqlash usullarini qaytadan ixtiro qilmaydi — u kurs davomida allaqachon ko'rib chiqilganlarini bitta o'tishga yig'adi:
| Tekshiruv | Usul | Qayerda ko'rib chiqilgan |
|---|---|---|
| Hamma yoza oladigan fayllar va kataloglar | find / -xdev -type f -perm -0002 |
Fayl ruxsatlari xavfsizligi |
| Kutilmagan setuid/setgid binary’lar | find / -xdev -perm -4000 -o -perm -2000 |
Maxsus ruxsatlar |
| Haqiqiy egasi yo'q fayllar (o'chirilgan akkaunt egasiz fayllar qoldirgan) | find / -xdev -nouser -o -nogroup |
Maxsus ruxsatlar |
| Haddan tashqari keng sudoers ruxsatlari | /etc/sudoers.d/ ni faol akkauntlar bilan solishtirib ko'rib chiqish |
sudo xavfsizligi |
ls -l ko'rsatmaydigan kirish huquqini beradigan ACL’lar |
Sezgir kataloglar daraxtida getfacl -R |
Fayl ruxsatlari xavfsizligi |
| Hali ham tizimga kira oladigan, lekin kirmasligi kerak bo'lgan akkauntlar | Faol xodimlar bilan solishtirilgan getent passwd |
Shu maqola, quyida |
Tekshiruvlarni bitta skriptga yig'ish
#!/bin/bash
set -euo pipefail
REPORT_DIR="/var/log/permission-audit"
TIMESTAMP=$(date '+%Y%m%d-%H%M%S')
REPORT="${REPORT_DIR}/audit-${TIMESTAMP}.txt"
mkdir -p "$REPORT_DIR"
{
echo "=== Permission Audit: $(date '+%Y-%m-%d %H:%M:%S') ==="
echo -e "\n--- World-writable files (excluding /proc, /sys) ---"
find / -xdev \( -path /proc -o -path /sys \) -prune -o \
-type f -perm -0002 -print 2>/dev/null
echo -e "\n--- setuid/setgid binaries ---"
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -print 2>/dev/null
echo -e "\n--- Files with no valid owner or group ---"
find / -xdev \( -nouser -o -nogroup \) -print 2>/dev/null
echo -e "\n--- sudoers.d contents ---"
grep -rH '' /etc/sudoers.d/ 2>/dev/null | grep -v '^[^:]*:#'
echo -e "\n--- Accounts with a login shell and UID 0 ---"
awk -F: '($3 == 0) {print $1}' /etc/passwd
echo -e "\n--- Accounts with a valid login shell (candidates to review) ---"
grep -E '/(bash|sh|zsh)$' /etc/passwd | cut -d: -f1
} > "$REPORT"
echo "Report written to $REPORT"
Bu skript yuqoridagi alohida usullar allaqachon chuqur ko'rib chiqmagan hech narsani ataylab qilmaydi. Uning yagona vazifasi — ularning hammasini birga, jadval bo'yicha ishga tushirish va umumiy natijani oxirgisi bilan diff qilish mumkin bo'lgan, sanasi ko'rsatilgan bitta faylga yozish.
Butun fayl tizimi bo'ylab find faqat o'qiydi, lekin bepul emas
Yuqoridagi har bir buyruq faqat metama’lumotlarni o'qiydi — hech narsa o'zgartirilmaydi. Lekin katta fayl tizimi bo'ylab find / -xdev aylanib chiqishi haqiqiy vaqt va I/O oladi. -xdev qidiruvni bitta fayl tizimi bilan cheklaydi va uning /proc, tarmoq mount’lari yoki qidiruv yo'li ostida mount qilingan boshqa fayl tizimlariga kirib ketishining oldini oladi. Bu ham qidiruvni tezlashtiradi, ham aynan shu audit qamrab olishi kerak bo'lmagan fayl tizimlari haqida hisobot berishdan qochadi. Uni trafik kam bo'lgan soatlarda ishga tushirish (cron asoslari maqolasida ko'rib chiqilgan jadvalga qo'yish uchun tabiiy holat) production I/O bilan raqobatlashishdan qochadi.
Bazaviy holat bilan solishtirish
Bu yerdagi haqiqatan yangi imkoniyat — jadval bo'yicha audit o'zining alohida find buyruqlari yig'indisidan qimmatroq bo'lishining sababi — har hafta bir xil 40 qatorli ro'yxatga tikilib, uni yana yaxshi deb qaror qilish o'rniga, o'tgan safardan beri nima o'zgarganini bilish.
diff <(sort /var/log/permission-audit/audit-20260722-020000.txt) \
<(sort /var/log/permission-audit/audit-20260729-020000.txt)
diff dagi bitta yangi qator — o'tgan haftadagi hisobotda bo'lmagan bitta yangi setuid binary — kimdir ko'z yugurtirib, arxivga qo'yib qo'yadigan 40 qatorli hisobotda e’tiborsiz turgan o'sha binary’ga qaraganda ancha amaliyroq va haqiqatan tekshirilish ehtimoli ancha yuqori. Yuqoridagi skript qilganidek, har bir ishga tushirish hisobotini vaqt belgisi bilan saqlash bu solishtirishni umuman mumkin qiladigan narsa. Har safar bir xil faylni qayta yozish esa "yangi"ni "doim bo'lgan"dan ajratish uchun kerakli tarixni yo'q qiladi.
comm -13 xuddi shu g'oyaning biroz aniqroq versiyasi: u faqat ikkinchi faylda bor, lekin birinchisida yo'q qatorlarni chiqaradi. Bu yo'qolgan yoki o'zgarmay qolgan qatorlarning shovqinisiz aynan "nima yangi" ro'yxati.
Topilma bilan nima qilishni hal qilish
Har bir audit natijasi bir xil darajada shoshilinch emas. Ularning hammasiga bir xil munosabatda bo'lish yo ogohlantirishlardan charchashga (hamma narsa past ustuvorlikdagi "qachondir" belgisini oladi), yo keraksiz vahimaga olib keladi (/usr/bin/sudo ning o'zi kabi to'liq kutilgan setuid binary haqiqatan shubhali binary bilan bir xil signalni ishga tushiradi). Taxminiy saralash (triage):
| Topilma | Odatiy shoshilinchlik | Odatiy keyingi qadam |
|---|---|---|
Yaxshi ma’lum setuid binary (/usr/bin/sudo, /usr/bin/passwd) |
Yo'q — kutilgan | U distributivning o'z, o'zgartirilmagan binary’si ekanini tasdiqlang; e’tiborsiz qoldiring |
| Paket o'rnatilishidan paydo bo'lgan yangi setuid binary | Pastdan o'rtachagacha | Uni o'rnatgan paket va versiyani tasdiqlang, setuid uning ishlashi uchun haqiqatan kerakmi, tekshiring |
| Kelib chiqishi noma’lum yangi setuid binary | Yuqori | Buzib kirishning ehtimoliy belgisi sifatida qarang; keyingi rejalashtirilgan ko'rib chiqishni kutmasdan darhol tekshiring |
| Endi mavjud bo'lmagan yoki o'chirilgan akkaunt uchun sudoers yozuvi | O'rtacha | Olib tashlang; qarang: sudo xavfsizligi |
| Ilovaning o'z ishchi katalogi ichidagi hamma yoza oladigan fayl | Pastdan o'rtachagacha, kontekstga bog'liq | Ilovaga bu haqiqatan kerakmi, tekshiring; kerak bo'lmasa, toraytiring |
| Hech qanday kutilgan ilova yo'lidan tashqaridagi hamma yoza oladigan fayl | Yuqori | Darhol tekshiring |
"Bu qanchalik shoshilinch" degan savolni ajratib beradigan savol deyarli har doim "bu nega mavjudligini hozirning o'zida aniq tushuntira olamanmi". Darhol, tekshirib bo'ladigan izohi bor topilma — past ustuvorlikdagi tartib-intizom masalasi. Uni nima yaratganini tushunish uchun ham chuqur qazish talab qiladigan topilma esa birinchi navbatda e’tibor talab qiladi.
Amaliy vaziyat: haftalik audit tartibini qurish
Muammo. Jamoa muntazam ruxsatlar auditini xohlaydi va har hafta o'zgarmagan chiqish devori emas, faqat mazmunli o'zgarishlar ko'rsatilishi kerak.
1-qadam — audit skriptini o'rnatish va uning qo'lda toza ishlashini tasdiqlash:
2-qadam — uni cron asoslari maqolasidagi shablonga amal qilib jadvalga qo'yish:
3-qadam — faqat oldingi ishga tushirishdan farq bo'lsagina hisobot beradigan solishtirish qadamini qo'shish:
#!/bin/bash
set -euo pipefail
REPORT_DIR="/var/log/permission-audit"
LATEST=$(ls -1t "${REPORT_DIR}"/audit-*.txt | head -n 1)
PREVIOUS=$(ls -1t "${REPORT_DIR}"/audit-*.txt | sed -n 2p)
if [ -z "$PREVIOUS" ]; then
echo "No previous report to compare against yet."
exit 0
fi
DIFF_OUTPUT=$(diff "$PREVIOUS" "$LATEST" || true)
if [ -n "$DIFF_OUTPUT" ]; then
echo "Changes since $(basename "$PREVIOUS"):"
echo "$DIFF_OUTPUT"
else
echo "No changes since $(basename "$PREVIOUS")."
fi
Bir hafta oraliqdagi ikki ishga tushirish bilan tekshirish:
Xulosa. Haftalik cron vazifasi endi to'liq tarixiy yozuvni hosil qiladi, lekin inson har hafta haqiqatan o'qishi kerak bo'lgan narsa — diff skripti. Bo'sh diff hech narsa o'zgarmaganini tasdiqlaydi va ko'rib chiqish bir necha soniya oladi. Bo'sh bo'lmagan diff esa to'g'ridan-to'g'ri yangi narsaga ishora qiladi va haqiqatan e’tiborga loyiq yagona narsa aynan shu.
Keng tarqalgan xatolar
- Auditni bir marta ishga tushirib, ishni tugadi deb hisoblash. Bitta snapshot faqat o'sha paytdagi holatni aytadi. Xavfsizlik qiymati snapshot’larni vaqt bo'yicha solishtirish va siljishni (drift) ushlashdan keladi.
- Tarixni saqlash o'rniga oldingi hisobotni qayta yozish. Vaqt belgisi qo'yilgan arxivsiz diff qilish uchun hech narsa qolmaydi va har bir ishga tushirish yana "butun ro'yxatni o'qib, ko'z bilan tekshirish"ga aylanadi.
- Har bir topilmaga bir xil darajada shoshilinch deb qarash. Yuqorida ko'rib chiqilganidek, bu yo ogohlantirishlardan charchashga, yo keraksiz vahimaga olib keladi. Darhol, tekshirib bo'ladigan izohi bor topilma tekshiruv talab qiladiganidan farq qiladi.
- Butun fayl tizimini skanerlashni trafik eng yuqori bo'lgan soatlarda ishga tushirish.
find / -xdevaylanib chiqishi faqat o'qiydi, lekin bepul emas — uni tinch davrga rejalashtirish production I/O bilan raqobatlashishdan qochadi. - Fayllar va sudoers’ni audit qilib, faol akkauntlar bilan hech qachon solishtirmaslik. Hamma yoza oladigan fayllar auditi ketib qolgan pudratchi uchun qoldirilgan sudoers ruxsati haqida hech narsa aytmaydi. Yuqoridagi skriptda ko'rsatilganidek, ikkalasi ham bir xil tartibning qismi bo'lishi kerak.
Mashqlar
- Yuqoridagi audit skriptini
/etc/passwddagirootdan boshqa UID 0 ga ega har qanday akkauntni ham belgilaydigan qilib moslashtiring va aynan shu topilma boshqa har qanday kontekstdan qat’i nazar nega darhol e’tibor talab qilishini tushuntiring. - Lab tizimida audit skriptini bir kun oraliq bilan ikki marta ishga tushiring, oralig'ida ataylab bitta yangi setuid fayl yarating. Diff qadami faqat shu bitta o'zgarishni to'g'ri belgilashini tasdiqlang.
- "
/opt/myapp/uploadsichidagi hamma yoza oladigan katalog" topilmasi uchun u kutilganmi yoki muammomi, hal qilishdan oldin qanday qo'shimcha ma’lumot kerak bo'lishini tasvirlab bering. - Audit hisobotlarini fayl nomida vaqt belgisi bilan saqlash nega shunchaki nomlash kelishuvi emas, balki mazmunli trend tahlilining zaruriy sharti ekanini tushuntiring.
Xulosa
Ruxsatlar auditi Fayl ruxsatlari xavfsizligi, Maxsus ruxsatlar va sudo xavfsizligi allaqachon qamrab olganidan tashqari yangi aniqlash usullarini talab qilmaydi. U ularni birga, jadval bo'yicha ishga tushirishni va har bir ishga tushirishni oxirgisi bilan solishtirishni talab qiladi, shunda haqiqatan yangi topilma o'zgarmaydigan chiqish devori ichida ko'milib qolmasdan, ajralib turadi. Haqiqiy qiymat biror bitta tekshiruvda emas, takrorlanuvchanlik va diff’da. Keyingi maqola, Xavfsizlik loglarini tahlil qilish, xuddi shu "nima o'zgargan yoki ajralib turganini qidirish" intizomini fayl metama’lumotlari o'rniga autentifikatsiya va audit log'lariga qo'llaydi.