Tarmoq izolyatsiyasi — nimani tashqariga ochish kerak

~10 daq · Docker · Tarmoq

Muammodan boshlaylik

Haqiqiy voqealar asosida: VPS serverda loyiha. Dasturchi qulaylik uchun hammasini ochdi:

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d -p 6379:6379 redis
docker run -d -p 27017:27017 mongo

Bir hafta ichida: MySQL dagi barcha jadvallar o'chirilgan, o'rniga bitta jadval — "Ma'lumotlaringizni qaytarish uchun 0.05 BTC to'lang". Redis orqali serverga kripto-mayner o'rnatilgan.

Internetni 24/7 avtomatik skanerlaydigan botlar ochiq 3306, 6379, 27017 portlarni daqiqalar ichida topadi.


Asosiy qoida

Tashqariga faqat foydalanuvchi to'g'ridan-to'g'ri kirishi kerak bo'lgan narsa ochiladi.

Odatiy veb-loyihada bu — faqat 80 va 443 (Nginx / Caddy, reverse proxy — 37-dars).

Xizmat Tashqariga ochiqmi
Reverse proxy (Nginx, Caddy, Traefik) ✅ 80, 443
API, backend ❌ — proxy orqali
Baza (MySQL, PostgreSQL, MongoDB) ❌ Hech qachon
Redis, RabbitMQ ❌ Hech qachon
Admin panellar (Adminer, pgAdmin) ❌ — kerak bo'lsa SSH tunnel orqali

Uch daraja himoya

1. Portni umuman ochmang

docker run -d --name baza --network dokon-net mysql:8.4      # -p yo'q

Baza faqat Docker tarmog'i ichida (24-dars). Eng xavfsiz.

2. Faqat lokal

Kompyuterdan (masalan, GUI mijoz bilan) ulanish kerak bo'lsa:

-p 127.0.0.1:3306:3306

Tashqi tarmoqdan — yetib bo'lmaydi.

3. Firewall — lekin Docker uni chetlab o'tadi

[!WARNING] Linux da Docker port qoidalarini to'g'ridan-to'g'ri iptables ga yozadi va UFW ni chetlab o'tadi (9-dars). ufw deny 3306 — -p 3306:3306 bilan ochilgan konteynerni himoya qilmaydi. Firewall ga tayanmang — portni ochmang yoki 127.0.0.1: bilan oching.

Bulut provayderining firewall i (AWS Security Groups, DigitalOcean Cloud Firewall, Hetzner Firewall) server tashqarisida ishlaydi va Docker ni chetlab o'tmaydi — qo'shimcha qatlam sifatida yoqing: faqat 22, 80, 443.


Serverdagi bazaga qanday ulanish kerak

Baza porti yopiq. Lekin siz kompyuteringizdan (DBeaver, Workbench) unga ulanmoqchisiz. Yechim — SSH tunnel:

ssh -L 3307:localhost:3306 foydalanuvchi@server-ip

Endi kompyuteringizdagi localhost:3307 → shifrlangan SSH orqali → serverning localhost:3306 ga. Serverda baza -p 127.0.0.1:3306:3306 bilan ochilgan bo'lishi kerak.

Ko'p GUI vositalarda (DBeaver, TablePlus, Workbench) "SSH tunnel" sozlamasi bor — buyruq yozmasdan.


Konteyner ichidan chiqish

Izolyatsiya ikki tomonlama:

docker network create --internal baza-net

--internal (24-dars) — tarmoqdagi konteynerlar internetga chiqa olmaydi. Baza buzilsa ham — hujumchi ma'lumotni tashqariga yubora olmaydi, qo'shimcha zararli dastur yuklab ololmaydi.


Tekshirish ro'yxati

Serverda:

docker ps --format "table {{.Names}}\t{{.Ports}}"
NAMES    PORTS
nginx    0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp      ✅
api      3000/tcp                                       ✅ (faqat ichki)
baza     3306/tcp                                       ✅ (faqat ichki)
redis    127.0.0.1:6379->6379/tcp                       ✅ (faqat lokal)

0.0.0.0:3306 yoki 0.0.0.0:6379 ko'rsangiz — darhol tuzating.

Tashqaridan tekshirish (boshqa kompyuterdan):

nc -zv server-ip 3306
# Connection refused / timed out — ✅ yopiq

Qo'shimcha qatlamlar

  • Bazalarga kuchli parollar — "123456" yoki "root" emas, hatto ichki tarmoqda ham
  • Redis — requirepass bilan
  • Ilova uchun — root emas, cheklangan huquqli baza foydalanuvchisi (MySQL kursi 50-dars)
  • Image larni yangilab turish — zaifliklar tuzatiladi (39-dars)

Nima uchun shunday?

Nima uchun "ichki tarmoqdagi baza" ham kuchli parolga muhtoj?

Chunki xavfsizlik — qatlamlar (defense in depth). Har bir qatlam ertami-kechmi teshilishi mumkin: API da zaiflik topiladi va hujumchi API konteyneri ichida bo'ladi — endi u ichki tarmoqda, bazaga yeta oladi. Agar baza paroli "root" bo'lsa — keyingi qatlam yo'q. Agar kuchli parol va cheklangan huquqli foydalanuvchi bo'lsa — hujumchi faqat ilova ko'ra oladigan narsani ko'radi. Har bir qatlam hujumni qiyinlashtiradi va vaqt yutadi.


Xulosa

Eslab qoling:

  • Tashqariga — faqat 80/443 (reverse proxy)
  • Baza, Redis, admin panellar — hech qachon 0.0.0.0 da
  • Portni ochmang → yoki 127.0.0.1: → firewall ga tayanmang (Docker UFW ni chetlab o'tadi)
  • Bulut firewall — qo'shimcha qatlam: 22, 80, 443
  • Serverdagi bazaga — SSH tunnel
  • --internal — internetga chiqishsiz
  • docker ps da 0.0.0.0:3306 — darhol tuzating
  • Ichki tarmoqda ham kuchli parollar

Keyingi dars

26-dars: Docker Compose nima — bir buyruqda butun loyiha