MongoDB عبارة عن قاعدة بيانات NoSQL مستندات مجانية ومفتوحة المصدر تُستخدم غالبا في تطبيقات الويب الحديثة.
في هذا المقال سنُثبِّت MongnDB، ونُدير خدماتها، ونحميها، ونُفعل الوصول البعيد لها.
المتطلبات
تحتاج لتطبيق هذا الدرس إلى خادم أوبونتو مُعَد باتباع مقال الإعداد الأولي، ويحتوي على مستخدم sudo غير مسؤول وجدار حماية.
الجزء الأول: تثبيت MongoDB
خطوة 1 - تثبيت MongoDB
حزمة مخزن أوبونتو الرسمي يحتوي على نسخة مُحدثه من MongoDB، ما يعني أنه بإمكاننا تثبيت حزماتِه المهمة باستخدام apt
.
بداية حدِّث قائمة الحُزم كي تحصل على أحدث الاصدارات:
$ sudo apt update
الآن ثبّت حزمة MongoDB:
$ sudo apt install -y mongodb
يُثبّت هذا الأمر عدة حُزم تحتوي على أحدث إصدار من MongoDB بالاضافة إلى أدوات إدارة مساعدة لخادم MongoDB. يبدأ خادم قاعدة البيانات بالعمل تلقائيا بعد التثبيت.
تاليًا، نتحقق ما إن كان الخادم بعمل بصورة صحيحة.
خطوة 2 - التحقق من الخدمة وقاعدة البيانات
قامت عملية تثبيت MongoDB بتشغيله تلقائيا، لكن لنتأكد من بدء الخدمة ومن صحة عمل قاعدة البيانات.
أولا تحقق من حالة الخدمة:
$ sudo systemctl status mongodb
سترى هذه المخرجات:
● mongodb.service - An object/document-oriented database
Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-05-26 07:48:04 UTC; 2min 17s ago
Docs: man:mongod(1)
Main PID: 2312 (mongod)
Tasks: 23 (limit: 1153)
CGroup: /system.slice/mongodb.service
└─2312 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf
يصرِّح systemd
أنَّ خادم MongoDB يعمل.
يمكننا التحقق أكثر عن طريق الاتصال بخادم قاعدة البيانات وتنفيذ أمر للفحص .نفّذ الأمر التالي:
$ mongo --eval 'db.runCommand({ connectionStatus: 1 })'
المخرجات:
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
{
"authInfo" : {
"authenticatedUsers" : [ ],
"authenticatedUserRoles" : [ ]
},
"ok" : 1
}
القيمة 1
للحقل ok
تعني أن الخادم يعمل بطريقة صحيحة.
بعد ذلك، سنتطرق إلى كيفية إدارة حالة الخادم.
خطوة 3 - إدارة خدمة MongoDB
تُثبت MongoDB كخدمة ضمن النظام، ما يعني أنه يُمكنك إدارتها باستخدام أوامر systemd
القياسية مثل باقي خدمات النظام على أوبونتو.
لتتأكد من حالة الخدمة نفذ الأمر:
$ sudo systemctl status mongodb
يمكنك إيقاف الخادم في أي وقت من خلال الأمر:
$ sudo systemctl stop mongodb
لبدء الخادم عندما يكون متوقفًا عن العمل:
$ sudo systemctl start mongodb
يمكن إعادة تشغيل الخادم باستخدام أمر واحد:
$ sudo systemctl restart mongodb
MongoDB مُعد لِلبدء تلقائيا مع بدء الخادم، لإيقاف البدء التلقائي:
$ sudo systemctl disable mongodb
لتفعيل الميزة مجددا:
$ sudo systemctl enable mongodb
تاليًا، إعداد جدار الحماية لعملية تثبيت MongoDB.
خطوة 4 - إعداد جار الحماية (اختياري)
بافتراض أنك اتبعت مقال الإعداد الأولي لخادم أوبونتو لِتفعيل جدار الحماية، فإن خادم MongoDB لا يمكن أن يُوصل من خلال الإنترنت.
في حال كنت تنوي استخدام خادم MongoDB محليا مع التطبيقات على نفس الخادم فقط فهذا الإعداد هو الأمثل. لكن إن كنت تريد أن تتصل بخادم قاعدة بيانات MongoDB من خلال الانترنت فيجب أن تسمح للاتصالات الخارجية في ufw
.
للسماح بالوصول من أي مكان إلى MongoDB على المنفذ الافتراضي 27017
يمكنك استخدام sudo ufw allow 27017
. لكن تفعيل وصول الإنترنت إلى خادم MongoDB في التثبيت الافتراضي يعطي دخول غير محدود بضوابط لِخادم قاعدة البيانات وبياناته.
في معظم الحالات يجب الوصول إلى MongoDB من أماكن موثوقة معينة فقط، مثل خادم آخر يستضيف تطبيقا مًا. للقيام بذلك، يمكنك السماح بالوصول إلى منفذ MongoDB الافتراضي مع تحديد عنوان بروتوكول الإنترنت للخادم الآخر الذي سيتمكن من الوصول إلى خادم MongoDB مباشرة:
$ sudo ufw allow from your_other_server_ip/32 to any port 27017
يمكنك التحقق من التغييرات في جدار الحماية باستخدام ufw
:
$ sudo ufw status
يجب أن ترى أن حركة المرور للمنفذ 27017
متاحة في المخرجات "output":
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
27017 (v6) ALLOW Anywhere (v6)
إن كنت قد قمت بتحديد عنوان بروتوكول إنترنت معين للاتصال بخادم MongoDB، فستراه بدلا من كلمة Anywhere
في المخرجات.
للمزيد من إعدادات جدار الحماية المتقدمة لحد الوصول إلى خدمات UFW الأساسية: قواعد وأوامر جدار الحماية الشائعة.
على الرغم من أنَّ المنفذ مفتوح، إلا أن MongoDB يسمع فقط للعنوان المحلي 127.0.0.1
. للسماح بالوصول من بعد، أضف عنوان بروتوكول الخادم العام و القابل للتوجيه إلى ملف mongod.conf
.
افتح ملف ضبط MongoDB:
$ sudo nano /etc/mongodb.conf
أضف عنوان بروتوكول الانترنت الخاص بالخادم إلى قيمة bindIP
:
...
logappend=true
bind_ip = 127.0.0.1,your_server_ip
#port = 27017
...
لا تنسَ وضع فاصلة بين عناوين بروتوكول الإنترنت الموجودة والعنوان الذي أضفته الآن.
احفظ الملف واغلقه، ثم أعد تشغيل MongoDB:
$ sudo systemctl restart mongodb
الجزء الثاني: تأمين MongoDB
كانت الاصدارات السابقة ل MongoDB مُعرَّضة للاختراق لأنَّها لا تتطلب أي مصادقة للتفاعل مع قاعدة البيانات. يمكن لأي مستخدم إنشاء وحذف قواعد بيانات وقراءة محتواها والكتابة فيها تلقائيا. أعدَّت أيضا هذه الاصدارات برنامج MongoDB خفي يسمع لجميع الواجهات تلقائيًا، مما يعني أن السكربتات التلقائية يمكن أن تكتشف حالات MongoDB الغير محمية بجدار حماية، وإن لم تكُن المصادقة مفعلة، يمكن لهذه السكربتات الحصول على وصول كامل إلى MongoDB.
خُفِّفَت الحالة في الاصدار 3.x وبعض الاصدارات السابقة المُقدَّمة من بعض مديري الحُزم لأن البرنامج الخفي أصبح الآن مرتبط ب 127.0.0.1، لذلك سيقبل الاتصالات على حزمة يونكس فقط. أي أنه أصبح غير مفتوحًا للإنترنت.
لأن المصادقة ما زالت مُعَطَّلة افتراضيا، فإن لدى أي مستخدم على النظام المحلي وصول كامل لقاعدة البيانات. سنُنشِئ مستخدمًا مسؤولًا لتأمين ذلك، ونُفَعِّل المصادقة ونتحقق من ذلك.
خطوة 1 - إضافة مستخدم مسؤول
سنتَّصِل بسطر أوامر Mongo لإضافة مستخدم:
$ mongo
تُحذِّر المُخرجات عندما نستخدم سطر أوامر Mongo من أن التحكم بالوصول معطل لقاعدة البيانات وأن وصول القراءة والكتابة للبيانات والإعدادت غير مقيدة. مخرجات تنفيذ الأمرالسابق هي:
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten]
>
يمكنك اختيار الاسم الذي تريده للمستخدم المسؤول لأنَّ الصلاحيات تأتي من إعطاء الدور userAdminAnyDatabase
. تُحدد قاعدة البيانات admin
أين تُخَزَّن بيانات الاعتماد. يمكنك الاطلاع أكثر عن المصادقة في جزء مصادقة أمنية MongoDB.
حدد اسم مستخدم وتأكد من اختيار كلمة مرور آمنة واستبدِلهما في الأمر التالي:
> use admin
> db.createUser(
> {
> user: "AdminSammy",
> pwd: "AdminSammy'sSecurePassword",
> roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
> }
> )
عند بدء أمر db.createUser
، فإن سطر الأوامر سيضع ثلاث نقاط قبل كل سطر حتى انتهاء الأمر. بعد ذلك، يظهر رد بأن المستخدم قد أُنشِئ كالتالي:
المخرجات:
> use admin
switched to db admin
> db.createUser(
... {
... user: "AdminSammy",
... pwd: "AdminSammy'sSecurePassword",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {
"user" : "AdminSammy",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
اكتب "exit" ثم اضغط على ENTER
أو اضغط على CTRL+C
للخروج.
سَيُتاح الآن للمستخدم إدخال بيانات الاعتماد، لكن لن يُطلَب هذا من المستخدام حتى تفعيل المصادقة وإعادة تشغيل برنامج MongoDB الخفي.
خطوة 2 - تفعيل المصادقة
المصادقة مفعلة في ملف mongod.conf
. عند تفعيلها وإعادة تشغيل mongod
، سيظل المستخدمون قادرون على الاتصال ب Mongo بدون مصادقة، لكن سيُطلَب منهم اسم مستخدم وكلمة مرور قبل أي تفاعل.
لنفتح ملف الإعداد:
$ sudo nano /etc/mongod.conf
في الجزء #security
، ستُزيل التعليق من أمام security
لتفعيل المقطع. ثم سنُضيف إعداد المصادقة. يجب أن تبدو الأسطر كما في الأسفل بعد إلغاء تعليقها:
- الملف mongodb.conf:
. . . security: authorization: "enabled" . . .
لاحظ أنَّ سطر "Security" لا يحوي مسافة في بدايته، بينما سطر "authorization" يجب أن يبدأ بِمسافتين.
نُعيد تشغيل البرنامج الخفي بعد حفظ الملف وإغلاقه:
$ sudo systemctl restart mongod
إن أخطأنا في ملف الإعداد فلن يبدأ البرنامج الخفي بالعمل. ولأن systemctl
لا تعرض أي مخرجات فَسنستخدم خيار status
للتحقق من ذلك:
$ sudo systemctl status mongod
إن ظهر Active: active (running)
في المخرجات وانتهى بشيء كما يلي، فإن أمر restart
قد نُفِّذ بنجاح:
المخرجات:
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.
بعد التأكد من أن البرنامج الخفي يعمل، لنُجَرِّب المصادقة.
خطوة 3 - التحقق من منع المستخدمين غير المخولين
أولا، نحاول الاتصال بدون معلومات اعتماد للتحقق من أن الدخول ممنوع:
$ mongo
تم حل جميع التحذيرات بعد تفعيل المصادقة.
المخرجات:
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
اتصلنا بقاعدة بيانات test
. سَنتأكد من أن الوصول ممنوع باستخدام الأمر show dbs
:
> show dbs
المخرجات:
2017-02-21T19:20:42.919+0000 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
. . .
لن نتمكن من إنشاء مستخدمين أو تنفيذ أوامر بصلاحيات مشابهة بدون مصادقة.
نُغلِق سطر الأوامر للمتابعة:
> exit
ثانيًا، نتحقق من أن المستخدم المسؤول الذي أنشأناه يمكنه الوصول.
خطوة 4 - التحقق من إمكانية وصول المستخدم المسؤول
سَنَتَّصِل باستخدام المستخدم المسؤول الذي أنشأناه باستخدام الخيار -u
لتزويد اسم المستخدم والخيار -p
ليطلب كلمة مرور. سنحتاج أيضا إلى تزويد اسم قاعدة البيانات التي خُزِّنَت فيها بيانات اعتماد المستخدم باستخدام الخيار --authenticationDatabase
.
$ mongo -u AdminSammy -p --authenticationDatabase admin
سيُطلب منَّا كلمة المرور، لذلك ندخلها. سننتقل إلى سطر الأوامر عند ادخال كلمة المرور الصحيحة حيث يمكننا تنفيذ الأمر show dbs
:
المخرجات
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
>
يجب أن نرى قاعدة البيانات بدلًا من رفض الوصول:
> show dbs
المخرجات:
admin 0.000GB
local 0.000GB
للخروج، أدخل exit
أو اضغط CTRL+C
.
خاتمة
ثبَّتنا الآن MongoDB وإجرينا عمليات التهيئة والحماية المطلوبة وتحققنا من عملها. يمكنك الآن بدء استعمالها وأنت مطمئن القلب ومرتاح البال.
يمكنك العثور على المزيد من الدروس المتعمقة في كيفية إعداد واستخدام MongoDB في هذه المقالات من أكاديمية حسوب. يُعد التوثيق الرسمي ل MongoDB أيضا مصدر ممتاز للخيارات التي يقدمها MongoDB.
كما يمكنك الاطلاع على توثيق MongoDB لتتعلم أكثر عن المصادقة، والتحكم بالوصول وفقا للدور، والمستخدمون والأدوار.
ترجمة -وبتصرف- للمقال How to Install MongoDB on Ubuntu 18.04 لصاحبه الكاتب Mateusz Papiernik.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.