User yaratish, GRANT, REVOKE — huquqlarni boshqarish
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 DATABASEqildi- 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 ROLEni unutmang. Busiz foydalanuvchi rolga ega bo'ladi, lekin ulanganda u faol emas — har safarSET 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
rootni hech qachon ilova uchun ishlatmangrootfaqatlocalhostdan:'root'@'%'bo'lmasinmysql_secure_installation— o'rnatgandan keyin darhol (2-dars)- Shaxsiy admin foydalanuvchilar — har bir DBA uchun alohida,
rootemas. 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, DELETEfaqat o'z bazasiga;DROP,ALTERyo'q - Migratsiya, analitika, backup — alohida foydalanuvchilar
- Rollar:
CREATE ROLE,GRANT rol TO user,SET DEFAULT ROLE ALL root— faqatlocalhost, hech qachon ilovada- Parol — kodda va Git da emas
Keyingi dars
51-dars: SQL Injection — qanday ishlaydi, qanday himoyalanish