| SYSTEMD-MEASURE(1) | systemd-measure | SYSTEMD-MEASURE(1) |
نام (NAME)
systemd-measure - محاسبه پیشدستانه و امضای مقادیر مورد انتظار TPM2 PCR 11 برای ایمیجهای هسته یکپارچه بوتشده
خلاصه دستور (SYNOPSIS)
/usr/lib/systemd/systemd-measure [OPTIONS...]
توضیحات (DESCRIPTION)
نکته: این دستور در حال حاضر آزمایشی است. اگرچه احتمالاً به یکی از اجزای همیشگی systemd تبدیل خواهد شد، ممکن است رفتار و رابط کاربری آن همچنان دستخوش تغییر شود.
systemd-measure ابزاری است که میتواند برای محاسبه پیشدستانه و امضای مقادیر مورد انتظار TPM2 PCR 11 استفاده شود؛ مقادیری که باید هنگام بوت شدن یک ایمیج هسته یکپارچه (UKI) مبتنی بر UAPI.5[1] بر پایه systemd-stub(7) مشاهده شوند. این ابزار مسیرهای فایل ایمیج هسته ELF، فایل ایمیج initrd، فایل devicetree، فایل خط فرمان هسته، فایل os-release(5)، فایل تصویر زمینه بوت (boot splash) و فایل کلید عمومی PEM مربوط به TPM2 PCR را که ایمیج هسته یکپارچه را تشکیل میدهند میپذیرد، و مقادیر PCR مورد انتظار پس از بوت شدن ایمیج را تعیین میکند. محاسبه با یک PCR 11 مقداردهیشده با صفر آغاز میشود و به شیوهای سازگار با عملکرد systemd-stub در هنگام بوت اجرا میگردد. نتیجه را میتوان بهصورت اختیاری بهصورت رمزنگاریشده امضا کرد، تا خطمشیهای TPM2 که تنها در صورت بوت شدن مجموعه مشخصی از هستهها قابل بازگشایی هستند (که چنین امضای PCR برای آنها ارائه شده باشد) پیادهسازی شوند.
معمولاً فراخوانی مستقیم این ابزار هنگام ساخت یک UKI چندان منطقی نیست. در عوض، باید از ukify(1) استفاده شود؛ این ابزار systemd-measure را فراخوانی کرده و مسئولیت جاسازی اندازهگیریهای حاصل را در UKI بر عهده میگیرد.
فرمانها (COMMANDS)
فرمانهای زیر پشتیبانی میشوند:
status
در نسخه ۲۵۲ اضافه شد.
calculate
در نسخه ۲۵۲ اضافه شد.
sign
توجه داشته باشید که برای انجام این امضا باید یک دستگاه TPM2 در دسترس باشد، حتی اگر نتیجه به هیچ دستگاه TPM2 یا وضعیت آن وابسته نباشد.
در نسخه ۲۵۲ اضافه شد.
policy-digest
در نسخه ۲۵۸ اضافه شد.
گزینهها (OPTIONS)
گزینههای زیر پشتیبانی میشوند:
--linux=PATH, --osrel=PATH, --cmdline=PATH, --initrd=PATH, --ucode=PATH, --splash=PATH, --dtb=PATH, --uname=PATH, --sbat=PATH, --pcrpkey=PATH, --profile=PATH, --dtbauto=PATH, --hwids=PATH
در نسخه ۲۵۲ اضافه شد.
بهاستثنای --profile=، --dtbauto= و --hwids= که در نسخه ۲۵۷ اضافه شدهاند.
--current
در نسخه ۲۵۲ اضافه شد.
--bank=DIGEST
توجه داشته باشید که برخی از سیستمهای عامل پشتیبانی از امضاهای مبتنی بر SHA1 را غیرفعال میکنند، که در این صورت این عملیات ناموفق خواهد بود. لطفاً برای جزئیات در مورد نحوه نادیده گرفتن خطمشی امنیتی سیستمعامل در این رابطه، به مستندات سیستمعامل خود مراجعه کنید.
در نسخه ۲۵۲ اضافه شد.
--private-key=PATH, --public-key=PATH, --certificate=PATH
به تفاوت بین سوییچهای --pcrpkey= و --public-key= توجه کنید. سوییچ اول دادههایی را انتخاب میکند که در بخش PE با نام ".pcrpkey" از ایمیج هسته یکپارچه گنجانده شود؛ سوییچ دوم کلید عمومی از جفتکلید مورداستفاده برای امضای مقادیر حاصل از PCR 11 را انتخاب میکند. سوییچ اول کلیدی است که سیستم بوتشده احتمالاً برای قفل کردن رمزگذاری دیسک و اعتبارنامهها به آن استفاده خواهد کرد؛ سوییچ دوم کلیدی است که برای بازگشایی مجدد چنین منابعی استفاده میشود. بنابراین، معمولاً باید کلید PEM یکسانی در هر دو حالت ارائه شود.
اگر --public-key= مشخص نشده باشد اما --private-key= مشخص شده باشد، کلید عمومی بهطور خودکار از کلید خصوصی استخراج میشود.
از نسخه ۲۵۶، --certificate= میتواند برای مشخص کردن یک گواهی X.509 بهعنوان جایگزینی برای --public-key= استفاده شود.
در نسخه ۲۵۲ اضافه شد.
--private-key=PATH/URI, --private-key-source=TYPE[:NAME], --certificate=PATH/URI, --certificate-source=TYPE[:NAME]
گزینه --certificate= نیز یک مسیر یا یک URI میگیرد که به ارائهدهنده OpenSSL ارسال خواهد شد، همانطور که توسط --certificate-source= بهصورت یک تاپل "type:name" مانند "provider:pkcs11" مشخص شده است. توجه داشته باشید که برخلاف --private-key-source=، این گزینه فقط از ارائهدهندهها پشتیبانی میکند و نه از موتورها.
در نسخه ۲۵۶ اضافه شد.
--tpm2-device=PATH
در نسخه ۲۵۲ اضافه شد.
--phase=PHASE
برای جزئیات بیشتر درباره فازهای بوت PCR، به systemd-pcrphase.service(8) مراجعه کنید.
در نسخه ۲۵۲ اضافه شد.
--append=PATH
در نسخه ۲۵۳ اضافه شد.
--json=MODE
--no-pager
-h, --help
--version
مثالها (EXAMPLES)
مثال ۱. تولید یک ایمیج هسته یکپارچه و محاسبه مقدار مورد انتظار TPM PCR 11
$ ukify build \
--linux=vmlinux \
--initrd=initrd.cpio \
--os-release=@os-release.txt \
--cmdline=@cmdline.txt \
--splash=splash.bmp \
--devicetree=devicetree.dtb \
--measure \
--output=vmlinux.efi
11:sha1=d775a7b4482450ac77e03ee19bda90bd792d6ec7
11:sha256=bc6170f9ce28eb051ab465cd62be8cf63985276766cf9faf527ffefb66f45651
11:sha384=1cf67dff4757e61e5...7f49ad720be02fd07263e1f93061243aec599d1ee4b4
11:sha512=8e79acd3ddbbc8282...0c3e8ec0c714821032038f525f744960bcd082d937da
دستور ukify(1) بهصورت داخلی systemd-measure را فراخوانی میکند. خروجی حاوی درهمسازیها از جانب systemd-measure است.
مثال ۲. تولید یک جفتکلید خصوصی/عمومی، یک ایمیج هسته یکپارچه و یک امضای TPM PCR 11 برای آن، و جاسازی امضا و کلید عمومی در ایمیج
$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out tpm2-pcr-private-key.pem
..+.+++++++++......+.........+......+.......+....+.....+.+...+..........
$ openssl rsa -pubout -in tpm2-pcr-private-key.pem -out tpm2-pcr-public-key.pem
$ systemd-measure sign \
--linux=vmlinux \
--osrel=os-release.txt \
--cmdline=cmdline.txt \
--initrd=initrd.cpio \
--splash=splash.bmp \
--dtb=devicetree.dtb \
--pcrpkey=tpm2-pcr-public-key.pem \
--bank=sha1 \
--bank=sha256 \
--private-key=tpm2-pcr-private-key.pem \
--public-key=tpm2-pcr-public-key.pem >tpm2-pcr-signature.json
$ ukify build \
--linux=vmlinux \
--initrd=initrd.cpio \
--os-release=@os-release.txt \
--cmdline=@cmdline.txt \
--splash=splash.bmp \
--devicetree=devicetree.dtb \
--pcr-private-key=tpm2-pcr-private-key.pem \
--pcr-public-key=tpm2-pcr-public-key.pem \
--pcr-banks=sha1,sha256 \
--output=vmlinuz.efi
سپس، خطمشی امضاشده PCR را روی یک حجم LUKS ثبت (enroll) کنید:
# systemd-cryptenroll --tpm2-device=auto \
--tpm2-public-key=tpm2-pcr-public-key.pem \
--tpm2-signature=tpm2-pcr-signature.json \
/dev/sda5
و سپس دستگاه را با امضا بازگشایی کنید:
# systemd-cryptsetup attach \
volume5 /dev/sda5 - \
tpm2-device=auto,tpm2-signature=/path/to/tpm2-pcr-signature.json
توجه داشته باشید زمانی که ایمیج هسته یکپارچه تولیدشده vmlinux.efi بوت میشود، فایلهای امضا و کلید عمومی در مکانهایی قرار میگیرند که systemd-cryptenroll و systemd-cryptsetup به هر حال در آنجا به دنبالشان خواهند گشت، و بنابراین نیازی به مشخص کردن صریح این مسیرها نیست.
مثال ۳. معرفی یک کلید عمومی دوم، برای امضای همان اندازهگیریهای PCR هسته، اما فقط برای فاز بوت initrd
این مثال نمونه قبلی را گسترش میدهد، اما اکنون یک کلید امضای دوم را معرفی میکنیم که فقط برای امضای خطمشیهای PCR محدود به فاز بوت initrd استفاده میشود. این کار میتواند برای قفل کردن حجمهای ریشه به گونهای استفاده شود که فقط قبل از انتقال به سیستم میزبان قابل بازگشایی باشند. بنابراین ما دو دسته از اسرار یا اعتبارنامهها داریم: دستهای که میتوانند در تمام طول زمان اجرا بازگشایی شوند، و دستهای که فقط در initrd قابل استفاده هستند.
$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out tpm2-pcr-private-key.pem
.+........+.+........+.......+...+...+........+....+......+..+..........
$ openssl rsa -pubout -in tpm2-pcr-private-key.pem -out tpm2-pcr-public-key.pem
$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out tpm2-pcr-initrd-private-key.pem
..+.......++........+........+......+........+....+.....+.+..+..........
$ openssl rsa -pubout -in tpm2-pcr-initrd-private-key.pem -out tpm2-pcr-initrd-public-key.pem
$ ukify build \
--linux=vmlinux-1.2.3 \
--initrd=initrd.cpio \
--os-release=@os-release.txt \
--cmdline=@cmdline.txt \
--splash=splash.bmp \
--devicetree=devicetree.dtb \
--pcr-private-key=tpm2-pcr-private-key.pem \
--pcr-public-key=tpm2-pcr-public-key.pem \
--phases=enter-initrd,enter-initrd:leave-initrd,enter-initrd:leave-initrd:sysinit,enter-initrd:leave-initrd:sysinit:ready \
--pcr-banks=sha1,sha256 \
--pcr-private-key=tpm2-pcr-initrd-private-key.pem \
--pcr-public-key=tpm2-pcr-initrd-public-key.pem \
--phases=enter-initrd \
--uname=1.2.3 \
--output=vmlinux-1.2.3.efi
+ /usr/lib/systemd/systemd-measure sign --linux=vmlinux-1.2.3 \
--osrel=os-release.txt --cmdline=cmdline.txt --dtb=devicetree.dtb \
--splash=splash.bmp --initrd=initrd.cpio --bank=sha1 --bank=sha256 \
--private-key=tpm2-pcr-private-key.pem --public-key=tpm2-pcr-public-key.pem \
--phase=enter-initrd --phase=enter-initrd:leave-initrd \
--phase=enter-initrd:leave-initrd:sysinit \
--phase=enter-initrd:leave-initrd:sysinit:ready
+ /usr/lib/systemd/systemd-measure sign --linux=vmlinux-1.2.3 \
--osrel=os-release.txt --cmdline=cmdline.txt --dtb=devicetree.dtb \
--splash=splash.bmp --initrd=initrd.cpio --bank=sha1 --bank=sha256 \
--private-key=tpm2-pcr-initrd-private-key.pem \
--public-key=tpm2-pcr-initrd-public-key.pem \
--phase=enter-initrd
Wrote unsigned vmlinux-1.2.3.efi
ابزار ukify هر دو فراخوانی systemd-measure را بهعنوان خروجی اطلاعاتی چاپ میکند (سطرهایی که با "+" شروع میشوند)؛ این امر به ما امکان میدهد ببینیم چگونه systemd-measure فراخوانی میشود. سپس خروجی هر دو فراخوانی را در بخش ".pcrsig" ادغام میکند. systemd-measure همچنین میتواند این ادغام را خود با استفاده از گزینه --append= انجام دهد.
توجه داشته باشید که در این مثال، بخش PE با نام ".pcrpkey" حاوی کلید مشخصشده توسط اولین گزینه --pcr-private-key= است که تمام فازهای بوت را پوشش میدهد. بخش ".pcrpkey" در خطمشیهای پیشفرض systemd-cryptenroll و systemd-creds استفاده میشود. برای استفاده از خطمشی سختگیرانهتر مقید به tpm2-pcr-initrd-public-key.pem، گزینه --tpm2-public-key= را در خط فرمان آن ابزارها مشخص کنید.
کدهای خروج (EXIT STATUS)
در صورت موفقیت 0 و در غیر این صورت یک کد خطای غیر صفر برگردانده میشود.
همچنین ببینید (SEE ALSO)
systemd(1), systemd-stub(7), ukify(1), systemd-creds(1), systemd-cryptsetup@.service(8), systemd-pcrphase.service(8)
نکات (NOTES)
- 1.
- UAPI.5 Unified Kernel Image (UKI)
| systemd 261.2 |