SYSTEMD-MEASURE(1)

الاسم
systemd-measure - احسب مسبقًا ووقع قيم TPM2 PCR 11 المتوقعة لصور النواة الموحدة المُقلعة

موجز

/usr/lib/systemd/systemd-measure [خيارات...]

الوصف

ملاحظة: هذا الأمر تجريبي في الوقت الحالي. ورغم أنه من المرجح أن يصبح مكونًا نظاميًا في systemd، إلا أنه قد يطرأ عليه تغيير في السلوك والواجهة.

systemd-measure هي أداة يمكن استخدامها لحساب مسبق وتوقيع قيم TPM2 PCR 11 المتوقعة التي ينبغي رؤيتها عند إقلاع صورة نواة موحدة (UKI)[1] استنادًا إلى systemd-stub(7). تقبل مسارات لملف صورة نواة ELF، ملف صورة initrd، ملف شجرة الأجهزة، ملف سطر أوامر النواة، ملف os-release(5)، ملف شاشة الإقلاع، وملف مفتاح عام PEM لـ TPM2 PCR الذي يشكل صورة النواة الموحدة، وتحدد قيم PCR المتوقع وجودها بعد إقلاع الصورة. يبدأ الحساب بـ PCR 11 مهيأ بالصفر، ويُنفذ بطريقة متوافقة مع ما يفعله systemd-stub عند الإقلاع. يمكن توقيع النتيجة اختياريًا تشفيريًا، للسماح بسياسات TPM2 التي لا يمكن فتحها إلا إذا أُقلعت مجموعة معينة من النوى، والتي يمكن تقديم توقيع PCR لها.

عادة لا يكون من المنطقي استدعاء هذه الأداة مباشرة عند بناء UKI. بدلاً من ذلك، ينبغي استخدام ukify(1)؛ ستستدعي systemd-measure وتتولى تضمين القياسات الناتجة في UKI.

الأوامر

الأوامر التالية مفهومة:

status
    هذا هو الأمر المبدئي إذا لم يُحدد أي أمر. يستعلم عن قيم TPM2 PCR 11 للنظام المحلي ويعرضها. تُكتب البيانات بتنسيق مشابه لأمر calculate أدناه، ويمكن استخدامها لمقارنة التوقعات بالواقع بسرعة.

    أُضيف في الإصدار 252.

calculate
    احسب مسبقًا القيم المتوقعة في سجل PCR 11 بعد إقلاع صورة نواة موحدة تتكون من المكونات المحددة بـ --linux=، --osrel=، --cmdline=، --initrd=، --ucode=، --splash=، --dtb=، --uname=، --sbat=، --pcrpkey=، --profile=، --dtbauto=، --hwids=، انظر أدناه. فقط --linux= إلزامي. (بدلاً من ذلك، حدد --current لاستخدام القيم الحالية لسجل PCR 11 بدلاً من ذلك.)

    أُضيف في الإصدار 252.

sign
    كما هو الحال مع أمر calculate، احسب مسبقًا القيمة المتوقعة في سجل TPM2 PCR 11 بعد إقلاع صورة نواة موحدة. ثم، وقع تشفيريًا القيم الناتجة باستخدام زوج المفاتيح الخاص/العام (RSA) المُهيأ عبر --private-key= و --public-key=. سيكتب هذا كائن JSON إلى المخرجات القياسية يحتوي على توقيعات لجميع بنوك PCR المحددة (انظر خيار --bank= أدناه)، والتي يمكن استخدامها لفتح بيانات اعتماد مشفرة (انظر systemd-creds(1)) أو وحدات تخزين LUKS (انظر systemd-cryptsetup@.service(8)). يسمح هذا بربط الأسرار بمجموعة من النوى التي يمكن تقديم توقيعات PCR 11 لها.

    لاحظ أن جهاز TPM2 يجب أن يكون متاحًا لحدوث هذا التوقيع، على الرغم من أن النتيجة غير مرتبطة بأي جهاز TPM2 أو حالته.

    أُضيف في الإصدار 252.

policy-digest
    كما هو الحال مع أمر sign، احسب مسبقًا القيمة المتوقعة في سجل TPM2 PCR 11 بعد إقلاع صورة نواة موحدة. ثم، احسب سياسة TPM2 الناتجة واطبع ملخصها. سيكتب هذا كائن JSON إلى المخرجات القياسية يحتوي على ملخصات السياسة لجميع بنوك PCR المحددة (انظر خيار --bank= أدناه)، بحيث يمكن توقيعه دون اتصال، للحالات التي لا يكون فيها المفتاح الخاص متاحًا مباشرة. إذا حُدد --public-key= أو --certificate=، سيحتوي كائن JSON أيضًا على بصمة المفتاح.

    أُضيف في الإصدار 258.

الخيارات

الخيارات التالية مفهومة:

--linux=المسار, --osrel=المسار, --cmdline=المسار, --initrd=المسار, --ucode=المسار, --splash=المسار, --dtb=المسار, --uname=المسار, --sbat=المسار, --pcrpkey=المسار, --profile=المسار, --dtbauto=المسار, --hwids=المسار
    عند استخدامها مع الفعل calculate أو sign، تهيئ الملفات لقراءة مكونات صورة النواة الموحدة منها. يتوافق كل خيار مع القسم المسمى بالمثل في ملف PE للنواة الموحدة. يتوقع المفتاح --linux= المسار إلى ملف نواة ELF الذي ستغلّفه النواة PE الموحدة. جميع المفاتيح باستثناء --linux= اختيارية. يمكن استخدام كل خيار مرة واحدة على الأكثر.

    أُضيف في الإصدار 252.

    باستثناء --profile=، --dtbauto= و --hwids=، التي أُضيفت في الإصدار 257.

--current
    عند استخدامها مع الفعل calculate أو sign، تأخذ قيم PCR 11 السارية حاليًا للنظام (والتي ينبغي أن تعكس عادة تجزئات النواة المُقلعة حاليًا). يمكن استخدام هذا بدلاً من --linux= والمفاتيح الأخرى المذكورة أعلاه.

    أُضيف في الإصدار 252.

--bank=الملخص
    يتحكم في بنوك PCR لحساب قيم PCR مسبقًا – في حالة استدعاء calculate أو sign –، أو البنوك لعرضها في مخرجات status. يمكن استخدامه أكثر من مرة لتحديد بنوك متعددة. إذا لم يُحدد، فالمبدئي هو البنوك الأربعة "sha1"، "sha256"، "sha384"، "sha512".

    لاحظ أن بعض أنظمة التشغيل تعطل دعم التوقيعات المستندة إلى SHA1، وفي هذه الحالة ستفشل هذه العملية. يُرجى الرجوع إلى وثائق نظام التشغيل الخاص بك للحصول على تفاصيل حول كيفية تجاوز سياسة الأمان لنظام التشغيل حول هذا.

    أُضيف في الإصدار 252.

--private-key=المسار, --public-key=المسار, --certificate=المسار
    تأخذ هذه المفاتيح مسارات لزوج من ملفات مفاتيح RSA المرمزة بـ PEM، لاستخدامها مع أمر sign.

    لاحظ الفرق بين المفتاحين --pcrpkey= و --public-key=. الأول يختار البيانات لتضمينها في قسم PE ".pcrpkey" لصورة النواة الموحدة، والثاني يختار المفتاح العام لزوج المفاتيح المستخدم لتوقيع قيم PCR 11 الناتجة. الأول هو المفتاح الذي سيستخدمه النظام المُقلع على الأرجح لقفل تشفير القرص وبيانات الاستيثاق، والثاني هو المفتاح المستخدم لفتح هذه الموارد مرة أخرى. وبالتالي، عادةً ينبغي توفير نفس مفتاح PEM في كلتا الحالتين.

    إذا لم يُحدد --public-key= ولكن حُدد --private-key=، يُشتق المفتاح العام آليًا من المفتاح الخاص.

    يمكن استخدام --certificate= لتحديد شهادة X.509 كبديل لـ --public-key= منذ الإصدار v256.

    أُضيف في الإصدار 252.

--private-key=المسار/URI, --private-key-source=النوع[:الاسم], --certificate=المسار/URI, --certificate-source=النوع[:الاسم]
    كبديل لـ --public-key= لأمر sign، يمكن استخدام هذه المفاتيح للتوقيع باستخدام رمز عتادي. يمكن لخيار المفتاح الخاص أن يأخذ مساراً أو URI سيُمرر إلى محرك أو مزود OpenSSL، كما هو محدد بواسطة --private-key-source= كتشكيلة type:name، مثل engine:pkcs11. سيُستخدم محرك أو مزود توقيع OpenSSL المحدد للتوقيع.

    يأخذ خيار --certificate= أيضًا مساراً أو URI سيُمرر إلى مزود OpenSSL، كما هو محدد بواسطة --certificate-source= كتشكيلة "type:name"، مثل "provider:pkcs11". لاحظ أنه على عكس --private-key-source=، يدعم هذا الخيار المزودين فقط وليس المحركات.

    أُضيف في الإصدار 256.

--tpm2-device=مسار
    يتحكم في أي جهاز TPM2 سيُستخدم. يتوقع مسار عقدة جهاز يشير إلى شريحة TPM2 (مثلاً /dev/tpmrm0). بدلاً من ذلك، يمكن تحديد القيمة الخاصة "auto" لتحديد عقدة جهاز TPM2 مناسب آليًا (حيث يجب أن يوجد واحد فقط). يمكن استخدام القيمة الخاصة "list" لسرد جميع أجهزة TPM2 المناسبة المكتشفة حاليًا.

    أُضيف في الإصدار 252.

--phase=المرحلة
    تتحكم في مراحل الإقلاع التي سيُحسب لها قيم PCR 11 المتوقعة. تأخذ سلسلة من النصوص المفصولة بنقطتين تشفر "مسارات" الإقلاع للدخول في مرحلة محددة من عملية الإقلاع. تُقاس كل سلسلة من السلاسل المحددة بواسطة systemd-pcrphase-initrd.service و systemd-pcrphase-sysinit.service و systemd-pcrphase.service(8) داخل PCR 11 خلال معالم مختلفة من عملية الإقلاع. يمكن تحديد هذا المفتاح مرات متعددة لحساب قيم PCR لمراحل إقلاع متعددة في وقت واحد. إذا لم يُستخدم، فالمبدئي هو "enter-initrd" و "enter-initrd:leave-initrd" و "enter-initrd:leave-initrd:sysinit" و "enter-initrd:leave-initrd:sysinit:ready"، أي أنه يحسب قيم PCR المتوقعة لمرحلة الإقلاع في initrd، وخلال الإقلاع المبكر، وخلال الإقلاع اللاحق، وخلال وقت تشغيل النظام، مع استثناء المراحل التي تسبق initrd أو عند إيقاف التشغيل. يُحترم هذا الضبط في كل من calculate و sign. وعند استخدامه مع الأخير يكون مفيداً بشكل خاص لإنشاء توقيعات PCR التي لا يمكن استخدامها إلا لفتح الموارد خلال أجزاء محددة من عملية الإقلاع.

    لمزيد من التفاصيل حول مراحل إقلاع PCR، انظر systemd-pcrphase.service(8).

    أُضيف في الإصدار 252.

--append=المسار
    عند إنشاء توقيع PCR بصيغة JSON (عبر الأمر sign)، اجمعه مع توقيع PCR بصيغة JSON مولّد سابقًا، وأخرجه ككيان واحد. يجب أن يشير المسار المحدد إلى ملف عادي يحتوي على كائن توقيع PCR بصيغة JSON صالح. لا يُعدّل الملف المحدد. سيُقرأ أولاً، ثم يُلحق به التوقيع المُنشأ حديثًا، ويُكتب الكائن الناتج إلى المخرج القياسي. استخدم هذا لإنشاء كائن JSON واحد يتكون من توقيعات مصنوعة بعدد من مفاتيح التوقيع (على سبيل المثال، ليكون مفتاح واحد لكل مرحلة إقلاع). سيقوم الأمر بقمع التكرارات: إذا كان توقيع معين مضمنًا بالفعل في كائن توقيع JSON، فلن يُضاف مرة ثانية.

    أُضيف في الإصدار 253.

--json=وضع
    يظهر المخرجات منسقة بصيغة JSON. يتوقع أحد الخيارات: "short" (لأقصر مخرج ممكن دون أي مسافات زائدة أو فواصل أسطر)، أو "pretty" (لنسخة جميلة من المخرج نفسه، مع إزاحة وفواصل أسطر) أو "off" (لإيقاف مخرجات JSON، وهو الخيار المبدئي).

--no-pager
    لا تمرر المخرجات إلى برنامج عرض (pager).

-h، --help
    اطبع نص مساعدة قصير واخرج.

--version
    اطبع سلسلة إصدار قصيرة واخرج.

أمثلة

مثال 1. إنشاء صورة نواة موحدة، وحساب قيمة 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.

مثال 2. إنشاء زوج مفاتيح خاص/عام، وصورة نواة موحدة، وتوقيع 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:

    # 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 على أي حال، وبالتالي لا تحتاج هذه المسارات إلى التحديد فعليًا.

مثال 3. إدخال مفتاح عام ثانٍ، يوقع نفس قياسات 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= في سطر الأوامر لتلك الأدوات.

حالة الخروج

عند النجاح، يُعاد الرقم 0، وإلا فيُعاد رمز فشل غير صفري.

انظر أيضًا

systemd(1), systemd-stub(7), ukify(1), systemd-creds(1), systemd-cryptsetup@.service(8), systemd-pcrphase.service(8)

ملاحظات

1.  صورة نواة موحدة (UKI) من النوع UAPI.5
    https://uapi-group.org/specifications/specs/unified_kernel_image/

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.