7-bo‘lim

Operatsion tizim xavfsizligi

Serverni mustahkamlash, fayl huquqlari, yangilanishlar, jarayonlarni izolyatsiya qilish va yaxlitlik nazorati.

🕑 24 daqiqa o‘qish 📄 966 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Mustahkamlash prinsipi
  2. Foydalanuvchilar va huquqlar
  3. Fayl huquqlari
  4. Yangilanishlar
  5. Jarayonlarni izolyatsiya qilish
  6. Yadro parametrlari
  7. Majburiy kirish nazorati
  8. Konteynerlar xavfsizligi
  9. Yaxlitlik nazorati
  10. Jurnal va audit
  11. Zaxira nusxa
  12. Mustahkamlash tekshiruvi
  13. Windows xavfsizligi
  14. Server mustahkamlash ro'yxati
  15. Xulosa

Ilova qanchalik xavfsiz bo'lmasin, u ishlab turgan tizim buzilgan bo'lsa - hammasi behuda.

Mustahkamlash prinsipi #

Mustahkamlash - ortiqchani olib tashlash Standart o'rnatish • 400+ paket o'rnatilgan • 15 ta xizmat ishlayapti • Standart parollar • Barcha portlar ochiq • Jurnal minimal Mustahkamlangan • Faqat kerakli paketlar • 5 ta xizmat • Kuchli parollar, kalitlar • 3 ta port ochiq • To'liq jurnal va monitoring Har bir olib tashlangan komponenta - kamaygan hujum yuzasi
Kam komponenta - kam zaiflik
Terminal
# Nima o'rnatilgan?
dpkg -l | wc -l

# Qaysi xizmatlar ishga tushadi?
systemctl list-unit-files --state=enabled --type=service

# Keraksizlarni o'chirish
sudo systemctl disable --now bluetooth cups avahi-daemon
sudo apt purge telnet rsh-client rsh-server xinetd
sudo apt autoremove --purge
Minimal o'rnatishdan boshlang

Ubuntu Server "minimal" variantini tanlang yoki Alpine Linux ishlating.

Keyin faqat kerakli narsalarni qo'shing - bu keraksizni olib tashlashdan osonroq.

Foydalanuvchilar va huquqlar #

Terminal
# Barcha foydalanuvchilar
cat /etc/passwd | cut -d: -f1,3,7

# Parolsiz hisoblar - xavfli
sudo awk -F: '($2 == "") {print $1}' /etc/shadow

# UID 0 bo'lgan hisoblar (root ekvivalenti)
sudo awk -F: '($3 == 0) {print $1}' /etc/passwd
Natija
root
UID 0 faqat root bo'lsin

Agar ro'yxatda boshqa nom chiqsa - bu backdoor bo'lishi mumkin.

Hujumchilar ko'pincha root huquqlariga ega yashirin hisob yaratadi.

Terminal
# Yangi foydalanuvchi - login qilmaydigan xizmat uchun
sudo useradd -r -s /usr/sbin/nologin -M dokon

# sudo huquqi - aniq buyruqlar bilan
sudo visudo -f /etc/sudoers.d/dokon
Natija
# /etc/sudoers.d/dokon
husanboy ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx, /bin/systemctl reload php8.3-fpm
%deploy ALL=(dokon) NOPASSWD: /var/www/dokon/deploy.sh
ALL=(ALL) ALL - to'liq root huquqi
Natija
husanboy ALL=(ALL) ALL          # hamma narsa
husanboy ALL=(ALL) NOPASSWD:ALL # hamma narsa, parolsiz - juda xavfli

Aniq buyruqlar ro'yxatini bering. Agar foydalanuvchi sudo vim qila olsa, u vim ichidan istalgan buyruqni bajarishi mumkin.

Terminal
# sudo amallarini kuzatish
sudo grep sudo /var/log/auth.log | tail -20

Fayl huquqlari #

Terminal
ls -la /var/www/dokon
Natija
drwxr-xr-x  8 dokon dokon  4096 Aug 15 10:22 .
-rw-r-----  1 dokon dokon   842 Aug 15 10:20 .env
drwxr-xr-x  4 dokon dokon  4096 Aug 15 10:22 manba
drwxrwxr-x  3 dokon dokon  4096 Aug 15 10:22 storage
HuquqMa'nosi
644Egasi yozadi, hamma o'qiydi - oddiy fayllar
640Egasi yozadi, guruh o'qiydi - sozlamalar
600Faqat egasi - sirlar, kalitlar
755Papkalar va bajariladigan fayllar
750Papka, faqat egasi va guruh
777Hech qachon ishlatmang
Terminal
# To'g'ri huquqlar
sudo chown -R dokon:dokon /var/www/dokon
sudo find /var/www/dokon -type d -exec chmod 755 {} \;
sudo find /var/www/dokon -type f -exec chmod 644 {} \;

# Sirlar
sudo chmod 600 /var/www/dokon/.env

# Yozish kerak bo'lgan papkalar
sudo chmod 775 /var/www/dokon/storage
sudo chown -R dokon:www-data /var/www/dokon/storage
chmod 777 - eng ko'p uchraydigan xato

"Ishlamayapti - 777 qilib ko'raman" - bu hech qachon to'g'ri yechim emas.

777 degani: har qanday foydalanuvchi faylni o'qishi, yozishi va bajarishi mumkin.

Veb-serverda bu shuni anglatadi: hujumchi zararli fayl yuklab, uni bajara oladi.

To'g'ri yondashuv: egasini va guruhni to'g'ri belgilang.

Terminal
# Xavfli fayllarni topish
sudo find / -type f -perm -002 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

# SUID fayllar - ular egasi huquqi bilan bajariladi
sudo find / -type f -perm -4000 2>/dev/null
Natija
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/su
/usr/bin/mount
SUID fayllarni kuzating

SUID bayrog'i bilan fayl egasi huquqi bilan bajariladi.

/usr/bin/passwd root bo'lgani uchun oddiy foydalanuvchi ham parolini o'zgartira oladi.

Lekin kutilmagan SUID fayl - backdoor belgisi. Ro'yxatni vaqti-vaqti bilan solishtiring.

Yangilanishlar #

Terminal
# Mavjud yangilanishlar
sudo apt update
apt list --upgradable

# Faqat xavfsizlik yangilanishlari
sudo unattended-upgrade --dry-run -d
Terminal
sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure --priority=low unattended-upgrades
Natija
# /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
};

Unattended-Upgrade::Mail "[email protected]";
Unattended-Upgrade::MailReport "on-change";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
Avtomatik yangilanish - eng samarali chora

Ommaviy hujumlarning katta qismi yangilanish chiqarilgan zaifliklardan foydalanadi.

Avtomatik xavfsizlik yangilanishlari bu hujumlarni to'sadi.

Xavotir: "yangilanish nimadir buzsa?" - shuning uchun:

  • Faqat xavfsizlik yangilanishlari avtomatik
  • Sinov muhitida oldindan tekshiruv
  • Zaxira nusxa har doim tayyor
Terminal
# Qayta ishga tushirish kerakmi?
[ -f /var/run/reboot-required ] && cat /var/run/reboot-required.pkgs
Terminal
# Yadro yangilanishlarini qayta ishga tushirmasdan qo'llash
sudo apt install libcanberra-gtk-module   # yoki kexec, livepatch
sudo canonical-livepatch status

Jarayonlarni izolyatsiya qilish #

INI
# /etc/systemd/system/dokon.service
[Unit]
Description=Dokon ilovasi
After=network.target mysql.service

[Service]
Type=notify
User=dokon
Group=dokon
WorkingDirectory=/var/www/dokon

# Huquqlarni oshirishni taqiqlash
NoNewPrivileges=true

# Fayl tizimi
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/www/dokon/storage /var/log/dokon

# Yadro
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectClock=true
ProtectHostname=true

# Tarmoq
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
IPAddressDeny=any
IPAddressAllow=10.0.0.0/8 127.0.0.1

# Xotira
MemoryDenyWriteExecute=true
RestrictRealtime=true
RestrictSUIDSGID=true
LockPersonality=true

# Tizim chaqiruvlari
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
SystemCallArchitectures=native

# Resurs cheklovlari
MemoryMax=2G
CPUQuota=200%
TasksMax=512

[Install]
WantedBy=multi-user.target
Terminal
# Xavfsizlik bahosini tekshirish
systemd-analyze security dokon.service
Natija
NAME                     DESCRIPTION                    EXPOSURE
✓ PrivateNetwork=        Service has access to network
✗ User=/DynamicUser=     Service runs as root user           0.4
✓ CapabilityBoundingSet= Service has no elevated privileges
...
→ Overall exposure level for dokon.service: 2.1 OK 🙂
systemd-analyze security

Bu buyruq har bir xizmat uchun xavflilik bahosi beradi (0 - eng xavfsiz, 10 - eng xavfli).

Muhim xizmatlar uchun bahoni 3 dan past tushiring.

Yadro parametrlari #

Terminal
# /etc/sysctl.d/99-xavfsizlik.conf
INI
# IP soxtalashtirishga qarshi
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# ICMP yo'naltirishlarini rad etish
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# Manba marshrutlashni o'chirish
net.ipv4.conf.all.accept_source_route = 0

# SYN flood himoyasi
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# Shubhali paketlarni jurnalga yozish
net.ipv4.conf.all.log_martians = 1

# ASLR - xotira manzillarini tasodifiylashtirish
kernel.randomize_va_space = 2

# Yadro ko'rsatkichlarini yashirish
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1

# Core dump larni o'chirish (parollar tushishi mumkin)
fs.suid_dumpable = 0

# Qattiq va ramziy havola himoyasi
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
Terminal
sudo sysctl --system
sudo sysctl -a | grep tcp_syncookies

Majburiy kirish nazorati #

Terminal
# AppArmor holati
sudo aa-status
Natija
apparmor module is loaded.
32 profiles are loaded.
28 profiles are in enforce mode.
   /usr/sbin/mysqld
   /usr/sbin/nginx
   ...
4 profiles are in complain mode.
Natija
# /etc/apparmor.d/usr.sbin.dokon
#include <tunables/global>

/usr/local/bin/dokon {
  #include <abstractions/base>
  #include <abstractions/nameservice>

  # Faqat shu fayllarni o'qish
  /var/www/dokon/** r,
  /var/www/dokon/storage/** rw,
  /etc/dokon/config.php r,

  # Tarmoq
  network inet stream,
  network inet6 stream,

  # Boshqa hamma narsa taqiqlangan
  deny /etc/shadow r,
  deny /root/** rwx,
  deny /home/** rwx,
}
AppArmor yoki SELinux

Bu tizimlar majburiy kirish nazorati (MAC) beradi.

Oddiy huquqlarda root hamma narsani qila oladi. MAC da esa root ham profil chegarasidan chiqa olmaydi.

Ilova buzilsa ham, u faqat profilda ruxsat etilgan fayllarga kira oladi.

AppArmorSELinux
DistributivUbuntu, SUSERHEL, Fedora
SozlashOsonroqMurakkabroq
KuchYaxshiKuchliroq

Konteynerlar xavfsizligi #

DOCKERFILE
FROM php:8.3-fpm-alpine

# Root sifatida ishlamang
RUN addgroup -g 1000 ilova && adduser -u 1000 -G ilova -D ilova

# Faqat kerakli paketlar
RUN apk add --no-cache libzip \
    && docker-php-ext-install pdo_mysql opcache \
    && rm -rf /var/cache/apk/*

COPY --chown=ilova:ilova . /var/www

USER ilova

HEALTHCHECK --interval=30s CMD php /var/www/tools/salomatlik.php
YAML
services:
  ilova:
    build: .
    read_only: true                    # fayl tizimi faqat o'qish
    tmpfs:
      - /tmp
    cap_drop:
      - ALL                            # barcha imkoniyatlarni olib tashlash
    cap_add:
      - CHOWN
      - SETUID
      - SETGID
    security_opt:
      - no-new-privileges:true
      - apparmor:docker-default
    user: "1000:1000"
    mem_limit: 1g
    pids_limit: 256
Konteynerdagi keng tarqalgan xatolar
XatoXavfi
root sifatida ishlashKonteynerdan chiqish osonlashadi
--privilegedTo'liq xost huquqlari
Docker soketini ulashXostga to'liq kirish
latest tegiQaysi versiya ekani noma'lum
Sirlarni obrazga qo'yishObraz tarixida qoladi
Katta asosiy obrazKo'p zaiflik
Terminal
# Obrazni zaifliklarga tekshirish
docker scout cves dokon:1.0.0
trivy image dokon:1.0.0
Natija
dokon:1.0.0 (alpine 3.20.0)
=============================
Total: 3 (HIGH: 2, CRITICAL: 1)

┌────────────┬───────────────┬──────────┬─────────┬───────────────┐
│  Library   │ Vulnerability │ Severity │ Version │ Fixed Version │
├────────────┼───────────────┼──────────┼─────────┼───────────────┤
│ libcrypto3 │ CVE-2026-1234 │ CRITICAL │ 3.3.0   │ 3.3.1         │
└────────────┴───────────────┴──────────┴─────────┴───────────────┘

Yaxlitlik nazorati #

Terminal
# AIDE - fayl yaxlitligini kuzatish
sudo apt install aide
sudo aideinit
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# Tekshirish
sudo aide --check
Natija
Summary:
  Total number of entries:    42817
  Added entries:        0
  Removed entries:        0
  Changed entries:        2

Changed entries:
  f   ...    . : /etc/passwd
  f   ...    . : /usr/local/bin/backup.sh
Kutilmagan o'zgarish - buzilish belgisi

/etc/passwd o'zgarganini siz qilmagan bo'lsangiz - kimdir hisob qo'shgan bo'lishi mumkin.

Ma'lumotlar bazasini faqat o'qish muhitida saqlang - aks holda hujumchi uni ham o'zgartiradi.

Terminal
# Kunlik tekshiruv
echo "0 4 * * * root /usr/bin/aide --check | mail -s 'AIDE hisoboti' [email protected]" \
    | sudo tee /etc/cron.d/aide

Jurnal va audit #

Terminal
# auditd - tizim chaqiruvlarini kuzatish
sudo apt install auditd

# Muhim fayllarni kuzatish
sudo auditctl -w /etc/passwd -p wa -k parol_fayli
sudo auditctl -w /etc/shadow -p wa -k parol_fayli
sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_sozlama
sudo auditctl -w /var/www/dokon/.env -p wa -k ilova_sirlari

# Doimiy qoidalar
Natija
# /etc/audit/rules.d/xavfsizlik.rules
-w /etc/passwd -p wa -k parol_fayli
-w /etc/shadow -p wa -k parol_fayli
-w /etc/sudoers -p wa -k sudo_sozlama
-w /etc/sudoers.d/ -p wa -k sudo_sozlama

# Huquq oshirish urinishlari
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -F auid!=4294967295 -k huquq_oshirish

# Foydalanuvchi o'zgarishlari
-w /usr/sbin/useradd -p x -k foydalanuvchi_ozgarishi
-w /usr/sbin/userdel -p x -k foydalanuvchi_ozgarishi
Terminal
# Hisobot
sudo ausearch -k parol_fayli --start today
sudo aureport --summary

Zaxira nusxa #

Terminal
#!/bin/bash
# zaxira.sh
set -euo pipefail

SANA=$(date +%F_%H%M)
ZAXIRA=/zaxira
SAQLASH_KUN=30

# Ma'lumotlar bazasi
mysqldump --single-transaction --routines --triggers dokon \
    | gzip > "$ZAXIRA/db_${SANA}.sql.gz"

# Fayllar
tar -czf "$ZAXIRA/fayllar_${SANA}.tar.gz" \
    /var/www/dokon/storage/yuklamalar

# Sozlamalar
tar -czf "$ZAXIRA/sozlama_${SANA}.tar.gz" \
    /etc/nginx /etc/php /var/www/dokon/.env

# Shifrlash
for f in "$ZAXIRA"/*_"${SANA}".*; do
    gpg --encrypt --recipient [email protected] "$f"
    rm "$f"
done

# Masofaviy nusxa
rclone copy "$ZAXIRA" bulut:dokon-zaxira/ --include "*_${SANA}.*"

# Eskilarini tozalash
find "$ZAXIRA" -name "*.gpg" -mtime +$SAQLASH_KUN -delete

echo "Zaxira tayyor: $SANA"
Zaxira nusxa ham hujum nishoni

Zamonaviy ransomware avval zaxirani yo'q qiladi, keyin shifrlaydi.

Himoya:

  1. Oflayn nusxa - tarmoqqa ulanmagan
  2. O'zgartirilmaydigan saqlash (immutable storage)
  3. Zaxira serveri ilova serveridan kira olmasin (teskarisi bo'lsin)
  4. Zaxirani shifrlang
  5. Tiklashni sinang - tekshirilmagan zaxira zaxira emas
Terminal
# Tiklash mashqi - har oyda
mysql -u root -p sinov_baza < <(gpg --decrypt db_2026-08-15.sql.gz.gpg | gunzip)
mysql sinov_baza -e "SELECT COUNT(*) FROM buyurtmalar;"

Mustahkamlash tekshiruvi #

Terminal
# Lynis - avtomatik audit
sudo apt install lynis
sudo lynis audit system
Natija
  Hardening index : 68 [############        ]

  Suggestions:
  - Install a file integrity tool to monitor changes [FINT-4350]
  - Configure minimum password age [AUTH-9286]
  - Enable process accounting [ACCT-9622]
  - Harden compilers by restricting access [HRDN-7222]
Terminal
# CIS benchmark tekshiruvi
docker run --rm --net host --pid host --userns host --cap-add audit_control \
    -v /etc:/etc:ro -v /var/lib:/var/lib:ro \
    docker/docker-bench-security
Mustahkamlash indeksini oshiring

Lynis 0 dan 100 gacha baho beradi.

Yangi Ubuntu serveri odatda 55-65 ball oladi.

Asosiy choralar bilan 80+ ga chiqarish mumkin. 100 ga intilish shart emas - ba'zi tavsiyalar sizning holatingizga mos kelmasligi mumkin.

Windows xavfsizligi #

POWERSHELL
# Yangilanishlar holati
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10

# Ishlaydigan xizmatlar
Get-Service | Where-Object {$_.Status -eq 'Running'} | Select-Object Name, DisplayName

# Firewall
Get-NetFirewallProfile | Select-Object Name, Enabled

# Administrator guruhidagi foydalanuvchilar
Get-LocalGroupMember -Group "Administrators"

# BitLocker holati
Get-BitLockerVolume
POWERSHELL
# Xavfsizlik siyosati
# Parol murakkabligi
net accounts /minpwlen:12 /maxpwage:0 /lockoutthreshold:5

# SMBv1 ni o'chirish (WannaCry shu orqali tarqalgan)
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

# PowerShell jurnali
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" `
    -Name "EnableScriptBlockLogging" -Value 1

Server mustahkamlash ro'yxati #

Yangi server uchun
QadamBajarildi
Barcha paketlar yangilangan
Avtomatik xavfsizlik yangilanishlari yoqilgan
Keraksiz xizmatlar o'chirilgan
Firewall sozlangan
SSH: kalit bilan, root taqiqlangan
fail2ban o'rnatilgan
Alohida foydalanuvchi yaratilgan
sudo huquqlari cheklangan
Fayl huquqlari to'g'ri
.env fayli 600 huquqi bilan
Yadro parametrlari sozlangan
AppArmor/SELinux yoqilgan
systemd cheklovlari qo'llangan
auditd sozlangan
AIDE o'rnatilgan
Zaxira nusxa ishlaydi va sinovdan o'tgan
Monitoring va ogohlantirish sozlangan
NTP sozlangan (jurnal vaqti to'g'ri bo'lsin)
Terminal
#!/bin/bash
# tez-tekshiruv.sh

echo "=== Yangilanishlar ==="
apt list --upgradable 2>/dev/null | grep -c security || echo "0"

echo -e "\n=== Root ekvivalenti hisoblar ==="
awk -F: '($3 == 0) {print $1}' /etc/passwd

echo -e "\n=== Parolsiz hisoblar ==="
sudo awk -F: '($2 == "") {print $1}' /etc/shadow || echo "yo'q"

echo -e "\n=== 777 huquqli fayllar (/var/www) ==="
find /var/www -perm 0777 2>/dev/null | head

echo -e "\n=== SSH sozlamalari ==="
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication)'

echo -e "\n=== Firewall ==="
sudo ufw status | head -3

echo -e "\n=== Ishlaydigan xizmatlar soni ==="
systemctl list-units --type=service --state=running | grep -c '\.service'

echo -e "\n=== Oxirgi qayta ishga tushirish ==="
uptime -s
Amaliy topshiriq
  1. Virtual mashinada yangi Ubuntu server o'rnating.
  2. lynis audit system ishga tushiring va boshlang'ich bahoni yozing.
  3. Keraksiz xizmatlarni o'chiring.
  4. Avtomatik xavfsizlik yangilanishlarini yoqing.
  5. UID 0 bo'lgan hisoblarni tekshiring.
  6. Fayl huquqlarini to'g'rilang, .env ni 600 qiling.
  7. Yadro parametrlarini sozlang.
  8. systemd xizmat fayliga xavfsizlik cheklovlarini qo'shing va systemd-analyze security bilan bahoni ko'ring.
  9. AIDE o'rnating va boshlang'ich bazani yarating.
  10. lynis ni qayta ishga tushiring - baho qanchaga oshdi?

Xulosa #

  • Mustahkamlash - keraksiz komponentalarni olib tashlash.
  • Minimal o'rnatishdan boshlang, keyin kerakligini qo'shing.
  • UID 0 faqat root bo'lsin - boshqasi backdoor belgisi.
  • sudo da aniq buyruqlar ro'yxatini bering.
  • chmod 777 hech qachon to'g'ri yechim emas.
  • Avtomatik xavfsizlik yangilanishlari - eng samarali chora.
  • systemd cheklovlari jarayonni izolyatsiya qiladi.
  • AppArmor/SELinux root ni ham cheklaydi.
  • Konteynerda root sifatida ishlamang, imkoniyatlarni olib tashlang.
  • AIDE kutilmagan fayl o'zgarishlarini aniqlaydi.
  • Zaxira nusxa ham hujum nishoni - oflayn nusxa saqlang.
  • Lynis bilan mustahkamlash darajasini o'lchang va oshiring.

Keyingi bo'limda veb-ilovalar xavfsizligini ko'ramiz.

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.