الأذونات
يمكن استخدام الأذونات للتحكم في موارد النظام التي يمكن لعملية Node.js الوصول إليها أو الإجراءات التي يمكن للعملية اتخاذها باستخدام هذه الموارد.
- أذونات قائمة على العملية تتحكم في وصول عملية Node.js إلى الموارد. يمكن السماح بالمورد بالكامل أو رفضه، أو يمكن التحكم في الإجراءات المتعلقة به. على سبيل المثال، يمكن السماح بقراءات نظام الملفات مع رفض الكتابة. لا تحمي هذه الميزة من التعليمات البرمجية الضارة. وفقًا لسياسة أمان Node.js سياسة الأمان، فإن Node.js تثق بأي رمز يُطلب منها تشغيله.
ينفذ نموذج الأذونات نهج "حزام الأمان"، والذي يمنع التعليمات البرمجية الموثوقة من تغيير الملفات أو استخدام الموارد التي لم يتم منح الوصول إليها صراحةً بشكل غير مقصود. لا يوفر ضمانات أمان في وجود التعليمات البرمجية الضارة. يمكن للتعليمات البرمجية الضارة تجاوز نموذج الأذونات وتنفيذ تعليمات برمجية تعسفية دون القيود المفروضة من قبل نموذج الأذونات.
إذا وجدت ثغرة أمان محتملة، فيرجى الرجوع إلى سياسة الأمان الخاصة بنا.
أذونات قائمة على العملية
نموذج الأذونات
[مستقر: 2 - مستقر]
مستقر: 2 استقرار: 2 - مستقر.
يُعد نموذج أذونات Node.js آلية لتقييد الوصول إلى موارد محددة أثناء التنفيذ. يوجد واجهة برمجة التطبيقات خلف علامة --permission
التي عند تمكينها، ستقيد الوصول إلى جميع الأذونات المتاحة.
يتم توثيق الأذونات المتاحة بواسطة علامة --permission
.
عند بدء تشغيل Node.js باستخدام --permission
، ستُقيّد القدرة على الوصول إلى نظام الملفات من خلال وحدة fs
، وعمليات التوليد الفرعي، واستخدام node:worker_threads
، واستخدام الإضافات الأصلية، واستخدام WASI، وتمكين مُفتش وقت التشغيل.
$ node --permission index.js
Error: Access to this API has been restricted
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/home/user/index.js'
}
2
3
4
5
6
7
8
يمكن السماح بالوصول إلى إنشاء عملية وإنشاء مؤشرات الترابط للعمل باستخدام --allow-child-process
و --allow-worker
على التوالي.
للسماح بالإضافات الأصلية عند استخدام نموذج الأذونات، استخدم علامة --allow-addons
. بالنسبة إلى WASI، استخدم علامة --allow-wasi
.
واجهة برمجة التطبيقات وقت التشغيل
عند تمكين نموذج الأذونات من خلال علم --permission
، تتم إضافة خاصية جديدة permission
إلى كائن process
. يحتوي هذا الكائن على دالة واحدة:
permission.has(scope[, reference])
دعوة واجهة برمجة التطبيقات للتحقق من الأذونات وقت التشغيل (permission.has()
)
process.permission.has('fs.write') // true
process.permission.has('fs.write', '/home/rafaelgss/protected-folder') // true
process.permission.has('fs.read') // true
process.permission.has('fs.read', '/home/rafaelgss/protected-folder') // false
2
3
4
5
أذونات نظام الملفات
يقيد نموذج الأذونات، بشكل افتراضي، الوصول إلى نظام الملفات من خلال الوحدة النمطية node:fs
. لا يضمن ذلك عدم قدرة المستخدمين على الوصول إلى نظام الملفات من خلال وسائل أخرى، مثل الوحدة النمطية node:sqlite
.
لسماح بالوصول إلى نظام الملفات، استخدم علمي --allow-fs-read
و --allow-fs-write
:
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
2
الحجج الصالحة لكلا العلمين هي:
*
- للسماح بجميع عملياتFileSystemRead
أوFileSystemWrite
، على التوالي.- المسارات المحددة بفاصلة (
,
) للسماح فقط بعملياتFileSystemRead
أوFileSystemWrite
المطابقة، على التوالي.
مثال:
--allow-fs-read=*
- سيسمح بجميع عملياتFileSystemRead
.--allow-fs-write=*
- سيسمح بجميع عملياتFileSystemWrite
.--allow-fs-write=/tmp/
- سيسمح بالوصول إلى الكتابة في مجلد/tmp/
.--allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore
- يسمح بالوصول للقراءة إلى مجلد/tmp/
و مسار/home/.gitignore
.
يتم دعم الأحرف البرية أيضًا:
--allow-fs-read=/home/test*
سيسمح بالوصول للقراءة لكل ما يتطابق مع الحرف البري. مثال:/home/test/file1
أو/home/test2
بعد تمرير حرف بري (*
) سيتم تجاهل جميع الأحرف اللاحقة. على سبيل المثال: /home/*.js
سيعمل بشكل مشابه لـ /home/*
.
عند تهيئة نموذج الأذونات، سيضيف تلقائيًا حرفًا بريًا (_) إذا كان الدليل المحدد موجودًا. على سبيل المثال، إذا كان /home/test/files
موجودًا، فسيتم التعامل معه على أنه /home/test/files/_
. ومع ذلك، إذا لم يكن الدليل موجودًا، فلن يتم إضافة الحرف البري، وسيكون الوصول محدودًا إلى /home/test/files
. إذا كنت ترغب في السماح بالوصول إلى مجلد غير موجود بعد، فتأكد من تضمين الحرف البري صراحةً: /my-path/folder-do-not-exist/\*
.
قيود نموذج الأذونات
هناك قيود تحتاج إلى معرفتها قبل استخدام هذا النظام:
لا يرث النموذج إلى عملية عقدة فرعية أو مؤشر ترابط عامل.
عند استخدام نموذج الأذونات، سيتم تقييد الميزات التالية:
- الوحدات الأصلية
- العملية الفرعية
- مؤشرات ترابط العامل
- بروتوكول المفتش
- الوصول إلى نظام الملفات
- WASI
يتم تهيئة نموذج الأذونات بعد إعداد بيئة Node.js. ومع ذلك، تم تصميم بعض الأعلام مثل
--env-file
أو--openssl-config
لقراءة الملفات قبل تهيئة البيئة. نتيجة لذلك، هذه الأعلام لا تخضع لقواعد نموذج الأذونات. وينطبق الشيء نفسه على أ flags V8 التي يمكن تعيينها عبر وقت التشغيل من خلالv8.setFlagsFromString
.لا يمكن طلب محركات OpenSSL في وقت التشغيل عندما يكون نموذج الأذونات ممكّنًا، مما يؤثر على الوحدات المشفرة المضمنة و https و tls.
لا يمكن تحميل امتدادات التحميل الديناميكي وقت التشغيل عندما يكون نموذج الأذونات ممكّنًا، مما يؤثر على وحدة sqlite.
يؤدي استخدام واصفات الملفات الموجودة عبر وحدة
node:fs
إلى تجاوز نموذج الأذونات.
القيود والمشاكل المعروفة
- سيتم اتباع الروابط الرمزية حتى إلى المواقع الموجودة خارج مجموعة المسارات التي تم منح الوصول إليها. قد تسمح الروابط الرمزية النسبية بالوصول إلى ملفات ودلائل تعسفية. عند بدء تشغيل التطبيقات مع تمكين نموذج الأذونات، يجب التأكد من عدم احتواء المسارات التي تم منح الوصول إليها على روابط رمزية نسبية.