SYSTEMD-PCRPHASE.SERVICE(8) systemd-pcrphase.service SYSTEMD-PCRPHASE.SERVICE(8)

systemd-pcrphase.service, systemd-pcrphase-sysinit.service, systemd-pcrphase-initrd.service, systemd-pcrmachine.service, systemd-pcrosseparator.service, systemd-pcrproduct.service, systemd-pcrlogin@.service, systemd-pcrfs-root.service, systemd-pcrfs@.service, systemd-pcrnvdone.service, systemd-pcrphase-factory-reset.service, systemd-pcrphase-storage-target-mode.service, systemd-pcrextend - اندازه‌گیری فازهای بوت، شناسه ماشین، UUID محصول، رکوردهای کاربر و هویت سیستم‌فایل در TPM PCRها و NvPCRها

systemd-pcrphase.service

systemd-pcrphase-sysinit.service

systemd-pcrphase-initrd.service

systemd-pcrmachine.service

systemd-pcrosseparator.service

systemd-pcrproduct.service

systemd-pcrlogin@.service

systemd-pcrfs-root.service

systemd-pcrfs@.service

systemd-pcrnvdone.service

systemd-pcrphase-factory-reset.service

systemd-pcrphase-storage-target-mode.service

/usr/lib/systemd/systemd-pcrextend [STRING]

systemd-pcrphase.service، systemd-pcrphase-sysinit.service و systemd-pcrphase-initrd.service سرویس‌های سیستمی هستند که رشته‌های مشخصی را در طول بوت در نقاط عطف مختلف فرآیند بوت در TPM2 PCR 11 اندازه‌گیری می‌کنند.

systemd-pcrmachine.service یک سرویس سیستمی است که شناسه ماشین (به machine-id(5) مراجعه کنید) را در PCR 15 اندازه‌گیری می‌کند.

systemd-pcrosseparator.service یک سرویس سیستمی است که کلمه "os-separator" را در PCRهای 0-7، 9 و 12-14 اندازه‌گیری می‌کند. این عمل به عنوان یک اندازه‌گیری جداکننده اضافی، اندازه‌گیری‌های پیش از بوت (یعنی سفت‌افزار + بارگذار بوت) را از اندازه‌گیری‌های سیستم‌عامل جدا می‌سازد و به‌ویژه PCRهای سفت‌افزار را «مهر و موم» (seal) می‌کند.

systemd-pcrproduct.service یک سرویس سیستمی است که UUID محصول سفت‌افزار را (همان‌طور که توسط یکی از SMBIOS، Devicetree و غیره ارائه شده است) در یک NvPCR با نام "hardware" اندازه‌گیری می‌کند.

systemd-pcrlogin@.service یک سرویس الگو (template) است که رکورد کاربر (خلاصه‌شده، در قالب JSON متعارف) مربوط به کاربری را که با شناسه نمونه آن (یک UID) مشخص شده است، در یک NvPCR با نام "login" اندازه‌گیری می‌کند. این سرویس در اولین ورود کاربر در بوت جاری توسط systemd-logind.service(8) راه‌اندازی می‌شود، بسیار شبیه به user-runtime-dir@.service(5). برخلاف دومی، این سرویس عمداً هرگز دوباره متوقف نمی‌شود: یک سرویس Type=oneshot با RemainAfterExit=yes در system.slice است، بنابراین هر کاربر صرف‌نظر از اینکه چند بار وارد یا خارج شود، دقیقاً یک بار در هر بوت اندازه‌گیری می‌شود (گسترش‌های NvPCR یک زنجیره درهم‌سازی تشکیل می‌دهند، بنابراین اندازه‌گیری مجدد همان رکورد، مقدار NvPCR را غیرقابل‌پیش‌بینی می‌کرد). بنابراین NvPCR حاصل با نام "login" (همراه با گزارش رویداد /run/log/systemd/tpm2-measure.log) یک رکورد با پشتیبانی TPM و فقط‌افزودنی (append-only) از هویت‌های کاربری فعال‌شده در طول بوت جاری فراهم می‌کند.

systemd-pcrnvdone.service یک سرویس سیستمی است که پس از اتمام مقداردهی اولیه تمام NvPCRها، یک رویداد جداکننده را در PCR 9 اندازه‌گیری می‌کند.

systemd-pcrfs-root.service و systemd-pcrfs@.service سرویس‌هایی هستند که اطلاعات هویتی سیستم‌فایل (یعنی نقطه اتصال، نوع سیستم‌فایل، برچسب و UUID، برچسب پارتیشن و UUID) را در PCR 15 اندازه‌گیری می‌کنند. systemd-pcrfs-root.service این کار را برای سیستم‌فایل ریشه انجام می‌دهد و systemd-pcrfs@.service یک واحد الگو است که به جای آن سیستم‌فایل مشخص‌شده توسط شناسه نمونه خود را اندازه‌گیری می‌کند.

این سرویس‌ها نیازمند استفاده از systemd-stub(7) در یک ایمیج هسته یکپارچه (UKI) هستند. هنگامی که از stub برای فراخوانی هسته استفاده نشده باشد، هیچ عملیاتی انجام نمی‌دهند. پیش از واگذاری کنترل به هسته، stub هسته فراخوانی‌شده و منابع مرتبط سازنده را در PCR 11 اندازه‌گیری می‌کند؛ به محض اینکه فضای کاربری (userspace) فراخوانی شود، این سرویس‌ها TPM2 PCR 11 را با رشته‌های متنی مشخصی که نشان‌دهنده فازهای فرآیند بوت هستند گسترش می‌دهند. در طول یک فرآیند بوت عادی، PCR 11 با رشته‌های زیر گسترش می‌یابد:

1."enter-initrd" — اوایل مقداردهی اولیه initrd، پیش از فعال‌سازی ایمیج‌های افزونه سیستم برای initrd. این به عنوان مانعی بین زمانی که هسته مقداردهی اولیه می‌شود و زمانی که initrd شروع به کار کرده و ایمیج‌های افزونه سیستم (یعنی کدهای ارائه‌شده خارج از UKI) را فعال می‌کند عمل می‌کند. (این گسترش زمانی رخ می‌دهد که سرویس systemd-pcrphase-initrd.service(8) شروع می‌شود.)
2."leave-initrd" — زمانی که initrd در آستانه انتقال به سیستم‌فایل میزبان است. این به عنوان مانعی بین کد initrd و کد سیستم‌عامل میزبان عمل می‌کند. (این گسترش زمانی رخ می‌دهد که سرویس systemd-pcrphase-sysinit.service(8) متوقف می‌شود.)
3."sysinit" — زمانی که مقداردهی اولیه پایه‌ای سیستم کامل شده است (شامل سوار شدن سیستم‌فایل‌های محلی) و سیستم شروع به راه‌اندازی سرویس‌های سیستمی عادی می‌کند. (این گسترش زمانی رخ می‌دهد که سرویس systemd-pcrphase-sysinit.service(8) شروع می‌شود.)
4."ready" — در مراحل بعدی بوت، پس از فعال شدن سیستم‌فایل‌های دوردست (یعنی پس از remote-fs.target)، اما پیش از اینکه به کاربران اجازه ورود داده شود (یعنی پیش از systemd-user-sessions.service). این به عنوان مانعی بین زمانی که کاربران عادی غیرممتاز هنوز مجاز به ورود نیستند و زمانی که اجازه ورود می‌یابند عمل می‌کند. (این گسترش زمانی رخ می‌دهد که سرویس systemd-pcrphase-sysinit.service(8) شروع می‌شود.)
5."shutdown" — زمانی که خاموش شدن سیستم آغاز می‌شود. این به عنوان مانعی بین زمانی که سیستم کاملاً بالا آمده و در حال اجراست و زمانی که در آستانه خاموش شدن قرار دارد عمل می‌کند. (این گسترش زمانی رخ می‌دهد که سرویس systemd-pcrphase.service متوقف می‌شود.)
6."final" — در پایان خاموش شدن سیستم. این به عنوان مانعی بین زمانی که مدیر سرویس‌ها هنوز در حال اجراست و زمانی که به فاز نهایی خاموش شدن (جایی که مدیریت سرویس‌ها دیگر در دسترس نیست) منتقل می‌شود عمل می‌کند. (این گسترش زمانی رخ می‌دهد که سرویس systemd-pcrphase-sysinit.service(8) متوقف می‌شود.)

در طول چرخه حیات عادی سیستم، PCR 11 با رشته‌های "enter-initrd"، "leave-initrd"، "sysinit"، "ready"، "shutdown" و "final" گسترش می‌یابد.

فازهای خاص فرآیند بوت را می‌توان از طریق سری رشته‌های اندازه‌گیری‌شده که با دونقطه از هم جدا شده‌اند (به اصطلاح «مسیر فاز» یا "phase path") مورد ارجاع قرار داد. برای مثال، مسیر فاز برای زمان اجرای عادی سیستم "enter-initrd:leave-initrd:sysinit:ready" است، در حالی که مسیر مربوط به initrd تنها "enter-initrd" است. مسیر فاز برای فاز بوت پیش از initrd یک رشته خالی است؛ از آنجا که انتقال رشته خالی دشوار است، می‌توان به جای آن از یک دونقطه تک (":") استفاده کرد. توجه داشته باشید که شش رشته مذکور تنها رشته‌های پیش‌فرض هستند و سیستم‌های منفرد ممکن است رشته‌های دیگری را در زمان‌های دیگر اندازه‌گیری کنند، و بدین ترتیب فازهای بوت متفاوتی را با جزئیات دقیق‌تر برای پیوند دادن خط‌مشی به آن‌ها پیاده‌سازی نمایند.

با پیوند دادن خط‌مشی اشیاء TPM2 به یک مسیر فاز مشخص، می‌توان دسترسی به آن‌ها را به فازهای خاصی از فرآیند بوت محدود کرد؛ برای مثال، غیرممکن ساختن دسترسی به کلید رمزگذاری سیستم‌فایل ریشه پس از اینکه سیستم از initrd به سیستم‌فایل ریشه میزبان انتقال یافت.

از systemd-measure(1) برای محاسبه پیش‌دستانه مقادیر مورد انتظار PCR 11 برای فازهای خاص بوت (از طریق سوییچ --phase=) استفاده کنید.

systemd-pcrfs-root.service و systemd-pcrfs@.service به‌طور خودکار توسط systemd-gpt-auto-generator(8) برای سیستم‌فایل‌های ریشه و /var/ به درون تراکنش اولیه کشیده می‌شوند. systemd-fstab-generator(8) این کار را برای تمام نقاط اتصالی که دارای گزینه اتصال x-systemd.pcrfs در /etc/fstab هستند انجام خواهد داد.

فایل اجرایی /usr/lib/systemd/systemd-pcrextend را می‌توان از خط فرمان نیز فراخوانی کرد، که در آن انتظار کلمه‌ای برای گسترش در یک PCR یا NvPCR و همچنین سوییچ‌های زیر را دارد:

--bank=

بانک‌های PCR را که کلمه مشخص‌شده باید در آن‌ها گسترش یابد می‌گیرد. اگر مشخص نشود، این ابزار به‌طور خودکار تمام بانک‌های PCR فعال را تعیین کرده و کلمه را در همه آن‌ها اندازه‌گیری می‌کند.

در نسخه ۲۵۲ اضافه شد.

--pcr=

شاخص (index) رجیستر PCR را برای گسترش می‌گیرد. اگر --machine-id یا --file-system= مشخص شده باشند پیش‌فرض 15 است، در غیر این صورت (و مگر اینکه --product-id مشخص شده باشد) پیش‌فرض 11 است. برای اندازه‌گیری هم‌زمان در چندین PCR می‌توان این گزینه را چندین بار مشخص کرد. نمی‌تواند با --nvpcr= ترکیب شود.

در نسخه ۲۵۵ اضافه شد.

--nvpcr=

نام یک NvPCR را برای گسترش می‌گیرد. رجیسترهای NvPCR، رجیسترهای PCR اضافی هستند که از طریق شاخص‌های TPM NV پیاده‌سازی شده‌اند. نام باید یک رشته کوتاه مانند "hardware" یا "disk-encryption" باشد. اگر --product-id مشخص شده باشد پیش‌فرض "hardware" است. نمی‌تواند با --pcr= ترکیب شود.

در نسخه ۲۵۹ اضافه شد.

--tpm2-device=PATH

کنترل می‌کند که از کدام دستگاه TPM2 استفاده شود. انتظار یک مسیر گره دستگاه که به تراشه TPM2 ارجاع دارد (مانند /dev/tpmrm0). به‌عنوان جایگزین، مقدار ویژه "auto" می‌تواند مشخص شود تا گره دستگاهِ یک دستگاه TPM2 مناسب (که دقیقاً باید یکی از آن وجود داشته باشد) به‌طور خودکار تعیین شود. از مقدار ویژه "list" می‌توان برای برشمردن تمام دستگاه‌های TPM2 مناسب که در حال حاضر شناسایی شده‌اند استفاده کرد.

در نسخه ۲۵۲ اضافه شد.

--graceful

اگر هیچ سفت‌افزار TPM2، زیرسیستم هسته، درایور هسته یا پشتیبانی دستگاهی یافت نشود، با وضعیت خروج 0 خارج شو (یعنی موفقیت را نشان بده). اگر این گزینه مشخص نشود، هرگونه تلاش برای اندازه‌گیری بدون دستگاه TPM2 باعث شکست فراخوانی خواهد شد.

در نسخه ۲۵۳ اضافه شد.

--early

حالت بوت اولیه (early-boot) را انتخاب می‌کند. به‌طور مشخص این بدان معناست که تلاشی برای نوشتن راز لنگر (anchor secret) مربوط به NvPCR در /var/lib/ و پارتیشن بارگذار بوت علاوه بر /run/ صورت نمی‌گیرد. (برخلاف مورد اخیر، موارد قبلی عموماً در طول بوت اولیه یا در initrd سوار نشده و قابل نوشتن نیستند.)

در نسخه ۲۵۹ اضافه شد.

--machine-id

به جای اندازه‌گیری کلمه مشخص‌شده در خط فرمان در PCR 11، شناسه ماشین میزبان را در PCR 15 اندازه‌گیری کن.

در نسخه ۲۵۳ اضافه شد.

--product-id

به جای اندازه‌گیری کلمه مشخص‌شده در خط فرمان در PCR 11، UUID محصول سفت‌افزار را در یک NvPCR با نام "hardware" اندازه‌گیری کن.

در نسخه ۲۵۹ اضافه شد.

--login=

به جای اندازه‌گیری کلمه مشخص‌شده در خط فرمان در PCR 11، رکورد کاربری کاربر مشخص‌شده را در یک NvPCR با نام "login" اندازه‌گیری کن. پارامتر باید یک نام کاربری یا UID عددی باشد. رکورد به بخش‌های "regular"، "perMachine" و "binding" خود تقلیل می‌یابد (یعنی بخش‌های دارای امتیاز، محرمانه، وضعیت و امضا حذف می‌شوند تا برای مثال تغییرات هش رمز عبور باعث برهم خوردن NvPCR نشود)، نرمال‌سازی شده و پیش از اندازه‌گیری به صورت JSON متعارف سریالی می‌شود. این گزینه عمدتاً توسط systemd-pcrlogin@.service استفاده می‌شود.

در نسخه ۲۶۱ اضافه شد.

--file-system=

به جای اندازه‌گیری کلمه مشخص‌شده در خط فرمان در PCR 11، اطلاعات هویتی سیستم‌فایل مشخص‌شده را در PCR 15 اندازه‌گیری کن. پارامتر باید مسیر نقطه اتصال برقرارشده سیستم‌فایل مورد نظر برای اندازه‌گیری باشد.

در نسخه ۲۵۳ اضافه شد.

--event-type=

نوع رویداد گزارش رویداد (event log) را برای این اندازه‌گیری تعیین می‌کند. برای دریافت فهرستی از شناسه‌های تعریف‌شده فعلی، مقدار "help" را ارسال کنید. مقدار پیش‌فرض برای --machine-id، --product-id، --file-system= و --login= مقداری مناسب است و در غیر این صورت روی "phase" قرار دارد.

در نسخه ۲۵۹ اضافه شد.

-h, --help

یک متن راهنمای کوتاه را چاپ کرده و خارج شو.

--version

یک رشته نسخه کوتاه را چاپ کرده و خارج شو.

/run/log/systemd/tpm2-measure.log

اندازه‌گیری‌ها در یک فایل گزارش رویداد که در /run/log/systemd/tpm2-measure.log نگهداری می‌شود ثبت می‌شوند؛ این فایل حاوی دنباله‌ای از اشیاء JSON-SEQ[1] است که از ساختار کلی اشیاء رویداد قالب گزارش رویداد متعارف TCG (CEL-JSON)[2] پیروی می‌کنند (اما فاقد فیلد "recnum" هستند).

هنگام انجام اندازه‌گیری و به‌روزرسانی فایل، یک قفل فایل BSD از نوع LOCK_EX (flock(2)) روی فایل گزارش اعمال می‌شود. بنابراین، برنامه‌هایی که قصد دارند یک نقل‌قول (quote) منسجم از TPM همراه با تصویر لحظه‌ای (snapshot) مرتبط از گزارش رویداد به دست آورند، باید در هنگام انجام این کار یک قفل LOCK_SH به دست آورند.

در نسخه ۲۵۲ اضافه شد.

/usr/lib/nvpcr/*.nvpcr

فایل‌های تعریف NvPCRها.

در نسخه ۲۵۹ اضافه شد.

systemd(1), systemd-stub(7), systemd-measure(1), systemd-gpt-auto-generator(8), systemd-fstab-generator(8), اندازه‌گیری‌های TPM2 PCR انجام‌شده توسط systemd[3]

1.
JSON-SEQ
2.
قالب گزارش رویداد متعارف TCG (CEL-JSON)
3.
اندازه‌گیری‌های TPM2 PCR انجام‌شده توسط systemd
systemd 261.2