افزایش امنیت MySQL چیزی نیست که بتوانید با چند ترفند ساده انجام دهید و خیالتان راحت باشد. اگر فکر میکنید همین الان هم دیتابیستان امن است، باید بگوییم اشتباه میکنید! از رمزنگاری گرفته تا کنترل دسترسی، کلی نکته و راهکار وجود دارد که بیشتر کاربران حتی به فکرشان هم نمیرسد. شاید بپرسید که مثلا چه نکاتی؟ خب، بگذارید یکی از رایجترین اشتباهها را همینجا بگوییم: تغییر ندادن پورت پیشفرض MySQL. بله، همین یک مورد به ظاهر ساده میتواند جایی باشد که هکرها از آن برای نفوذ به اطلاعات شما استفاده کنند.
در این مقاله آبالون، قصد داریم به شما بگوییم که چطور امنیت MySQL را از صفر تا صد افزایش دهید. و بله، قرار نیست فقط حرفهای تکراری بزنیم. ما از تکنیکهای حرفهای و جزئیاتی صحبت میکنیم که برای مدیران شبکه، برنامهنویسان و حتی کاربرانی که امنیت را جدی میگیرند، حسابی به کار میآید. تا آخر این مقاله با ما همراه باشید و بیایید امنیت MySQL را مثل یک حرفهای افزایش دهید.
دیتابیس MySQL چیست؟
دیتابیس MySQL یک سیستم مدیریت پایگاهداده رابطهای (RDBMS مخفف Relational Database Management System) است که توسط شرکت اوراکل توسعه پیدا کرده و براساس زبان کوئری ساختاریافته SQL کار میکند. این دیتابیس، یک نرمافزار متنباز است که بهصورت رایگان در دسترس کاربران قرار دارد. این نرمافزار (که مای اِسکیواِل و گاه مایسِکوئِل هم خوانده میشود) به دلیل کارایی، انعطافپذیری و سهولت استفاده، به یکی از محبوبترین انتخابها برای مدیریت پایگاهداده در وب تبدیل شده است. در کنار این راهکارهایی که در ادامه بررسی خواهیم کرد، توصیه میکنیم اصول پایه و حرفهای امنیت ابری را نیز رعایت کنید، بهویژه اگر MySQL را روی سرورهای خارج از محل فیزیکی سازمان اجرا میکنید.
راهکارهای افزایش امنیت MySQL
افزایش امنیت MySQL از اهمیت بالایی برخوردار است تا از دادههای حساس و مهم در برابر دسترسیهای غیرمجاز و تهدیدات امنیتی محافظت شود. در این بخش، راههای افزایش امنیت MySQL را معرفی میکنیم تا بتوانید محیط دیتابیس خود را امنتر کرده و از خطرات احتمالی جلوگیری کنید:
۱. حذف تاریخچه دستورات MySQL
وقتی شما در محیط MySQL کار میکنید و دستورات مختلفی را اجرا میکنید (مثل ایجاد حساب کاربری جدید، تغییر رمز عبور، یا اجرای کوئریها)، MySQL بهطور خودکار تمامی این دستورات را در فایلی به نام mysql_history./~
ذخیره میکند. این فایل دقیقاً مثل یک دفترچه یادداشت است که هر کاری که انجام دادهاید، در آن نوشته میشود. اگر کسی به این فایل دسترسی پیدا کند، میتواند به تمامی نامهای کاربری و رمزهای عبور که در MySQL وارد کردهاید، دسترسی پیدا کند. این یک ریسک امنیتی است، چون دیگران میتوانند از این اطلاعات سوءاستفاده کنند. برای اینکه محتویات این فایل را پاک کنید و مطمئن شوید دستورات قبلی شما در آن ذخیره نماندهاند، میتوانید از این دستور در لینوکس استفاده کنید:
cat /dev/null > ~/.mysql_history
این دستور به این معنی است که محتوای فایلmysql_history./~
را کاملاً خالی میکند. یعنی هر دستوری که قبلاً اجرا کردهاید و در این فایل ذخیره شده، با اجرای این دستور از بین میرود و فایل خالی میشود. s
۲. فعالسازی لاگگیری (Logging) در MySQL
فعالسازی لاگگیری (Logging) در MySQL به شما کمک میکند تا تمامی فعالیتها و اتفاقات رخ داده در سرور MySQL را ثبت کنید. برای فعال کردن لاگگیری در MySQL، کافی است یک خط به فایل تنظیمات MySQL اضافه کنید تا همه اتفاقات و دستورات در یک فایل خاص ذخیره شود. این کار کمک میکند تا اگر اتفاق مشکوکی افتاد، بتوانید با بررسی این فایل متوجه شوید.
مراحل کار:
۱. فایل تنظیمات MySQL را باز کنید (این فایل معمولاً به نام my.cnf
در لینوکس و my.ini
در ویندوز است). در بخش [mysqld]، این خط را اضافه کنید:
log=/var/log/mysql.log
۲. اگر در ویندوز هستید، مسیر فایل را به شکلی مثل این تغییر دهید:
log=C:/mysql.log
۳. بعد از اعمال تغییرات، نیاز است که MySQL را ریاستارت کنید تا تنظیمات جدید اعمال شوند.
۳. تغییر پورت پیشفرض MySQL
MySQL بهطور پیشفرض از پورت 3306 استفاده میکند. تغییر این پورت پس از نصب MySQL به امنیت بیشتر کمک میکند، زیرا باعث میشود تشخیص پورت سرویسهای حیاتی برای مهاجمان سختتر شود؛ آنها اغلب ابتدا به دنبال پورتهای پیشفرض هستند تا به سرویسها نفوذ کنند. س
۴. خودداری از از اجرای MySQL با دسترسی root
بهتر است MySQL را با یک حساب کاربری مخصوص و محدود اجرا کنید که فقط دسترسیهای ضروری برای اجرای سرویس را دارد و نیازی به دسترسیهای کامل root ندارد. وقتی MySQL را با کاربر root اجرا میکنید، تمامی دسترسیهای سیستم به این سرویس داده میشود که در صورت بروز مشکل یا نفوذ امنیتی، میتواند خطرات زیادی به همراه داشته باشد. با ایجاد یک کاربر اختصاصی با سطح دسترسی پایینتر برای MySQL، میتوانید امنیت سرور را افزایش داده و جلوی دسترسیهای غیرمجاز به بخشهای حساس سیستم را بگیرید.
۵. محدود یا غیرفعال کردن دستور SHOW DATABASES
برای افزایش امنیت MySQL، یکی از روشهای مهم، محدود یا غیرفعال کردن دستوری به نام SHOW DATABASES است. این دستور به کاربر اجازه میدهد که لیست همه پایگاههای داده موجود روی سرور را ببیند. اگر دسترسی به این دستور بدون محدودیت باشد، مهاجمان احتمالی میتوانند با استفاده از این دستور، از تمامی پایگاههای داده شما مطلع شوند و از این اطلاعات برای نفوذ به سیستم استفاده کنند.
برای جلوگیری از این کار، میتوانید دستور SHOW DATABASES را غیرفعال کنید. این کار با اضافه کردن خط زیر به فایل پیکربندی MySQL انجام میشود:
skip-show-database
این خط را در بخش [mysqld] فایل تنظیمات MySQL که در مسیر /etc/my.cnf
قرار دارد، وارد کنید. پس از اعمال این تغییر و راهاندازی مجدد MySQL، کاربران عادی دیگر نمیتوانند با استفاده از دستور SHOW DATABASES، لیست پایگاههای داده شما را مشاهده کنند.
۶. حذف پایگاه داده آزمایشی
پایگاه داده آزمایشی که همراه با نصب MySQL Server ایجاد میشود، بهطور پیشفرض برای همه کاربران باز است؛ یعنی در واقع در را برای هر مهاجمی باز گذاشتهاید! پس بهتر است بعد از نصب، همین اول کار این پایگاه داده را برای اطمینان از امنیت سیستم، بدون معطلی حذف کنید.
۷. حذف حسابهای ناشناس
MySQL بهطور پیشفرض چند حساب کاربری ناشناس ایجاد میکند که واقعاً هیچ کاربرد مفیدی ندارند و تنها دسترسی غیرمجاز را برای مهاجمان آسانتر میکنند. حضور این حسابها یعنی باز گذاشتن یک درِ غیرضروری به روی نفوذگران. بنابراین، بهتر است بدون معطلی این حسابهای بیمصرف را حذف کنید
۸. تغییر منظم رمز عبور MySQL
یکی از اصول اولیه امنیت سیستم این است که رمز عبور MySQL را بهصورت دورهای تغییر دهید. چند وقت یکبار؟ این بستگی به سیاست امنیتی داخلی شما دارد؛ اما فراموش نکنید، با این کار دست هرکسی را که مدتها دنبال نفوذ به سرور شما بوده، کوتاه میکنید! برای اطمینان بیشتر، رمز عبور را مرتب عوض کنید و به این مهاجمان فرصت ندهید.
دستورات زیر را اجرا کنید تا رمز عبور جدید برای کاربر root تنظیم شود و تغییرات لازم اعمال گردد:
USE mysql;
UPDATE user SET password=PASSWORD(‘YourPasswordHere’) WHERE User=’root’ AND Host = ‘localhost’;
FLUSH PRIVILEGES;
۹. مزنگاری دادهها در حالت استراحت و حین انتقال
ببینید، MySQL بهطور پیشفرض، بدون رمزنگاری بین سرور و کلاینت ارتباط برقرار میکند؛ این یعنی فرصتی طلایی برای مهاجمان تا از طریق حملات مرد میانی یا MitM (مخفف Man-in-the-middle attack) دادههای شما را رهگیری کنند. بدتر از آن، اگر دادههای کاربران را در پایگاه داده بدون رمزنگاری ذخیره کنید، به حریم خصوصی و امنیت آنها آسیب زدهاید.
راهکار؟ از TLS/SSL برای رمزنگاری ارتباطات MySQL بین شبکهها استفاده کنید و راه نفوذ را برای مهاجمان ببندید. در شبکههای کاملاً ایمن شاید نیازی به رمزنگاری نباشد، اما احتیاط هیچوقت ضرر ندارد. همچنین، MySQL امکان رمزنگاری دادهها را در حالت استراحت هم فراهم میکند؛ این یعنی حتی اگر کسی به سرور شما دسترسی پیدا کند، دادهها در امان خواهند بود.
۱۰. استفاده از پلاگینهای احراز هویت
اگر به دنبال افزایش امنیت MySQL هستید، وقت آن است که از پلاگینهای احراز هویت استفاده کنید. این پلاگینها به شما اجازه میدهند روش احراز هویت دلخواهتان را انتخاب کنید و MySQL گزینههای متنوعی را برای این کار ارائه میدهد. برای امنیت بیشتر، میتوانید چندین روش احراز هویت را ترکیب کنید. این پلاگینها را میتوانید بهراحتی با دستورات ALTER USER یا CREATE USER پیادهسازی کنید.
مثال:
CREATE USER ‘user_7’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
این دستور، از الگوریتم هش رمز عبور بومی MySQL برای احراز هویت استفاده میکند. با این کار، دسترسی کاربران به پایگاه داده شما کاملاً تحت کنترل است. پس فرصت را از دست ندهید؛ با انتخاب هوشمندانه و استفاده از پلاگینهای احراز هویت، یک لایه امنیتی قوی اضافه کنید و دسترسیها را مدیریت کنید.
۱۱. تغییر دسترسی میزبانها به MySQL
اگر MySQL بهعنوان یک سرور مستقل راهاندازی شده است (یعنی سرورهای وب و برنامه از سرور دیگری به پایگاه داده متصل میشوند)، باید دسترسی را فقط به میزبانهای مجاز محدود کنید. اجازه ندهید هر کسی از هر کجا به پایگاه داده شما سرک بکشد!
برای این کار، تغییرات لازم را در فایلهای hosts.deny و hosts.allow اعمال کنید. با این تنظیمات، دسترسی تنها به میزبانهای تأییدشده داده میشود و هر گونه تلاش برای ورود غیرمجاز را مسدود میکنید.
۱۲. غیرفعال کردن LOCAL INFILE در MySQL
برای امنیت بیشتر، باید local_infile را غیرفعال کنید. چرا؟ چون این قابلیت به کاربران اجازه میدهد که از داخل MySQL به فایلهای سیستم دسترسی پیدا کنند—و شما قطعاً نمیخواهید چنین دسترسی ناخواستهای باز بماند!
برای این کار، در بخش [mysqld] فایل تنظیمات MySQL، این خط را اضافه کنید:
local-infile=0
با این تنظیم، دسترسی به فایلهای سیستم از طریق MySQL را مسدود میکنید و عملاً یکی از راههای نفوذ را میبندید.
تهدیدات امنیتی رایج در MySQL
همانند تمامی پایگاههای دادهای که از زبان SQL استفاده میکنند، MySQL نیز با تهدیدات امنیتی متعددی روبهرو است که برخی از آنها مشترک با دیگر پلتفرمها و برخی خاص خود MySQL هستند. در اینجا به تعدادی از رایجترین تهدیدات امنیتی که ممکن است از داخل یا خارج سازمان شما ناشی شوند، اشاره میکنیم:
۱. مدیریت نادرست دسترسی حسابها
باید یک نکته را روشن کنیم: یکی از بزرگترین اشتباهات در مدیریت پایگاههای داده، تخصیص نادرست دسترسیها به کاربران است. هیچ چیز بدتر از این نیست که همه کاربران را بهصورت ساده لوحانهای بهعنوان مدیر در نظر بگیرید یا به آنها دسترسیهای root بدهید. این نوع دسترسی در دستان افراد نادرست میتواند پایگاه داده شما را نابود کند!
برای جلوگیری از این فاجعهها و پیادهسازی راهکارهای افزایش امنیت MySQL، باید عادت کنید که به هر کاربر تنها حداقل دسترسیهای لازم برای انجام کارش را بدهید. اصلاً نیازی نیست همه به همه چیز دسترسی داشته باشند! همچنین، دسترسی به ویژگیهای حیاتی، مانند جدول کاربران (User Table) در پایگاه داده سیستم MySQL، باید بهطور انحصاری به حسابهای روت محدود شود. این اقدام نهتنها از بروز حوادث ناخواسته جلوگیری میکند، بلکه امنیت پایگاه داده شما را افزایش میدهد. شما باید کنترل کامل بر دسترسیها داشته باشید و این مسئله را بههیچوجه دست کم نگیرید!
۲. رمزهای عبور ضعیف
حداقل از رمزهای عبوری با ۱۵ کاراکتر استفاده کنید که حتماً شامل ترکیبی از حروف، اعداد و نمادها باشند. به عنوان مثال، به جای استفاده از «password123» که به راحتی قابل حدس است، از رمزهایی مانند «3x@mpl3Secur!ty#2024» استفاده کنید. این نوع رمزها نهتنها سختتر حدس زده میشوند، بلکه امنیت شما را افزایش میدهند. از رمزهای سادهای که در دیکشنریها پیدا میشوند دوری کنید! هکرها معمولاً همینها را اولین گزینههای خود قرار میدهند. برای اینکه به اوج امنیت برسید، رمزهای عبور خود را با توابع هش قدرتمند مانند MD5() یا SHA2() رمزنگاری کنید. این کار از اطلاعات حساستان نیز به بهترین شکل ممکن محافظت میکند.
۳. حملات DDoS
حمله دیداس یا DDoS (مخفف عبارت Distributed Denial of Service بهمعنی «منع سرویس توزیعشده») یکی از خطرناکترین حملات سایبری است که هکرها و باتنتها با هدف ایجاد اختلال در ترافیک عادی یک سرور، شبکه یا وبسایت انجام میدهند. در این نوع حمله، مهاجمان با ارسال حجم عظیمی از ترافیک (Flood of Internet Traffic) به یک سرور، وبسایت یا شبکه، سعی در از دسترس خارج کردن آن برای خدماتدهی دارند.
در حملات DDoS، یک سرور با ترافیک اینترنتی غیرعادی از چندین منبع مواجه میشود که باعث اختلال در سرویسدهی آن میگردد. این حملات میتوانند از نظر پیچیدگی و اندازه متفاوت باشند و عملکرد وبسایتها و دسترسی به آنها را بهطور قابل توجهی تحت تأثیر قرار دهند.
یکی از رایجترین اشکال این حملات، حملات brute force به پایگاه داده MySQL است. در اینجا، مهاجمان از چندین حساب کاربری برای پر کردن پایگاه داده با پرسشهای جعلی بهصورت سریع و پیدرپی استفاده میکنند. هدف این نوع حمله این است که پایگاه داده را کند کرده و در نهایت آن را به طور کامل از کار بیندازند.
برای کاهش اثرات حملات DDoS، میتوانید چند روش ساده را دنبال کنید: ابتدا، تعداد کاربرانی که همزمان به پایگاه داده وصل میشوند را محدود کنید تا از بار زیاد جلوگیری شود. همچنین، ارتباطات طولانیمدت را غیرفعال کنید تا کاربران نتوانند به سیستم آسیب بزنند. همچنین، سشنهایی که دچار خطا میشوند را سریعاً ببندید.
جمعبندی
افزایش امنیت MySQL یکی از مهمترین چالشهایی است که مدیران پایگاههای داده با آن مواجه هستند. در این مقاله آبالون، ما به بررسی راهکارهای افزایش امنیت MySQL پرداختیم و روشهای مختلفی را برای محافظت از دادهها و به حداقل رساندن خطرات امنیتی بررسی کردیم. ابتدا، به اهمیت بهروزرسانی نرمافزار و پیکربندی صحیح آن اشاره کردیم، که به کاهش آسیبپذیریهای امنیتی کمک میکند. سپس به موضوع استفاده از رمزهای عبور قوی و سیاستهای مدیریتی در سطح دسترسیها پرداختیم. با پیادهسازی راه های افزایش امنیت MySQL و توجه به این نکات، میتوان خطرات احتمالی را کاهش داد.