| KEYCTL(1) | دستورهای کاربری | KEYCTL(1) |
نام (NAME)
keyctl - ابزار کنترل و مدیریت کلیدها و دستهکلیدهای هسته لینوکس
خلاصه دستور (SYNOPSIS)
keyctl زیردستور [ آرگومانها... ]
توضیحات (DESCRIPTION)
ابزار keyctl برای دستکاری و مدیریت سیستم نگهداری کلیدهای امنیتی (Kernel Keyring Facility) در هسته لینوکس استفاده میشود.
شناسههای کلید (KEY IDENTIFIERS)
شناسههای کلیدی که به keyctl ارسال یا از آن دریافت میشوند، معمولاً اعداد صحیح مثبت هستند. با این حال، مقادیر ویژهای با معانی خاص وجود دارند که میتوانند به عنوان آرگومان فرستاده شوند:
- بدون کلید: 0
- دستهکلید رشته (Thread keyring): @t یا -1
- هر رشته پردازشی (Thread) میتواند دستهکلید مخصوص به خود را داشته باشد. این دستهکلید پیش از بقیه جستجو میشود. دستهکلید رشته با فراخوانیهای (v)fork، exec و clone جایگزین میشود.
- دستهکلید فرایند (Process keyring): @p یا -2
- هر فرایند (گروه رشته) میتواند دستهکلید ویژه خود را داشته باشد. این دستهکلید میان تمام اعضای گروه به اشتراک گذاشته شده و پس از دستهکلید رشته جستجو میشود. دستهکلید فرایند با (v)fork و exec جایگزین میشود.
- دستهکلید نشست (Session keyring): @s یا -3
- هر فرایند به یک دستهکلید نشست متصل است که در میان (v)fork، exec و clone به ارث میرسد. این دستهکلید پس از دستهکلید فرایند جستجو میشود. دستهکلیدهای نشست میتوانند نامگذاری شوند و میتوان به جای دستهکلید نشست فعلی فرایند، به یک دستهکلید موجود ملحق شد.
- دستهکلید اختصاصی کاربر (User specific keyring): @u یا -4
- این دستهکلید میان تمامی فرایندهای متعلق به یک کاربر خاص مشترک است. این دستهکلید مستقیماً جستجو نمیشود، اما معمولاً از طریق دستهکلید نشست به آن پیوند (link) داده میشود.
- دستهکلید پیشفرض نشست کاربر (User default session keyring): @us یا -5
- این دستهکلید، نشست پیشفرض برای یک کاربر مشخص است. فرایندهای ورودی که به یک کاربر مشخص سوییچ میکنند، تا زمانی که نشست دیگری تنظیم نشود به این نشست متصل خواهند بود.
- دستهکلید گروهی (Group specific keyring): @g یا -6
- این مورد یک جایگاه موقت برای دستهکلید گروهی است، اما هنوز در هسته لینوکس پیادهسازی نشده است.
- کلید مجوز فرضی request_key: @a یا -7
- این گزینه کلید مجوزی را انتخاب میکند که به ابزار کمکی request_key() ارائه شده تا به آن اجازه دهد به دستهکلیدهای فراخواننده دسترسی یافته و کلید هدف را نمونهسازی (instantiate) کند.
- دستهکلید بر اساس نام: %:<name>
- یک دستهکلید نامگذاریشده. این مورد در دستهکلیدهای فرایند و در مسیر /proc/keys جستجو خواهد شد.
- کلید بر اساس نام: %<type>:<name>
- یک کلید نامگذاریشده از نوع مشخص. این مورد در دستهکلیدهای فرایند و در مسیر /proc/keys جستجو خواهد شد.
نحو دستور (COMMAND SYNTAX)
هرگونه کوتاه کردن بدون ابهام نام دستور میتواند به جای نام کامل دستور به کار رود. این قابلیت نباید در اسکریپتنویسی استفاده شود، زیرا ممکن است در آینده دستورهای جدیدی افزوده شوند که ابهام ایجاد کنند.
نمایش شماره نگارش بسته
keyctl --version
این دستور شماره نگارش بسته و تاریخ ساخت آن را چاپ کرده و خارج میشود:
$ keyctl --version keyctl from keyutils-1.5.3 (Built 2011-08-24)
پرسوجوی قابلیتهای زیرسیستم
keyctl supports keyctl supports --raw keyctl supports <cap>
این دستور میتواند قابلیتهای موجود را فهرست کند:
$ keyctl supports have_capabilities=0 have_persistent_keyrings=1 have_dh_compute=1 have_public_key=1
یک خروجی خام هگز از فهرست قابلیتها تولید کند:
$ keyctl supports --raw ff0f
یا یک قابلیت خاص را بررسی کند:
$ keyctl supports pkey echo $? 0
که در صورت پشتیبانی شدن قابلیت با کد ۰، در صورت پشتیبانی نشدن با کد ۱ و در صورت ناشناخته بودن نام با کد ۳ خارج میشود. قابلیتهای پشتیبانیشده عبارتند از:
- capabilities
- هسته از پرسوجوی قابلیتها پشتیبانی میکند. در غیر این صورت، سایر قابلیتها در حد توان libkeyutils بررسی خواهند شد.
- persistent_keyrings
- هسته از دستهکلیدهای ماندگار (persistent keyrings) پشتیبانی میکند.
- dh_compute
- هسته از عملیات محاسباتی دیفی-هلمن پشتیبانی میکند.
- public_key
- هسته از عملیات کلید عمومی پشتیبانی میکند.
- big_key_type
- هسته از نوع کلید big_key پشتیبانی میکند.
- key_invalidate
- هسته از عملیات باطلسازی کلید پشتیبانی میکند.
- restrict_keyring
- هسته از عملیات محدودسازی دستهکلید پشتیبانی میکند.
- move_key
- هسته از عملیات جابجایی کلید پشتیبانی میکند.
- ns_keyring_name
- نامهای دستهکلید بر اساس فضای نام کاربری (user-namespace) که در آن ایجاد شدهاند تفکیک میشوند.
- ns_key_tag
- کلیدها میتوانند برچسبهای فضای نام دریافت کنند، که به کلیدهایی با نوع و شرح یکسان اما فضاهای نام مختلف امکان میدهد در یک دستهکلید مشترک همزیستی داشته باشند. برچسبگذاری به صورت خودکار بر اساس نوع کلید انجام میشود.
نمایش شناسه واقعی کلید یا دستهکلید
keyctl id [<key>]
این دستور شناسه واقعی یک کلید یا دستهکلید را بر اساس شناسه مشخصشده جستجو میکند؛ شناسه ورودی معمولاً یک شناسه نمادین مانند "@s" (نشاندهنده دستهکلید نشست) است، اما میتواند یک شناسه عددی یا ساختار "%type:desc" نیز باشد. اگر یک دستهکلید ویژه تعیین شود که هنوز ایجاد نشده است، به جای ایجاد آن، یک خطا برگردانده خواهد شد.
نمایش دستهکلیدهای فرایند
keyctl show [-x] [<keyring>]
به طور پیشفرض، این دستور به صورت بازگشتی نشان میدهد که یک فرایند به چه دستهکلیدهایی متصل است و آن دستهکلیدها شامل چه کلیدها و دستهکلیدهایی هستند. اگر یک دستهکلید مشخص شود، تنها محتویات همان دستهکلید نمایش داده میشود. اگر گزینه -x تعیین شده باشد، شناسههای دستهکلید به جای مبنای دهدهی، در مبنای هگزادسیمال نمایش داده میشوند.
افزودن کلید به یک دستهکلید
keyctl add [-x] <type> <desc> <data>
<keyring>
keyctl padd [-x] <type> <desc> <keyring>
این دستور کلیدی با نوع و شرح مشخصشده ایجاد میکند؛ آن را با دادههای دادهشده مقداردهی اولیه کرده و به دستهکلید تعیینشده پیوند میدهد. سپس شناسه کلید جدید را در خروجی استاندارد چاپ میکند:
$ keyctl add user mykey stuff @u 26
گونه padd دادهها را به جای خط فرمان از ورودی استاندارد (stdin) میخواند:
$ echo -n stuff | keyctl padd user mykey @u 26
در صورت ارائه -x، دادهها به صورت هگز رمزگشایی شده و نویسههای فاصلهای نادیده گرفته میشوند.
درخواست یک کلید
keyctl request <type> <desc>
[<dest_keyring>]
keyctl request2 <type> <desc> <info>
[<dest_keyring>]
keyctl prequest2 <type> <desc> [<dest_keyring>]
این سه دستور به جستجوی کلیدی با نوع و شرح دادهشده میپردازند. دستهکلیدهای فرایند جستجو میشوند و در صورت یافتن تطابق، شناسه کلید منطبق در خروجی استاندارد چاپ میشود؛ همچنین اگر یک دستهکلید مقصد داده شده باشد، کلید به آن دستهکلید نیز متصل خواهد شد.
اگر کلیدی وجود نداشته باشد، اولین دستور به سادگی خطای ENOKEY را برگردانده و ناموفق میشود. دستورهای دوم و سوم یک کلید ناقص با نوع و شرح ارائهشده ایجاد کرده و /sbin/request-key را با آن کلید و اطلاعات تکمیلی ارائهشده فراخوانی میکنند. این کار باعث تلاش برای نمونهسازی کلید به نحوی میشود که کلیدی معتبر حاصل گردد.
دستور سوم مشابه دستور دوم است، با این تفاوت که اطلاعات فراخوانی به جای ارسال در خط فرمان، از ورودی استاندارد خوانده میشود.
در صورت دستیابی به یک کلید معتبر، شناسه آن چاپ شده و کلید چنان پیوند مییابد که گویی جستجوی اولیه موفقیتآمیز بوده است.
اگر کلید معتبری به دست نیاید، یک کلید منفی موقت به دستهکلید مقصد (در صورت ارائه) متصل شده و خطای "Requested key not available" صادر میشود.
$ keyctl request2 user debug:hello wibble 23 $ echo -n wibble | keyctl prequest2 user debug:hello 23 $ keyctl request user debug:hello 23
بهروزرسانی یک کلید
keyctl update [-x] <key> <data>
keyctl pupdate [-x] <key>
این دستور دادههای متصل به یک کلید را با مجموعه جدیدی از دادهها جایگزین میکند. اگر نوع کلید از بهروزرسانی پشتیبانی نکند، خطای "Operation not supported" بازگردانده خواهد شد.
$ keyctl update 23 zebra
گونه pupdate دادهها را از ورودی استاندارد میخواند:
$ echo -n zebra | keyctl pupdate 23 $ echo 616263313233 | keyctl pupdate -x 23
در صورت تعیین -x، دادهها به صورت هگز رمزگشایی میشوند.
ایجاد یک دستهکلید
keyctl newring <name> <keyring>
این دستور یک دستهکلید جدید با نام مشخص ایجاد کرده و آن را به دستهکلید تعیینشده متصل میکند. در صورت موفقیت، شناسه دستهکلید جدید در خروجی استاندارد چاپ میشود.
$ keyctl newring squelch @us 27
ابطال یک کلید
keyctl revoke <key>
این دستور یک کلید را به عنوان باطلشده (revoked) علامت میزند. هرگونه عملیات بعدی روی آن کلید (به جز حذف پیوند آن) خطای "Key has been revoked" را به همراه خواهد داشت.
$ keyctl revoke 26 $ keyctl describe 26 keyctl_describe: Key has been revoked
پاکسازی یک دستهکلید
keyctl clear <keyring>
این دستور تمام کلیدهای متصل به دستهکلید مشخصشده را از حالت پیوند خارج میکند (unlink). اگر کلید مشخصشده یک دستهکلید نباشد، خطای "Not a directory" برگردانده میشود.
$ keyctl clear 27
پیوند دادن یک کلید به یک دستهکلید
keyctl link <key> <keyring>
این دستور در صورت وجود ظرفیت کافی، پیوندی از کلید به دستهکلید ایجاد میکند. اگر مقصد یک دستهکلید نباشد خطای "Not a directory"، اگر کلید فاقد مجوز link یا دستهکلید فاقد مجوز write باشد خطای "Permission denied"، اگر دستهکلید پر باشد خطای "File table overflow" و اگر تلاشی برای پیوند بازگشتی صورت گیرد خطای "Resource deadlock avoided" بازگردانده میشود.
$ keyctl link 23 27 $ keyctl link 27 27 keyctl_link: Resource deadlock avoided
حذف پیوند یک کلید از دستهکلید یا درخت دستهکلید نشست
keyctl unlink <key> [<keyring>]
اگر دستهکلید تعیین شده باشد، این دستور پیوند به کلید را از آن دستهکلید حذف میکند. اگر مقصد یک دستهکلید نباشد خطای "Not a directory"، اگر دستهکلید مجوز نوشتن نداشته باشد خطای "Permission denied" و اگر کلید به آن دستهکلید متصل نباشد خطای "No such file or directory" داده خواهد شد.
اگر دستهکلید مشخص نشده باشد، این دستور جستجوی عمقاول در درخت دستهکلید نشست انجام داده و تمام پیوندهای یافتشده به کلید مورد نظر را که مجاز به حذف آنهاست حذف مینماید. این دستور تعداد پیوندهای موفق حذفشده را چاپ میکند.
$ keyctl unlink 23 27
جابجایی کلید بین دستهکلیدها
keyctl move [-f] <key> <from_keyring> <to_keyring>
این دستور کلیدی را از یک دستهکلید به دستهکلید دیگر منتقل میکند و به صورت اتمیک دو عمل "keyctl unlink <key> <from_keyring>" و "keyctl link <key> <to_keyring>" را ترکیب مینماید.
اگر پرچم -f داده شود، هر کلید منطبق از دستهکلید مقصد (to_keyring) جایگزین خواهد شد؛ در غیر این صورت، اگر کلید باعث جایگزینی کلید دیگری شود، دستور با خطای "File exists" شکست میخورد.
$ keyctl move 23 27 29 $ keyctl move -f 71 @u @s
جستجوی یک دستهکلید
keyctl search <keyring> <type> <desc> [<dest_keyring>]
این دستور به صورت غیربازگشتی یک دستهکلید را برای یافتن کلیدی با نوع و شرح مشخص جستجو میکند. در صورت یافتن، شناسه کلید در خروجی استاندارد چاپ شده و کلید به دستهکلید مقصد (در صورت وجود) متصل میگردد. در صورت پیدا نشدن کلید، خطای "Requested key not available" برگردانده خواهد شد.
$ keyctl search @us user debug:hello 23 $ keyctl search @us user debug:bye keyctl_search: Requested key not available
محدودسازی یک دستهکلید
keyctl restrict_keyring <keyring> [<type> [<restriction>]]
این دستور اتصال و پیوند کلیدها به دستهکلید مشخصشده را با بهرهگیری از یک طرح محدودیت معین محدود میسازد. طرح با نوع کلید مشخص در ارتباط است و جزئیات بیشتر در رشته گزینه محدودیت آورده میشود. این گزینهها معمولاً نام محدودیت و در ادامه شناسههای کلید یا دیگر دادههای مرتبط را شامل میشوند. اگر هیچ طرح محدودیتی تعیین نشود، دستهکلید تمام پیوندها را رد میکند.
$ keyctl restrict_keyring $1 asymmetric builtin_trusted
خواندن یک کلید
keyctl read <key>
keyctl pipe <key>
keyctl print <key>
این دستورها بار داده (payload) یک کلید را میخوانند. دستور "read" آن را به عنوان یک نسخه هگز (hex dump) چاپ میکند، دستور "pipe" دادههای خام را مستقیماً به خروجی استاندارد میفرستد، و دستور "print" در صورتی که دادهها تماماً قابل چاپ باشند مستقیماً آنها را چاپ میکند و در غیر این صورت به عنوان یک هگزادسیمال با پیشوند ":hex:" خروجی میدهد.
اگر نوع کلید از خواندن بار داده پشتیبانی نکند، خطای "Operation not supported" صادر خواهد شد.
$ keyctl read 26 1 bytes of data in key: 62 $ keyctl print 26 b $ keyctl pipe 26 b$
فهرست کردن یک دستهکلید
keyctl list <keyring>
keyctl rlist <keyring>
این دستورها محتویات یک کلید را به عنوان دستهکلید فهرست میکنند. دستور "list" خروجی را با قالببندی مرتب چاپ کرده و "rlist" فهرستی از شناسههای کلید جداشده با فاصله تولید میکند.
هیچ تلاشی برای بررسی اینکه آیا کلید ارائهشده واقعاً یک دستهکلید است انجام نمیگیرد.
$ keyctl list @us
2 keys in keyring:
22: vrwsl---------- 4043 -1 keyring: _uid.4043
23: vrwsl---------- 4043 4043 user: debug:hello
$ keyctl rlist @us
22 23
توصیف یک کلید
keyctl describe <keyring>
keyctl rdescribe <keyring> [sep]
این دستورها مشخصات و توصیف یک دستهکلید را دریافت میکنند. دستور "describe" مشخصات را همانند دستور "list" با قالب مرتب چاپ میکند؛ دستور "rdescribe" دادههای خام دریافتشده از هسته را چاپ مینماید.
$ keyctl describe @us
-5: vrwsl---------- 4043 -1 keyring: _uid_ses.4043
$ keyctl rdescribe @us
keyring;4043;-1;3f1f0000;_uid_ses.4043
رشته خام ساختاری به شکل "<type>;<uid>;<gid>;<perms>;<description>" دارد که در آن uid و gid شناسههای دهدهی کاربر و گروه، perms ماسک دسترسی در مبنای شانزده (hex) و type و description رشتههای نام نوع و شرح کلید هستند (که هیچیک شامل کاراکتر نقطهویرگول نخواهند بود).
تغییر کنترلهای دسترسی یک کلید
keyctl chown <key> <uid>
keyctl chgrp <key> <gid>
این دو دستور، UID و GID مرتبط با ارزیابی ماسک مجوزهای یک کلید را تغییر میدهند. مقدار UID همچنین تعیین میکند سهمیه (quota) کلید از کدام کاربر کسر گردد.
دستور chown در حال حاضر پشتیبانی نمیشود و تلاش برای اجرای آن به خطای "Operation not supported" منجر میگردد.
برای کاربران عادی (غیرکاربر ارشد)، مقدار GID تنها میتواند برابر با GID فرایند یا یکی از GIDهای موجود در فهرست گروههای فرایند باشد. کاربر ارشد (ریشه) میتواند هر GID دلخواهی را تنظیم کند.
$ sudo keyctl chown 27 0 keyctl_chown: Operation not supported $ sudo keyctl chgrp 27 0
تنظیم ماسک مجوزهای یک کلید
keyctl setperm <key> <mask>
این دستور ماسک کنترل دسترسی روی یک کلید را تغییر میدهد. اگر ماسک با "0x" شروع شود به عنوان عددی در مبنای شانزده (hex)، اگر با "0" آغاز گردد در مبنای هشت (octal) و در غیر این صورت در مبنای ده (decimal) تفسیر خواهد شد.
اعداد هگزادسیمال ترکیبی از موارد زیر هستند:
Possessor UID GID Other Permission Granted ======== ======== ======== ======== ================== 01000000 00010000 00000100 00000001 View 02000000 00020000 00000200 00000002 Read 04000000 00040000 00000400 00000004 Write 08000000 00080000 00000800 00000008 Search 10000000 00100000 00001000 00000010 Link 20000000 00200000 00002000 00000020 Set Attribute 3f000000 003f0000 00003f00 0000003f All
View امکان مشاهده نوع، شرح و سایر پارامترهای کلید را فراهم میسازد.
Read اجازه خواندن بار داده (یا فهرست دستهکلید) را در صورت پشتیبانی نوع کلید میدهد.
Write اجازه اصلاح یا بهروزرسانی بار داده (یا فهرست دستهکلید) را صادر میکند.
Search امکان پیدا شدن کلید در زمان جستجوی دستهکلیدی که کلید به آن پیوند دارد را میدهد.
Link امکان پیوند داده شدن یک کلید به یک دستهکلید را صادر مینماید.
Set Attribute اجازه تغییر مالک، عضویت گروه، ماسک مجوزها و زمان انقضای کلید را فراهم میآورد.
$ keyctl setperm 27 0x1f1f1f00
شروع یک نشست جدید با دستهکلیدهای تازه
keyctl session
keyctl session - [<prog> <arg1> <arg2> ...]
keyctl session <name> [<prog> <arg1> <arg2>
...]
این دستورها به یک دستهکلید جدید ملحق شده یا آن را ایجاد میکنند و سپس یک پوسته یا برنامه دیگر را با آن دستهکلید به عنوان کلید نشست اجرا مینمایند.
گونه بدون آرگومان، صرفاً یک دستهکلید نشست ناشناس ایجاد کرده و آن را به عنوان دستهکلید نشست متصل میکند؛ سپس دستور SHELL$ را اجرا مینماید.
گونه دارای خط تیره به جای نام، یک دستهکلید نشست ناشناس ایجاد و متصل میکند؛ سپس دستور ارائهشده (یا در صورت عدم ارائه، SHELL$) را اجرا مینماید.
گونه دارای نام، دستهکلید نامگذاریشده را ایجاد کرده یا به آن ملحق میشود و آن را به عنوان دستهکلید نشست متصل میسازد؛ سپس دستور مشخصشده (یا در صورت عدم ارائه، SHELL$) را اجرا مینماید.
$ keyctl rdescribe @s keyring;4043;-1;3f1f0000;_uid_ses.4043 $ keyctl session Joined session keyring: 28 $ keyctl rdescribe @s keyring;4043;4043;3f1f0000;_ses.24082 $ keyctl session - Joined session keyring: 29 $ keyctl rdescribe @s keyring;4043;4043;3f1f0000;_ses.24139 $ keyctl session - keyctl rdescribe @s Joined session keyring: 30 keyring;4043;4043;3f1f0000;_ses.24185 $ keyctl session fish Joined session keyring: 34 $ keyctl rdescribe @s keyring;4043;4043;3f1f0000;fish $ keyctl session fish keyctl rdesc @s Joined session keyring: 35 keyring;4043;4043;3f1f0000;fish
نمونهسازی یک کلید
keyctl instantiate [-x] <key> <data>
<keyring>
keyctl pinstantiate [-x] <key> <keyring>
keyctl negate <key> <timeout> <keyring>
keyctl reject <key> <timeout> <error>
<keyring>
این دستورها برای متصل کردن داده به یک کلید نیمهآماده (که توسط هسته ایجاد شده و به /sbin/request-key فرستاده شده است) به کار میروند. دستور "instantiate" کلید را معتبر دانسته و دادهها را به عنوان بار داده متصل میسازد. دستورهای "negate" و "reject" کلید را نامعتبر علامتگذاری کرده و زمان انقضایی روی آن تنظیم میکنند تا پس از مدتی حذف گردد. این کار مانع از کند شدن سیستم توسط انبوه درخواستهای متوالی هنگام شکست آنها میشود، زیرا همه درخواستهای بعدی تا زمان انقضای کلید منفی، با خطای "Requested key not found" (در حالت negate) یا خطای مشخصشده (در حالت reject) رد خواهند شد.
آرگومان خطای دستور reject میتواند یک کد خطای یونیکس یا یکی از مقادیر 'rejected', 'expired' یا 'revoked' باشد.
کلید تازهنمونهسازیشده به دستهکلید مشخصشده پیوند داده میشود.
این دستورها فقط میتوانند از برنامهای اجرا شوند که توسط request-key فراخوانی شده است؛ یک کلید مجوز ویژه توسط هسته تنظیم شده و به دستهکلید نشست request-key افزوده میشود. این کلید ویژه به محض نمونهسازی کلید هدف، باطل میگردد.
$ keyctl instantiate $1 "Debug $3" $4 $ keyctl negate $1 30 $4 $ keyctl reject $1 30 64 $4
گونه pinstantiate دادهها را به جای خط فرمان از ورودی استاندارد میخواند:
$ echo -n "Debug $3" | keyctl pinstantiate $1 $4
در صورت استفاده از گزینه -x دادهها به صورت هگز رمزگشایی میشوند:
$ echo 01 02 03 04 | keyctl pinstantiate -x $1 $4
تنظیم زمان انقضا برای یک کلید
keyctl timeout <key> <timeout>
این دستور برای تعیین مهلت انقضا روی یک کلید، یا پاک کردن زمان انقضای موجود (اگر مقدار صفر باشد) به کار میرود. زمان انقضا به عنوان تعداد ثانیهها در آینده مشخص میشود.
$ keyctl timeout $1 45
دریافت زمینه امنیتی کلید
keyctl security <key>
این دستور برای دریافت زمینه امنیتی LSM یک کلید به کار میرود. برچسب در خروجی استاندارد چاپ میشود.
$ keyctl security @s unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
اعطای دستهکلید نشست جدید به فرایند والد
keyctl new_session [<name>]
این دستور برای اختصاص یک دستهکلید نشست جدید به فرایند فراخواننده (معمولاً پوسته) و کنار گذاشتن دستهکلید نشست قدیمی آن استفاده میشود. اگر نامی ارائه شود، دستهکلید با همان نام ایجاد میشود؛ در غیر این صورت نام پیشفرض "_ses" را میگیرد و نمیتوان به طور دستی به آن ملحق شد.
$ keyctl session foo
Joined session keyring: 723488146
$ keyctl show
Session Keyring
-3 --alswrv 0 0 keyring: foo
$ keyctl new_session
490511412
$ keyctl show
Session Keyring
-3 --alswrv 0 0 keyring: _ses
توجه داشته باشید که این دستور بر فرایند والد (parent) فرایندی که فراخوانی سیستمی را انجام داده اثر میگذارد، و از این رو فقط بر فرایندهایی با مشخصات و اعتبارنامههای منطبق کارساز خواهد بود. علاوه بر این، تغییرات تا زمانی که فرایند والد به فضای کاربری بازگردد (معمولاً هنگام بازگشت از فراخوانی سیستمی wait()) اعمال نخواهد شد.
حذف کلیدهای مرده از درخت دستهکلید نشست
keyctl reap
این دستور جستجوی عمقاول در درخت دستهکلید نشست فراخواننده انجام داده و تلاش میکند هر کلیدی را که به دلیل انقضا، ابطال، رد یا نفی غیرقابلدسترس شده است، از حالت پیوند خارج سازد. این دستور برای حذف کلیدهای زندهای که فقط به دلیل عدم دسترسی یا مجوز در دسترس نیستند اقدامی نمیکند.
کلید واجد شرایط تنها در صورتی از دستهکلید حذف میشود که فراخواننده دارای مجوز نوشتن (Write) روی آن دستهکلید باشد، و فقط دستهکلیدهایی جستجو میشوند که مجوز جستجو (Search) را به فراخواننده اعطا کرده باشند.
این دستور تعداد کلیدهای دروشده را پیش از خروج چاپ میکند. اگر فلگ -v ارسال شود، کلیدها در حین حذف همراه با نتیجه موفقیت یا شکست فهرست میشوند.
حذف کلیدهای منطبق از درخت دستهکلید نشست
keyctl purge <type>
keyctl purge [-i] [-p] <type> <desc>
keyctl purge -s <type> <desc>
این دستورها جستجوی عمقاول برای یافتن کلیدهای منطبق در درخت دستهکلید نشست فراخواننده انجام داده و تلاش میکنند پیوند آنها را بردارند. تعداد کلیدهای حذفشده در پایان چاپ میشود.
دستهکلیدها برای جستجو شدن باید مجوزهای Read و View را اعطا کنند، و کلیدهای مورد نظر برای حذف نیز باید مجوز View داشته باشند. کلیدها تنها از دستهکلیدهایی حذف میشوند که مجوز Write دارند.
حالت نخست تمامی کلیدهای نوع مشخصشده را پاک میکند.
حالت دوم تمامی کلیدهای نوع مشخصشده را که دقیقاً با شرح دادهشده مطابقت دارند پاک میکند. گزینه -i اجازه مطابقت مستقل از بزرگی و کوچکی حروف و گزینه -p اجازه مطابقت پیشوندی را میدهد.
حالت سوم تمام کلیدهای نوع مشخصشده و شرح منطبق را با بهکارگیری مقایسهگر نوع کلید در هسته پاکسازی میکند.
دریافت دستهکلید ماندگار
keyctl get_persistent <keyring> [<uid>]
این دستور دستهکلید ماندگار را برای UID فعلی یا UID ارائهشده دریافت کرده و آن را به دستهکلید مشخصشده متصل مینماید. شناسه دستهکلید ماندگار در خروجی استاندارد چاپ میشود.
هسته در صورت عدم وجود دستهکلید آن را ایجاد میکند و با هر بار اجرای دستور، زمان انقضا روی دستهکلید را به مقدار موجود در:
- /proc/sys/kernel/keys/persistent_keyring_expiry
(به طور پیشفرض سه روز) بازنشانی میکند. با اتمام این زمان، دستهکلید ماندگار حذف شده و تمام محتویات آن آماده بازیافت حافظه میشوند.
اگر شناسهای به غیر از UID واقعی یا مؤثر فرایند داده شود، در صورت نداشتن قابلیت CAP_SETUID خطایی صادر خواهد شد.
محاسبه راز مشترک دیفی-هلمن یا کلید عمومی
keyctl dh_compute <private> <prime> <base>
این دستور راز مشترک دیفی-هلمن یا کلید عمومی متناظر با کلید خصوصی دادهشده را با استفاده از بار داده سه کلید محاسبه میکند:
- base ^ private (mod prime)
هر سه ورودی باید کلیدهای کاربری دارای مجوز خواندن باشند. اگر کلید پایه دادهشده حاوی مقدار مولد مشترک باشد، کلید عمومی محاسبه میشود. اگر کلید پایه حاوی کلید عمومی راه دور باشد، راز مشترک محاسبه خواهد شد.
نتیجه به عنوان یک خروجی هگزادسیمال در خروجی استاندارد چاپ میشود.
$ keyctl dh_compute $1 $2 $3 8 bytes of data in result: 00010203 04050607
محاسبه راز مشترک دیفی-هلمن و استخراج داده کلید
keyctl dh_compute_kdf <private> <prime> <base> <output_length> <hash_type>
این دستور راز مشترک دیفی-هلمن را محاسبه کرده و با استفاده از تابع اشتقاق کلید (KDF)، دادههای کلید را از آن راز مشترک مشتق میکند. راز مشترک محاسبه شده و با استفاده از نوع هش مشخص به KDF داده میشود. نوع هش باید به نام هش شناختهشده برای crypto API هسته اشاره داشته باشد.
این عملیات دادههای کلیدی را به اندازه طول مشخصشده استخراج میکند.
این عملیات کاملاً منطبق بر مشخصات استاندارد SP800-56A است.
نتیجه به عنوان یک خروجی هگز در خروجی استاندارد چاپ میشود.
محاسبه راز مشترک دیفی-هلمن و اعمال KDF با ورودی دیگر
keyctl dh_compute_kdf_oi [-x] <private> <prime> <base> <output_length> <hash_type>
این دستور مشابه دستور dh_compute_kdf است که راز مشترک دیفی-هلمن و به دنبال آن استخراج کلید را انجام میدهد. این دستور به فراخواننده اجازه میدهد تا دادههای ورودی دیگر (دادههای OI) مطابق با استاندارد SP800-56A را از طریق ورودی استاندارد (stdin) ارسال کند.
اگر گزینه -x داده شود، دادههای ارائهشده به stdin به عنوان هگز رمزگشایی میشوند و فاصلهها نادیده گرفته خواهند شد.
انجام عملیات کلید عمومی با یک کلید نامتقارن
keyctl pkey_query <key> <pass> [k=v]*
keyctl pkey_encrypt <key> <pass> <datafile> [k=v]*
> <encfile>
keyctl pkey_decrypt <key> <pass> <encfile> [k=v]*
> <datafile>
keyctl pkey_sign <key> <pass> <datafile> [k=v]* >
<sigfile>
keyctl pkey_verify <key> <pass> <datafile>
<sigfile> [k=v]*
این دستورها یک کلید نامتقارن را بررسی میکنند، دادهها را با آن رمزنگاری کرده، دادههای رمزگذاریشده را رمزگشایی میکنند، بر روی دادهها امضا میگذارند و آن امضا را اعتبارسنجی و تأیید مینمایند. برای دستورهای encrypt، decrypt و sign، دادههای خروجی در stdout نوشته میشوند؛ دستور verify فایلهای داده و امضا را خوانده و آنها را مقایسه میکند.
[!] توجه داشته باشید که این دادهها دارای گنجایش بسیار محدودی بوده و نمیتوانند بیتهایی بیش از اندازه کلید داشته باشند. برای امضاها، انتظار میرود فراخواننده خلاصه (digest) دادههای اصلی را محاسبه کرده و نتیجه را به عنوان datafile ارسال نماید. نام الگوریتم هش باید در انتهای خط فرمان به شکل "hash=<name>" مشخص گردد.
شناسه key کلید مورد نظر را مشخص میکند؛ pass جایگاهی برای گذرواژه در آینده است و فعلاً باید "0" باشد؛ datafile فایل داده رمزنشده برای رمزنگاری، امضا یا بررسی امضا است؛ encfile فایل حاوی دادههای رمزگذاریشده است؛ و sigfile فایل حاوی امضا میباشد.
فهرستی از پارامترها به صورت "[key[=val" میتواند در انتهای خط فرمان درج شود؛ این پارامترها مواردی همچون الگوریتم هش ("hash=<name>") یا قالب رمزگذاری ("enc=<type>") را مشخص میکنند.
k=`keyctl padd asymmetric "" @s <key.pkcs8.der` keyctl pkey_query $k 0 enc=pkcs1 hash=sha256 keyctl pkey_encrypt $k 0 foo.hash enc=pkcs1 >foo.enc keyctl pkey_decrypt $k 0 foo.enc enc=pkcs1 >foo.hash keyctl pkey_sign $k 0 foo.hash enc=pkcs1 hash=sha256 >foo.sig keyctl pkey_verify $k 0 foo.hash foo.sig enc=pkcs1 hash=sha256
برای اطلاعات تکمیلی به asymmetric-key(7) مراجعه فرمایید.
اعلانهای تغییرات (Change notifications)
keyctl watch [-f<filters>] <key>
keyctl watch_session [-f <filters>] [-n <name>] \
<notifylog> <gclog> <fd> <prog> [<arg1>
<arg2> ...] keyctl watch_add <fd> <key>
keyctl watch_rm <fd> <key>
دستور watch یک کلید منفرد را زیر نظر میگیرد و اعلانها را تا زمان نابودی کلید در stdout چاپ میکند. برای کاستن از رویدادها میتوان از فیلتر استفاده کرد. رشته filter دنبالهای از حروف است که هر حرف یک زیرنوع رویداد خاص را فعال میسازد:
i - کلید نمونهسازی شد (instantiated) p - کلید بهروزرسانی شد (updated) l - یک پیوند به دستهکلید اضافه شد (link added) n - یک پیوند از دستهکلید حذف شد (link removed) c - دستهکلید پاکسازی شد (cleared) r - کلید باطل شد (revoked) v - کلید فاقد اعتبار شد (invalidated) s - ویژگیهای کلید تغییر یافت (attributes changed)
خروجی این دستور به شکل زیر است:
<keyid> <event> [<aux>]
که در آن keyid موضوع اصلی اعلان، event رویداد رخداده، و aux کلید ثانویه (در صورت وجود) است (مانند رویداد link که کلید اصلی همان دستهکلید و کلید ثانویه کلیدی است که به آن پیوند خورده است). برای نمونه:
255913279 link 340681059 255913279 clr
هنگامی که کلید تحتنظر پاکسازی حافظه (garbage collection) شود، یک اعلان اضافی تولید میگردد:
255913279 gc
دستور watch_session یک دستهکلید نشست جدید با نام name (در صورت تعیین) میسازد، آن را برای دریافت اعلانها زیر نظر میگیرد و برنامه prog را به همراه آرگومانهای ارائهشده اجرا میکند.
یک فرایند دوم به صورت موازی منشعب میشود تا اعلانها را پایش کند. خروجی آن برای اکثر اعلانها به فایل notifylog و برای اعلانهای حذف کلید به فایل gclog هدایت میشود.
دستگاه watch_queue(7) به برنامهای که به شماره توصیفگر فایل fd متصل است صادر میشود که توسط دو دستور دیگر نیز قابل استفاده است.
دستور watch_add یک پایش روی key به watch_queue متصل به fd اضافه کرده و watch_rm آن را حذف میکند. یک watch_queue میتواند چندین کلید و حتی منابع غیرکلیدی را مدیریت نماید.
خطاها (ERRORS)
خطاهای متداولی که توسط این برنامه بازگردانده میشوند عبارتند از:
"Not a directory" - کلید دادهشده یک دستهکلید نبود.
"Requested key not found" - کلید مورد نظر پیدا نشد یا در دسترس نیست.
"Key has been revoked" - دسترسی به یک کلید باطلشده صورت گرفته است.
"Key has expired" - دسترسی به یک کلید منقضیشده صورت گرفته است.
"Permission denied" - دسترسی توسط ترکیب UID/GID/mask رد شد.
همچنین ببینید (SEE ALSO)
keyctl(1), keyctl(2), request_key(2), keyctl(3), request-key.conf(5), keyrings(7), request-key(8)
| مه ۲۰۲۵ | keyutils |