ڈیٹا بیس میں صارفین اور اجازتیں
MySQL اور PostgreSQL میں ہر ایپلیکیشن کے لیے الگ صارف کیسے بنائیں، کم سے کم اجازتیں کیسے دیں، اور تصدیق کیسے کریں کہ کوئی اضافی اجازت نہیں دی گئی۔
اپ ڈیٹ 23 اگست، 2026
root یا postgres کے طور پر چلنے والی ایپلیکیشن پہلی کمزوری پر مشین کے تمام ڈیٹا بیس حملہ آور کے حوالے کر دیتی ہے۔ اپنے اسکیما تک محدود مراعات رکھنے والا مخصوص صارف نقصان کو صرف ایک پروجیکٹ تک محدود رکھتا ہے۔
MySQL اور MariaDB
یہاں صارف "نام اور ہوسٹ" کا جوڑا ہوتا ہے، اور یہی الجھن کی بنیادی وجہ ہے:
CREATE USER 'shop'@'localhost' IDENTIFIED BY 'long-random-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';
FLUSH PRIVILEGES;
'shop'@'localhost' اور 'shop'@'%' مختلف پاس ورڈز کے ساتھ دو الگ صارفین ہیں۔ ضرورت کے بغیر ہوسٹ % کے ساتھ ریکارڈ نہ بنائیں: یہ کسی بھی ایڈریس سے لاگ ان کی اجازت دیتا ہے۔
ڈھانچے پر مراعات صرف مائیگریشن کے دوران درکار ہوتی ہیں:
GRANT CREATE, ALTER, DROP, INDEX, REFERENCES ON shop.* TO 'shop_migrate'@'localhost';
ایپلیکیشن رول اور مائیگریشن رول کو الگ رکھنا اچھا عمل ہے: پھر ایک عام کوئری جسمانی طور پر ٹیبل ڈراپ نہیں کر سکتی۔
جانچیں:
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'shop'@'localhost';
پاس ورڈ تبدیل کرنا اور حذف کرنا:
ALTER USER 'shop'@'localhost' IDENTIFIED BY 'new-password';
DROP USER 'shop'@'localhost';
PostgreSQL
رول اور ڈیٹا بیس و اسکیما پر اس کی مراعات:
CREATE ROLE shop WITH LOGIN PASSWORD 'long-random-password';
CREATE DATABASE shop OWNER shop;
REVOKE ALL ON DATABASE shop FROM PUBLIC;
صرف پڑھنے والے رول کے لیے (رپورٹس، اینالیٹکس، مانیٹرنگ پینل):
CREATE ROLE reader WITH LOGIN PASSWORD '...';
GRANT CONNECT ON DATABASE shop TO reader;
GRANT USAGE ON SCHEMA public TO reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO reader;
آخری لائن لازمی ہے: اس کے بغیر رول کو مراعات دینے کے بعد بننے والے ٹیبل نظر نہیں آئیں گے، اور ایک مہینے بعد رپورٹس نئے ڈیٹا پر خراب ہو جائیں گی۔
جانچیں:
\du
\l
\dp
کیا چیز لازمی محفوظ کرنی ہے
- کوئی بھی ایپلیکیشن رول سپر یوزر نہ ہو۔
- ہر پروجیکٹ کا اپنا ڈیٹا بیس اور اپنا صارف ہو۔
- پاس ورڈز طویل اور بے ترتیب ہوں، اور مختلف پروجیکٹس کے لیے مختلف ہوں۔
- بیرونی لاگ ان صرف انہی ایڈریسز کے لیے اجازت یافتہ ہو جنہیں اس کی ضرورت ہو — ریموٹ رسائی۔
- MySQL میں کوئی گمنام صارف اور کوئی ٹیسٹ ڈیٹا بیس نہ ہو:
mariadb-secure-installationیہ کام کرتا ہے۔
عام غلطیاں
| علامت | وجہ |
|---|---|
درست پاس ورڈ کے باوجود Access denied | کوئی دوسرا ہوسٹ رول مماثل ہو گیا، مثلاً ''@'localhost' |
مراعات دی گئیں، مگر SELECT کام نہیں کرتا | PostgreSQL میں USAGE ON SCHEMA موجود نہیں |
| نیا ٹیبل رول کو نظر نہیں آتا | DEFAULT PRIVILEGES سیٹ نہیں ہیں |
| ناکام مائیگریشن کے دوران ایپلیکیشن نے سب کچھ حذف کر دیا | ایپلیکیشن رول کے پاس DROP مراعات تھیں |
| پاس ورڈ کمانڈ ہسٹری میں نظر آتا ہے | پاس ورڈز فائل سے سیٹ کریں، ~/.mysql_history صاف کریں |
ڈیٹا بیس کے پاس ورڈز کوڈ میں نہیں بلکہ
600اجازتوں والی سروس انوائرنمنٹ فائل میں محفوظ کریں۔ اگر افشا ہو جائیں تو آپ ایک لائن تبدیل کر کے ری اسٹارٹ کرتے ہیں، پورا پروجیکٹ دوبارہ نہیں بناتے۔