ควรใช้ pkexec vs. gksu / gksudo เมื่อใด


77

มีวิธีการทั่วไปสองวิธีในการเรียกใช้แอปพลิเคชันแบบกราฟิกในฐานะรูท (หรือโดยทั่วไปในฐานะผู้ใช้รายอื่น) โปรแกรมเช่นgksu, gksudoและkdesudoมี frontends sudoกราฟิกสำหรับ ในทางตรงกันข้ามpkexecเป็น frontend กราฟิกสำหรับPolicyKit

เมื่อรันโปรแกรมด้วยตนเองในฐานะรูท (หรือผู้ใช้อื่นที่ไม่ใช่รูท) ข้อดี / ข้อเสีย (ถ้ามี) ของการใช้งานpkexecคืออะไรเมื่อเทียบกับวิธีการใช้sudoส่วนหน้าแบบดั้งเดิมมากขึ้น?




ที่เกี่ยวข้อง (แต่ไม่ซ้ำกัน): sudo -i ปลอดภัยน้อยกว่า pkexec หรือไม่
Eliah Kagan

คำตอบ:


25

PolicyKit สามารถกำหนดค่าได้มากขึ้น แต่pkexecไม่ได้ใช้ประโยชน์จากความสามารถในการกำหนดค่านี้ นอกจากนี้pkexecให้ผู้ใช้ดูเส้นทางแบบเต็มของโปรแกรมที่จะเริ่มขึ้นเพื่อให้ผู้ใช้แน่ใจว่าจะเกิดอะไรขึ้น สามารถใช้ 'นโยบาย' ของ PolicyKit เพื่อตั้งค่าการตั้งค่าความก้าวหน้าเพิ่มเติม ตัวอย่างเช่นควรจำรหัสผ่านหรือไม่

สิ่งที่ฉันได้จากpkexecคู่มือ:

สภาพแวดล้อมที่โปรแกรมจะเรียกใช้จะถูกตั้งค่าเป็นสภาพแวดล้อมที่ปลอดภัยและรู้จักน้อยที่สุดเพื่อหลีกเลี่ยงการฉีดโค้ดผ่าน LD_LIBRARY_PATH หรือกลไกที่คล้ายกัน นอกจากนี้ตัวแปรสภาวะแวดล้อม PKEXEC_UID ถูกตั้งค่าเป็น id ผู้ใช้ของกระบวนการที่เรียกใช้ pkexec ดังนั้น pkexec จะไม่อนุญาตให้คุณเรียกใช้แอปพลิเคชั่น X11 ในฐานะผู้ใช้รายอื่นเนื่องจากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม $ DISPLAY

ข้อมูลเพิ่มเติมเกี่ยวกับนโยบายหรือคำจำกัดความการกระทำจากpkexecคู่มือ:

   To specify what kind of authorization is needed to execute the program
   /usr/bin/pk-example-frobnicate as another user, simply write an action
   definition file like this

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE policyconfig PUBLIC
        "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
        "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
       <policyconfig>

         <vendor>Examples for the PolicyKit Project</vendor>
         <vendor_url>http://hal.freedesktop.org/docs/PolicyKit/</vendor_url>

         <action id="org.freedesktop.policykit.example.pkexec.run-frobnicate">
           <description>Run the PolicyKit example program Frobnicate</description>
           <description xml:lang="da">Kør PolicyKit eksemplet Frobnicate</description>
           <message>Authentication is required to run the PolicyKit example program Frobnicate</message>
           <message xml:lang="da">Autorisering er påkrævet for at afvikle PolicyKit eksemplet Frobnicate</message>
           <icon_name>audio-x-generic</icon_name>
           <defaults>
             <allow_any>no</allow_any>
             <allow_inactive>no</allow_inactive>
             <allow_active>auth_self_keep</allow_active>
           </defaults>
           <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/pk-example-frobnicate</annotate>
         </action>

       </policyconfig>

   and drop it in the /usr/share/polkit-1/actions directory under a
   suitable name (e.g. matching the namespace of the action). Note that in
   addition to specifying the program, the authentication message,
   description, icon and defaults can be specified. For example, for the
   action defined above, the following authentication dialog will be
   shown:

       [IMAGE][2]

           +----------------------------------------------------------+
           |                     Authenticate                     [X] |
           +----------------------------------------------------------+
           |                                                          |
           |  [Icon]  Authentication is required to run the PolicyKit |
           |          example program Frobnicate                      |
           |                                                          |
           |          An application is attempting to perform an      |
           |          action that requires privileges. Authentication |
           |          is required to perform this action.             |
           |                                                          |
           |          Password: [__________________________________]  |
           |                                                          |
           | [V] Details:                                             |
           |  Command: /usr/bin/pk-example-frobnicate                 |
           |  Run As:  Super User (root)                              |
           |  Action:  org.fd.pk.example.pkexec.run-frobnicate        |
           |  Vendor:  Examples for the PolicyKit Project             |
           |                                                          |
           |                                  [Cancel] [Authenticate] |
           +----------------------------------------------------------+

   If the user is using the da_DK locale, the dialog looks like this:

       [IMAGE][3]

           +----------------------------------------------------------+
           |                     Autorisering                     [X] |
           +----------------------------------------------------------+
           |                                                          |
           |  [Icon]  Autorisering er påkrævet for at afvikle         |
           |          PolicyKit eksemplet Frobnicate                  |
           |                                                          |
           |          Et program forsøger at udføre en handling der   |
           |          kræver privilegier. Autorisering er påkrævet.   |
           |                                                          |
           |          Kodeord: [___________________________________]  |
           |                                                          |
           | [V] Detaljer:                                            |
           |  Bruger:   Super User (root)                             |
           |  Program:  /usr/bin/pk-example-frobnicate                |
           |  Handling: org.fd.pk.example.pkexec.run-frobnicate       |
           |  Vendor:   Examples for the PolicyKit Project            |
           |                                                          |
           |                                [Annullér] [Autorisering] |
           +----------------------------------------------------------+

   Note that pkexec does no validation of the ARGUMENTS passed to PROGRAM.
   In the normal case (where administrator authentication is required
   every time pkexec is used), this is not a problem since if the user is
   an administrator he might as well just run pkexec bash to get root.

   However, if an action is used for which the user can retain
   authorization (or if the user is implicitly authorized), such as with
   pk-example-frobnicate above, this could be a security hole. Therefore,
   as a rule of thumb, programs for which the default required
   authorization is changed, should never implicitly trust user input
   (e.g. like any other well-written suid program).

1
ผมคิดว่าผมควรจะได้กล่าวว่ามีสองในการใช้งานเป็นหลักมีการตรวจสอบแบบกราฟิก ฉันคิดว่ามีวิธีใช้pkexecในการเรียกใช้โปรแกรมกราฟิก (ฉันไม่เคยทำเช่นนั้น ... ) คำตอบของคุณอธิบายว่าทำไมไม่มี (หรืออย่างน้อยก็ต้องระบุสภาพแวดล้อมที่กำหนดเองเพื่อทำ)
Eliah Kagan

1
ฉันมีคำถามหนึ่งข้อเกี่ยวกับคำตอบของคุณแม้ว่า - เมื่อโปรแกรมรันตามรูทด้วยpkexecความสามารถ ("การอนุญาต") ในแง่ใดจะถูก จำกัด ? ฉันอนุญาตให้โปรแกรมมีความสามารถในการทำอะไรเมื่อฉันเรียกใช้ด้วยsudoหรือsudoส่วนหน้า ... ในแง่ใดบ้างที่รันโปรแกรมในฐานะรูทที่pkexecไม่ทำเช่นนี้
Eliah Kagan

3
ฉันเข้าใจว่าPolicyKitใช้เพื่ออนุญาตให้โปรแกรมทำการกระทำเฉพาะบางประเภทเท่านั้น แต่จะpkexecช่วยอำนวยความสะดวกให้หรือไม่หรือทำpkexecสิ่งต่าง ๆ ด้วยความสามารถที่ไม่ จำกัด pkexecตัดตอนคู่มือคุณรวมอยู่ในเอกสารคำตอบของคุณวิธีการเขียนกฎระเบียบในการตรวจสอบที่สามารถเรียกใช้โปรแกรมเป็นราก (หรืออื่นใช้ที่ไม่ใช่ราก) มากกว่าสิ่งที่โปรแกรมสามารถทำได้
Eliah Kagan

4
ฉันต้องการยอมรับคำตอบของคุณเนื่องจากให้ข้อมูลที่ดีมากมาย แต่ฉันรู้สึกว่ามันทำให้เข้าใจผิดมากเพราะมันบอกว่ามันpkexecสามารถกำหนดค่าได้มากกว่าsudoและได้รับการสนทนาที่เรามีในความคิดเห็นที่ดูเหมือนจะไม่เป็นเช่นนั้น คุณจะพิจารณาแก้ไขคำตอบของคุณเพื่ออธิบายความสามารถในsudoการกำหนดค่าของและเปรียบเทียบ / เปรียบเทียบกับpkexecของหรือแก้ไขคำตอบของคุณเพื่อบอกว่าความแตกต่างเป็นสิ่งอื่นนอกเหนือจากการกำหนดค่าได้หรือไม่
Eliah Kagan

2
"เพียงแค่เขียน" แล้วตามด้วย XML ฉันต้องการหัวเราะนั้น
Jürgen A. Erhard

14

ด้วย sudo คุณสามารถตั้งค่าต่อผู้ใช้และต่อนโยบายโปรแกรมเกี่ยวกับ wether เพื่อเก็บหรือรีเซ็ตสภาพแวดล้อมของผู้โทรในบริบทของ sudo นโยบาย env_reset ตั้งตามค่าเริ่มต้น

คุณไม่สามารถรันแอปพลิเคชั่นแบบกราฟิกผ่าน pkexec โดยไม่ต้องกำหนดค่าให้ชัดเจน เพราะนี่เป็นเพียงผลลัพธ์ของการรีเซ็ตสภาพแวดล้อมซึ่งเห็นได้ชัดว่าเป็นจริงสำหรับ sudo เช่นกัน อย่างไรก็ตามโปรดทราบว่าทั้ง pkexec และ sudo ไม่สามารถป้องกันแอปพลิเคชันที่เป็นอันตรายซึ่งทำงานในฐานะรูทเพื่อดึงข้อมูลที่จำเป็นทั้งหมดจากเครื่องมือจัดการการแสดงผลหรือไฟล์คุกกี้ X11 ของผู้ใช้ อาจทำโดยแอ็พพลิเคชันที่ไม่ใช่รูทขึ้นอยู่กับสถานการณ์

Sudo ไม่ต้องการรายชื่อผู้ใช้ที่ชัดเจน การแสดงรายการกลุ่มผู้ใช้ใด ๆ หรือแม้แต่การตั้งค่าการอนุญาตสำหรับผู้ใช้ทั้งหมดโดยทั่วไปสามารถทำได้ คำสั่ง target_pw อนุญาตให้ผู้ใช้รับรองความถูกต้องกับข้อมูลรับรองของผู้ใช้ในบริบทที่พวกเขาต้องการเรียกใช้แอปพลิเคชันเช่นรูท นอกเหนือจากนั้นโปรแกรม su (su / gtksu / kdesu) แบบเดิม ๆ สามารถนำมาใช้ทำสิ่งเดียวกันได้โดยไม่ต้องตั้งค่าพิเศษ

sudo เช่นกันอนุญาตให้ผู้ใช้ยังคงรับรองความถูกต้องตามเวลาที่กำหนด ตัวเลือกนี้มีชื่อว่าหมดเวลากำหนดค่าได้ทั่วโลกต่อผู้ใช้หรือต่อแอปพลิเคชัน การพิสูจน์ตัวตนสามารถเก็บรักษาไว้ต่อ tty หรือโกลบอลต่อผู้ใช้

แม้ว่า pkexec อาจไม่ผ่านการตรวจสอบ ARGUMENTS ที่ส่งไปยังโปรแกรม แต่ sudo ก็มีคุณสมบัตินี้ ยอมรับว่าคุณสามารถยุ่งกับเรื่องนี้และมันไม่ได้ทำตามปกติ

คุณสามารถปรับแต่งวิธีที่คุณต้องการให้โปรแกรมทำงานผ่าน pkexec: ไอคอน, ข้อความที่จะแสดง, คุณสามารถมีสิ่งที่เป็นภาษาท้องถิ่นและทุกอย่าง ขึ้นอยู่กับสถานการณ์นี้สามารถดีแน่นอน น่าเศร้าที่บางคนรู้สึกว่าจำเป็นต้องบูรณาการล้อสำหรับคุณสมบัตินี้ นี่อาจเป็นสิ่งที่จะใส่เข้าไปใน gtksudo / kdesu wrapper แบบกราฟิก

Policykit เป็นเพียงกรอบงานการกำหนดค่าส่วนกลาง น่าเสียดายที่ไม่ใช่คนสวย PKs XML-Files นั้นซับซ้อนกว่าสิ่งใด ๆ ที่แอพสามารถให้ได้โดยไม่ต้องมีไฟล์ไบนารี และไม่มีใครที่จะขี้เกียจที่จะใช้ไบนารี ... โอ้ gconf ... ไม่เป็นไร


8
ฉันลงคะแนนเพราะโพสต์นี้ไม่ใช่คำตอบจริงๆมันเป็นการวิจารณ์คำตอบอื่น หากคุณรู้สึกว่าเป็นทางเลือกที่ดีกว่าในการใช้ sudo ผ่าน pkexec ให้อธิบายประเด็นของคุณด้วยการโต้แย้ง
Flimm

4
ขอบคุณ Paul สำหรับการวิเคราะห์ที่เป็นประโยชน์มากมายที่นี่! แต่ฉันก็เห็นด้วยกับ Flimm คุณสามารถเริ่มต้นด้วยคำตอบง่ายๆสำหรับคำถามที่ถาม?
nealmcb

1
ไม่pkexec สามารถเรียกใช้ GUI ได้โดยไม่ต้องกำหนดค่า: askubuntu.com/a/332847/89385
akostadinov

8

บางสิ่งที่pkexecแตกต่างจากsudoและส่วนหน้า:

  1. คุณไม่สามารถเรียกใช้แอปพลิเคชันแบบกราฟิกได้pkexecโดยไม่ต้องกำหนดค่าให้ชัดเจน
  2. คุณสามารถปรับแต่งเล็กน้อยว่าคุณต้องการให้โปรแกรมทำงานอย่างไรpkexec: ไอคอนข้อความที่จะแสดงไม่ว่าจะจำรหัสผ่านหรือไม่ไม่ว่าจะอนุญาตให้เรียกใช้กราฟิกและอื่น ๆ อีกมากมาย
  3. ทุกคนสามารถเรียกใช้ "เรียกว่า" superuser (ที่ให้พวกเขาสามารถรับรองความถูกต้องเป็นเช่นนั้น) กับsudoคุณจะต้องมีการระบุไว้ในsudoersไฟล์เป็นผู้ดูแลระบบ
  4. gksudoล็อคแป้นพิมพ์เมาส์และมุ่งเน้นเมื่อขอรหัสผ่านpkexecไม่ได้ ในทั้งสองกรณีการกดแป้นสามารถดมกลิ่นได้
  5. เมื่อpkexecคุณทำงานในสภาพแวดล้อมที่สะอาดขึ้นเล็กน้อย

ลองตัวอย่าง:

cd /etc/init.d
sudo cat README
# and now the same with pkexec
pkexec cat README
# nice, huh?

จุดดี (# 3) เกี่ยวกับวิธีการที่คุณสามารถรับรองความถูกต้องเป็นผู้ใช้คนอื่นที่จะเรียกใช้เป็นโปรแกรมที่มีroot pkexecมันกำหนดค่าได้หรือไม่ซึ่งผู้ใช้สามารถใช้งานpkexecได้เลย (แม้ว่าพวกเขาจะรู้รหัสผ่านของผู้ใช้รายอื่นที่ได้รับอนุญาตให้ทำ) suสามารถกำหนดค่าได้ด้วยวิธีนี้ เมื่อฉันพยายามที่จะsuให้rootผู้ใช้ที่ไม่ใช่ผู้ใช้อื่นguestบนระบบ Oneiric มันบอกฉันว่าฉันไม่ได้รับอนุญาตให้ทำเช่นนั้น (ในทางตรงกันข้ามเมื่อฉันพยายามใช้pkexecเป็นguestOneiric หรือ Precise ฉันจะได้รับข้อผิดพลาดในการยืนยันซึ่งฉันอาจรายงานว่าเป็นข้อผิดพลาดในไม่ช้าเนื่องจากฉันไม่ควรได้รับแม้ว่าจะไม่ได้รับอนุญาตก็ตาม)
Eliah Kagan

2
แต่sudoและส่วนหน้าของมันยังสามารถปรับแต่งตามที่อธิบายไว้ในจุดที่ 2 คุณสามารถเรียกใช้โปรแกรมด้วยgksuหรือgksudo แสดงข้อความที่กำหนดเองหยุดต้องการรหัสผ่านของผู้ใช้บางคนโดยการแก้ไข/etc/sudoers(ด้วยvisudo) และเปลี่ยนระยะเวลาที่พวกเขาจำได้ว่า ใช้เวลานานสำหรับ sudo ในการหมดเวลา (แม้ว่าฉันไม่แน่ใจว่าจะทำสิ่งนี้บน Ubuntu ได้อย่างไรซึ่งได้รับการกำหนดค่าเพื่อให้คำถามว่าsudoต้องการรหัสผ่านหรือไม่และนานเท่าใดจนกว่าจะต้องใช้อีกครั้ง )
Eliah Kagan

# 4 ไม่เป็นความจริงถ้าคุณใช้ GNOME Shell
muru

ไม่pkexec สามารถเรียกใช้ GUI ได้โดยไม่ต้องกำหนดค่า: askubuntu.com/a/332847/89385
akostadinov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.