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

الإضافة والإنشاء فحصان مختلفان

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

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission denied or operation not permitted

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

قوائم التحكم بالوصول الافتراضية تُورَّث ولا تمنح

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

namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log

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

استخدم المسار المحلول بدل المسار الموجود في الإعداد. قد يضع رابط رمزي أو نقطة تركيب أو دليل مُدوَّر الملف الحقيقي في مكان لا تصل إليه الصلاحية التي منحتها. امشِ المسار بأداة الاسم أولًا، ثم قارن كل مستوى بالحساب المعني. التخمين عند الدليل الأعلى هو كيف يستقر الإصلاح على مستوى أعلى بمستوى واحد.

حدّد من يكتب في تلك اللحظة

افحص وحدة الخدمة وملفات drop-in الخاصة بها وإعدادات حساب الخدمة نفسها قبل تغيير أي شيء. قد تكون العملية التي تضيف والعملية التي تعيد الإنشاء مختلفتين: مساعد التدوير وكاتب الحالة وقارئ الويب نادرًا ما يتشاركون هوية.

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

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

دوّر دون إعادة إدخال العطل

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

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

حين يفشل الاقتطاع رغم ذلك، توقف عن إضافة الصلاحيات

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

افحص قيود نظام الملفات في الوحدة وخيارات التركيب للمسار، ثم أعد إنتاج العملية نفسها التي فشلت. توسيع صلاحية لم يُستشر أصلًا لا يفعل سوى إخفاء أي قيد كان حقيقيًا. أزل قيدًا واحدًا في كل مرة في وحدة مؤقتة، وأعده قبل تغيير أي شيء دائم.

مقالات ذات صلة