سؤال

هل من الممكن استخدام واجهة Sudo (مثل Gksudo) لرفع امتيازات تيار معالجة؟ أعلم أنه يمكنني القيام بما يلي:

sudo cat /etc/passwd-

لكنني مهتم بالقيام بذلك:

sudo-become-root # magic function/command
cat /etc/passwd-

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

أعلم أنه يمكنني فصل منطق المسؤول والمنطق غير المنطقي إلى عمليات منفصلة ، ثم فقط تشغيل عملية المسؤول كجذر (مع بعض الاتصالات-سيكون PolicyKit/DBUS مناسبًا هنا). لكنني كنت آمل في حل أبسط (رغم أنه أكثر خطورة).

أفكر في شيء مثل تشغيل PPRIV من Solaris من خلال Sudo لتعديل امتيازات العملية الحالية. الذي يبدو وكأنه مستدير خارق ولكن قابلية للتنفيذ. ولكن على حد علمي ، لا يقدم Linux PPRIV.

(أنا مندهش من أن هذا ليس واضحًا بالفعل ؛ يبدو أنه شيء غير مألوف لا تريده ولا يريده بدا أن تكون حفرة أمنية للسماح بالتصعيد في العملية على تصاعد عملية جديدة.)

هل كانت مفيدة؟

المحلول

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

ما تبحث عنه هو مكالمات setuid (2) / setReuid (2) / setRegid (2) / setGroups (2) ، لكنها جميعها سلكية صلبة حتى لا تسمح لك باكتساب امتيازات في منتصف الموقع. يمكنك فقط استخدامها "لإعطاء" امتيازات ، على حد علمي.

نصائح أخرى

الكفاءة لها خيار "تصبح الجذر". قد ترغب في معرفة ما فعله المؤلف هناك.

إذا كنت ترغب في التعامل بشكل نظيف مع الحقوق الإدارية داخل البرنامج ، فقد ترغب في الاستخدام PolicyKit بدلاً من Sudo ، اعتمادًا على نظام التشغيل الذي تخطط لتشغيل برنامجك عليه.

للحصول على PolicyKit لـ Python ، انظر بيثون الانزلاق.

خلاف ذلك ، هناك طريقتان للاتصال بـ Sudo لتصبح جذرًا:

sudo -s

سيجعلك جذرًا وتحافظ على بيئتك الحالية (أي ما يعادل sudo su)

sudo -i

سيجعلك جذرًا ويمنحك بيئة الجذر أيضًا (أي ما يعادل sudo su -)

هناك طريقة أخرى للتعامل مع المشكلة وهي النظر في أن لديك الحقوق التي تحتاجها ، والسماح لمستخدم البرنامج باختيار كيفية إعطاء الحقوق لبرنامجك (باستخدام مجموعات Sudo/Setuid/Unix/أي شيء آخر).

أنظر أيضا هذا السؤال على ServerFault على نفس الموضوع.

لك وظيفة/أمر سحري ممكن ان يكون

sudo su
echo 'echo tee; echo hee'|sudo -s

الإخراج هو:

tee
hee

لا أحب فكرة أن أتمكن من تشغيل أوامر تعسفية كجذر من عملية متميزة أقل. ومع ذلك ، نظرًا لأنك تريد ذلك ، فإن إحدى الأفكار التي تتبادر إلى الذهن هي الاحتفاظ setuid قذيفة مقيدة والتي يمكن أن تنفذ فقط الأوامر التي تهتم بالسماح بها. يمكنك بعد ذلك استخدام subprocess.Popen وظائف لتشغيل أمرك باستخدام هذه القشرة المقيدة التي ستقوم بتشغيلها بامتيازات مرتفعة.

أتساءل ما إذا كان هذا سيعمل:

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

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

يرى دليل سودو لخيارات أخرى.

تريد المصادقة مع PAM. هناك مثال هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top