أنت تحتاج أن توصل برنامجَ مكتبٍ بقاعدةِ بياناتٍ على خادم. والطريقُ السريع — الربطُ بكلّ العناوين وفتحُ المنفذ — يضع قاعدتك أمام الإنترنت كلّه، حيث تجدها الماسحاتُ خلال ساعات. وثمّة طريقٌ أفضل لا يستغرق أطول.
الجواب الصحيح: نفقُ SSH
ssh -N -L 3307:127.0.0.1:3306 sara@server.example.com
# then point the client at:
# host 127.0.0.1 port 3307
تظلّ قاعدةُ البيانات تُنصت على المضيف المحلّيّ وحده، ولا يُفتَح شيءٌ في الجدار الناريّ، والاتّصالُ يشفّره SSH. وكلُّ برنامج مكتبٍ — TablePlus وDBeaver وSequel Ace وMySQL Workbench — فيه هذا مدمجًا خيارَ SSH.
تأكّد أنّها ليست مكشوفةً سلفًا
sudo ss -tlnp | grep 3306
# 127.0.0.1:3306 good
# 0.0.0.0:3306 exposed
# /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1
وإن وجب حقًّا أن تكون مُتاحة
خادمُ تطبيقاتٍ في مركز بياناتٍ آخر مثلًا. فعندئذٍ: شبكةٌ خاصّة إن كان المزوّد يقدّمها، وقاعدةُ جدارٍ ناريّ تسمّي عنوانَ المصدر بالضبط، ومستخدمٌ مقصورٌ على ذلك المضيف، وتشفيرٌ مشترَط.
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY '...' REQUIRE SSL;
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.20';
ولا تُنشئ مستخدمًا برمز المضيف الشامل أبدًا — فمنحُ 'app'@'%' يعني من أيّ مكانٍ على الأرض. وهو أشيعُ سببٍ منفردٍ للاستيلاء على قاعدة بيانات، وهو محرفٌ واحد.
افحص ما هو قائمٌ سلفًا
SELECT user, host FROM mysql.user ORDER BY host;
وكلُّ صفٍّ فيه % في عمود المضيف يستحقّ تفسيرًا. انظر المستخدمون والصلاحيّات بلا إفراط.