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

تنطیم IP دسترسی ریموت به MySQL

یکی از مشکلات رایجی که کاربران در هنگام کار با پایگاه داده ریموت MySQL پیدا می‌کنند این است که این پایگاه داده تنها برای دریافت ارتباط‌های لوکال تنظیم شده است. این در واقع، این تنظیمات  پیش‌فرض است و برای دسترسی ریموت به MySQL، پایگاه داده می‌بایست بتواند ارتباط از طریق یک IP خارجی را دریافت کند. برای این منظور، فایل mysqld.cnf را باز کنید.

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

به سراغ خطی که با پارامتر bind-address شروع می‌شود بروید. این بخش ظاهری شبیه به زیر خواهد داشت.

. . .

lc-messages-dir = /usr/share/mysql

skip-external-locking

#

# Instead of skip-networking the default is now to listen only on

# localhost which is more compatible and is not less secure.

bind-address            = 127.0.0.1

. . .

این مقدار به صورت پیش‌فرض، برابر 127.0.0.1 تنظیم شده است. به این معنا که سرور تنها به دنبال ارتباط‌های محلی خواهد بود. این مقدار را باید به یک آدرس IP خارجی تغییر دهید. به منظور عیب‌یابی می‌توانید این مقدار را به یک آدرس IP وایلدکارد یا *، :: یا 0.0.0.0 تغییر دهید.

. . .

lc-messages-dir = /usr/share/mysql

skip-external-locking

#

# Instead of skip-networking the default is now to listen only on

# localhost which is more compatible and is not less secure.

bind-address            = 0.0.0.0

. . .

نکته: در برخی نسخه‌های MySQL ممکن است پارامتر MySQL  به این صورت در فایل mysqld.cnf موجود نباشد. در این حالت، به سراغ این پارامتر در انتهای فایل بروید.

. . .

[mysqld]

pid-file        = /var/run/mysqld/mysqld.pid

socket          = /var/run/mysqld/mysqld.sock

datadir         = /var/lib/mysql

log-error       = /var/log/mysql/error.log

bind-address            = 0.0.0.0

پس از تغییر این خط، فایل را ذخیره کرده و ببندید. سپس سرویس MySQL را دوباره راه‌اندازی کنید تا تغییرات در فایل mysqld.cnf اِعمال شوند.

sudo systemctl restart mysql

حساب کاربری

در صورتی که یک حساب کاربری MySQL دارید و می‌خواهید برای دسترسی ریموت به MySQL از آن استفاده کنید،  بایستی حتماً آن را برای ارتباط سرور ریموت به جای لوکال‌هاست تنظیم نمایید. برای این منظور، با کاربر روت MySQL یا کاربر دیگری که دسترسی لازم را داشته باشد، کلاینت MySQL را باز کنید.

sudo mysql

اگر تأیید پسورد را برای روت تنظیم کرده باشید، نیاز به فرمان زیر برای دسترسی به MySQL shell پیدا می‌کنید.

mysql -u root -p

برای تغییر هاست کاربر می‌توانید از فرمان RENAME USER استفاده کنید. فرمان زیر را تایپ نمایید. دقت کنید که حتماً نام کاربری MySQL و remote_server_ip را با نام کاربری و آدرس IP سرور ریموت جایگزین کنید.

RENAME USER 'sammy'@'localhost' TO 'sammy'@'remote_server_ip';

البته به جای این کار، می‌توانید یک حساب کاربری جدید برای صرفاً ارتباط با هاست ریموت ایجاد کنید.

CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';

نکته: این فرمان موجب ایجاد یک کاربر با تأیید پلاگین پیش‌فرض تأییدیه MySQL ، یعنی caching_sha2_password می‌شود. با این وجود، درنظر داشته باشید که در برخی نسخه‌های PHP ممکن است این کار باعث بروز برخی مشکلات شود.

در صورتی که قصد دارید از این پایگاه داده به همراه یک اپلیکیشن PHP، به عنوان مثال phpMyAdmin استفاده کنید، احتمالاً باید یک کاربر ریموت با تأیید پلاگین قدیمی‌تر و امن‌تر mysql_native_password ایجاد نمایید.

CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

اگر در این رابطه مطمئن نیستید، می‌توانید همیشه یک کاربر با تأیید caching_sha2_plugin ایجاد کرده و سپس آن را تغییر دهید.

ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

اعطای مجوّزهای دسترسی به کاربر

سپس به کاربر جدید دسترسی‌های لازم را بدهید. در مثالی که در ادامه می‌آید، به یک کاربر مجوّزهای ساخت، تغییر و حذف پایگاه‌های داده، جداول و کاربران، و همین‌طور، توانایی وارد کردن، بروزرسانی و پاک‌کردن داده‌ها از هر کدام از جداول سرور داده می‌شود. اگر به کاربر توانایی درخواست داده با SELECT می‌دهید، حتماً کلیدهای خارجی با کلیدواژه REFERENCES ایجاد کنید و با مجوّز RELOAD، عملیات FLUSH را انجام دهید. در هر صورت، بایستی به کاربران مجوّزهای موردنیازشان را بدهید. در این رابطه، دقت لازم را داشته باشید.

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;

به دنبال این کار، استفاده از فرمان FLUSH PRIVILEGES توصیه می‌شود. در نتیجه، هر گونه حافظه‌ای که سرور برای ایجاد کاربر و عملیات GRANT استفاده کرده، پاک می‌شود.

FLUSH PRIVILEGES;

اکنون می‌توانید از کلاینت MySQL خارج شوید.

exit

نهایتاً با این فرض که یک دیوار آتش یا فایروال برای سرور پایگاه داده تنظیم کرده باشید، نیاز به باز کردن پورت پیش‌فرض MySQL یعنی 3306 دارید. در نتیجه، ترافیک MySQL مجوّز خواهد داشت.

اگر قصد دارید که برای دسترسی ریموت به MySQL صرفاً از طریق یک سیستم اقدام کنید، می‌توانید مجوّز لازم برای ارتباط ریموت با پایگاه داده را فقط برای این سیستم فعال کنید. برای این منظور، فرمان زیر به کمک شما می‌آید. حتماً دقت کنید که عبارت remote_IP_address را با ‌آدرس IP سیستم موردنظرتان جایگزین نمایید.

sudo ufw allow from remote_IP_address to any port 3306

در صورتی که بخواهید در آینده برای دسترسی ریموت به MySQL از سیستم‌های دیگر استفاده کنید، می‌توانید دسترسی لازم برای آنها را بر پایه ad hoc با این فرمان ایجاد نمایید. به خاطر داشته باشید که حتماً آدرس IP موردنظر را جایگزین کنید.

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

sudo ufw allow 3306

حالا دسترسی ریموت به MySQL را از طریق یک سیستم دیگر امتحان کنید.

نکته: اگر قاعده‌ای به فایروال برای مجوّز به ارتباط صرفاً از یک آدرس IP خاص اضافه کردید، بایستی از طریق سیستم مرتبط با این آدرس به پایگاه داده دسترسی پیدا کنید.

mysql -u user -h database_server_ip -p

اگر بتوانید دسترسی ریموت به پایگاه داده MySQL داشته باشید، این موضوع تأیید می‌شود که پارامتر bind-address در فایل تنظیمات، مشکل شما بوده است. با این حال، توجه داشته باشید که تنظیم این پارامتر به مقدار 0.0.0.0 راه‌حل چندان امنی نیست. همه می‌توانند از هر IP ممکن به سرور شما وصل شوند. از طرف دیگر، اگر هنوز هم نمی‌توانید به پایگاه داده دسترسی ریموت داشته باشید، احتمالاً چیز دیگری باعث این موضوع شده است. مطالب وبلاگ آریانت در آینده راهگشا خواهند بود.