Landlock(7)

الاسم
لاندلوك - التحكم بالوصول غير المميز

الوصف
لاندلوك هو نظام تحكم بالوصول يُمكّن أي عمليات من تقييد نفسها وأطفالها المستقبليين بشكل آمن. نظرًا لأن لاندلوك هو وحدة أمان لينكس قابلة للتكديس (LSM)، فإنه يجعل من الممكن إنشاء صناديق رمل أمان آمنة كطبقات أمان جديدة بالإضافة إلى ضوابط الوصول الحالية على مستوى النظام. من المتوقع أن يساعد هذا النوع من الصندوق الرملي في تخفيف الأثر الأمني للأخطاء والسلوكيات غير المتوقعة أو الخبيثة في التطبيقات.

سياسة أمان لاندلوك هي مجموعة من حقوق الوصول (مثل فتح ملف للقراءة فقط، إنشاء دليل، إلخ) مرتبطة بتسلسل هرمي للملفات. يمكن تهيئة هذه السياسة وتطبيقها بواسطة العمليات على نفسها باستخدام ثلاث استدعاءات نظام:

•   landlock_create_ruleset(2) ينشئ مجموعة قواعد جديدة؛

•   landlock_add_rule(2) يضيف قاعدة جديدة إلى مجموعة قواعد؛

•   landlock_restrict_self(2) يفرض مجموعة قواعد على الخيط المستدعي.

لتتمكن من استخدام هذه الاستدعاءات النظامية، يجب أن يدعم النواة الجاري تشغيلها لاندلوك ويجب تفعيلها عند الإقلاع.

  قواعد لاندلوك
تصف قاعدة Landlock إجراءً على كائن تعتزم العملية تنفيذه. تُجمَّع مجموعة من القواعد في "مجموعة قواعد" (ruleset)، والتي يمكنها بعد ذلك تقييد الخيط (thread) الذي يفرضها، وأبناءه المستقبليين.

نوعا القواعد الموجودان هما:

قواعد نظام الملفات
    لهذه القواعد، الكائن هو تسلسل هرمي للملفات، وتُعرف إجراءات نظام الملفات المتعلقة به بـ حقوق الوصول إلى نظام الملفات.

قواعد الشبكة (منذ ABI v4)
    لهذه القواعد، الكائن هو منفذ TCP، وتُعرف الإجراءات المتعلقة به بـ حقوق الوصول إلى الشبكة.

  إجراءات نظام الملفات
تمكّن هذه الأعلام من تقييد عملية في صندوق رملي لمجموعة من الإجراءات على الملفات والأدلة. الملفات أو الأدلة المفتوحة قبل الصندوق الرملي لا تخضع لهذه القيود. انظر landlock_add_rule(2) و landlock_create_ruleset(2) لمزيد من السياق.

حقوق الوصول التالية تنطبق فقط على الملفات:

LANDLOCK_ACCESS_FS_EXECUTE
    تنفيذ ملف.

LANDLOCK_ACCESS_FS_WRITE_FILE
    فتح ملف مع وصول للكتابة.

    عند فتح ملفات للكتابة، ستحتاج غالبًا بالإضافة إلى ذلك حق LANDLOCK_ACCESS_FS_TRUNCATE. في العديد من الحالات، تقوم هذه الاستدعاءات النظامية باقتطاع الملفات الموجودة عند الكتابة فوقها (مثل creat(2)).

LANDLOCK_ACCESS_FS_READ_FILE
    فتح ملف مع وصول للقراءة.

LANDLOCK_ACCESS_FS_TRUNCATE
    اقتطاع ملف باستخدام truncate(2) أو ftruncate(2) أو creat(2) أو open(2) مع O_TRUNC.

    حق الوصول هذا متاح منذ الإصدار الثالث من واجهة ABI الخاصة بلاندلوك.

LANDLOCK_ACCESS_FS_IOCTL_DEV
    استدعاء أوامر ioctl(2) على جهاز حرفي أو كتلي مفتوح.

    ينطبق حق الوصول هذا على جميع أوامر ioctl(2) المنفذة بواسطة برامج تشغيل الأجهزة. ومع ذلك، تظل أوامر IOCTL الشائعة التالية قابلة للاستدعاء بغض النظر عن حق LANDLOCK_ACCESS_FS_IOCTL_DEV:

    •   أوامر IOCTL التي تستهدف واصفات الملفات (FIOCLEX، FIONCLEX)،

    •   أوامر IOCTL التي تستهدف أوصاف الملفات (FIONBIO، FIOASYNC)،

    •   أوامر IOCTL التي تستهدف أنظمة الملفات (FIFREEZE، FITHAW، FIGETBSZ، FS_IOC_GETFSUUID، FS_IOC_GETFSSYSFSPATH)

    •   بعض أوامر IOCTL التي لا معنى لها عند استخدامها مع الأجهزة، ولكن تطبيقاتها آمنة وتُرجع رموز الخطأ الصحيحة (FS_IOC_FIEMAP، FICLONE، FICLONERANGE، FIDEDUPERANGE)

    يتوفر حق الوصول هذا منذ الإصدار الخامس من واجهة Landlock الثنائية.

يُحدد ما إذا كان يمكن اقتطاع ملف مفتوح باستخدام ftruncate(2) أو استخدامه مع ioctl(2) أثناء open(2)، بنفس طريقة التحقق من أذونات القراءة والكتابة أثناء open(2) باستخدام LANDLOCK_ACCESS_FS_READ_FILE وLANDLOCK_ACCESS_FS_WRITE_FILE.

يمكن للدليل استقبال حقوق وصول تتعلق بالملفات أو الدلائل. يُطبق حق الوصول التالي على الدليل نفسه، والدلائل الموجودة أسفله:

LANDLOCK_ACCESS_FS_READ_DIR
    فتح دليل أو سرد محتواه.

ومع ذلك، تنطبق حقوق الوصول التالية فقط على محتوى الدليل، وليس على الدليل نفسه:

LANDLOCK_ACCESS_FS_REMOVE_DIR
    إزالة دليل فارغ أو إعادة تسميته.

LANDLOCK_ACCESS_FS_REMOVE_FILE
    فك رابط (أو إعادة تسمية) ملف.

LANDLOCK_ACCESS_FS_MAKE_CHAR
    إنشاء (أو إعادة تسمية أو ربط) جهاز حرفي.

LANDLOCK_ACCESS_FS_MAKE_DIR
    إنشاء (أو إعادة تسمية) دليل.

LANDLOCK_ACCESS_FS_MAKE_REG
    إنشاء (أو إعادة تسمية أو ربط) ملف عادي.

LANDLOCK_ACCESS_FS_MAKE_SOCK
    إنشاء (أو إعادة تسمية أو ربط) مقبس نطاق يونكس.

LANDLOCK_ACCESS_FS_MAKE_FIFO
    أنشئ (أو غيّر اسم أو اربط) أنبوباً مسمى.

LANDLOCK_ACCESS_FS_MAKE_BLOCK
    أنشئ (أو غيّر اسم أو اربط) جهازاً كتلياً.

LANDLOCK_ACCESS_FS_MAKE_SYM
    أنشئ (أو غيّر اسم أو اربط) رابطاً رمزياً.

LANDLOCK_ACCESS_FS_REFER
    ربط ملف أو إعادة تسميته من أو إلى دليل مختلف (أي تغيير الهرم الأب لملف ما).

    حق الوصول هذا متاح منذ الإصدار الثاني من واجهة Landlock الثنائية.

    هذا هو حق الوصول الوحيد المرفوض مبدئيًا بواسطة أي مجموعة قواعد، حتى لو لم يُحدد الحق كمعالج في وقت إنشاء مجموعة القواعد. الطريقة الوحيدة لجعل مجموعة القواعد تمنح هذا الحق هي السماح به صراحةً لدليل معين بإضافة قاعدة مطابقة إلى مجموعة القواعد.

    على وجه الخصوص، عند استخدام الإصدار الأول من واجهة Landlock الثنائية، سيرفض Landlock آليًا محاولات إعادة توجيه الملفات بين أدلة مختلفة.

    بالإضافة إلى امتلاك دليلي المصدر والوجهة لحق الوصول LANDLOCK_ACCESS_FS_REFER، يجب أن تفي عملية الربط أو إعادة التسمية المقصودة بالقيود التالية:

    •   قد لا يكتسب الملف المعاد توجيهه حقوق وصول أكثر في دليل الوجهة مما كان لديه سابقًا في دليل المصدر. إذا جرت محاولة ذلك، تؤدي العملية إلى خطأ EXDEV.

    •   عند الربط أو إعادة التسمية، يجب منح حق LANDLOCK_ACCESS_FS_MAKE_* لنوع الملف المعني لدليل الوجهة. وإلا، تؤدي العملية إلى خطأ EACCES.

    •   عند إعادة التسمية، يجب منح حق LANDLOCK_ACCESS_FS_REMOVE_* لنوع الملف المعني لدليل المصدر. وإلا، تؤدي العملية إلى خطأ EACCES.

    إذا لم تُستوفَ متطلبات متعددة، يأخذ رمز الخطأ EACCES الأولوية على EXDEV.

  أعلام الشبكة
تمكّن هذه الأعلام من تقييد عملية معزولة بمجموعة من إجراءات الشبكة.

هذا مدعوم منذ الإصدار 4 من واجهة Landlock الثنائية.

تنطبق حقوق الوصول التالية على أرقام منافذ TCP:

LANDLOCK_ACCESS_NET_BIND_TCP
    ربط مقبس TCP بمنفذ محلي.

LANDLOCK_ACCESS_NET_CONNECT_TCP
    توصيل مقبس TCP نشط بمنفذ بعيد.

  أعلام النطاق
تعمل هذه الأعلام على عزل عملية محصورة عن مجموعة من إجراءات الاتصال بين العمليات (IPC). يؤدي تعيين علم لمجموعة قواعد إلى عزل نطاق Landlock لمنع الاتصالات بالموارد خارج النطاق.

هذا مدعوم منذ إصدار Landlock ABI 6.

توجد النطاقات التالية:

LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET
    يقيد عملية محصورة من الاتصال بمقبس UNIX مجرد تم إنشاؤه بواسطة عملية خارج نطاق Landlock ذي الصلة (مثل نطاق أب أو عملية غير محصورة).

LANDLOCK_SCOPE_SIGNAL
    يقيد عملية محصورة من إرسال إشارة إلى عملية أخرى خارج النطاق.

  طبقات حقوق الوصول لمسار الملف
في كل مرة يفرض فيها خيط مجموعة قواعد على نفسه، يقوم بتحديث نطاق Landlock الخاص به بطبقة جديدة من السياسة. في الواقع، تتكون هذه السياسة التكميلية مع مجموعات القواعد الأخرى التي قد تقيد هذا الخيط بالفعل. يمكن للخيط المحصور بعد ذلك إضافة المزيد من القيود بأمان على نفسه باستخدام مجموعة قواعد مفروضة جديدة.

تمنح طبقة سياسة واحدة الوصول إلى مسار ملف إذا منحت قاعدة واحدة على الأقل من قواعدها التي تمت مواجهتها على المسار الوصول. يمكن للخيط المحصور الوصول إلى مسار ملف فقط إذا منحت جميع طبقات السياسة المفروضة عليه الوصول بالإضافة إلى جميع ضوابط الوصول الأخرى للنظام (مثل DAC لنظام الملفات، سياسات LSM الأخرى، إلخ).

  الوصلات المرتبطة (Bind mounts) و OverlayFS
يتيح Landlock تقييد الوصول إلى التسلسلات الهرمية للملفات، مما يعني أن حقوق الوصول هذه يمكن نشرها مع الوصلات المرتبطة (راجع mount_namespaces(7)) ولكن ليس مع OverlayFS.

تعكس الوصلة المرتبطة تسلسلاً هرميًا للملفات المصدر إلى وجهة. يتكون التسلسل الهرمي الوجهة بعد ذلك من نفس الملفات تمامًا، والتي يمكن ربط قواعد Landlock بها، إما عبر مسار المصدر أو الوجهة. تقيد هذه القواعد الوصول عند مواجهتها على مسار، مما يعني أنها يمكن أن تقيد الوصول إلى تسلسلات هرمية متعددة للملفات في نفس الوقت، سواء كانت هذه التسلسلات الهرمية نتيجة وصلات مرتبطة أم لا.

تتكون نقطة وصل OverlayFS من طبقات عليا وسفلى. يتم دمج هذه الطبقات في دليل دمج، نتيجة لنقطة الوصل. قد يتضمن هذا التسلسل الهرمي للدمج ملفات من الطبقات العليا والسفلى، لكن التعديلات التي تتم على التسلسل الهرمي للدمج تنعكس فقط على الطبقة العليا. من وجهة نظر سياسة Landlock، كل طبقة من طبقات OverlayFS والتسلسلات الهرمية للدمج مستقلة وتحتوي على مجموعتها الخاصة من الملفات والأدلة، وهو ما يختلف عن الوصلة المرتبطة. لن تقيد سياسة تقيد طبقة OverlayFS التسلسل الهرمي المدمج الناتج، والعكس صحيح. يجب على مستخدمي Landlock بعد ذلك التفكير فقط في التسلسلات الهرمية للملفات التي يريدون السماح بالوصول إليها، بغض النظر عن نظام الملفات الأساسي.

  الوراثة
يرث كل خيط جديد ناتج عن clone(2) قيود نطاق Landlock من والده. هذا مشابه لوراثة seccomp(2) أو أي LSM آخر يتعامل مع credentials(7) للمهام. على سبيل المثال، قد يطبق خيط من عملية قواعد Landlock على نفسه، لكنها لن تُطبق آليًا على خيوط شقيقة أخرى (على عكس تغييرات بيانات اعتماد خيوط POSIX، راجع nptl(7)).

عندما يحصر الخيط نفسه، لدينا ضمان بأن السياسة الأمنية ذات الصلة ستبقى مفروضة على جميع أحفاد هذا الخيط. يتيح هذا إنشاء سياسات أمنية مستقلة ومعيارية لكل تطبيق، والتي ستتألف آليًا فيما بينها وفقًا لسياساتها الأم في وقت التشغيل.

  قيود Ptrace
تمتلك العملية المحصورة امتيازات أقل من العملية غير المحصورة ويجب أن تخضع لقيود إضافية عند التعامل مع عملية أخرى. للسماح باستخدام ptrace(2) واستدعاءات النظام ذات الصلة على عملية هدف، يجب أن تحتوي العملية المحصورة على مجموعة فرعية من قواعد العملية الهدف، مما يعني أن المتتبع (tracee) يجب أن يكون في نطاق فرعي للمتتبع (tracer).

  نطاق IPC
على غرار قيود Ptrace الضمنية، قد نرغب في تقييد التفاعلات بين الصناديق (sandboxes) بشكل أكبر. لذلك، في وقت إنشاء مجموعة القواعد، يمكن لكل نطاق Landlock تقييد النطاق لعمليات معينة، بحيث يمكن لهذه العمليات الوصول فقط إلى العمليات داخل نفس نطاق Landlock أو في نطاق Landlock متداخل ("النطاق").

العمليات التي يمكن تحديد نطاقها هي:

LANDLOCK_SCOPE_SIGNAL
    يحد هذا من إرسال الإشارات إلى العمليات الهدف التي تعمل داخل نفس نطاق Landlock أو نطاق متداخل.

LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET
    يحد هذا من مجموعة مقابس unix(7) المجردة التي يمكننا connect(2) بها إلى عناوين مقابس تم إنشاؤها بواسطة عملية في نفس نطاق Landlock أو نطاق متداخل.

    يتم التعامل مع sendto(2) على مقبس مخطط بيانات غير متصل كما لو كان يقوم بـ connect(2) ضمني وسيتم حظره إذا لم ينشأ الطرف البعيد من نفس نطاق Landlock أو نطاق متداخل.

    لن يُقيّد استدعاء sendto(2) على مقبس كان متصلاً سابقًا. يعمل هذا لكل من مقابس البيانات ومقابس التدفق.

لا يدعم نطاق IPC الاستثناءات عبر landlock_add_rule(2). إذا كان نطاق عملية ضمن نطاق، فلا يمكن إضافة قواعد للسماح بالوصول إلى الموارد أو العمليات خارج النطاق.

  اقتطاع الملفات
تغير العمليات التي تغطيها LANDLOCK_ACCESS_FS_WRITE_FILE و LANDLOCK_ACCESS_FS_TRUNCATE محتويات الملف وتتداخل أحيانًا بطرق غير بديهية. يُوصى دائمًا بتحديد كليهما معًا.

مثال مفاجئ بشكل خاص هو creat(2). يشير الاسم إلى أن استدعاء النظام هذا يتطلب حقوق إنشاء وكتابة الملفات. ومع ذلك، يتطلب أيضًا حق الاقتطاع إذا كان ملف موجود بنفس الاسم حاضرًا بالفعل.

يجب أيضًا ملاحظة أن اقتطاع الملفات لا يتطلب حق LANDLOCK_ACCESS_FS_WRITE_FILE. بصرف النظر عن استدعاء النظام truncate(2)، يمكن فعل ذلك أيضًا عبر open(2) مع الأعلام O_RDONLY | O_TRUNC.

عند فتح ملف، يرتبط توفر حق LANDLOCK_ACCESS_FS_TRUNCATE بواصف الملف المنشأ حديثًا وسيُستخدم لمحاولات الاقتطاع اللاحقة باستخدام ftruncate(2). السلوك مشابه لفتح ملف للقراءة أو الكتابة، حيث تُفحص الأذونات أثناء open(2)، ولكن ليس أثناء استدعاءات read(2) و write(2) اللاحقة.

كنتيجة، من الممكن وجود واصفات ملفات مفتوحة متعددة لنفس الملف، حيث يمنح أحدها حق اقتطاع الملف والآخر لا يمنحه. من الممكن أيضًا تمرير واصفات الملفات هذه بين العمليات، مع الحفاظ على خصائص Landlock الخاصة بها، حتى عندما لا تملك هذه العمليات مجموعة قواعد Landlock مفروضة.

الإصدارات
أُدخل Landlock في لينكس 5.13.

لتحديد ميزات Landlock المتاحة، يجب على المستخدمين الاستعلام عن إصدار ABI الخاص بـ Landlock:
ABI | نواة | الثوابت المقدمة حديثًا
1 | 5.13 | LANDLOCK_ACCESS_FS_EXECUTE
 |  | LANDLOCK_ACCESS_FS_WRITE_FILE
 |  | LANDLOCK_ACCESS_FS_READ_FILE
 |  | LANDLOCK_ACCESS_FS_READ_DIR
 |  | LANDLOCK_ACCESS_FS_REMOVE_DIR
 |  | LANDLOCK_ACCESS_FS_REMOVE_FILE
 |  | LANDLOCK_ACCESS_FS_MAKE_CHAR
 |  | LANDLOCK_ACCESS_FS_MAKE_DIR
 |  | LANDLOCK_ACCESS_FS_MAKE_REG
 |  | LANDLOCK_ACCESS_FS_MAKE_SOCK
 |  | LANDLOCK_ACCESS_FS_MAKE_FIFO
 |  | LANDLOCK_ACCESS_FS_MAKE_BLOCK
 |  | LANDLOCK_ACCESS_FS_MAKE_SYM
2 | 5.19 | LANDLOCK_ACCESS_FS_REFER
3 | 6.2 | LANDLOCK_ACCESS_FS_TRUNCATE
4 | 6.7 | LANDLOCK_ACCESS_NET_BIND_TCP
 |  | LANDLOCK_ACCESS_NET_CONNECT_TCP
5 | 6.10 | LANDLOCK_ACCESS_FS_IOCTL_DEV
6 | 6.12 | LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET
 |  | LANDLOCK_SCOPE_SIGNAL
7 | 6.15 | LANDLOCK_RESTRICT_SELF_LOG_SAME_EXEC_OFF
 |  | LANDLOCK_RESTRICT_SELF_LOG_NEW_EXEC_ON
 |  | LANDLOCK_RESTRICT_SELF_LOG_SUBDOMAINS_OFF
8 | 7.0 | LANDLOCK_RESTRICT_SELF_TSYNC

ينبغي للمستخدمين استخدام إصدار واجهة Landlock الثنائية (ABI) بدلاً من إصدار النواة لتحديد الميزات المتاحة. إصدارات النواة الرئيسية المدرجة هنا مذكورة للتوجيه فقط. قد تحتوي النوى من مصادر أخرى على ميزات منقولة (backported)، وقد لا تتطابق أرقام إصداراتها.

لاستعلام إصدار Landlock ABI للنواة قيد التشغيل، يمكن للبرامج تمرير العلامة LANDLOCK_CREATE_RULESET_VERSION إلى landlock_create_ruleset(2).

عند بناء آليات احتياطية للتوافق مع النوى الأقدم، يُنصح المستخدمون بمراعاة الدلالات الخاصة لحق الوصول LANDLOCK_ACCESS_FS_REFER: في ABI v1، يكون ربط ونقل الملفات بين أدلة مختلفة محظورًا دائمًا، لذا فإن البرامج التي تعتمد على مثل هذه العمليات متوافقة فقط مع Landlock ABI v2 والإصدارات الأحدث.

ملاحظات
يتم تمكين Landlock بواسطة CONFIG_SECURITY_LANDLOCK. تتحكم معلمة سطر الأوامر lsm=lsm1,...,lsmN في تسلسل تهيئة وحدات أمان Linux. يجب أن تحتوي على السلسلة landlock لتمكين Landlock. إذا لم تُحدد معلمة سطر الأوامر، يتراجع التهيئة إلى قيمة معلمة سطر الأوامر المهملة security= ثم إلى قيمة CONFIG_LSM. يمكننا التحقق من تمكين Landlock بالبحث عن landlock: Up and running. في سجلات النواة.

تحذيرات
من غير الممكن حاليًا تقييد بعض الإجراءات المتعلقة بالملفات والتي يمكن الوصول إليها عبر عائلات استدعاءات النظام هذه: chdir(2)، stat(2)، flock(2)، chmod(2)، chown(2)، setxattr(2)، utime(2)، fcntl(2)، access(2). ستتيح التطورات المستقبلية لـ Landlock تقييدها.

أمثلة
نحتاج أولاً إلى إنشاء مجموعة القواعد التي ستحتوي على قواعدنا.

في هذا المثال، سيحتوي مجموعة القواعد على قواعد تسمح فقط بإجراءات القراءة، بينما سيتم رفض إجراءات الكتابة. تحتاج مجموعة القواعد بعد ذلك إلى التعامل مع كلا النوعين من الإجراءات. انظر قسم DESCRIPTION لوصف إجراءات نظام الملفات.

    struct landlock_ruleset_attr attr = {0};
    int ruleset_fd;

    attr.handled_access_fs =
            LANDLOCK_ACCESS_FS_EXECUTE |
            LANDLOCK_ACCESS_FS_WRITE_FILE |
            LANDLOCK_ACCESS_FS_READ_FILE |
            LANDLOCK_ACCESS_FS_READ_DIR |
            LANDLOCK_ACCESS_FS_REMOVE_DIR |
            LANDLOCK_ACCESS_FS_REMOVE_FILE |
            LANDLOCK_ACCESS_FS_MAKE_CHAR |
            LANDLOCK_ACCESS_FS_MAKE_DIR |
            LANDLOCK_ACCESS_FS_MAKE_REG |
            LANDLOCK_ACCESS_FS_MAKE_SOCK |
            LANDLOCK_ACCESS_FS_MAKE_FIFO |
            LANDLOCK_ACCESS_FS_MAKE_BLOCK |
            LANDLOCK_ACCESS_FS_MAKE_SYM |
            LANDLOCK_ACCESS_FS_REFER |
            LANDLOCK_ACCESS_FS_TRUNCATE |
            LANDLOCK_ACCESS_FS_IOCTL_DEV;

للتّوافق مع إصدارات لينكس الأقدم، نكتشف إصدار ABI لـ Landlock المتاح، ونستخدم فقط المجموعة الفرعية المتاحة من حقوق الوصول:

    /*
     * Table of available file system access rights by ABI version,
     * numbers hardcoded to keep the example short.
     */
    __u64 landlock_fs_access_rights[] = {
        (LANDLOCK_ACCESS_FS_MAKE_SYM  << 1) - 1,  /* v1                  */
        (LANDLOCK_ACCESS_FS_REFER     << 1) - 1,  /* v2: add "refer"     */
        (LANDLOCK_ACCESS_FS_TRUNCATE  << 1) - 1,  /* v3: add "truncate"  */
        (LANDLOCK_ACCESS_FS_TRUNCATE  << 1) - 1,  /* v4: TCP support     */
        (LANDLOCK_ACCESS_FS_IOCTL_DEV << 1) - 1,  /* v5: add "ioctl_dev" */
    };

    int abi = landlock_create_ruleset(NULL, 0,
                                      LANDLOCK_CREATE_RULESET_VERSION);
    if (abi == -1) {
        /*
         * Kernel too old, not compiled with Landlock,
         * or Landlock was not enabled at boot time.
         */
        perror("Unable to use Landlock");
        return;  /* Graceful fallback: Do nothing.  */
    }
    abi = MIN(abi, 3);

    /* Only use the available rights in the ruleset.  */
    attr.handled_access_fs &= landlock_fs_access_rights[abi - 1];

حقوق الوصول المتاحة لكل إصدار ABI مدرجة في قسم VERSIONS.

إذا احتاج برنامجنا إلى إنشاء روابط صلبة أو إعادة تسمية ملفات بين أدلة مختلفة (LANDLOCK_ACCESS_FS_REFER)، فسنحتاج إلى التغيير التالي في منطق التوافق العكسي: إعادة تعيين الدليل غير ممكنة في عملية مقيدة بإصدار Landlock ABI 1. لذلك، إذا احتاج البرنامج إلى إعادة تعيين الملفات، وإذا كان إصدار Landlock ABI 1 فقط متاحًا، فلن نتمكن من تقييد العملية.

الآن بعد تحديد سمات مجموعة القواعد، ننشئ مجموعة قواعد Landlock ونحصل على واصف ملف كمقبض لها، باستخدام landlock_create_ruleset(2):

    ruleset_fd = landlock_create_ruleset(&attr, sizeof(attr), 0);
    if (ruleset_fd == -1) {
        perror("Failed to create a ruleset");
        exit(EXIT_FAILURE);
    }

يمكننا الآن إضافة قاعدة جديدة إلى مجموعة القواعد من خلال واصف ملف مجموعة القواعد. يجب أن تكون حقوق الوصول المطلوبة مجموعة فرعية من حقوق الوصول التي تم تحديدها في attr.handled_access_fs عند إنشاء مجموعة القواعد.

في هذا المثال، ستسمح القاعدة فقط بقراءة التسلسل الهرمي للملفات /usr. بدون قاعدة أخرى، سيتم رفض إجراءات الكتابة بواسطة مجموعة القواعد. لإضافة /usr إلى مجموعة القواعد، نفتحه بالعلامة O_PATH ونملأ struct landlock_path_beneath_attr بواصف الملف هذا.

    struct landlock_path_beneath_attr path_beneath = {0};
    int err;

    path_beneath.allowed_access =
            LANDLOCK_ACCESS_FS_EXECUTE |
            LANDLOCK_ACCESS_FS_READ_FILE |
            LANDLOCK_ACCESS_FS_READ_DIR;

    path_beneath.parent_fd = open("/usr", O_PATH | O_CLOEXEC);
    if (path_beneath.parent_fd == -1) {
        perror("Failed to open file");
        close(ruleset_fd);
        exit(EXIT_FAILURE);
    }
    err = landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
                            &path_beneath, 0);
    close(path_beneath.parent_fd);
    if (err) {
        perror("Failed to update ruleset");
        close(ruleset_fd);
        exit(EXIT_FAILURE);
    }

لدينا الآن مجموعة قواعد بقاعدة واحدة تسمح بالوصول للقراءة إلى /usr بينما ترفض جميع عمليات الوصول الأخرى المعالجة لنظام الملفات. الخطوة التالية هي تقييد الخيط الحالي من اكتساب امتيازات إضافية (مثلًا، بفضل ملف ثنائي set-user-ID).

    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
        perror("Failed to restrict privileges");
        close(ruleset_fd);
        exit(EXIT_FAILURE);
    }

الخيط الحالي جاهز الآن لعزل نفسه بمجموعة القواعد.

    if (landlock_restrict_self(ruleset_fd, 0)) {
        perror("Failed to enforce ruleset");
        close(ruleset_fd);
        exit(EXIT_FAILURE);
    }
    close(ruleset_fd);

إذا نجحت استدعاء النظام landlock_restrict_self(2)، فإن الخيط الحالي أصبح مقيدًا الآن وسيتم فرض هذه السياسة على جميع أطفاله الذين تم إنشاؤهم لاحقًا أيضًا. بمجرد أن يصبح الخيط مقيدًا بـ Landlock، لا توجد طريقة لإزالة سياسة الأمان الخاصة به؛ فقط إضافة المزيد من القيود مسموح بها. هذه الخيوط الآن في نطاق Landlock جديد، وهو دمج لنطاق والدها (إن وجد) مع مجموعة القواعد الجديدة.

يمكن العثور على الكود الكامل العامل في https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/samples/landlock/sandboxer.c

انظر أيضًا
landlock_create_ruleset(2), landlock_add_rule(2), landlock_restrict_self(2)

https://landlock.io/

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.