MySQL یکی از پرکاربردترین سیستمهای مدیریت پایگاه داده در وبسایتها، نرمافزارهای سازمانی و سرویسهای آنلاین است. همین گستردگی استفاده باعث شده امنیت دیتابیس MySQL به یکی از بخشهای مهم امنیت زیرساخت و نرمافزار تبدیل شود. افزایش امنیت MySQL تنها به انتخاب یک رمز عبور قوی برای کاربر root محدود نمیشود. برای ایجاد یک محیط امن باید شبکه، حسابهای کاربری، سطح دسترسی، ارتباطات رمزنگاریشده، تنظیمات سرور، برنامههای متصل به دیتابیس، ثبت رویدادها و نسخههای پشتیبان همگی بهدرستی مدیریت شوند. مستندات رسمی MySQL نیز امنیت را مجموعهای از اقدامات شامل کنترل دسترسی، محافظت از فایلها، امنیت شبکه، جلوگیری از تزریق SQL، مدیریت رمزهای عبور و تهیه نسخه پشتیبان قابل بازیابی میداند. در این راهنما مهمترین روشهای افزایش امنیت MySQL را بهصورت عملی بررسی میکنیم.
امنیت MySQL چیست؟
امنیت MySQL به مجموعه سیاستها، تنظیمات و کنترلهایی گفته میشود که برای جلوگیری از دسترسی غیرمجاز، سرقت اطلاعات، تغییر دادهها، سوءاستفاده از حسابهای کاربری و حمله به سرور MySQL اجرا میشوند. هدف اصلی این اقدامات محافظت از سه ویژگی اساسی اطلاعات است:
- محرمانگی اطلاعات
- صحت و یکپارچگی دادهها
- در دسترس بودن پایگاه داده
امنیت MySQL باید در چند لایه اجرا شود. حتی اگر خود سرور MySQL بهدرستی پیکربندی شده باشد، یک آسیبپذیری در برنامه وب، دسترسی شبکه نامحدود یا یک حساب کاربری با سطح دسترسی بیش از حد میتواند امنیت کل دیتابیس را به خطر بیندازد. به همین دلیل امنسازی MySQL باید بهعنوان یک فرایند مستمر در نظر گرفته شود، نه یک تنظیم یکباره.
چرا افزایش امنیت MySQL اهمیت دارد؟
پایگاه داده معمولاً یکی از ارزشمندترین بخشهای زیرساخت سازمان است. اطلاعات کاربران، اطلاعات مالی، اطلاعات سفارشها، اطلاعات هویتی و بسیاری از دادههای محرمانه ممکن است در MySQL نگهداری شوند. دسترسی غیرمجاز به دیتابیس میتواند پیامدهایی مانند موارد زیر داشته باشد:
- سرقت اطلاعات کاربران
- تغییر یا حذف اطلاعات
- افشای دادههای محرمانه
- اختلال در سرویس
- سوءاستفاده از حسابهای مدیریتی
- ایجاد دسترسی دائمی برای مهاجم
- نقض الزامات امنیتی و Compliance
- افزایش دامنه یک حمله سایبری
به همین دلیل امنیت MySQL باید بخشی از معماری امنیتی کل سازمان باشد و تنها به تنظیمات خود Database Server محدود نشود.
MySQL چه آسیبپذیریها و تهدیدات امنیتی دارد؟
MySQL بهخودیخود یک سیستم مدیریت پایگاه داده ناامن نیست، اما مانند هر نرمافزار پیچیده دیگری میتواند هم تحت تأثیر آسیبپذیریهای نرمافزاری واقعی قرار بگیرد و هم در اثر پیکربندی اشتباه، سطح دسترسی نامناسب یا ضعف امنیتی برنامه متصل به دیتابیس در معرض حمله قرار گیرد. این تفاوت اهمیت زیادی دارد. باز گذاشتن پورت دیتابیس روی اینترنت، استفاده از حساب root در برنامه یا اعطای دسترسی بیش از حد به کاربران، آسیبپذیری خود MySQL محسوب نمیشوند؛ بلکه ضعفهای پیکربندی و معماری هستند. در مقابل، آسیبپذیریهایی که با شناسه CVE منتشر میشوند، نقصهای مشخص در خود MySQL یا اجزای مرتبط با آن هستند.
1. نسخههای قدیمی و Patch نشده
یکی از جدیترین خطرات امنیتی، استفاده از نسخههایی است که آسیبپذیریهای شناختهشده دارند یا آخرین وصلههای امنیتی روی آنها نصب نشده است. برخی از این آسیبپذیریها ممکن است باعث موارد زیر شوند:
- اختلال از راه دور در سرویس
- افزایش سطح دسترسی
- دسترسی غیرمجاز به اطلاعات
- تغییر دادهها
- سوءاستفاده از ضعفهای شبکهای
2. تزریق SQL
تزریق SQL (SQL Injection) یکی از شناختهشدهترین تهدیدات مرتبط با MySQL است. این مشکل معمولاً از خود MySQL ناشی نمیشود، بلکه زمانی ایجاد میشود که برنامه Queryهای ناامن و قابل دستکاری تولید کند. اگر داده واردشده توسط کاربر مستقیماً وارد Query شود، مهاجم ممکن است ساختار دستور را تغییر داده و عملیات خارج از انتظار برنامه انجام دهد.
- خواندن اطلاعات محرمانه
- دور زدن احراز هویت
- تغییر اطلاعات
- حذف رکوردها
- دسترسی به بخشهای غیرمجاز دیتابیس
3. دسترسی بیش از حد کاربران
سیستم کنترل دسترسی MySQL بر اساس فهرست کنترل دسترسی (Access Control List یا ACL) کار میکند. اگر به یک کاربر مجوزهایی بیشتر از نیاز واقعی او داده شود، در صورت به خطر افتادن آن حساب، مهاجم نیز همان مجوزها را در اختیار خواهد داشت.
4. حسابهای مدیریتی و رمزهای عبور ضعیف
حسابهایی مانند root دسترسی گستردهای به MySQL دارند. افشای Credential این حسابها یا استفاده از آنها توسط Application میتواند کنترل بسیار زیادی در اختیار مهاجم قرار دهد. حسابهای بلااستفاده، کاربران آزمایشی و حسابهایی که مدتهاست مورد استفاده قرار نمیگیرند نیز باید حذف یا غیرفعال شوند.
5. قرار گرفتن MySQL مستقیماً در معرض اینترنت
پورت پیشفرض MySQL معمولاً 3306 است. قرار دادن این پورت در دسترس عمومی اینترنت، سطح حمله را افزایش داده و سرور را در معرض اسکن، تلاشهای ورود و سوءاستفاده از آسیبپذیریهای احتمالی قرار میدهد.
6. ارتباطات رمزنگارینشده
اگر ارتباط بین Client و Server بدون رمزنگاری انجام شود، مهاجمی که به مسیر شبکه دسترسی دارد ممکن است بتواند اطلاعات منتقلشده را مشاهده یا شنود کند. MySQL برای رفع این مشکل از امنیت لایه انتقال (Transport Layer Security یا TLS) پشتیبانی میکند.
7. پیکربندی نادرست MySQL
نمونههایی از پیکربندیهای ناامن عبارتاند از:
- فعال بودن دسترسی از Interfaceهای غیرضروری
- تعریف Host بسیار گسترده برای کاربران
- اعطای مجوزهای مدیریتی غیرضروری
- عدم استفاده از ارتباطات رمزنگاریشده
- فعال بودن افزونهها و قابلیتهای غیرضروری
- ثبت نشدن رخدادهای امنیتی
- ذخیره اطلاعات ورود در فایلهای ناامن
8. دسترسی ناامن برنامه به دیتابیس
در بسیاری از حملات، مهاجم ابتدا Application را هدف قرار میدهد و سپس از طریق دسترسی آن برنامه وارد دیتابیس میشود. اگر برنامه با Account دارای دسترسی بالا متصل باشد، دامنه خسارت بسیار بیشتر خواهد شد.
9. دسترسی غیرمجاز به فایلها و نسخههای پشتیبان
حتی اگر تنظیمات داخل MySQL امن باشد، دسترسی مستقیم به فایلهای دیتابیس، Configuration یا Backup میتواند اطلاعات حساس را افشا کند.
- Permissionهای ضعیف سیستمعامل
- Backupهای بدون رمزنگاری
- فایل Configuration حاوی Password
- ذخیره Backup در فضای عمومی یا ناامن
10. فعالیت کاربران دارای دسترسی بالا
کاربران مدیریتی مانند DBAها دسترسی بسیار زیادی دارند و فعالیت آنها باید قابل ردیابی باشد. سوءاستفاده داخلی، سرقت Credential یا خطای انسانی میتواند دادههای حساس را تحت تأثیر قرار دهد.
11. حملات Brute Force و Credential Stuffing
اگر MySQL از شبکه قابل دسترسی باشد، مهاجم ممکن است با امتحان کردن مکرر Username و Passwordهای مختلف برای دسترسی به یک حساب معتبر تلاش کند.
- استفاده از رمزهای عبور ضعیف
- اشتراک Password بین چند سرویس
- قرار گرفتن مستقیم دیتابیس در اینترنت
- نبود محدودیت برای تلاشهای ناموفق
12. نبود مانیتورینگ و ثبت رخدادهای امنیتی
نبود Logging و Monitoring مناسب ممکن است باعث شود فعالیت مخرب برای مدت طولانی بدون شناسایی باقی بماند.
مهمترین ریسکهای امنیت MySQL در یک نگاه
| ریسک | نتیجه احتمالی | کنترل اصلی |
|---|---|---|
| نسخه Patch نشده | سوءاستفاده از آسیبپذیریهای شناختهشده | بهروزرسانی و Patch Management |
| تزریق SQL | سرقت یا تغییر اطلاعات | Query پارامتری |
| Privilege بیش از حد | افزایش دامنه حمله | حداقل سطح دسترسی |
| Credential ضعیف | دسترسی غیرمجاز | Password Policy |
| باز بودن پورت 3306 | افزایش سطح حمله | Firewall و محدودیت شبکه |
| ارتباط بدون TLS | شنود اطلاعات | رمزنگاری ارتباط |
| پیکربندی ناامن | ایجاد مسیرهای حمله | Hardening |
| Accountهای قدیمی | دسترسی غیرضروری | مدیریت Account |
| Backup ناامن | افشای داده | رمزنگاری و کنترل دسترسی |
| نبود Monitoring | تشخیص دیرهنگام نفوذ | Logging و Auditing |
متدهای افزایش امنیت MySQL
افزایش امنیت MySQL نیازمند اجرای مجموعهای از کنترلهای امنیتی در چند لایه مختلف است. مهمترین روشها عبارتاند از:
- بهروزرسانی منظم MySQL و نصب Patchهای امنیتی
- سختسازی تنظیمات سرور و حذف تنظیمات غیرضروری
- محدود کردن دسترسی شبکه به دیتابیس
- مدیریت کاربران و سطح دسترسیها بر اساس اصل حداقل دسترسی
- استفاده از رمزهای عبور قوی و سیاستهای مناسب احراز هویت
- رمزنگاری ارتباطات میان Client و Server
- جلوگیری از SQL Injection در برنامههای متصل به دیتابیس
- محافظت از فایلهای دیتابیس و Backupها
- فعالسازی Logging و Auditing
- مانیتورینگ فعالیت کاربران و رفتارهای مشکوک
- ارزیابی دورهای آسیبپذیریها
- استفاده از ابزارها و ماژولهای امنیتی MySQL
- استفاده از Database Activity Monitoring در محیطهای سازمانی
در ادامه هر یک از این روشهای افزایش امنیت MySQL را بهصورت دقیقتر بررسی میکنیم.

روشهای افزایش امنیت MySQL
1. نسخه MySQL را بهروز نگه دارید
اولین گام برای افزایش امنیت MySQL استفاده از نسخهای است که همچنان بهروزرسانیهای امنیتی دریافت میکند. MySQL دارای شاخههای پشتیبانی بلندمدت (Long-Term Support یا LTS) و نسخههای نوآورانه است. انتخاب نسخه باید بر اساس نیاز سازمان به پایداری، سازگاری و دریافت قابلیتهای جدید انجام شود. قبل از ارتقا:
- Release Note نسخه جدید را بررسی کنید.
- از دیتابیس Backup بگیرید.
- سازگاری Application را آزمایش کنید.
- ارتقا را ابتدا در محیط Test انجام دهید.
- برای محیطهای حساس برنامه Rollback داشته باشید.
2. ابزار mysql_secure_installation را اجرا کنید
MySQL ابزاری با نام mysql_secure_installation ارائه میکند که برای انجام بخشی از تنظیمات امنیتی اولیه پس از نصب سرور استفاده میشود. بسته به نسخه و نحوه نصب، این ابزار میتواند در انجام اقداماتی مانند موارد زیر کمک کند:
- بهبود تنظیمات امنیتی Accountهای مدیریتی
- حذف کاربران ناشناس در صورت وجود
- حذف دیتابیسهای آزمایشی غیرضروری
- بازبینی برخی تنظیمات مرتبط با امنیت ورود
این ابزار جایگزین Hardening کامل سرور نیست، اما برای بررسی تنظیمات اولیه پس از نصب MySQL گزینه مناسبی است.
3. دسترسی شبکه به MySQL را محدود کنید
در اغلب معماریها کاربران اینترنت نباید مستقیماً به MySQL متصل شوند. معمولاً فقط Application Server، سیستمهای مدیریتی و Hostهای مشخص باید اجازه ارتباط با دیتابیس را داشته باشند.
تنظیم bind-address
یکی از روشهای محدود کردن Interface دریافت Connection، استفاده از bind_address است.
[mysqld]
bind-address = 127.0.0.1
اگر Application روی سیستم دیگری قرار دارد، بهجای باز کردن سرویس روی همه Interfaceها، آدرس مورد نیاز را بهطور مشخص تعریف کنید.
4. پورت 3306 را مستقیماً در اینترنت باز نکنید
قرار دادن پورت پیشفرض MySQL در دسترس عمومی اینترنت، سطح حمله را افزایش میدهد. تغییر شماره پورت ممکن است تعداد اسکنهای خودکار را کاهش دهد، اما یک کنترل امنیتی واقعی محسوب نمیشود.
Application Server → MySQL : Allow
Admin Network → MySQL : Allow
Internet → MySQL : Deny
Other Networks → MySQL : Deny
در محیطهای Cloud نیز همین محدودیت باید از طریق Security Group، Network ACL یا کنترلهای مشابه اعمال شود.
5. برای Application از حساب root استفاده نکنید
برنامه نباید با حساب مدیریتی root به MySQL متصل شود. بهتر است برای هر Application یک حساب اختصاصی با حداقل سطح دسترسی ایجاد شود.
CREATE USER 'shop_app'@'10.10.20.15'
IDENTIFIED BY 'Strong-Unique-Password';
GRANT SELECT, INSERT, UPDATE, DELETE
ON shop_database.*
TO 'shop_app'@'10.10.20.15';
6. اصل حداقل سطح دسترسی را اجرا کنید
اصل حداقل سطح دسترسی (Principle of Least Privilege) بیان میکند که هر حساب باید فقط مجوزهایی را دریافت کند که برای انجام وظیفه خود نیاز دارد.
GRANT SELECT
ON sales.*
TO 'report_user'@'10.10.30.20';
برای بررسی مجوز یک حساب:
SHOW GRANTS FOR 'username'@'host';
7. از Role برای مدیریت دسترسیها استفاده کنید
در محیطهایی با تعداد زیاد User، استفاده از Role میتواند مدیریت مجوزها را سادهتر و قابلکنترلتر کند.
CREATE ROLE 'report_reader';
GRANT SELECT
ON reporting.*
TO 'report_reader';
GRANT 'report_reader'
TO 'analyst1'@'localhost';
8. دسترسی کاربران را به Host مشخص محدود کنید
در MySQL، Host بخشی از هویت حساب است. بنابراین تا حد امکان از تعریف کاربران با Host عمومی مانند نمونه زیر خودداری کنید:
'user'@'%'
در صورت امکان Host مشخصی تعریف کنید:
'user'@'10.10.20.15'
9. سیاست مناسب رمز عبور تعریف کنید
برای Accountهای MySQL باید سیاست مناسبی برای Password تعریف شود.
- رمز عبور طول مناسبی داشته باشد.
- برای هر حساب منحصربهفرد باشد.
- در Source Code ذخیره نشود.
- در Repositoryهای Git قرار نگیرد.
- بین Production و Test مشترک نباشد.
- در Secret Manager نگهداری شود.
برای کاربران انسانی دارای سطح دسترسی بالا، احراز هویت چندمرحلهای (Multifactor Authentication یا MFA) نیز میتواند لایه امنیتی دیگری ایجاد کند.
10. حسابهای غیرضروری را حذف یا غیرفعال کنید
برای مشاهده حسابهای MySQL میتوانید از Query زیر استفاده کنید:
SELECT User, Host
FROM mysql.user;
موارد زیر را بهصورت دورهای بررسی کنید:
- کاربران قدیمی
- حساب کارکنانی که سازمان را ترک کردهاند
- کاربران مربوط به Applicationهای حذفشده
- حسابهای Test
- حسابهایی با Host بسیار گسترده
- حسابهایی با مجوز مدیریتی غیرضروری
11. ارتباطات MySQL را رمزنگاری کنید
اگر ارتباط Client و Database Server از شبکه عبور میکند، بهتر است اطلاعات با TLS رمزنگاری شوند. برای بررسی رمزنگاری Session:
SHOW SESSION STATUS LIKE 'Ssl_cipher';
نمایش یک Cipher فعال نشان میدهد Session فعلی از ارتباط رمزنگاریشده استفاده میکند.
12. از حملات SQL Injection جلوگیری کنید
یکی از مهمترین کنترلها برای جلوگیری از تزریق SQL، استفاده از Prepared Statement و Queryهای پارامتری است. نمونه ناامن:
$sql = "SELECT * FROM users WHERE email = '$email'";
روش مناسبتر:
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE email = ?"
);
$stmt->execute([$email]);
- ورودی کاربران را اعتبارسنجی کنید.
- به حساب Application حداقل دسترسی بدهید.
- پیام خطای دیتابیس را مستقیماً به کاربر نمایش ندهید.
- از ساخت Dynamic Query غیرضروری خودداری کنید.
13. دسترسی FILE و قابلیت local_infile را محدود کنید
مجوز FILE به کاربران اجازه انجام برخی عملیات مرتبط با فایلهای سیستم را میدهد و نباید بدون نیاز واقعی در اختیار Accountهای عادی قرار گیرد. همچنین قابلیت local_infile باید فقط زمانی فعال باشد که واقعاً به آن نیاز دارید. برای بررسی وضعیت:
SHOW VARIABLES LIKE 'local_infile';
محدود کردن این قابلیتها میتواند سطح حمله مرتبط با خواندن یا بارگذاری فایلها را کاهش دهد.
14. فایلهای MySQL را در سطح سیستمعامل محافظت کنید
- MySQL را با Account اختصاصی سیستمعامل اجرا کنید.
- Permission فایلها را محدود کنید.
- دسترسی به Data Directory را کنترل کنید.
- از فایل Configuration حاوی Credential محافظت کنید.
- سرویس را با root سیستمعامل اجرا نکنید.
- دسترسی SSH به Database Server را محدود کنید.
15. دادههای حساس را رمزنگاری کنید
رمزنگاری دادههای ذخیرهشده (Encryption at Rest) باعث میشود دسترسی مستقیم به Storage بهتنهایی برای خواندن دادهها کافی نباشد. بسته به حساسیت اطلاعات، موارد زیر میتوانند نیازمند رمزنگاری باشند:
- Tablespaceها
- Backupها
- اطلاعات هویتی
- اطلاعات مالی
- دادههای محرمانه
- کلیدها و Credentialها
16. Logging و Auditing را فعال کنید
ثبت وقایع (Logging) و ممیزی فعالیتها (Auditing) برای بررسی Incidentها و شناسایی فعالیتهای مشکوک ضروری است.
- Loginهای ناموفق
- ایجاد یا حذف Account
- تغییر مجوز کاربران
- فعالیت حسابهای مدیریتی
- تغییر ساختار دیتابیس
- دسترسی به دادههای حساس
- Queryهای غیرمعمول
- تغییر تنظیمات امنیتی
در سازمانها بهتر است Logهای امنیتی به یک سامانه متمرکز مدیریت Log یا SIEM نیز ارسال شوند.
17. فعالیت کاربران دارای دسترسی بالا را مانیتور کنید
عملیات کاربران مدیریتی و DBAها باید قابل ردیابی باشد، بهخصوص فعالیتهایی مانند:
- تغییر مجوزها
- ایجاد Account
- حذف اطلاعات
- تغییر Schema
- Export حجم زیاد اطلاعات
- تغییر Configuration
- غیرفعال کردن کنترلهای امنیتی
18. از دیتابیس نسخه پشتیبان امن تهیه کنید
Backup بخشی از امنیت MySQL است و باید علاوه بر ایجاد منظم، قابل بازیابی نیز باشد.
- بهصورت منظم ایجاد شود.
- در محلی جدا از Database Server نگهداری شود.
- دسترسی محدودی داشته باشد.
- در صورت نیاز رمزنگاری شود.
- Retention Policy مناسب داشته باشد.
- Restore آن بهصورت دورهای آزمایش شود.
19. محیط Production را از Test و Development جدا کنید
- شبکه محیطها جدا باشد.
- Credentialهای متفاوت استفاده شود.
- Accountهای متفاوت ایجاد شود.
- اطلاعات حساس قبل از انتقال Mask یا ناشناسسازی شوند.
- Backup تولید مستقیماً در اختیار Development قرار نگیرد.
20. تنظیمات MySQL را Hardening کنید
سختسازی (Hardening) به فرایند کاهش سطح حمله با حذف قابلیتهای غیرضروری و پیکربندی امن Server گفته میشود.
- Interfaceهای در دسترس
- Accountهای فعال
- مجوزهای مدیریتی
- تنظیمات TLS
- Logging
- دسترسی File System
- قابلیتهای غیرضروری
- Remote Access
- Pluginها و Componentهای نصبشده
یک فایل my.cnf تصادفی از اینترنت نباید بدون بررسی روی Production استفاده شود. تنظیمات باید با نسخه MySQL و معماری سازمان سازگار باشند.
21. MySQL را بهصورت مستمر مانیتور کنید
- افزایش Loginهای ناموفق
- Connectionهای غیرمعمول
- ایجاد Account جدید
- تغییر Privilege
- Queryهای غیرمعمول
- افزایش ناگهانی Export داده
- تغییر Configuration
- فعالیت کاربران مدیریتی
- آسیبپذیریهای جدید
- وضعیت Patchها
22. از Database Activity Monitoring استفاده کنید
مانیتورینگ فعالیت پایگاه داده (Database Activity Monitoring یا DAM) برای مشاهده و تحلیل فعالیتهای انجامشده روی دیتابیس استفاده میشود.
- چه کاربری وارد دیتابیس شده است؟
- از چه سیستم یا IP متصل شده است؟
- به کدام اطلاعات دسترسی داشته است؟
- چه Queryهایی اجرا کرده است؟
- چه تغییراتی انجام داده است؟
- آیا رفتار او با Policy سازمان مطابقت دارد؟
در محیطهای سازمانی، راهکار Trellix Database Security میتواند برای مانیتورینگ فعالیت دیتابیس، ارزیابی آسیبپذیریها و شناسایی رفتارهای پرریسک مورد استفاده قرار گیرد.
23. آسیبپذیریهای MySQL را بهصورت دورهای ارزیابی کنید
ارزیابی آسیبپذیری (Vulnerability Assessment) باید علاوه بر نسخه MySQL، تنظیمات، Accountها و دسترسی شبکه را نیز بررسی کند.
- نسخه MySQL
- Patchهای امنیتی نصبشده
- Accountهای غیرضروری
- کاربران بدون استفاده
- مجوزهای بیش از حد
- Credentialهای ضعیف
- Configuration ناامن
- ارتباطات رمزنگارینشده
- دسترسی شبکه گسترده
- Logging ناکافی
- عدم تطابق با Baseline امنیتی سازمان
ابزارها و ماژولهای افزایش امنیت MySQL
MySQL علاوه بر تنظیمات امنیتی پایه، مجموعهای از ابزارها، Componentها و قابلیتهای امنیتی را نیز ارائه میکند که میتوانند برای کاهش سطح حمله، کنترل دسترسی و مانیتورینگ محیط مورد استفاده قرار گیرند.
Password Validation
برای اعمال سیاستهای پیچیدگی رمز عبور و جلوگیری از انتخاب Passwordهای ضعیف استفاده میشود.
Connection Control
این قابلیت میتواند برای کنترل تلاشهای مکرر Login ناموفق و کاهش ریسک حملات Brute Force مورد استفاده قرار گیرد.
Keyring
Keyring برای مدیریت و نگهداری امن کلیدهای رمزنگاری مورد استفاده MySQL طراحی شده است.
MySQL Enterprise Audit
این قابلیت امکان ثبت و بررسی رویدادهای مرتبط با Connection، کاربران و فعالیتهای دیتابیس را فراهم میکند.
MySQL Enterprise Firewall
Firewall داخلی MySQL Enterprise میتواند الگوهای Query مجاز را کنترل کرده و اجرای برخی دستورات غیرمنتظره را محدود کند.
Data Masking
Masking میتواند برای محافظت از دادههای حساس هنگام استفاده در محیطهای Test، Development یا سناریوهای تحلیلی مورد استفاده قرار گیرد.
mysql_secure_installation
این ابزار برای بررسی و اعمال بخشی از تنظیمات امنیتی اولیه پس از نصب MySQL کاربرد دارد و بهتر است در مراحل ابتدایی Hardening بررسی شود.
چکلیست افزایش امنیت MySQL
- از نسخه پشتیبانیشده MySQL استفاده کنید.
- Security Updateها را بهموقع نصب کنید.
mysql_secure_installationرا بررسی و اجرا کنید.- پورت MySQL را مستقیماً روی اینترنت منتشر نکنید.
- دسترسی شبکه را با Firewall محدود کنید.
bind_addressرا متناسب با معماری تنظیم کنید.- برای Application حساب اختصاصی ایجاد کنید.
- از root در Application استفاده نکنید.
- اصل حداقل سطح دسترسی را اجرا کنید.
- Accountها و Privilegeهای قدیمی را حذف کنید.
- برای کاربران Password منحصربهفرد تعریف کنید.
- Credentialها را در Source Code نگهداری نکنید.
- ارتباطات شبکه را رمزنگاری کنید.
- برای جلوگیری از SQL Injection از Queryهای پارامتری استفاده کنید.
- مجوز FILE و local_infile را بررسی کنید.
- Data Directory و فایلهای Configuration را محافظت کنید.
- اطلاعات حساس و Backupها را در صورت نیاز رمزنگاری کنید.
- فعالیتهای مهم دیتابیس را ثبت و مانیتور کنید.
- کاربران دارای دسترسی بالا را تحت نظارت قرار دهید.
- Backup منظم تهیه کنید.
- Restore نسخههای پشتیبان را آزمایش کنید.
- آسیبپذیریها و Configuration دیتابیس را دورهای ارزیابی کنید.
اشتباهات رایج در امنیت MySQL
اتصال Application با root
این کار میتواند در صورت آسیبپذیری برنامه دسترسی بسیار گستردهای در اختیار مهاجم قرار دهد.
باز بودن MySQL برای تمام اینترنت
Database Server معمولاً نباید مستقیماً در دسترس کاربران اینترنت قرار داشته باشد.
استفاده از 'user'@'%'
اجازه اتصال از همه Hostها بدون نیاز واقعی میتواند دامنه حمله را افزایش دهد.
ذخیره Password داخل Source Code
با افشای Repository، Credential دیتابیس نیز ممکن است در اختیار مهاجم قرار گیرد.
عدم استفاده از TLS
ارتباط رمزنگارینشده در شبکههای غیرقابل اعتماد میتواند اطلاعات را در معرض شنود قرار دهد.
دادن ALL PRIVILEGES به کاربران
این کار برخلاف اصل حداقل سطح دسترسی است و دامنه خسارت ناشی از Compromise حساب را افزایش میدهد.
داشتن Backup بدون تست Restore
نسخه پشتیبانی که قابلیت بازیابی آن آزمایش نشده باشد، ممکن است هنگام Incident قابل استفاده نباشد.
جمعبندی
افزایش امنیت MySQL یک فرایند مستمر است که از نصب و پیکربندی Server آغاز میشود و تا مدیریت کاربران، امنیت Application، شبکه، مانیتورینگ و پاسخ به رخدادها ادامه دارد. محدود کردن دسترسی شبکه، حذف Accountهای غیرضروری، اجرای اصل حداقل سطح دسترسی، استفاده از ارتباطات رمزنگاریشده، جلوگیری از تزریق SQL، بهروزرسانی منظم MySQL، Hardening سرور و تهیه نسخه پشتیبان قابل بازیابی از مهمترین اقداماتی هستند که باید در هر محیط MySQL اجرا شوند. در محیطهای سازمانی و دیتابیسهای حاوی اطلاعات حساس، علاوه بر این اقدامات پایه، استفاده از مانیتورینگ فعالیت پایگاه داده، ارزیابی آسیبپذیری و کنترل فعالیت کاربران دارای دسترسی بالا میتواند دید امنیتی سازمان را افزایش داده و شناسایی فعالیتهای مشکوک را سریعتر کند.
سوالات متداول درباره افزایش امنیت MySQL
MySQL دارای کنترلهای امنیتی متعددی است، اما نصب پیشفرض بهتنهایی برای تمام محیطها کافی نیست. سطح امنیت نهایی به نحوه پیکربندی Server، مدیریت کاربران، شبکه، Application و مانیتورینگ بستگی دارد.
برای بررسی وضعیت امنیت MySQL باید نسخه Server، Patchها، کاربران، Privilegeها، تنظیمات شبکه، TLS، Logging، Backup و Configurationهای امنیتی بهصورت دورهای بررسی شوند.
تغییر پورت ممکن است تعداد اسکنهای ساده را کاهش دهد، اما بهتنهایی یک روش امنیتی مؤثر نیست. مهاجم میتواند سرویس را با Port Scanning شناسایی کند. کنترل اصلی باید فایروال ، محدودسازی IP، مدیریت Account، TLS و کنترل دسترسی باشد.
در اغلب معماریها خیر. Database Server بهتر است در شبکه داخلی یا Private Subnet قرار داشته باشد و فقط سیستمهای مورد نیاز اجازه اتصال به آن را داشته باشند.
خیر. فایروال تنها یکی از لایههای دفاعی است. یک Application آسیبپذیر میتواند از همان Connection مجاز برای حمله به دیتابیس استفاده کند.
یک روش واحد وجود ندارد. بهترین نتیجه با اجرای امنیت چندلایه حاصل میشود:
شبکه امن + نسخه بهروز + حداقل دسترسی + حسابهای اختصاصی + TLS +
کدنویسی امن + Logging + مانیتورینگ + Backup + ارزیابی آسیبپذیری