KEYCTL(1) دستورهای کاربری KEYCTL(1)

keyctl - ابزار کنترل و مدیریت کلیدها و دستهکلیدهای هسته لینوکس

keyctl زیردستور [ آرگومانها... ]

ابزار keyctl برای دستکاری و مدیریت سیستم نگهداری کلیدهای امنیتی (Kernel Keyring Facility) در هسته لینوکس استفاده میشود.

شناسه‌های کلیدی که به 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 جستجو خواهد شد.

هرگونه کوتاه کردن بدون ابهام نام دستور می‌تواند به جای نام کامل دستور به کار رود. این قابلیت نباید در اسکریپت‌نویسی استفاده شود، زیرا ممکن است در آینده دستورهای جدیدی افزوده شوند که ابهام ایجاد کنند.

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

که در صورت پشتیبانی شدن قابلیت با کد ۰، در صورت پشتیبانی نشدن با کد ۱ و در صورت ناشناخته بودن نام با کد ۳ خارج می‌شود. قابلیت‌های پشتیبانی‌شده عبارتند از:

هسته از پرس‌وجوی قابلیت‌ها پشتیبانی می‌کند. در غیر این صورت، سایر قابلیت‌ها در حد توان libkeyutils بررسی خواهند شد.
هسته از دسته‌کلیدهای ماندگار (persistent keyrings) پشتیبانی می‌کند.
هسته از عملیات محاسباتی دیفی-هلمن پشتیبانی می‌کند.
هسته از عملیات کلید عمومی پشتیبانی می‌کند.
هسته از نوع کلید big_key پشتیبانی می‌کند.
هسته از عملیات باطل‌سازی کلید پشتیبانی می‌کند.
هسته از عملیات محدودسازی دسته‌کلید پشتیبانی می‌کند.
هسته از عملیات جابجایی کلید پشتیبانی می‌کند.
نام‌های دسته‌کلید بر اساس فضای نام کاربری (user-namespace) که در آن ایجاد شده‌اند تفکیک می‌شوند.
کلیدها می‌توانند برچسب‌های فضای نام دریافت کنند، که به کلیدهایی با نوع و شرح یکسان اما فضاهای نام مختلف امکان می‌دهد در یک دسته‌کلید مشترک همزیستی داشته باشند. برچسب‌گذاری به صورت خودکار بر اساس نوع کلید انجام می‌شود.

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 است.

نتیجه به عنوان یک خروجی هگز در خروجی استاندارد چاپ می‌شود.

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) مراجعه فرمایید.

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 می‌تواند چندین کلید و حتی منابع غیرکلیدی را مدیریت نماید.

خطاهای متداولی که توسط این برنامه بازگردانده می‌شوند عبارتند از:

"Not a directory" - کلید داده‌شده یک دسته‌کلید نبود.

"Requested key not found" - کلید مورد نظر پیدا نشد یا در دسترس نیست.

"Key has been revoked" - دسترسی به یک کلید باطل‌شده صورت گرفته است.

"Key has expired" - دسترسی به یک کلید منقضی‌شده صورت گرفته است.

"Permission denied" - دسترسی توسط ترکیب UID/GID/mask رد شد.

keyctl(1), keyctl(2), request_key(2), keyctl(3), request-key.conf(5), keyrings(7), request-key(8)

مه ۲۰۲۵ keyutils