Repository navigation
feat(ipe): add signed policy loading and Azure mode selection - #52
Conversation
fe37a53 to
a449cd2
Compare
6cbfb5e to
0db5ca5
Compare
There was a problem hiding this comment.
Pull request overview
Adds opt-in IPE support to Azure Secure Boot UKI images, including signed policies, dm-verity signatures, and IMDS-based permissive mode.
Changes:
- Builds and loads signed IPE policies with signed
/usrroot hashes. - Adds Azure Trusted Launch certificate forwarding and runtime validation.
- Adds supporting tests, CI parameters, documentation, and package fixes.
Reviewed changes
Copilot reviewed 35 out of 35 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
sdk_lib/sdk_entry.sh |
Forwards validated IPE settings. |
sdk_lib/sdk_container_common.sh |
Adds version-file fallback. |
run_sdk_container |
Streams external policies into containers. |
run_azure_tests.sh |
Forwards Trusted Launch settings. |
image_to_vm.sh |
Reuses IPE signing certificates. |
ci-automation/vendor-testing/azure.sh |
Configures Trusted Launch and certificates. |
build_library/rpm/uki_install.sh |
Signs and installs verity companions. |
build_library/rpm/sign_uki_ephemeral.sh |
Supports shared signing certificates. |
build_library/rpm/rpm_install.sh |
Installs signed policies and multi-RPM mappings. |
build_library/rpm/package_catalog.yaml |
Adds explicit libgomp dependencies. |
build_library/rpm/ipe_verity.sh |
Serializes validated root hashes. |
build_library/rpm/ensure_ephemeral_cert.sh |
Generates shared ephemeral certificates. |
build_library/rpm/dracut_install.sh |
Installs the IPE loader module. |
build_library/rpm/additional_files/ipe/acl-ipe-boot-policy.pol |
Defines the IPE execution policy. |
build_library/rpm/additional_files/dracut-acl-selinux-toggle/module-setup.sh |
Installs the shared profile helper. |
build_library/rpm/additional_files/dracut-acl-selinux-toggle/acl-selinux-toggle.sh |
Uses shared IMDS parsing. |
build_library/rpm/additional_files/dracut-acl-ipe-load/module-setup.sh |
Defines the IPE dracut module. |
build_library/rpm/additional_files/dracut-acl-ipe-load/acl-ipe-load.sh |
Selects and activates IPE mode. |
build_library/rpm/additional_files/dracut-acl-ipe-load/acl-ipe-load.service |
Orders early policy loading. |
build_library/rpm/additional_files/acl-node-security-profile.sh |
Fetches and caches IMDS profiles. |
build_library/build_image_util.sh |
Integrates policy installation. |
acl/validate/validate_common.sh |
Forwards host-test timeouts. |
acl/tests/test-run-sdk-container-ipe-policy.sh |
Tests policy streaming and reuse. |
acl/tests/test-rpm-provider-selection.sh |
Tests multi-package mappings. |
acl/tests/test-ipe-policy-input.sh |
Tests policy preparation and validation. |
acl/tests/test-ipe-loader-runtime.sh |
Tests runtime mode selection. |
acl/tests/test-azure-security-profile-test-common.sh |
Tests timeout contracts. |
acl/tests/run-selinux-toggle-test.sh |
Reuses shared Azure helpers. |
acl/tests/run-ipe-permissive-test.sh |
Validates permissive IPE behavior. |
acl/tests/run-ipe-mode-toggle-test.sh |
Tests reboot-based IPE selection. |
acl/tests/azure-security-profile-test-common.sh |
Shares Azure tag/reboot logic. |
acl/docs/BUILD_RPM_IMAGE_README.md |
Documents policy build inputs. |
acl/docs/architecture.md |
Documents IPE and verity architecture. |
acl/build_rpm_image.sh |
Adds IPE configuration and validation. |
.pipelines/github-pr-validation.yml |
Adds validation parameters. |
Suppressed comments (1)
acl/docs/BUILD_RPM_IMAGE_README.md:173
- The external-policy example also omits
ACL_IPE_CAPABLE=true, so the supplied artifact is validated but never installed becauserpm_install_ipe_policyreturns immediately for the default disabled capability. Update this command to opt into IPE explicitly.
./acl/build_rpm_image.sh --rebuild \
--ipe-policy-mode=external \
--ipe-policy-path=/secure/input/acl.pol.p7b
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
4758407 to
9b504fd
Compare
ba4f50f to
5dd78a4
Compare
SeanDougherty
left a comment
There was a problem hiding this comment.
Four inline findings, each reproduced locally against this head.
3e118f0 to
31fcdd1
Compare
SeanDougherty
left a comment
There was a problem hiding this comment.
Two Azure launch-contract blockers, both reproduced locally against this head.
|
two agent reviews revealed no issues. a run asking about refactor or shareable code had this: |
31fcdd1 to
9020224
Compare
3725d0e to
e7aff50
Compare
SeanDougherty
left a comment
There was a problem hiding this comment.
Three current-head findings, each reproduced locally against the shipping functions.
There was a problem hiding this comment.
🔵 Needs a closer look
Security-sensitive boot-chain, signing, initramfs, and Azure orchestration changes require final human validation.
0 open findings
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
7c0e8d2 to
4736a51
Compare
There was a problem hiding this comment.
🔵 Needs a closer look
The security-critical boot, signing, initramfs, and Azure publication changes require final human review and live end-to-end validation.
0 open findings
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
4736a51 to
8ed94b2
Compare
There was a problem hiding this comment.
🔵 Needs a closer look
It changes boot-time trust, policy signing, UKI conversion, and Azure publication across a broad security-sensitive surface.
0 open findings
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
SeanDougherty
left a comment
There was a problem hiding this comment.
Two design-contract questions from the current-head rereview.
Dallas Delaney (dallasd1)
left a comment
There was a problem hiding this comment.
No blocking comments found but I'd like to know if one of the PRs lights up ESRP signing for the policy
8ed94b2 to
48aec3d
Compare
There was a problem hiding this comment.
🟡 Changes recommended
The Azure image-provenance guard can be bypassed using the supported -i image alias.
1 open finding
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
There was a problem hiding this comment.
🟡 Changes recommended
Azure CLI option abbreviations can bypass the ARM size and Trusted Launch override guard.
1 open finding
1 resolved since last review
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
There was a problem hiding this comment.
🔵 Needs a closer look
It changes the security-sensitive boot and signing chain across 39 files, and required CI validation is still in progress.
0 open findings
1 resolved since last review
🧠 Review effort: Balanced
Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.
Bind the IPE policy to the boot signing identity and validate Azure image selection. Reject deterministic gallery collisions before VM cleanup, disallow policy-hash overrides in active UKI addons, reject short image arguments for IPE launches, and upload the exact preflighted VHD across latest symlink changes. Signed-off-by: Aadhar Agarwal <aadagarwal@microsoft.com>
Lanze Liu (liulanze)
left a comment
There was a problem hiding this comment.
Ack. From the ACL-T side, here is how I read the contract this PR sets for an image whose UKI is rebuilt by Image Customizer. Please correct anything that is off.
- The rebuilt UKI keeps
EFI/Linux/<uki>.efi.extra.d/acl-ipe-policy.p7b.credand keepsacl.ipe.policy_sha256in the main UKI command line, never in an addon. - The credential and the UKI are signed by the same certificate, and that certificate is the one enrolled in the UEFI db. ACL-T signs its UKI with its own per-build certificate, so it re-signs the credential with that certificate and rewrites the token to the new digest before the UKI signature, using the shared-certificate form of
sign_uki_ephemeral.sh. - For the production path, the ACL-T artifact carries the
ipe-signing-modemarker and the raw policy from the stock drop, and the publish pipeline runs the same ESRP finalize on it as on stock ACL: new CMS, fixed-width token rewrite in the main UKI, UKI re-sign. - The runtime side needs nothing ACL-T specific: the loader keys off
flatcar.oem.id=azureand the IMDS tag, and fails open.
Yup that matches the intended contract. ACL-T currently signs the rebuilt UKI with a new cert but does not re-sign the IPE credential. It needs to sign both with the same key and update the policy hash in the UKI before signing the UKI. |
|
In the standalone path where no shared certificate directory is supplied, |

Summary
Adds opt-in, policy-only IPE audit for Azure UKI images, with signed policies bound to the UKI and signer-continuity checks during conversion. Azure IMDS activates only
ipe=audit(enforce=0); loading failures are logged and leave IPE inactive without blocking boot./usrretains dm-verity without detached root-hash signatures. Kernel-trusted policies do not require Trusted Launch; test-signed candidates still need test trust. Enforcement is unsupported and production defaults remain disabled.Shared landing timeline
The core implementation in PR 28754 lands as five reviewable PRs. Policy-only audit preparation and production activation follow as separate PRs.
/usrroot-hash signing for policy-only audit - PR 29478.release/3.0