PKEXEC(1) pkexec PKEXEC(1)

pkexec - اجرای یک دستور با هویت کاربری دیگر

pkexec [--version] [--disable-internal-agent] [--help]

pkexec [--keep-cwd] [--user username] PROGRAM [ARGUMENTS...]

دستور pkexec به یک کاربر مجاز اجازه می‌دهد تا PROGRAM را با هویت کاربری دیگر اجرا کند. اگر PROGRAM مشخص نشده باشد، شل پیش‌فرض اجرا خواهد شد. اگر username تعیین نشده باشد، برنامه با هویت کاربر مدیر سیستم، یعنی root، اجرا خواهد شد.

در صورت اتمام موفقیت‌آمیز، مقدار بازگشتی همان مقدار بازگشتی PROGRAM خواهد بود. چنانچه فرایند فراخواننده مجاز نباشد، یا مجوز لازم از طریق احراز هویت کسب نشود، یا خطایی رخ دهد، pkexec با مقدار بازگشتی 127 خارج می‌شود. اگر به دلیل لغو کردن کادر گفتگوی احراز هویت توسط کاربر، مجوزی حاصل نشود، pkexec با مقدار بازگشتی 126 خارج خواهد شد.

دستور pkexec، مانند هر برنامهٔ polkit دیگری، از عامل احراز هویت ثبت‌شده برای فرایند یا نشست (session) فراخواننده استفاده خواهد کرد. با این حال، اگر هیچ عامل احراز هویتی در دسترس نباشد، pkexec عامل احراز هویت متنیِ داخلی خود را ثبت می‌کند. این رفتار را می‌توان با ارسال گزینهٔ --disable-internal-agent غیرفعال کرد.

اجرای یک برنامه با هویت کاربری دیگر، یک عملیات ممتاز (privileged) است. به‌طور پیش‌فرض، کنشی که باید برای آن بررسی انجام شود (بخش “کنش‌ها و مجوزها (ACTION AND AUTHORIZATIONS)” را ببینید) نیازمند احراز هویت مدیر سیستم است. علاوه بر این، کادر گفتگوی احراز هویت که به کاربر نشان داده می‌شود، مسیر کامل برنامه برای اجرا را نمایش می‌دهد تا کاربر از آنچه رخ خواهد داد آگاه باشد.

محیطی که PROGRAM در آن اجرا خواهد شد، به منظور جلوگیری از تزریق کد از طریق LD_LIBRARY_PATH یا سازوکارهای مشابه، بر روی یک محیط کمینه، شناخته‌شده و امن تنظیم می‌شود. علاوه بر این، متغیر محیطی PKEXEC_UID روی شناسهٔ کاربری (UID) فرایندی که pkexec را فراخوانده است تنظیم می‌شود. در نتیجه، pkexec به‌طور پیش‌فرض اجازهٔ اجرای برنامه‌های X11 را با هویت کاربری دیگر نخواهد داد، چرا که متغیرهای محیطی $DISPLAY و $XAUTHORITY تنظیم نشده‌اند. در صورتی که حاشیه‌نویسی org.freedesktop.policykit.exec.allow_gui روی یک کنش با مقداری غیرخالی مقداردهی شده باشد، این دو متغیر حفظ خواهند شد؛ با این حال، استفاده از این کار توصیه نمی‌شود و فقط باید برای برنامه‌های قدیمی و موروثی (legacy) به کار رود.

دستور pkexec برنامهٔ PROGRAM را در دایرکتوری خانگی username اجرا خواهد کرد، مگر اینکه از گزینهٔ --keep-cwd برای تغییر این رفتار استفاده شود.

توجه داشته باشید که pkexec هیچ اعتبارسنجی‌ای روی ARGUMENTS ارسال‌شده به PROGRAM انجام نمی‌دهد. در حالت عادی (که در آن احراز هویت مدیر سیستم با هر بار استفاده از pkexec الزامی است)، این امر مشکلی به وجود نمی‌آورد زیرا اگر کاربر مدیر سیستم باشد، می‌تواند به‌راحتی pkexec bash را برای دسترسی به root اجرا کند.

با این حال، اگر کنشی استفاده شود که کاربر بتواند مجوز را در آن حفظ کند (یا اگر کاربر به‌طور ضمنی مجاز باشد)، این می‌تواند یک رخنهٔ امنیتی باشد. بنابراین، به عنوان یک قاعدهٔ کلی، برنامه‌هایی که مجوز مورد نیاز پیش‌فرض آن‌ها تغییر یافته است، هرگز نباید به‌طور ضمنی به ورودی‌های کاربر اعتماد کنند (به عنوان مثال، مانند هر برنامهٔ خوب‌نوشته‌شدهٔ suid دیگر).

به‌طور پیش‌فرض، از کنش org.freedesktop.policykit.exec استفاده می‌شود. برای استفاده از کنشی دیگر، از حاشیه‌نویسیِ org.freedesktop.policykit.exec.path روی یک کنش با مقداری که برابر با مسیر کامل برنامه است استفاده کنید. علاوه بر تعیین برنامه، می‌توان پیام احراز هویت، شرح، آیکون و مقادیر پیش‌فرض را نیز مشخص کرد. اگر حاشیه‌نویسی org.freedesktop.policykit.exec.argv1 وجود داشته باشد، کنش تنها در صورتی انتخاب خواهد شد که آرگومان اول برنامه با مقدار این حاشیه‌نویسی مطابقت داشته باشد.

توجه داشته باشید که پیام‌های احراز هویت ممکن است به متغیرها ارجاع دهند (بخش “متغیرها (VARIABLES)” را ببینید)؛ برای نمونه، $(user) به مقدار متغیر user بسط می‌یابد.

برای جلوگیری از تغییر نرم‌افزارهای موجود جهت افزودن پیشوند pkexec به فراخوانی‌های خط فرمان آن‌ها، می‌توان از pkexec در یک لفاف she-bang[1] به این صورت استفاده کرد:

#!/usr/bin/pkexec /usr/bin/python
import os
import sys
print "Hello, I'm running as uid %d"%(os.getuid())
for n in range(len(sys.argv)):
    print "arg[%d]=`%s'"%(n, sys.argv[n])

اگر این اسکریپت در /usr/bin/my-pk-test نصب شده باشد، آن‌گاه حاشیه‌نویسی‌های زیر:

[...]
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/python</annotate>
<annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/my-pk-test</annotate>
[...]

می‌توانند برای انتخاب کنش مناسب polkit استفاده شوند. دقت کنید که حاشیه‌نویسی دوم را به‌درستی تنظیم کنید، در غیر این صورت با هر فراخوانی pkexec برای اسکریپت‌های /usr/bin/python تطبیق داده خواهد شد.

متغیرهای زیر توسط pkexec تنظیم می‌شوند. می‌توان از آن‌ها در قواعد صدور مجوز و پیام‌های نمایش‌یافته در کادرهای گفتگوی احراز هویت استفاده کرد:

program

مسیر کامل و مطلق برنامه‌ای که باید اجرا شود. مثال: “/bin/cat”

command_line

خط فرمان درخواست‌شده (از این متغیر برای بررسی‌های امنیتی استفاده نکنید، چرا که امن نیست). مثال: “cat /srv/xyz/foobar”

user

نام کاربری کاربری که برنامه با هویت او اجرا می‌شود. مثال: “davidz”

user.gecos

نام کامل کاربری که برنامه با هویت او اجرا می‌شود. مثال: “David Zeuthen”

user.display

نمایشی از کاربر اجراکنندهٔ برنامه که برای نمایش در کادر گفتگوی احراز هویت مناسب است. معمولاً ترکیبی از نام کاربری و نام کامل تنظیم می‌شود. مثال: “David Zeuthen (davidz)”

نوشته‌شده توسط David Zeuthen <davidz@redhat.com> با کمک‌های بسیار از سوی افراد متعدد دیگر.

لطفاً گزارش باگ‌ها را به توزیع خود یا به فهرست پستی polkit-devel ارسال کنید، ببینید: https://github.com/polkit-org/polkit#bugs-and-development.

polkit(8), polkitd(8), pkaction(1), pkcheck(1), pkttyagent(1)

1.
لفاف she-bang
May 2009 polkit