پایگاه داده ای که مستقیم روی اینترنت باز باشد، یکی از رایج ترین دلایل نشت اطلاعات است. اسکنرهای خودکار مدام کل اینترنت را برای پورت ۳۳۰۶ جستجو میکنند و یک رمز ضعیف کافی است تا کل داده های شما بیرون برود. با این حال گاهی واقعا به اتصال از راه دور نیاز دارید. در این راهنما اول گزینه امن تر را میبینیم و بعد، اگر چاره ای نبود، روش درست باز کردن دسترسی را مرور میکنیم.
قبل از باز کردن پورت این گزینه را ببینید
در بیشتر مواردی که افراد دنبال دسترسی از راه دور هستند، هدف واقعی وصل شدن با یک ابزار گرافیکی از روی سیستم شخصی است. برای این کار اصلا لازم نیست پورت را باز کنید. تونل SSH همان نتیجه را میدهد بدون اینکه چیزی روی اینترنت در معرض دید باشد.
با اجرای دستور زیر، پورت ۳۳۰۶ روی سیستم خودتان به پورت پایگاه داده روی سرور وصل میشود. بعد کافی است ابزار مدیریت را به 127.0.0.1 وصل کنید. رمزنگاری هم به صورت خودکار توسط SSH انجام میشود.
ssh -L 3306:127.0.0.1:3306 user@your-server-ipتغییر رابط شبکه ای که سرویس روی آن گوش میدهد
اگر تصمیم گرفتید دسترسی مستقیم را فعال کنید، اولین قدم تغییر مقدار bind-address است. مسیر فایل پیکربندی بسته به اینکه MySQL دارید یا مریادی بی متفاوت است.
به جای گوش دادن روی همه رابط ها، اگر سرور شما شبکه خصوصی دارد بهتر است فقط روی آدرس خصوصی گوش بدهد. این کار سطح در معرض دید را به شدت کم میکند.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfbind-address = 10.0.0.5bind-address = 0.0.0.0ساخت کاربر مخصوص همان میزبان
در MySQL هر کاربر با ترکیب نام و میزبان تعریف میشود. یعنی میتوانید مشخص کنید که این کاربر فقط از یک آدرس مشخص اجازه اتصال دارد. این یکی از موثرترین کارهایی است که میتوانید انجام دهید.
از ساختن کاربر با میزبان درصد که به معنی هر آدرسی است تا حد امکان پرهیز کنید. اگر آدرس ثابت ندارید، حداقل دسترسی را به یک پایگاه داده مشخص محدود کنید و هرگز دسترسی کامل روی همه چیز ندهید.
CREATE USER 'appuser'@'203.0.113.10' IDENTIFIED BY 'a-long-strong-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'203.0.113.10';
FLUSH PRIVILEGES;SELECT user, host FROM mysql.user;محدود کردن در فایروال
تنظیمات پایگاه داده به تنهایی کافی نیست. در سطح فایروال هم پورت را فقط برای آدرس هایی که واقعا نیاز دارند باز کنید. اگر این قانون را بدون محدودیت آدرس بنویسید، عملا کل کاری که در مرحله قبل انجام دادید را خنثی کرده اید.
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
sudo ufw status numberedاجبار به اتصال رمزنگاری شده
وقتی داده ها از اینترنت عبور میکنند، رمزنگاری اتصال دیگر اختیاری نیست. با اضافه کردن شرط استفاده از TLS، اتصال های بدون رمزنگاری رد میشوند.
نسخه های امروزی به صورت پیشفرض گواهی خودامضا میسازند و TLS در دسترس است، اما تا وقتی آن را اجباری نکنید، کلاینت میتواند بدون رمزنگاری وصل شود.
SHOW VARIABLES LIKE '%ssl%';ALTER USER 'appuser'@'203.0.113.10' REQUIRE SSL;
FLUSH PRIVILEGES;اعمال، تست و عیب یابی
بعد از تغییر پیکربندی، سرویس را ری استارت کنید و بررسی کنید که روی آدرس مورد نظر گوش میدهد. سپس از سیستم مقصد اتصال را تست کنید.
اگر اتصال برقرار نشد، معمولا یکی از این سه مورد است: سرویس هنوز فقط روی لوکال هاست گوش میدهد، فایروال اجازه نمیدهد، یا کاربر برای آن میزبان تعریف نشده است. پیام خطا معمولا مشخص میکند کدام یک.
sudo systemctl restart mysql
sudo ss -tlnp | grep 3306mysql -u appuser -h your-server-ip -p- اگر خطای دسترسی گرفتید، ترکیب نام کاربر و میزبان را بررسی کنید.
- اگر اتصال اصلا برقرار نشد، مشکل از فایروال یا bind-address است.
- پورت ۳۳۰۶۰ مربوط به پروتکل ایکس است؛ اگر از آن استفاده نمیکنید بازش نکنید.
- بعد از پایان کار، دسترسی هایی که دیگر لازم نیستند را باطل کنید.
پرسش های پرتکرار
آیا باز کردن پورت ۳۳۰۶ روی اینترنت خطرناک است؟
بله. اسکنرهای خودکار این پورت را در مدت کوتاهی پیدا میکنند و یک رمز ضعیف برای از دست رفتن کل داده ها کافی است. اگر فقط برای اتصال شخصی نیاز دارید، تونل SSH گزینه امن تری است.
چطور دسترسی را فقط به یک آدرس مشخص محدود کنم؟
کاربر را با میزبان مشخص بسازید و در فایروال هم پورت را فقط برای همان آدرس باز کنید. هر دو مرحله لازم است.
چرا با وجود ساختن کاربر، اتصال از راه دور برقرار نمیشود؟
معمولا مقدار bind-address هنوز روی لوکال هاست است یا فایروال اجازه عبور نمیدهد. پیام خطا مشخص میکند کدام مورد است.
به راهنمای بیشتری نیاز دارید؟
تیم پشتیبانی هایوهاست برای انتخاب و مدیریت سرویس کنار شماست.