يحتوي خادم قاعدة البيانات على VPS عادةً على أثمن البيانات في الجهاز، وكثيراً ما يُضبط مرة واحدة ثم يُنسى. والإعدادات الافتراضية في حزم Debian وUbuntu الحالية معقولة، لكن بضع عادات تصنع الفرق بين قاعدة بيانات مثبّتة فحسب وأخرى آمنة للتشغيل المستمر: أبعِدها عن الشبكة، ونظّف الحسابات الأولية، وامنح التطبيقات صلاحيات ضيقة، وشفّر أي حركة تغادر الخادم.
ما الذي تثبّته توزيعتك
- يأتي Debian 12 (bookworm) بالإصدار 10.11 من MariaDB، ويأتي Debian 13 (trixie) بالإصدار 11.8 (متتبع الحزم). ولا يتضمن أي منهما خادم MySQL من Oracle في أرشيفه الرئيسي.
- يوفر Ubuntu 22.04 و24.04 الإصدار 8.0 من MySQL، ويوفر Ubuntu 26.04 الإصدار 8.4. كما يتوفر MariaDB بالإصدارات 10.6 و10.11 و11.8 على الترتيب (packages.ubuntu.com).
dpkg -l | grep -E 'mariadb-server|mysql-server'
mariadb --version 2>/dev/null || mysql --versionالخطوة الأولى: أبقِها على localhost
إذا كان التطبيق يعمل على الخادم نفسه فلا ينبغي أن تستمع قاعدة البيانات على عنوان عام. وتضبط حزم Debian وUbuntu القيمة bind-address = 127.0.0.1: لـ MariaDB في الملف /etc/mysql/mariadb.conf.d/50-server.cnf، ولـ MySQL على Ubuntu في الملف /etc/mysql/mysql.conf.d/mysqld.cnf الذي يربط أيضاً منفذ X Protocol بـ localhost عبر mysqlx-bind-address. تحقق مما يستمع فعلاً:
sudo ss -tlnp | grep -E ':3306|:33060'المطلوب أن ترى 127.0.0.1:3306 لا 0.0.0.0:3306. وإذا كان لا بد من اتصال خادم آخر فاربط القاعدة بعنوان خاص لا عام، واسمح بالمنفذ 3306 من ذلك الخادم فقط في جدار الحماية على الخادم وفي أي جدار حماية سحابي، وأنشئ المستخدم لذلك المضيف وحده، واشترط TLS (الخطوة الرابعة).
الخطوة الثانية: نظّف الحسابات الأولية
يوفر المشروعان سكربتاً يضبط كلمة مرور الجذر أو يتحقق منها، ويحذف حسابات الجذر التي يمكن الوصول إليها من مضيفات أخرى، ويحذف المستخدمين المجهولين، ويحذف قاعدة البيانات test التي يستطيع المستخدمون المجهولون الوصول إليها (mariadb-secure-installation وmysql_secure_installation):
# MariaDB
sudo mariadb-secure-installation
# MySQL
sudo mysql_secure_installationفي Debian وUbuntu يُصادَق على root@localhost عبر نظام التشغيل لا بكلمة مرور؛ إذ يستخدم MariaDB الإضافة unix_socket، ويستخدم MySQL في Ubuntu الإضافة auth_socket. ولهذا يفتح الأمر sudo mariadb أو sudo mysql جلسة جذر دون كلمة مرور، وهذا آمن لأنه يتطلب صلاحيات الجذر على الخادم. أبقِ الأمر كذلك، ولا تسمح أبداً لتطبيق بالاتصال بمستخدم الجذر في قاعدة البيانات. ثم راجع الحسابات الموجودة:
SELECT User, Host FROM mysql.user;احذف الحسابات التي لا تعرفها، وراجع أي حساب قيمة المضيف فيه %، أي أي عنوان.
الخطوة الثالثة: مستخدم بأقل الصلاحيات لكل تطبيق
إرشادات الأمان في MySQL صريحة: لا تمنح صلاحيات أكثر من اللازم، ولا تمنح صلاحيات لكل المضيفات أبداً، ولا تمنح أحداً غير الجذر وصولاً إلى جدول mysql.user. وعملياً امنح كل تطبيق قاعدة بيانات ومستخدماً خاصين به، مقيّدين بتلك القاعدة:
CREATE DATABASE shop;
CREATE USER 'shop_app'@'localhost' IDENTIFIED BY 'long-random-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop_app'@'localhost';
-- optional: a separate account for schema migrations
CREATE USER 'shop_migrate'@'localhost' IDENTIFIED BY 'another-long-password';
GRANT ALL PRIVILEGES ON shop.* TO 'shop_migrate'@'localhost';
SHOW GRANTS FOR 'shop_app'@'localhost';لا تمنح حساب تطبيق صلاحيات ON *.* أبداً. واحفظ كلمة مروره في ملف إعداد لا يقرؤه إلا مستخدم التطبيق، لا في مجلد ويب يقرؤه الجميع، واستخدم قيمة عشوائية طويلة (مثلاً من openssl rand -base64 32).
الخطوة الرابعة: شفّر الاتصالات التي تغادر الخادم
الاتصالات عبر واجهة loopback أو المقبس المحلي لا تعبر الشبكة، أما ما سواها فاستخدم له TLS:
- MariaDB 11.4 وما بعده، ومنه الإصدار 11.8 في Debian 13، يفعّل TLS تلقائياً؛ فبحسب توثيق MariaDB ينشئ الخادم الشهادات عند الإقلاع ويحفظها في الذاكرة، ويتحقق العملاء من شهادة الخادم افتراضياً مع إضافات المصادقة المناسبة. وقد تفضّل مع ذلك شهاداتك الخاصة في بيئة الإنتاج.
- إصدارات MariaDB الأقدم، مثل 10.11 في Debian 12، تحتاج إلى ضبط
ssl_certوssl_keyوssl_caفي إعداد الخادم. - MySQL يستخدم الإعدادات الثلاثة نفسها، ويجعل
require_secure_transport=ONالاتصالات المشفرة إلزامية (الاتصالات المشفرة في MySQL).
وعلى مستوى الحساب يفرض الخيار REQUIRE SSL استخدام TLS لذلك المستخدم، وهو مناسب للمستخدم الذي يتصل من خادم آخر:
CREATE USER 'report'@'10.0.0.5' IDENTIFIED BY 'long-random-password' REQUIRE SSL;
GRANT SELECT ON shop.* TO 'report'@'10.0.0.5';
-- from the client, check that the session is encrypted
SHOW STATUS LIKE 'Ssl_version';الخطوة الخامسة: التحديث وحماية ملفات التفريغ
ثبّت تحديثات قاعدة البيانات مع بقية النظام (sudo apt update && sudo apt upgrade) ثم أعد تشغيل الخدمة: sudo systemctl restart mariadb، أو mysql لخادم MySQL على Ubuntu. وتعامل مع النسخ الاحتياطية على أنها نسخ كاملة من قاعدة البيانات؛ فملفات التفريغ الناتجة عن mariadb-dump أو mysqldump تحتوي على كل الصفوف نصاً صريحاً، فاحفظها بصلاحيات مقيّدة، وشفّرها إذا غادرت الخادم، واختبر استعادتها.
أخطاء شائعة
- تغيير
bind-addressإلى0.0.0.0وإنشاء مستخدمين بمضيف%«لكي يعمل الوصول عن بُعد». - تطبيق يتصل بحساب الجذر، أو حساب واحد تتشاركه عدة تطبيقات.
- أداة ويب لإدارة قاعدة البيانات يمكن الوصول إليها من الإنترنت كله.
- نشر المنفذ 3306 من حاوية Docker، مما يتجاوز قواعد ufw.
ما الذي ينبغي فعله
- شغّل
ss -tlnpوتأكد من أن قاعدة البيانات تستمع فقط على localhost أو على عنوان خاص. - شغّل سكربت التثبيت الآمن، وراجع
mysql.user، واحذف الحسابات المجهولة وحسابات الجذر البعيدة والحسابات غير المعروفة. - امنح كل تطبيق مستخدماً خاصاً مقيّداً بقاعدة بياناته، ولا تستخدم الجذر في إعدادات أي تطبيق.
- اشترط TLS لكل حساب يتصل من مضيف آخر.
- حافظ على تحديث الخادم وأعد تشغيله بعد التحديثات، واحمِ ملفات التفريغ واختبرها.
المصادر
- mariadb.com/docs/server/clients-and-utilities/deployment-tools/mariadb-secure-installation
- mariadb.com/docs/server/reference/plugins/authentication-plugins/authentication-plugin-...
- mariadb.com/docs/server/security/encryption/data-in-transit-encryption/securing-connect...
- mariadb.com/docs/server/server-management/install-and-upgrade-mariadb/installing-mariad...
- dev.mysql.com/doc/refman/8.4/en/mysql-secure-installation.html
- dev.mysql.com/doc/refman/8.4/en/security-guidelines.html
- dev.mysql.com/doc/refman/8.4/en/using-encrypted-connections.html
- documentation.ubuntu.com/server/how-to/databases/install-mysql
- git.launchpad.net/ubuntu/+source/mariadb/plain/debian/additions/mariadb.conf.d/50-serve...
- git.launchpad.net/ubuntu/+source/mysql-8.0/plain/debian/additions/mysql.conf.d/mysqld.c...
- tracker.debian.org/pkg/mariadb
- packages.ubuntu.com/search?keywords=mysql-server&searchon=names&exact=1&suite=all§i...
- packages.ubuntu.com/search?keywords=mariadb-server&searchon=names&exact=1&suite=all&sec...
Comments
0 total · 0 threads