วิธีกำหนดค่า pkexec ให้ไม่ถามรหัสผ่าน?


12

ฉันมีแอปพลิเคชั่น GUI ที่จำเป็นต้องเรียก daemon (เขียนด้วยภาษา Python) ด้วยสิทธิ์ superuser ฉันต้องการทำสิ่งนี้โดยไม่แจ้งให้ผู้ใช้ใส่รหัสผ่าน

เนื่องจาก daemon เป็นสคริปต์ฉันไม่สามารถตั้งค่าบิต SUID ได้โดยตรง ฉันสามารถเขียนตัวห่อหุ้ม C สำหรับสิ่งนี้ แต่ฉันไม่อยากประดิษฐ์พวงมาลัยใหม่โดยเฉพาะเมื่อความผิดพลาดในส่วนของฉันอาจนำไปสู่ความปลอดภัยของระบบที่ถูกบุกรุกอย่างรุนแรง

สิ่งที่ฉันทำตามปกติในสถานการณ์นี้คือการเพิ่มบรรทัด/etc/sudoersที่อนุญาตให้ผู้ใช้เรียกใช้ daemon ในฐานะรูทโดยไม่มีรหัสผ่านโดยใช้คำสั่ง NOPASSWD ทำงานได้ดีจากบรรทัดคำสั่ง อย่างไรก็ตามเมื่อฉันทำสิ่งนี้จาก GUI pkexecกล่องโต้ตอบจะปรากฏขึ้นเพื่อขอรหัสผ่านของผู้ใช้ มันดูเหมือนว่าบน Ubuntu, โทรไปsudoจาก GUI pkexecที่มีอย่างใดถูกขัดขวางโดย

มีวิธีที่สะอาดรอบนี้หรือไม่? ฉันค่อนข้างจะไม่ต้องจัดการกับความยุ่งยากของสคริปต์ setuid


คุณพูดเกี่ยวกับแอปพลิเคชันอะไร
Radu Rădeanu

แอพ GUI ใด ๆ เมื่อแอพ GUI พยายามเรียกใช้sudo somecommandกล่องโต้ตอบที่ปรากฏขึ้นเป็นpkexecกล่องโต้ตอบรหัสผ่านไม่ว่าจะมีนโยบาย sudoers หรือไม่ก็ตามที่อนุญาตให้เรียกใช้งานโปรแกรมได้
Chinmay Kanchi

คำตอบ:


14

มันเป็นเรื่องที่ไม่เหมาะสมที่จะกล่าวว่า: "มันดูเหมือนว่าบน Ubuntu, โทรไปsudoจาก GUI เป็นอย่างใดถูกขัดขวางโดยpkexec " ไม่ได้มีมากเหมือนกันกับpkexec sudoในทางตรงกันข้ามกับsudo, pkexecไม่อนุญาตรากไปยังกระบวนการทั้งหมด แต่ช่วยให้ระดับปลีกย่อยของการควบคุมของนโยบายระบบรวมศูนย์

ทีนี้ถ้าคุณต้องการเรียกใช้แอปพลิเคชั่น GUI โดยไม่ต้องถามรหัสผ่านภายในpkexecก็ไม่ยากที่จะทำ ลองมาตัวอย่างเช่นGParted เมื่อคุณเปิดมันคุณจะเห็นหน้าต่างข้อความต่อไปนี้ถามรหัสผ่านของคุณ:

รับรองความถูกต้อง gparted

คลิกรายละเอียดและหน้าต่างข้อความจะมีลักษณะดังนี้:

รับรองความถูกต้อง gparted - รายละเอียด

สิ่งที่คุณต้องทำคือเปิดไฟล์โดยใช้คำสั่งต่อไปนี้:/usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

gksu gedit /usr/share/polkit-1/actions/com.ubuntu.pkexec.gparted.policy

และเปลี่ยนบรรทัดต่อไปนี้:

      <allow_any>auth_admin</allow_any>
      <allow_inactive>auth_admin</allow_inactive>
      <allow_active>auth_admin</allow_active>

ด้วยดังต่อไปนี้:

      <allow_any>yes</allow_any>
      <allow_inactive>yes</allow_inactive>
      <allow_active>yes</allow_active>

บันทึกไฟล์และปิด ถัดไปเมื่อคุณจะเปิดGPartedคุณจะไม่ได้รับรหัสผ่านอีกต่อไป


ใช่ pkexec ทำการสกัดกั้นการโทรไปยัง sudo อย่างแน่นอน ให้ฉันดูว่าฉันสามารถสร้างตัวอย่างน้อยที่สุดของพฤติกรรมนี้
Chinmay Kanchi

ฉันไม่สามารถทำซ้ำสิ่งนี้ในแอพที่เรียบง่ายมันอาจเกิดขึ้นในบางสถานการณ์ที่เฉพาะเจาะจงและฉันไม่มีเวลาในการติดตามข้อบกพร่อง ฉันจะยอมรับคำตอบของคุณ ไชโย
Chinmay Kanchi

@ChinmayKanchi ให้ชัดเจนยิ่งขึ้น gpartedฉันจะใช้ตัวอย่างอีกครั้ง เมื่อคุณเรียกใช้จากเทอร์มินัลsudo gpartedคุณเรียกใช้/usr/sbin/gpartedไฟล์ด้วยสิทธิ์พิเศษของรูท เมื่อคุณเริ่มต้นgpartedจาก GUI ที่คุณจะเริ่มต้นในความเป็นจริงgparted-pkexec(คุณสามารถตรวจสอบภายในนี้/usr/share/applications/gparted.desktopไฟล์) ซึ่งเป็น/usr/bin/gparted-pkexecที่เป็นสคริปต์เปลือกที่มีวัตถุประสงค์เพื่อเรียกใช้คำสั่งต่อไปนี้: ซึ่งเทียบเท่ากับpkexec "/usr/sbin/gparted" ดังนั้นไม่มีอะไรจะทำอย่างไรกับpkexec gparted sudoและคำสั่งนี้คุณควรใช้ใน terminal sudo gpartedไม่
Radu Rădeanu

1
@ChinmayKanchi sudoควรใช้สำหรับแอปเชลล์ไม่ใช่แอพ GUI เห็นman sudoและman pkexecในแง่นี้
Radu Rădeanu

ใช่ฉันรู้ทั้งสองประเด็นแล้ว สถานการณ์ของฉันคือฉันมีแอพ GUI (เขียนโดยฉัน) ที่พยายามเปิดโปรแกรมเชลล์ (a daemon หรือเขียนโดยฉัน) โดยใช้ sudo ด้วยเหตุผลบางอย่างการทำเช่นนี้ส่งผลให้ pkexec ถูกเรียกใช้แทน sudo ซึ่งหมายความว่านโยบาย sudo ใด ๆ ที่ฉันสร้างขึ้นสำหรับ daemon จะถูกเพิกเฉย
Chinmay Kanchi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.