آن پروژه‌ای که با یک کاربر دیتابیس نجات پیدا کرد

چند سال پیش، در یکی از پروژه‌های پاک‌سازی، سایت مشتری به‌دلیل یک آسیب‌پذیری SQL Injection هک شد. مهاجم از حساب کاربری دیتابیس استفاده کرد که دسترسی کامل به تمام جداول داشت. اگر آن حساب کاربری بر اساس اصل کمترین امتیاز تنظیم شده بود، مهاجم فقط می‌توانست به بخشی از داده‌ها دسترسی داشته باشد. آن روز برای من روشن شد که مدیریت صحیح کاربران و دسترسی‌های دیتابیس، بخشی حیاتی از امنیت هر سایت است. اگر با مفاهیم پایه آشنا نیستید، پیشنهاد می‌کنم ابتدا امنیت دیتابیس چیست و چرا مهم است را بخوانید.

چرا مدیریت کاربران دیتابیس مهم است؟

دیتابیس، قلب هر سایت است. تمام داده‌های حیاتی شامل اطلاعات کاربران، سفارش‌ها، محتوا و تنظیمات در دیتابیس ذخیره می‌شوند. اگر دسترسی‌های دیتابیس به‌درستی مدیریت نشوند، یک نفوذ ساده می‌تواند به فاجعه تبدیل شود. مدیریت کاربران و دسترسی‌ها به دلایل زیر مهم است:

  • کاهش سطح حمله
  • جلوگیری از نفوذ گسترده
  • محدودسازی خسارت در صورت نفوذ
  • انطباق با استانداردهای امنیتی
  • ردیابی فعالیت‌های مشکوک
  • جداسازی وظایف
  • حفاظت از داده‌های حساس
  • کاهش خطر از دست رفتن داده

اصل کمترین امتیاز

اصل کمترین امتیاز یا Principle of Least Privilege (PoLP)، یکی از اصول پایه امنیت است. بر اساس این اصل، هر کاربر باید فقط حداقل دسترسی‌های لازم برای انجام وظایف خود را داشته باشد. در دیتابیس، این اصل به این معنی است که هر کاربر فقط به جداول و عملیات موردنیاز خود دسترسی داشته باشد.

مثال‌های اجرای این اصل:

  • کاربر اپلیکیشن وب فقط به دیتابیس اپلیکیشن دسترسی داشته باشد.
  • کاربر خواندنِ گزارش‌ها فقط دسترسی SELECT داشته باشد.
  • کاربر پشتیبان‌گیری فقط دسترسی خواندن داشته باشد.
  • کاربر API فقط به جداول خاصی دسترسی داشته باشد.
  • کاربر مدیر سیستم دسترسی کامل داشته باشد اما فقط در شرایط ضروری.

انواع کاربران دیتابیس

در یک سیستم معمول، چند نوع کاربر دیتابیس وجود دارد:

  • کاربر اپلیکیشن: کاربری که اپلیکیشن با آن به دیتابیس متصل می‌شود.
  • کاربر مدیریت: کاربری برای مدیریت دیتابیس و ایجاد کاربران.
  • کاربر پشتیبان‌گیری: کاربری برای انجام عملیات بکاپ.
  • کاربر گزارش‌گیری: کاربری برای خواندن داده‌ها و گزارش‌گیری.
  • کاربر توسعه: کاربری برای توسعه‌دهندگان با محدودیت‌های خاص.
  • کاربر خواندن: کاربری با دسترسی فقط خواندن برای سرویس‌های خاص.
  • کاربر انبار داده: کاربری برای ETL و انتقال داده.
  • کاربر مانیتورینگ: کاربری برای پایش عملکرد دیتابیس.

هرکدام از این کاربران باید دسترسی‌های خودشان را داشته باشند.

ایجاد کاربر جدید در MySQL

ایجاد کاربر جدید در MySQL با دستور CREATE USER انجام می‌شود:

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';

نکات مهم:

  • نام کاربری باید مشخص و غیرقابل حدس باشد.
  • رمز عبور باید قوی باشد (حداقل ۱۲ کاراکتر).
  • دامنه یا IP باید مشخص شود (localhost یا IP خاص).
  • در محیط تولید، هرگز از ‎% به‌عنوان Host استفاده نکنید.
  • برای هر اپلیکیشن، کاربر جداگانه ایجاد کنید.

در سایت‌های وردپرسی، کاربر دیتابیس معمولاً با پیشوند wp_ و نام دلخواه ساخته می‌شود. راهنمای امن‌سازی در چگونه دیتابیس وردپرس را امن کنیم آمده است.

تخصیص دسترسی‌ها (GRANT)

پس از ایجاد کاربر، با دستور GRANT دسترسی‌ها تخصیص داده می‌شوند. مثالی از تخصیص دسترسی محدود:

GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.posts TO 'app_user'@'localhost';

انواع دسترسی‌های رایج:

  • SELECT: خواندن داده‌ها.
  • INSERT: درج داده‌های جدید.
  • UPDATE: به‌روزرسانی داده‌ها.
  • DELETE: حذف داده‌ها.
  • CREATE: ایجاد جداول و دیتابیس.
  • DROP: حذف جداول و دیتابیس.
  • ALTER: تغییر ساختار جداول.
  • INDEX: ایجاد و حذف ایندکس.
  • EXECUTE: اجرای Procedureها.
  • CREATE VIEW: ایجاد View.

در محیط تولید، هرگز دسترسی ALL PRIVILEGES را به کاربر اپلیکیشن ندهید. این دسترسی، سطح حمله را به‌شدت افزایش می‌دهد.

اصل کمترین امتیاز در عمل

برای اجرای اصل کمترین امتیاز در عمل:

  • کاربر اپلیکیشن فقط به جداول موردنیاز دسترسی داشته باشد.
  • عملیات DROP و ALTER فقط برای کاربر مدیریت باشد.
  • کاربر پشتیبان‌گیری فقط دسترسی SELECT داشته باشد.
  • کاربر API فقط به جداول خاص دسترسی داشته باشد.
  • دسترسی به دیتابیس‌های سیستمی (mysql، information_schema) محدود شود.
  • دسترسی به دیتابیس‌های دیگر سرور محدود شود.
  • دسترسی CREATE USER فقط برای مدیر سیستم باشد.
  • دسترسی FILE محدود به موارد ضروری باشد.
  • دسترسی SHUTDOWN محدود باشد.
  • دسترسی PROCESS محدود باشد.

با رعایت این اصول، حتی در صورت نفوذ، مهاجم نمی‌تواند به کل دیتابیس دسترسی پیدا کند. راهنمای کامل در بهترین روش‌های امنیت MySQL کدامند آمده است.

مدیریت رمز عبور کاربران دیتابیس

رمز عبور کاربران دیتابیس باید امن باشد:

  • حداقل 16 کاراکتر
  • ترکیب حروف بزرگ و کوچک، اعداد و کاراکترهای ویژه
  • یکتا برای هر کاربر
  • ذخیره در Password Manager یا Vault
  • تغییر دوره‌ای در صورت نشت
  • عدم ذخیره در کد یا فایل‌های قابل دسترس
  • استفاده از متغیرهای محیطی
  • عدم به‌اشتراک‌گذاری بین کاربران
  • عدم استفاده در محیط‌های توسعه
  • پایش استفاده غیرعادی

برای رمز عبور دیتابیس وردپرس، این رمز در فایل wp-config.php ذخیره می‌شود. راهنمای امن‌سازی این فایل در چگونه فایل wp-config را امن کنیم آمده است.

## محدودسازی دسترسی از راه دور

یکی از جنبه‌های مهم مدیریت کاربران دیتابیس، محدودسازی دسترسی از راه دور است. به‌طور پیش‌فرض، MySQL فقط از localhost دسترسی می‌دهد. اما در برخی سناریوها، نیاز به دسترسی از راه دور وجود دارد. برای محدودسازی:

  • دسترسی از راه دور را فقط به IPهای خاص محدود کنید.
  • از VPN استفاده کنید.
  • فایروال را طوری تنظیم کنید که فقط IPهای معتبر به پورت 3306 دسترسی داشته باشند.
  • از SSL/TLS برای ارتباطات استفاده کنید.
  • دسترسی از راه دور را برای کاربران اپلیکیشن محدود کنید.
  • دسترسی از راه دور را برای کاربران مدیریت حذف کنید.

راهنمای کامل در چگونه دسترسی خارجی به دیتابیس را محدود کنیم آمده است.

پایش و حسابرسی دسترسی‌ها

پایش دسترسی‌ها بخشی حیاتی از مدیریت کاربران دیتابیس است:

  • لاگ‌های اتصال را بررسی کنید.
  • لاگ‌های عملیات را پایش کنید.
  • فعالیت‌های غیرعادی را شناسایی کنید.
  • دسترسی‌های غیرضروری را حذف کنید.
  • حساب‌های غیرفعال را حذف کنید.
  • دسترسی‌های موقت را ابطال کنید.
  • دسترسی‌های افزوده‌شده را ثبت کنید.
  • لاگ‌ها را در جای امن نگه دارید.

راهنمای کامل در لاگ‌های دیتابیس چگونه بررسی می‌شوند آمده است. رعایت این اصول، به شناسایی سریع فعالیت‌های مشکوک کمک می‌کند.

حذف کاربران غیرضروری

حذف کاربران غیرضروری، بخشی از مدیریت دوره‌ای دیتابیس است:

  • حساب‌های تستی که فراموش شده‌اند
  • حساب‌های کارکنان خارج‌شده
  • حساب‌های اپلیکیشن‌های حذف‌شده
  • حساب‌های موقت که منقضی شده‌اند
  • حساب‌های اپلیکیشن‌های قدیمی
  • حساب‌های پیش‌فرض MySQL مثل anonymous

دستور حذف کاربر:

DROP USER 'old_user'@'localhost';

بررسی دوره‌ای لیست کاربران، از نشت داده جلوگیری می‌کند.

کاربران پیش‌فرض MySQL و خطرات آن‌ها

MySQL به‌طور پیش‌فرض چند کاربر ایجاد می‌کند که باید مدیریت شوند:

  • root@localhost: کاربر مدیریت اصلی که باید رمز قوی داشته باشد.
  • anonymous: کاربر ناشناس که باید حذف شود.
  • root@%: در برخی نصب‌ها، کاربر root با دسترسی از راه دور که باید محدود شود.
  • کاربران تستی: که باید حذف شوند.

در نصب‌های وردپرس، معمولاً یک کاربر دیتابیس برای اپلیکیشن ساخته می‌شود. امن‌سازی این کاربر و مدیریت دسترسی‌هایش، بخشی از امنیت کلی سایت است. راهنمای جامع در راهنمای امنیت وردپرس برای مبتدیان آمده است.

تغییر رمز عبور کاربران دیتابیس

تغییر رمز عبور به دلایل زیر ضروری است:

  • نشت احتمالی رمز عبور
  • ترک سازمان توسط کارمند
  • تغییر سیاست امنیتی
  • دوره‌ای بر اساس سیاست سازمانی
  • پس از هر حادثه امنیتی

دستور تغییر رمز عبور:

ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewStrongPassword456!';

پس از تغییر رمز، باید فایل تنظیمات اپلیکیشن نیز به‌روزرسانی شود.

مدیریت دسترسی‌ها در محیط‌های مختلف

در محیط‌های مختلف توسعه، دسترسی‌ها متفاوت هستند:

  • محیط توسعه (Development): دسترسی بیشتر برای تست.
  • محیط تست (Staging): دسترسی مشابه تولید.
  • محیط تولید (Production): دسترسی حداقلی برای امنیت.
  • محیط پشتیبان‌گیری: دسترسی خواندن.
  • محیط گزارش‌گیری: دسترسی خواندن از Viewها.
  • محیط انبار داده: دسترسی خواندن از جداول مشخص.

در محیط تولید، همیشه از کمترین امتیاز ممکن استفاده کنید.

Backup و بازیابی کاربران

از لیست کاربران و دسترسی‌ها باید بکاپ تهیه شود:

  • ذخیره لیست کاربران و دسترسی‌ها در جای امن
  • بکاپ دوره‌ای تنظیمات دسترسی
  • امکان بازیابی سریع در صورت حادثه
  • مستندسازی دقیق هر کاربر

راهنمای کامل در چگونه از دیتابیس وردپرس بکاپ بگیریم و پشتیبان‌گیری امن از دیتابیس چگونه است آمده است. اصول کلی مدیریت امنیت در چگونه امنیت وب‌سایت را افزایش دهیم آمده است.

ابزارهای مدیریت کاربران دیتابیس

ابزارهای مفید برای مدیریت کاربران دیتابیس:

  • phpMyAdmin: رابط وب برای مدیریت MySQL.
  • MySQL Workbench: ابزار رسمی MySQL برای مدیریت.
  • Adminer: ابزار سبک مدیریت دیتابیس.
  • Sequel Pro: ابزار مدیریت MySQL برای macOS.
  • DBeaver: ابزار مدیریت دیتابیس چندمنظوره.
  • DataGrip: ابزار JetBrains برای دیتابیس.
  • CLI: خط فرمان MySQL برای مدیریت مستقیم.

مستندات ویکی‌پدیا در مورد Database security اطلاعات فنی خوبی ارائه می‌دهد. اصول پایه امنیت وب در امنیت وب چیست و چه اصولی دارد آمده است. بررسی تخصصی حمله SQL Injection در تزریق SQL چیست و چگونه دفع می‌شود و SQL Injection چیست و چگونه جلوگیری کنیم آمده است.

پرسش‌های پرتکرار دربارهٔ مدیریت کاربران دیتابیس

چند کاربر دیتابیس باید داشته باشم؟ برای هر اپلیکیشن یا سرویس، کاربر جداگانه. حداقل دو کاربر: یکی برای اپلیکیشن و یکی برای مدیریت.

آیا کاربر root باید فعال باشد؟ کاربر root باید فعال باشد اما دسترسی از راه دور آن باید محدود شود و رمز عبور قوی داشته باشد.

آیا باید از کاربر ALL PRIVILEGES استفاده کنم؟ خیر، مگر برای کاربر مدیریت که فقط در شرایط ضروری از آن استفاده می‌شود.

چند وقت یک بار باید دسترسی‌ها را بررسی کنم؟ حداقل هر سه ماه یک بار. برای سازمان‌های بزرگ، ماهانه.

آیا می‌توانم رمز عبور دیتابیس را در کد ذخیره کنم؟ خیر. از متغیرهای محیطی یا فایل‌های پیکربندی محافظت‌شده استفاده کنید.

چطور بفهمم کاربری غیرمجاز به دیتابیس دسترسی دارد؟ با پایش لاگ‌های اتصال و بررسی دوره‌ای لیست کاربران.

آیا باید از SSL برای ارتباط دیتابیس استفاده کنم؟ در محیط‌هایی که ترافیک بین اپلیکیشن و دیتابیس از شبکه می‌گذرد، بله.

سخن آخر: مدیریت آگاهانه، امنیت پایدار

مدیریت کاربران و دسترسی‌های دیتابیس، یکی از پایه‌های امنیت هر سیستم است. با رعایت اصل کمترین امتیاز، مدیریت صحیح رمز عبور، محدودسازی دسترسی از راه دور و پایش مستمر، می‌توانید سطح حمله دیتابیس خود را به‌شدت کاهش دهید. خبر خوب این است که ابزارهای امروزی، مدیریت کاربران و دسترسی‌ها را ساده‌تر از همیشه کرده‌اند. اگر تجربه‌ای از مدیریت کاربران دیتابیس دارید یا سؤالی دربارهٔ آن دارید، در دیدگاه‌ها بنویسید؛ تجربهٔ شما به دیگران کمک می‌کند تا امنیت بهتری داشته باشند.