بلاگ/دسترسی ریموت به سرور پایگاه داده MySQL
به‌روز شده

دسترسی ریموت به سرور پایگاه داده MySQL

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

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

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

یکی از مشکلات رایجی که کاربران در هنگام کار با پایگاه داده ریموت MySQL پیدا می‌کنند این است که این پایگاه داده تنها برای دریافت ارتباط‌های لوکال تنظیم شده است. این در واقع، این تنظیمات  پیش‌فرض است و برای دسترسی ریموت به MySQL، پایگاه داده می‌بایست بتواند ارتباط از طریق یک IP خارجی را دریافت کند. برای این منظور، فایل mysqld.cnf را باز کنید.
php
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
به سراغ خطی که با پارامتر bind-address شروع می‌شود بروید. این بخش ظاهری شبیه به زیر خواهد داشت.
php
. . .lc-messages-dir = /usr/share/mysqlskip-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 تغییر دهید.
php
. . .lc-messages-dir = /usr/share/mysqlskip-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 موجود نباشد. در این حالت، به سراغ این پارامتر در انتهای فایل بروید.
php
. . .pid-file        = /var/run/mysqld/mysqld.pidsocket          = /var/run/mysqld/mysqld.sockdatadir         = /var/lib/mysqllog-error       = /var/log/mysql/error.logbind-address            = 0.0.0.0
پس از تغییر این خط، فایل را ذخیره کرده و ببندید. سپس سرویس MySQL را دوباره راه‌اندازی کنید تا تغییرات در فایل mysqld.cnf اِعمال شوند.
php
sudo systemctl restart mysql

حساب کاربری

در صورتی که یک حساب کاربری MySQL دارید و می‌خواهید برای دسترسی ریموت به MySQL از آن استفاده کنید،  بایستی حتماً آن را برای ارتباط سرور ریموت به جای لوکال‌هاست تنظیم نمایید. برای این منظور، با کاربر روت MySQL یا کاربر دیگری که دسترسی لازم را داشته باشد، کلاینت MySQL را باز کنید.
php
sudo mysql
اگر تأیید پسورد را برای روت تنظیم کرده باشید، نیاز به فرمان زیر برای دسترسی به MySQL shell پیدا می‌کنید.
php
mysql -u root -p
برای تغییر هاست کاربر می‌توانید از فرمان RENAME USER استفاده کنید. فرمان زیر را تایپ نمایید. دقت کنید که حتماً نام کاربری MySQL و remote_server_ip را با نام کاربری و آدرس IP سرور ریموت جایگزین کنید.
php
RENAME USER 'sammy'@'localhost' TO 'sammy'@'remote_server_ip';
البته به جای این کار، می‌توانید یک حساب کاربری جدید برای صرفاً ارتباط با هاست ریموت ایجاد کنید.
php
CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';
نکته: این فرمان موجب ایجاد یک کاربر با تأیید پلاگین پیش‌فرض تأییدیه MySQL ، یعنی caching_sha2_password می‌شود. با این وجود، درنظر داشته باشید که در برخی نسخه‌های PHP ممکن است این کار باعث بروز برخی مشکلات شود. در صورتی که قصد دارید از این پایگاه داده به همراه یک اپلیکیشن PHP، به عنوان مثال phpMyAdmin استفاده کنید، احتمالاً باید یک کاربر ریموت با تأیید پلاگین قدیمی‌تر و امن‌تر mysql_native_password ایجاد نمایید.
php
CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
اگر در این رابطه مطمئن نیستید، می‌توانید همیشه یک کاربر با تأیید caching_sha2_plugin ایجاد کرده و سپس آن را تغییر دهید.
php
ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

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

سپس به کاربر جدید دسترسی‌های لازم را بدهید. در مثالی که در ادامه می‌آید، به یک کاربر مجوّزهای ساخت، تغییر و حذف پایگاه‌های داده، جداول و کاربران، و همین‌طور، توانایی وارد کردن، بروزرسانی و پاک‌کردن داده‌ها از هر کدام از جداول سرور داده می‌شود. اگر به کاربر توانایی درخواست داده با SELECT می‌دهید، حتماً کلیدهای خارجی با کلیدواژه REFERENCES ایجاد کنید و با مجوّز RELOAD، عملیات FLUSH را انجام دهید. در هر صورت، بایستی به کاربران مجوّزهای موردنیازشان را بدهید. در این رابطه، دقت لازم را داشته باشید.
php
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;
به دنبال این کار، استفاده از فرمان FLUSH PRIVILEGES توصیه می‌شود. در نتیجه، هر گونه حافظه‌ای که سرور برای ایجاد کاربر و عملیات GRANT استفاده کرده، پاک می‌شود.
php
FLUSH PRIVILEGES;
اکنون می‌توانید از کلاینت MySQL خارج شوید.
php
exit
نهایتاً با این فرض که یک دیوار آتش یا فایروال برای سرور پایگاه داده تنظیم کرده باشید، نیاز به باز کردن پورت پیش‌فرض MySQL یعنی 3306 دارید. در نتیجه، ترافیک MySQL مجوّز خواهد داشت. اگر قصد دارید که برای دسترسی ریموت به MySQL صرفاً از طریق یک سیستم اقدام کنید، می‌توانید مجوّز لازم برای ارتباط ریموت با پایگاه داده را فقط برای این سیستم فعال کنید. برای این منظور، فرمان زیر به کمک شما می‌آید. حتماً دقت کنید که عبارت remote_IP_address را با ‌آدرس IP سیستم موردنظرتان جایگزین نمایید.
php
sudo ufw allow from remote_IP_address to any port 3306
در صورتی که بخواهید در آینده برای دسترسی ریموت به MySQL از سیستم‌های دیگر استفاده کنید، می‌توانید دسترسی لازم برای آنها را بر پایه ad hoc با این فرمان ایجاد نمایید. به خاطر داشته باشید که حتماً آدرس IP موردنظر را جایگزین کنید. در همین حال، می‌توانید با فرمان زیر به تمام ارتباطات به پایگاه داده MySQL از هر آدرس IP مجوّز بدهید. در صورتی که پایگاه داده شما حاوی اطلاعات حساس است، هرگز از این فرمان استفاده نکنید.
php
sudo ufw allow 3306
حالا دسترسی ریموت به MySQL را از طریق یک سیستم دیگر امتحان کنید. نکته: اگر قاعده‌ای به فایروال برای مجوّز به ارتباط صرفاً از یک آدرس IP خاص اضافه کردید، بایستی از طریق سیستم مرتبط با این آدرس به پایگاه داده دسترسی پیدا کنید.
php
mysql -u user -h database_server_ip -p
اگر بتوانید دسترسی ریموت به پایگاه داده MySQL داشته باشید، این موضوع تأیید می‌شود که پارامتر bind-address در فایل تنظیمات، مشکل شما بوده است. با این حال، توجه داشته باشید که تنظیم این پارامتر به مقدار 0.0.0.0 راه‌حل چندان امنی نیست. همه می‌توانند از هر IP ممکن به سرور شما وصل شوند. از طرف دیگر، اگر هنوز هم نمی‌توانید به پایگاه داده دسترسی ریموت داشته باشید، احتمالاً چیز دیگری باعث این موضوع شده است. مطالب وبلاگ آریانت در آینده راهگشا خواهند بود.

برچسب‌ها

این مطلب مفید بود؟

نظر شما به بهتر شدن محتوا کمک می‌کند

5498 بازدید