امنیت Mysql و MariaDB و نصب پیشفرض Mysql دارای نواقص امنیتی بزرگ و متعددی است که باید توسط شما به عنوان مدیر سرور رفع گردد.
البته این موارد به دلیل وجود حفرههای امنیتی در خود Mysql نبوده و صرفاً بحث کانفیگ سرور و تنظیمات ابتدایی مطرح است.
تأمین امنیت Mysql در واقع روی کل امنیت سرور تأثیر خواهد گذاشت. هکر با حملاتی نظیر Bruteforce به دنبال حدس پسورد ادمین دیتابیس خواهد بود. خوب قطعاً میدانید با داشتن پسورد روت دیتابیس سرور شما میتواند به کل نابود شود.
تأمین امنیت Mysql توسط نصب امن آن
اولین قدم بعد از نصب پیشفرض mysql برقراری امنیت بر روی پسورد ادمین است. اسکریپتی به همراه نصب mysql در اختیار شما قرار خواهد گرفت که میتوانید نصب پایه Mysql را به حالت امنتر ارتقا دهید.
توسط اسکریپت زیر میتوانید با کنترل ۳ پارامتر امنیت را در دیتابیس برقرار کنید.
- قرار دادن پسورد برای یوزر root دیتابیس اگر در حین نصب برای آن پسوردی در نظر گرفته نشده باشد.
- مسدود کردن دسترسی به صورت Remote به یوزر روت
- حذف یوزر anonymous و دسترسی به صورت به صورت ناشناس و مهمان
mysql_secure_installation
بعد از اجرای اسکریپت از شما سؤالاتی پرسیده خواهد شد که میتوانید هر یک از موارد ذکر شده را با زدن دکمههای Y/n کنترل کنید.
مجاز بودن اتصال به Mysql فقط از طریق دسترسی localhost
دیتابیس یک سرویس سمت سرور است که به صورت مستقیم با کاربر در ارتباط نیست و یک سرور اصطلاحاً Backend محسوب میشود پس دلیلی هم ندارد که دسترسی به آن از طریق Remote ممکن باشد.
برای برقراری امنیت Mysql و محدودسازی دسترسی کافی است فایل کانفیگ mysql را توسط یک ویرایشگر باز کنید.
vi /etc/my.cnf [RHEL/CentOS] vi /etc/mysql/my.conf [Debian/Ubuntu] vi /etc/mysql/mysql.conf.d/mysqld.cnf [Debian/Ubuntu]
سپس در بخش [mysqld] خط زیر را اضافه کنید.
bind-address = 127.0.0.1
غیرفعال کردن LOCAL INFILE در Mysql
برای غیرفعال کردن دسترسی به فایل سیستم باید local_infile را در Mysql غیرفعال کنید برای این مورد کافی است در بخش [mysqld] مقدار زیر را قرار دهید.
local-infile=0
تغییر پورت پیشفرض Mysql
پورت پیشفرض سرویس Mysql عدد ۳۳۰۶ از پروتکل TCP است که بهتر است برای جلوگیری از حملات به سمت آن پورت را به عددی بالاتر از رنج ۱۰۲۴ تغییر دهیم.
Port=5564
فعال کردن لاگ سرویس Mysql
یکی از مهمترین فایلهای هر سرویسی فایل ثبت وقایع و یا لاگ آن است. توسط این فایل تمامی اتفاقاتی که بر روی این سرویس توسط هکر اتفاق خواهد افتاد ثبت خواهد شد.
در زمانی که اتفاق خاصی بر روی سرور رخ دهد شما با داشتن این فایل میتوانید هر عمل مشکوکی را بر روی این سرویس شناسایی کنید.
در بخش [mysqld] فایل کانفیگ خط زیر را جهت معرفی فایل مسیر فایل لاگ قرار دهید.
log=/var/log/mysql.log
تغییر دسترسی فایلهای مهم Mysql
یکی دیگر از کارهایی که برای امنیت Mysql باید انجام دهید تغییر دسترسی فایلهای مهم این سرویس است.
با وارد کردن دستور زیر دسترسی به فایل کانفیگ فقط به صورت خواندنی برای کاربران غیر مالک ممکن خواهد بود.
chmod 644 /etc/my.cnf
تمامی دستورات وارد شده برای سرویس Mysql در فایل mysql_history. ذخیره میشود که شامل اطلاعات حساسی همچون نام کاربری و پسورد تمامی کاربرانی خواهد بود که شما بر روی سرور ایجاد کردهاید.
با دستور زیر اطلاعات این فایل بهطور کامل پاک خواهد شد.
cat /dev/null > ~/.mysql_history
از طریق ترمینال دستورات Mysql را اجرا نکنید
به دلیل اینکه تمامی دستورات لینوکس درون فایلهای history ذخیره میشوند نباید اطلاعات حیاتی شامل پسورد یوزرها در محیط شل اجرا شوند. با دسترسی هکر به سیستم و بازبینی از فایل bash_history. به راحتی پسورد کاربران قابلمشاهده خواهد بود.
به طور مثال اگر دستور زیر را در ترمینال لینوکس وارد کنید هکر با مشاهده فایل history به صورت Clear Text رمز عبور یوزر Root را پیدا خواهد کرد.
mysql -u root -ppassword
با وارد کردن دستور history آخرین دستور برای شما به شکل زیر نمایش داده خواهد شد.
بهترین روش اتصال به mysql حالتی است که پسورد به صورت Interactive توسط شل از شما درخواست شود.
mysql -u root -p
دسترسی مشخص برای هر یوزر فقط به یک سیستم مجزا
هر یوزر درون Mysql باید به یک پایگاه داده مشخص فقط دسترسی داشته باشد و دسترسیها برای یوزر مربوطه به طور مشخص و کامل و مجزا تعریف شود.
mysql -u root -p ;CREATE DATABASE wordpress_db ;'CREATE USER 'wp_admin'@'localhost' IDENTIFIED BY 'wp@admin%!2 ;'GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_admin'@'localhost ;FLUSH PRIVILEGES exit
و همیشه این مورد را به خاطر داشته باشید یوزری که درون پایگاه داده، برنامهای را کنترل نمیکند و بلااستفاده است باید از روی سیستم حذف شود.
استفاده از پلاگین و کتابخانههای امنیتی
برای بیشتر کردن امنیت Mysql و MariaDB میتوانید از پلاگین های و کتابخانههای فراوانی که توسط شرکت سازنده ارائه شده است به طور همزمان بر روی پایگاه داده خود استفاده کنید.
در آدرس زیر لیستی از این پلاگین ها که کنترلهای دقیقتری روی دسترسیها، پسوردها و … ارائه میدهد استفاده کنید.
https://dev.mysql.com/doc/refman/5.7/en/security-plugins.html
تغییر دورهای و مرتب پسورد Mysql
بهتر است برای جلوگیری از لو رفتن پسورد سیستم به هر دلیلی با توجه به سیاستهای امنیتی، پسورد Mysql را به صورت دورهای و مرتب با دستورات زیر تغییر دهید.
;USE mysql ;'UPDATE user SET password=PASSWORD('YourPasswordHere') WHERE User='root' AND Host = 'localhost ;FLUSH PRIVILEGES
آپدیت پکیج Mysql به صورت مداوم
یکی از بهترین کارهایی که هر مدیر سرور جهت امن سازی سرویسها میتواند انجام دهد آپدیت منظم برنامههاست، با آمدن وصلههای امنیتی و آپدیتهای مربوط به هسته برنامه میتوانید با وارد کردن دستورات زیر با توجه به توزیع خود توسط مخزن لینوکس Mysql/MariaDB را آپدیت کنید.
yum update apt update
بعد از انجام تمامی موارد گفته شده جهت برقراری امنیت Mysql با واردکردن یکی از دستورات زیر سرویس پایگاه داده خود را ریبوت کنید تا تغییرات بر روی سرویس لحاظ گردد.
systemctl restart mariadb #RHEL/CentOS systemctl restart mysql #Debian/Ubuntu