Skip to content
VDS · ڈیٹا بیس

ڈیٹا بیس میں صارفین اور اجازتیں

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 اجازتوں والی سروس انوائرنمنٹ فائل میں محفوظ کریں۔ اگر افشا ہو جائیں تو آپ ایک لائن تبدیل کر کے ری اسٹارٹ کرتے ہیں، پورا پروجیکٹ دوبارہ نہیں بناتے۔