User yaratish, GRANT, REVOKE — huquqlarni boshqarish

~20 daq · MySQL · Xavfsizlik va Boshqaruv

Muammodan boshlaylik

Sayt root foydalanuvchisi bilan bazaga ulanadi. Qulay — hamma narsaga ruxsat bor. Bir kuni saytda SQL injection zaifligi topildi (51-dars). Hujumchi root huquqlari bilan:

  • Barcha bazalarni o'qidi — nafaqat do'kon, balki shu serverdagi buxgalteriya bazasini ham
  • DROP DATABASE qildi
  • O'zi uchun yangi admin foydalanuvchi yaratdi — zaiflik tuzatilgandan keyin ham kira oladi

Agar sayt faqat dokon bazasidagi SELECT, INSERT, UPDATE, DELETE huquqiga ega bo'lsa — zarar ancha kichik bo'lardi.

Bu eng kam huquq tamoyili (principle of least privilege): har bir foydalanuvchi va ilova faqat o'z ishi uchun zarur bo'lgan huquqlarga ega bo'lsin.


Foydalanuvchi yaratish

CREATE USER 'dokon_app'@'localhost' IDENTIFIED BY 'Kuchli_Parol_2026!';

MySQL da foydalanuvchi — ism + host juftligi:

Host Ma'nosi
'localhost' Faqat shu serverning o'zidan
'192.168.1.50' Faqat shu IP dan
'192.168.1.%' Shu tarmoqdagi istalgan IP dan
'%' Istalgan joydan

'dokon_app'@'localhost' va 'dokon_app'@'%' — ikki xil foydalanuvchi, turli parol va huquqlar bilan.

[!WARNING] '%' — "butun internet". Baza serveri internetga ochiq bo'lsa — botlar parolni kuniga millionlab marta tanlashga urinadi. Ilova serveri IP sini aniq yozing yoki tarmoq maskasini ishlating, va MySQL portini (3306) firewall da yoping.


GRANT — huquq berish

GRANT SELECT, INSERT, UPDATE, DELETE ON dokon.* TO 'dokon_app'@'localhost';

Tuzilishi: GRANT huquqlar ON qayerga TO kimga.

Darajalar

GRANT ... ON *.*              TO ...;   -- butun server (xavfli!)
GRANT ... ON dokon.*          TO ...;   -- bitta baza, barcha jadvallar
GRANT ... ON dokon.mijozlar   TO ...;   -- bitta jadval
GRANT SELECT (id, shahar) ON dokon.mijozlar TO ...;   -- faqat ba'zi ustunlar
GRANT EXECUTE ON PROCEDURE dokon.buyurtma_berish TO ...;   -- bitta procedure

Asosiy huquqlar

Huquq Nima beradi
SELECT O'qish
INSERT, UPDATE, DELETE Yozish
CREATE, ALTER, DROP Jadval tuzilmasini o'zgartirish
INDEX Indeks yaratish/o'chirish
EXECUTE Procedure va function chaqirish
CREATE VIEW, TRIGGER, EVENT Mos ob'ektlarni yaratish
ALL PRIVILEGES Hammasi (GRANT OPTION dan tashqari)
GRANT OPTION Boshqalarga huquq berish

Tipik foydalanuvchilar to'plami

-- 1. Ilova — faqat ma'lumot bilan ishlash
CREATE USER 'dokon_app'@'10.0.0.%' IDENTIFIED BY '...';
GRANT SELECT, INSERT, UPDATE, DELETE ON dokon.* TO 'dokon_app'@'10.0.0.%';

-- 2. Migratsiyalar — tuzilmani o'zgartirish (faqat deploy paytida)
CREATE USER 'dokon_migrate'@'10.0.0.%' IDENTIFIED BY '...';
GRANT ALL PRIVILEGES ON dokon.* TO 'dokon_migrate'@'10.0.0.%';

-- 3. Analitik — faqat o'qish, shaxsiy ma'lumotsiz
CREATE USER 'analitik'@'%' IDENTIFIED BY '...';
GRANT SELECT ON dokon.buyurtmalar TO 'analitik'@'%';
GRANT SELECT ON dokon.mahsulotlar TO 'analitik'@'%';
GRANT SELECT ON dokon.mijozlar_analitika TO 'analitik'@'%';   -- VIEW, 40-dars

-- 4. Backup — faqat o'qish va qulflash
CREATE USER 'backup'@'localhost' IDENTIFIED BY '...';
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT, PROCESS ON *.* TO 'backup'@'localhost';

Hujumchi sayt orqali kirsa — DROP qila olmaydi, boshqa bazalarni ko'ra olmaydi, foydalanuvchi yarata olmaydi.


Huquqlarni ko'rish va olib tashlash

SHOW GRANTS FOR 'dokon_app'@'localhost';
-- GRANT USAGE ON *.* TO `dokon_app`@`localhost`
-- GRANT SELECT, INSERT, UPDATE, DELETE ON `dokon`.* TO `dokon_app`@`localhost`

SHOW GRANTS;   -- o'zingizniki

REVOKE DELETE ON dokon.* FROM 'dokon_app'@'localhost';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'eski_xodim'@'%';

USAGE — "hech qanday huquq yo'q, faqat ulanish".

Barcha foydalanuvchilar:

SELECT user, host, account_locked, password_last_changed FROM mysql.user;

Rollar (MySQL 8.0+)

Ko'p foydalanuvchiga bir xil huquqlar to'plami kerak bo'lsa — rol:

CREATE ROLE 'oqish_roli', 'yozish_roli';

GRANT SELECT ON dokon.* TO 'oqish_roli';
GRANT INSERT, UPDATE, DELETE ON dokon.* TO 'yozish_roli';

-- Foydalanuvchilarga rol berish
GRANT 'oqish_roli' TO 'analitik1'@'%', 'analitik2'@'%';
GRANT 'oqish_roli', 'yozish_roli' TO 'dokon_app'@'localhost';

-- Ulanganda rollar avtomatik faollashsin
SET DEFAULT ROLE ALL TO 'analitik1'@'%', 'analitik2'@'%', 'dokon_app'@'localhost';

Yangi analitik keldi — bitta GRANT 'oqish_roli'. Rolga yangi jadval qo'shildi — hamma analitiklar avtomatik oladi.

[!WARNING] SET DEFAULT ROLE ni unutmang. Busiz foydalanuvchi rolga ega bo'ladi, lekin ulanganda u faol emas — har safar SET ROLE ALL; qilish kerak. "Huquq berdim, lekin ishlamayapti" ning eng ko'p sababi.


Foydalanuvchini boshqarish

-- Parolni o'zgartirish
ALTER USER 'dokon_app'@'localhost' IDENTIFIED BY 'Yangi_Parol!';

-- Vaqtincha bloklash (o'chirmasdan)
ALTER USER 'eski_xodim'@'%' ACCOUNT LOCK;
ALTER USER 'eski_xodim'@'%' ACCOUNT UNLOCK;

-- Parol muddati
ALTER USER 'analitik'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;

-- Bir vaqtdagi ulanishlar chegarasi
ALTER USER 'analitik'@'%' WITH MAX_USER_CONNECTIONS 5;

-- O'chirish
DROP USER 'eski_xodim'@'%';

MAX_USER_CONNECTIONS — analitikning og'ir so'rovlari saytni "yeb qo'ymasligi" uchun.


root ni himoyalash

  • root ni hech qachon ilova uchun ishlatmang
  • root faqat localhost dan: 'root'@'%' bo'lmasin
  • mysql_secure_installation — o'rnatgandan keyin darhol (2-dars)
  • Shaxsiy admin foydalanuvchilar — har bir DBA uchun alohida, root emas. Kim nima qilganini bilish uchun

Parollarni saqlash

Ilova bazaga ulanish uchun parolni biladi. Uni qayerda saqlash kerak?

❌ Kodda:            $pdo = new PDO($dsn, 'dokon_app', 'Kuchli_Parol_2026!');
❌ Git dagi faylda:  config.php
✅ Muhit o'zgaruvchisida yoki .env da (Git dan tashqarida)
✅ Secret manager: AWS Secrets Manager, HashiCorp Vault, Docker secrets

Parol Git ga bir marta tushsa — tarixdan o'chirib bo'lmaydi deb hisoblang va parolni almashtiring.


Nima uchun shunday?

Nima uchun MySQL foydalanuvchini faqat ism bilan emas, ism + host bilan aniqlaydi?

Chunki bir xil odam yoki ilova turli joydan turli huquqlar bilan kirishi kerak bo'lishi mumkin. Admin serverning o'zidan (localhost) — to'liq huquq bilan; ofis tarmog'idan — faqat o'qish bilan; tashqaridan — umuman yo'q. Host ni hisobga olish — qo'shimcha himoya qatlami: hatto parol o'g'irlansa ham, hujumchi ruxsat berilmagan IP dan kira olmaydi.


Xulosa

Eslab qoling:

  • Eng kam huquq tamoyili: har biri faqat o'ziga keragini oladi
  • Foydalanuvchi = 'ism'@'host'; '%' dan ehtiyot bo'ling
  • GRANT huquqlar ON baza.jadval TO foydalanuvchi; REVOKE ... FROM ...
  • Ilova — SELECT, INSERT, UPDATE, DELETE faqat o'z bazasiga; DROP, ALTER yo'q
  • Migratsiya, analitika, backup — alohida foydalanuvchilar
  • Rollar: CREATE ROLE, GRANT rol TO user, SET DEFAULT ROLE ALL
  • root — faqat localhost, hech qachon ilovada
  • Parol — kodda va Git da emas

Keyingi dars

51-dars: SQL Injection — qanday ishlaydi, qanday himoyalanish