Note: An English version of this document is provided in the first half of this file. A Japanese version follows after the separator below. æ¥æ¬èªçã¯æ¬ããã¥ã¡ã³ãã®åŸåã«æ²èŒããŠããŸãã
This repository provides a Remote Attestation (RA) chain framework that performs RA against both NVIDIA Confidential Computing (a GPU TEE supported from the NVIDIA Hopper architecture onward; hereafter "NCC") and AMD SEV-SNP, primarily intended for execution on Azure's Standard_NCC40ads_H100_v5.
NCC requires that attestation be performed from a Confidential VM (CVM) such as an SEV-SNP CVM; a remote user (Relying Party) of the CVM cannot perform RA directly against NCC without going through the CVM. SEV-SNP itself also has a large Trusted Computing Base (TCB) and a multi-stage boot sequence, which makes performing security best-practice RA â while accounting for the environment â extremely difficult, and there are few existing frameworks for it.
To address this, Humane-RAChain-NS first performs attestation against NCC, then binds the resulting evidence and verification result to a trust chain anchored at SEV-SNP (specifically, the AMD Root Key) â namely, a vTPM Quote whose Attestation Key is bound to the SEV-SNP Attestation Report. By then verifying the SEV-SNP Attestation Report and the vTPM Quote as appropriately as possible, trust can be established in a chained manner â from NCC, through SEV-SNP, through the VM's lower-layer components (vTPM, OVMF, etc.), the kernel, and finally the workload of interest â thereby establishing an RA chain.
At this time, operation on platforms other than Azure is not supported.
Specifically, Humane-RAChain-NS performs processing that satisfies the following assumptions and goals. In principle, all of the processing below is executed automatically by Humane-RAChain-NS; developers and users who simply use this library do not need to be aware of (or implement) these steps.
-
The flow is: first the SEV-SNP CVM performs attestation of the NCC, and then the CVM itself (SEV-SNP) is attested, thereby establishing an RA chain from the NCC up to the Relying Party. Therefore, NCC attestation is performed first.
-
Using NVIDIA's Attestation SDK, the CVM obtains the NCC Evidence (equivalent to a Quote in SGX). Humane-RAChain-NS then requests NRAS (NVIDIA Remote Attestation Service) to verify this Evidence (Remote GPU Attestation). This realizes CVMâNCC attestation. The client (Relying Party) sends a nonce, which the CVM uses, as countermeasure against replay attacks on the Evidence.
-
The hash of this Evidence and verification result (Attestation Report) is stored in the PCR (Platform Configuration Register) of a vTPM whose trust is anchored at AMD (hereafter simply "vTPM"). By using this data along with the TPM Quote, its integrity is guaranteed.
-
Regarding PCR banks: each hash algorithm (sha1, sha256, sha384) has its own dedicated bank, but Humane-RAChain-NS uses the sha256 bank uniformly.
-
-
For TLS communication between the CVM and the Relying Party, a self-signed certificate dynamically generated per session by the CVM and a TLS session (including the TLS channel key) are used. Since the self-signed certificate is hash-measured by the vTPM's PCR, the Relying Party can be confident â as long as it has accepted RA and continues TLS communication tied to this self-signed certificate â that the communication peer is the expected CVM.
- The binding between the self-signed certificate and the TLS encryption key is automatically guaranteed by verifying â via RA â that Humane-RAChain-NS is operating correctly.
-
After NCC attestation, the CVM next generates the SEV-SNP Attestation Report (a structure that resembles a combined Quote and Attestation Report in SGX). On Azure CVMs, it is generated wrapped inside an HCL Report (a structure consisting of the SEV-SNP Report, a JSON bound into REPORT_DATA, hash-algorithm and TEE-type metadata, etc.). At the same time, the CVM also obtains the certificate for the VCEK used to sign the Attestation Report (VCEK Cert) and the TPM AK (Attestation Key) public key, which is also embedded in (i.e. bound to AMD's trust chain through) the SEV-SNP Attestation Report.
- These are delivered to the Relying Party. The implementation has the Relying Party verify the authenticity of the SEV-SNP Attestation Report and the TPM AK on the Relying Party side (the Relying Party performs verification of attestation).
-
Once the SEV-SNP-related attestation data has been acquired, the runtime workload â including Humane-RAChain-NS itself â is then measured into vTPM PCR bank 23. Specifically, the following data and files are sequentially Extend-ed into PCR23, so that PCR23 can track the integrity of the required components:
- The TLS self-signed certificate dynamically generated inside the CVM. As noted above, this is data that can be referenced to uniquely identify the session with the CVM.
- The VCEK Cert corresponding to the VCEK used to sign the SEV-SNP Attestation Report.
- The TPM AK public key.
- The Evidence from NCC Attestation.
- The NCC Attestation Report.
- The Humane-RAChain-NS server-side scripts and the NCC Attestation policy.
- The workload script to run after RA.
This allows the Relying Party to be confident that the above data definitely originates from the CVM it is communicating with.
-
At this point the SEV-SNP Attestation Report has been generated, the necessary measurements have been registered in the PCRs, and the AK public key â used to sign the TPM Quote based on those PCRs â is bound into the SEV-SNP Attestation Report. So the next step is to actually generate the TPM Quote. When generating the Quote, as with NCC attestation, the nonce sent by the Relying Party is included to prevent replay attacks.
-
By default, the PCR banks included in the TPM Quote are 0â10, 12, 14, and 23. PCR0â7 cover the firmware layer up to just before the guest OS (VMPL0â2). PCR10 holds the IMA (Integrity Measurements Architecture) policy (the OS kernel layer and some runtime workloads). PCR23 stores the hash values of the various data registered above. Banks 9, 10, 12, and 14 are included as a precaution because IMA-related changes may cause them to vary. The boot_aggregate entry in the IMA log is the hash of PCR0â9 concatenated, so PCR8 is also included to allow verification.
-
By loading at boot time an IMA policy that targets Humane-RAChain-NS scripts and the runtime workload, a trust chain analogous to Secure Boot / Measured Boot â SEV-SNP â firmware â OS kernel â Humane-RAChain-NS / workload â can be guaranteed at the SEV-SNP level. However, there is currently no mechanism to bind the IMA policy itself, so the trust chain remains incomplete.
-
The firmware layer corresponding to PCR0â7 (which includes OVMF, SVSM, the vTPM implementation itself, etc.) has its source code unpublished by Azure, so on Azure these become so-called self-asserted measurements. However, if used on a cloud where the source is published, fully zero-trust verification can be achieved by also verifying measurements against the source.
-
-
At this point all the evidence needed to prove the chain from SEV-SNP through Humane-RAChain-NS and the workload is available, so the CVM transmits the following data to the Relying Party:
- The dynamically generated self-signed TLS certificate.
- The VCEK Cert.
- The HCL Report (including the SEV-SNP Attestation Report).
- The NCC Attestation Evidence and Attestation Report.
- The TPM AK public key.
- The TPM Quote.
- The IMA policy and measurement log.
-
Ultimately, Linux IMA can measure all runtime content from the OS kernel onward, so depending on IMA policy configuration, Extending into PCR23 is semantically redundant. However, IMA logs tend to be extremely long, which makes manual inspection burdensome. From a usability standpoint, we therefore adopt a two-tier configuration: minimal content (as described above) is also Extended into PCR23 for easy inspection, while PCR10 can also be checked if complete and exhaustive verification is desired.
-
After receiving the above data from the CVM, the Relying Party first verifies the VCEK Cert. It is verified using the AMD intermediate CA certificate (ASK) and the AMD root CA certificate (ARK), confirming the authenticity of the VCEK used.
-
Next, using the verified VCEK Cert, the Relying Party verifies the HCL Report.
- The signature of the SEV-SNP Attestation Report is verified with the VCEK Cert, and the report is checked against the expected SEV-SNP measurement and against expected machine-configuration requirements (SMT disabled, TSME enabled status, vulnerability mitigations status, etc.).
- The REPORT_DATA in the SEV-SNP Attestation Report is checked against the hash of the JSON (Runtime Claims) in the HCL Report, and the JSON is checked to confirm that the nonce is included as
user-data.
-
Next, in order to verify the TPM Quote, the Relying Party first verifies the TPM AK used to sign the TPM Quote. By verifying that the TPM AK bound in the JSON within the SEV-SNP Attestation Report matches the AK received from the CVM (obtained directly from vTPM) as part of the response, the integrity of the TPM AK is verified.
-
After TPM AK verification, the TPM Quote received is verified using the AK's signature. The integrity of the received PCR list is also verified at this time.
-
Once TPM Quote verification is complete, the PCR banks are checked to see if they match the expected hashes.
-
For PCR0â7, strict checking of the firmware layer could in principle be done by logging into the CVM beforehand and obtaining the hash values to compare against the PCR values in the attestation result, but this check is not currently implemented.
-
For PCR23, the expected PCR23 value is computed from (copies of) the files that are the measurement targets. Specifically, the hash is Updated on the client side in the same order in which it was PCR-Extended on the CVM side, and the final hash value is then checked to match the value of PCR bank 23.
-
For PCR10, the authenticity of the IMA log is confirmed by verifying that the PCR value reproduced from the IMA log matches the received PCR10. Then, by checking whether each entry in the IMA log records the expected hash value, workload integrity is guaranteed.
-
-
Finally, to address the need for the Relying Party to also be able to perform NCC Attestation as a safeguard (for example, users who suspect that the guest OS might somehow bypass NCC Attestation, even though strict Measured Boot would make this unlikely), the Relying Party can also run NCC Attestation on its own. Similar to the CVM side, it sends the NCC Attestation Evidence to NRAS and obtains verification. Since the Evidence includes a Relying Party-specified nonce, the Relying Party can reliably perform NCC Attestation on its own.
- OS: Ubuntu 22.04.5 LTS
- Azure VM instance: Azure Standard_NCC40ads_H100_v5
- Linux kernel: 6.8.0-1018-azure
- nvattest CLI:
nvattest 1.2.0+1772475102 (Linux/x86_64)(successor of the legacynv-attestation-sdk) - snpguest: version 0.8.2
- Python: 3.10.12
- tpm2_pytss: version 2.3.0
- tpm2-tools: version 5.2-1build1
- OS: Ubuntu 24.04.1 LTS
- Azure VM instance: Azure Standard DC2ads_v6
- Linux kernel: 6.14.0-1017-azure-fde
- snpguest: v0.10.0
- Python: v3.12.3
- tpm2_pytss: Commit c7fd022
- tpm2-tools: Commit d15fc36 (next release v5.8.0)
Operation on the same machine (environment) as the server has been verified.
Remote operation has also been verified in the following environment:
- OS: Ubuntu 22.04.3 LTS
- Azure VM instance: Standard_DC4s_v3
- Linux kernel: 6.8.0-1018-azure
Other libraries that overlap with the server have been confirmed to work using the versions on the server. For client-side remote operation we have used an Intel SGX instance (Standard_DC4s_v3) due to local environment constraints, but neither the client nor the server requires Intel SGX functionality. The client is implemented assuming execution on an instance with no TEE at all (including SGX).
The server and client in this repository manage Python packages collectively via requirements.txt and are designed to run inside a venv. As of Ubuntu 23.04 and later, direct pip install into the system package directory is restricted by default (PEP 668), making venv use essentially mandatory.
The setup instructions that follow assume that a venv is created under Humane-RAChain-NS/server/ for the server and under Humane-RAChain-NS/client/ for the client. The creation, activation, and installation of dependencies into the venv are expected to be performed by the user in advance; scripts like run-server.sh do not activate the venv or run pip install.
If the venv package is not installed, install it with the following command:
sudo apt install -y python3-venvThe description below assumes installation on an Azure NCC instance.
-
Clone the Humane-RAChain-NS repository. The following prerequisite-installation steps assume that the repository has already been cloned.
git clone https://github.com/acompany-develop/Humane-RAChain-NS.git
-
If Python or pip is not installed, install them by following the official procedure. Python 3.10.12 is the verified version.
-
Install the prerequisite packages required for TPM operations from Python via apt:
sudo apt -y install libtss2-dev pkg-config python3-dev
-
Install the following for the TPM operations used when extracting the Measurement (described later):
sudo apt -y install tpm2-tools
-
The required Python packages are listed in
server/requirements.txt(fortpm2-pytss, the latest version is fetched from GitHub to avoid an unfixed bug on PyPI). Create a server venv under the server directory, activate it, and install them collectively:cd Humane-RAChain-NS/server/ python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
All subsequent server-side operations (installation of NCC-related packages described below, execution of
run-server.sh, etc.) must be performed withsource venv/bin/activatealready executed.
-
Log in as the user who will run Humane-RAChain-NS and run the following commands. This grants vTPM access without sudo. After running, reboot to make the group addition take effect.
sudo usermod -aG tss $USER newgrp tss
If NCC Attestation is not being performed, this section can be skipped.
-
For NCC GPU Attestation, the NVIDIA-distributed
nvattestCLI is used (the legacynv-attestation-sdkis deprecated).nvattestonly needs to be placed on PATH as a system binary; it does not need to be installed inside the Python venv. To install, run the following commands as shown on the download page:wget https://developer.download.nvidia.com/compute/nvat/1.2.0/local_installers/nvat-repo-ubuntu2204-1-2-local_1.0-1_amd64.deb sudo dpkg -i nvat-repo-ubuntu2204-1-2-local_1.0-1_amd64.deb sudo cp /var/nvat-local-repo-ubuntu2204-1.2.0/nvat-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install nvattestNote that the above commands are expected to change with version updates, so verifying the actual command at the linked page is recommended. For different OS versions or distributions, make the appropriate selection at the link above and follow the displayed commands.
-
After installation, verify that the binary is visible on PATH with the following command:
nvattest --version
Humane-RAChain-NS calls this
nvattestfrom the server-sideattester.pyviasubprocessand performs attestation in two steps:nvattest collect-evidenceto obtain GPU Evidence (equivalent to a Quote in SGX).nvattest attest --verifier localto verify the authenticity of the Evidence and obtain an Attestation Report.
By default, this nvattest binary is also Extended into PCR23 (described later), so prepare a version (including distribution) identical to that of the client for client-side recomputation. Alternatively, it can be excluded from the PCR23 extension targets, as described later.
-
Since CUDA Toolkit is not installed by Azure's official procedure, install it for GPU programming with workloads running on Humane-RAChain-NS:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt -y install cuda-toolkit-13-1
Running the following will print version info if installation is successful:
export PATH=/usr/local/cuda-13.1/bin:$PATH nvcc --version
To measure content beyond the OS kernel â such as user workloads â Linux's IMA feature must be used. Therefore, IMA-related configuration must also be performed.
-
Log into the TD and create a folder named
imaunder/etc/.sudo mkdir /etc/ima
-
Move into the created folder and create a file named
ima-policy. From here on, since shutting down the TD in an incomplete state can result in unrecoverable damage, do not shut down the TD by any means other than the procedure described below.cd /etc/ima sudo touch ima-policy -
Populate the file with the following contents. The FILE_CHECK line can remain commented out for now. A more detailed configuration that matches actual operation is described later in the "IMA Detailed Configuration" section.
# PROC_SUPER_MAGIC dont_measure fsmagic=0x9fa0 # SYSFS_MAGIC dont_measure fsmagic=0x62656572 # DEBUGFS_MAGIC dont_measure fsmagic=0x64626720 # TMPFS_MAGIC dont_measure fsmagic=0x1021994 # DEVPTS_SUPER_MAGIC dont_measure fsmagic=0x1cd1 # BINFMTFS_MAGIC dont_measure fsmagic=0x42494e4d # SECURITYFS_MAGIC dont_measure fsmagic=0x73636673 # SELINUX_MAGIC dont_measure fsmagic=0xf97cff8c # SMACK_MAGIC dont_measure fsmagic=0x43415d53 # CGROUP_SUPER_MAGIC dont_measure fsmagic=0x27e0eb # CGROUP2_SUPER_MAGIC dont_measure fsmagic=0x63677270 # NSFS_MAGIC dont_measure fsmagic=0x6e736673 # Measurement targets and measurement triggers # Measure files MMAP-ed for program execution measure func=MMAP_CHECK mask=MAY_EXEC # Measure executed binary programs measure func=BPRM_CHECK mask=MAY_EXEC # Measure files opened by root (uid=0) # measure func=FILE_CHECK mask=MAY_READ uid=0 # Measure loaded kernel modules measure func=MODULE_CHECK # Measure firmware loaded into the kernel measure func=FIRMWARE_CHECK -
Reboot the VM instance.
-
Clone the Humane-RAChain-NS repository. The following prerequisite-installation steps assume that the repository has already been cloned.
git clone https://github.com/acompany-develop/Humane-RAChain-NS.git
-
As with the server installation, install Python and pip following the official procedure if they are not already installed. Python 3.10.12 is the verified version.
-
Install the following library required for TPM operations (TPM Quote verification):
sudo apt -y install tpm2-tools
As of February 2026, the latest tpm2-tools version 5.7 contains an unfixed bug that affects parts of this repository. The bug will be fixed in the next release 5.8. For now, build the latest patched version from GitHub yourself with the following:
sudo apt install -y build-essential autoconf autoconf-archive automake libtool pkg-config libssl-dev libtss2-dev libcurl4-openssl-dev git clone https://github.com/tpm2-software/tpm2-tools.git cd tpm2-tools ./bootstrap mkdir -p build cd build ../configure make -j"$(nproc)" cd tools sudo install -m 0755 ./tpm2 /usr/local/bin/tpm2 sudo ln -sf /usr/local/bin/tpm2 /usr/local/bin/tpm2_checkquote
-
Install snpguest â used for SEV-SNP Attestation Report and VCEK Cert verification â and the Rust toolchain required for it:
sudo apt install -y build-essential clang curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" git clone https://github.com/virtee/snpguest.git cd snpguest cargo build -r
-
The required Python packages (
requests,cryptography,pyyaml, and the IMA-log verification tool IMA-PCR-Utils) are listed inclient/requirements.txt. Create a client venv under the client directory, activate it, and install them collectively:cd Humane-RAChain-NS/client/ python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
All subsequent client-side operations (installation of NCC-related packages described below, execution of
client.py, etc.) must be performed withsource venv/bin/activatealready executed.
If NCC Attestation is not being performed, this section can be skipped.
-
If the client also performs a double-check of the NCC Evidence (
verify_ncc_flag: trueinsettings.yaml), the NVIDIA-distributednvattestCLI needs to be on PATH in the client environment as on the server (the legacynv-attestation-sdkis deprecated). It also does not need to be installed inside the Python venv.After installation, verify that the binary is visible on PATH with the following command:
nvattest --version
The Humane-RAChain-NS client writes the Evidence array received from the server to a temporary file and re-verifies it by calling
nvattest attest --verifier local --gpu-evidence-source fileviasubprocess.By default, this nvattest binary is also Extended into PCR23 (described later), so prepare a version (including distribution) identical to that of the server for client-side recomputation. Alternatively, it can be excluded from the PCR23 extension targets, as described later.
If you just want to verify operation, follow this section only to obtain expected_measurement.dat and specify PLATFORM_INFO (setting it to [2, 2, 2, 2, 2, 2] skips all PLATFORM_INFO checks), then proceed to the "Execution" section.
-
The Humane-RAChain-NS scripts, NCC Attestation policy, and runtime workload (the script Humane-RAChain-NS executes after RA acceptance) that are registered into PCR bank 23 are configured in the following portion of
Humane-RAChain-NS/server/attester.py:# Humane-RAChain-NS script filenames targeted for PCR Extend PCR_EXTEND_TARGET_HUMANE_BASE = [ "api.py", "attester.py", "cert_gen.py", ] # Files added when NCC Attestation is enabled PCR_EXTEND_TARGET_HUMANE_GPU = [ "policy/server_gpu_ra_policy.json", "/usr/bin/nvattest", ] # ... # Workload filenames targeted for PCR Extend PCR_EXTEND_TARGET_WORKLOADS = [ "sample.py" ]
If you change the script structure of Humane-RAChain-NS itself or the NCC Attestation policy file structure, be sure to update the upper
PCR_EXTEND_TARGET_HUMANE_*lists. Files not listed here will not have their measurement registered in PCR bank 23 when the TPM Quote is created. Conversely, when changing the runtime workload, add to or modify entries in the lowerPCR_EXTEND_TARGET_WORKLOADSlist. For example, if you want to run a script other than the default sample, you must edit this section. If a folder is specified, its contents are also measured recursively. -
The NRAS URL is specified at the following location inside
attest_ncc()inHumane-RAChain-NS/server/attester.py:NRAS_URL = "https://nras.attestation.nvidia.com/v3/attest/gpu"
If you need to change this endpoint for any reason â e.g. when NRAS API versions are updated â modify this line directly.
-
Which PCR banks are included when generating the TPM Quote is specified at the following location inside
get_tpm_quote()inHumane-RAChain-NS/server/attester.py:# PCR list-file generation # By default, PCR banks 0-10, 12, 14, and 23 are included # Specify sha256:all to include all PCR banks selector_str = "sha256:0,1,2,3,4,5,6,7,8,9,10,12,14,23" pcr_indices = selector_str_to_pcr_indices(selector_str)
-
Currently, the IMA files are simply copied from the CVM's existing policy and log and presented to the client (the application of IMA-related hashes into PCR bank 10 is performed automatically). The locations of these files are specified in
Humane-RAChain-NS/server/run-server.sh:SRC_POLICY="/etc/ima/ima-policy" SRC_MEASUREMENTS="/sys/kernel/security/ima/ascii_runtime_measurements"
If these paths need to be changed for any reason â environment differences, etc. â modify these lines.
-
If you want to change the port on which client requests are received, directly modify the following section (
port=8080) ofHumane-RAChain-NS/server/api.py:config = uvicorn.Config( app=app, host="0.0.0.0", port=8080, ssl_certfile=cert_file_path, ssl_keyfile=key_file_path, ) config.load() config.ssl.options |= ssl.OP_NO_TICKET server = uvicorn.Server(config) server.run()
-
Specify the path to the directory containing the built
snpguestin the following entry ofclient/settings.yaml:# snpguest_path = "$HOME/snpguest/target/release" snpguest_path: "~/snpguest/target/release"
The default is the path where snpguest has been cloned and built directly under the home directory of the logged-in user (e.g. under
/home/username/). Adjust the path if it is cloned elsewhere or if a debug build is used. -
If you are using an SEV-SNP CVM that is not NCC-compatible, or otherwise not performing NCC Attestation, change the following item in
client/settings.yamlfrom true to false:# Flag for whether NCC Attestation is enabled. true means enabled. gpu_enabled: true
-
For SEV-SNP Attestation, the SEV-SNP Measurement (identity measurement) must be obtained in advance. For example, log in to the CVM in a previously-trusted situation (e.g. locally before VM deployment) and run
Humane-RAChain-NS/subtools/measurement_extractor.pyto generateexpected_measurement.dat:cd subtools python3 measurement_extractor.pyThe default is configured for a setup where the server and client run on localhost, so simply running this script will automatically place the above dat file under the
clientfolder. When running remotely, move the generated dat file to theclientfolder of the client environment yourself. -
Depending on the use case, you may not want to expose the Humane-RAChain-NS server-side source or runtime workload implementation, or you may not want to recompute file hashes on the client side. For such cases, an option is provided to use a pre-supplied hash list to reproduce PCR23. Change the following part of
client/settings.yaml:# If you want to simply compare a provided hash list against the PCR23 # value of the TPM Quote â rather than performing client-side hash # recomputation â set this variable to false. # The hash list can be generated with subtools/hashlist_generator.py. # Set to true if you want recomputation. recalculate_pcr23_flag: true
Setting it to false directly Extends using the hash list in
expected_pcr23_hash.datplaced directly under theclientfolder (no file-hash recomputation is performed). This hash-list file can be generated withsubtools/hashlist_generator.py:cd subtools/ python3 hashlist_generator.py
If NCC Attestation is disabled, run with the
--no-gpuflag:python3 hashlist_generator.py --no-gpu
For attestation evidence dynamically delivered per RA session (i.e. non-file evidence), the hash is recomputed from the received data regardless of this option. If you change the files targeted by PCR23, also edit the following part of
hashlist_generator.py:# Humane-RAChain-NS script filenames targeted for PCR Extend (no GPU) PCR_EXTEND_TARGET_HUMANE_BASE = [ "../server/api.py", "../server/attester.py", "../server/cert_gen.py", ] # Files added when GPU is enabled PCR_EXTEND_TARGET_HUMANE_GPU = [ "../server/policy/server_gpu_ra_policy.json", "/usr/bin/nvattest", ] # Workload filenames targeted for PCR Extend PCR_EXTEND_TARGET_WORKLOADS = ["../server/sample.py"]
-
PLATFORM_INFO â a bit string representing SEV-SNP configuration (SMT-enabled status, etc.) â is included in the Attestation Report, and Humane-RAChain-NS verifies it. The client can specify the expected value in the following part of
Humane-RAChain-NS/client/settings.yaml:# List used to check PLATFORM_INFO in the SEV-SNP Report. # Size is 6, ordered from the top: SMT enabled, Transparent SME enabled, # ECC enabled, RAPL disabled, DRAM ciphertext hiding enabled, BadRAM # mitigation enabled. Use 0 or 1 to indicate what is expected. Use 2 for # members that should not be verified. expected_platform_info: [0, 2, 0, 0, 0, 2]
Description of each element's corresponding configuration feature (starting from index 0):
- Whether Simultaneous Multi-Threading (SMT) is enabled. 0 = disabled, 1 = enabled. SMT is often abused in various attacks, especially in TEE contexts, so disabling is preferable.
- Whether Transparent SME is enabled. 0 = disabled, 1 = enabled. This is an AMD SME feature that automatically encrypts all memory regardless of the C-bit.
- Whether ECC is enabled. 0 = disabled, 1 = enabled. ECC provides some resistance to unintended bit flips or deliberate bit-flip attacks (e.g. RowHammer).
- Whether RAPL is disabled. 0 = enabled, 1 = disabled. RAPL is a CPU-level power-monitoring interface; if enabled, it may be abused in certain side-channel attacks (e.g. PLATYPUS in the SGX context).
- Whether SEV-SNP's Ciphertext Hiding is enabled. 0 = disabled, 1 = enabled. When enabled, reads of SEV-SNP-protected memory from outside return a specific fixed value rather than ciphertext. Similar to SGX's Abort Page Semantics.
- Whether mitigation against the BadRAM attack is enabled. 0 = disabled, 1 = enabled. While "enabled" is preferable, as of January 2025 there are still many cases in which this bit is unused.
Given the above, generally specify the expected bit as 0 or 1. For items that may be either, specify 2 to skip verification. With this in mind,
expected_platform_info = [0, 2, 0, 0, 0, 2]means:- Require SMT disabled.
- Do not care about Transparent SME.
- Require ECC disabled.
- Require RAPL enabled.
- Require Ciphertext Hiding disabled.
- Do not care about BadRAM mitigation.
However, this is by no means the optimal setup. From a purely security viewpoint,
[0, 2, 1, 1, 1, 1]would be best, but whether this is satisfiable depends strongly on the cloud's machines. Adjust this flexibly to your needs and environment.To directly check the current value of PLATFORM_INFO on the target CVM, the SEV-SNP Attestation Report can be inspected (run on the CVM):
export PATH=$PATH:$HOME/snpguest/target/release tpm2_nvread -C o 0x01400001 > ./snp_report.bin dd skip=32 bs=1 count=1184 if=./snp_report.bin of=./guest_report.bin snpguest display report guest_report.bin
The output of
snpguest displayincludes PLATFORM_INFO information like the following (theALIAS_CHECK_COMPLETEcorresponding to BadRAM mitigation is not yet supported):Platform Info (0): SMT Enabled: 0 TSME Enabled: 0 ECC Enabled: 0 RAPL Disabled: 0 Ciphertext Hiding Enabled: 0
-
The CVM URL is specified in the following part of
client/configs.yaml, so modify here when running remotely, etc.:# Don't forget the trailing "/". server_url: "https://localhost:8080/"
-
The Humane-RAChain-NS scripts, policies, and runtime workload expected to be measured into PCR bank 23 are listed on the client side in the following part of
Humane-RAChain-NS/client/ra_verifier.py:# Humane-RAChain-NS script filenames targeted for PCR Extend PCR_EXTEND_TARGET_HUMANE_BASE = [ "../server/api.py", "../server/attester.py", "../server/cert_gen.py", ] # Files added for NCC Attestation PCR_EXTEND_TARGET_HUMANE_GPU = ["../server/policy/server_gpu_ra_policy.json"]
As with the server configuration, add to or modify this list as needed. Note that when running the client remotely, the server-side scripts/policies on the client side and the actual ones used on the server (those PCR23-registered on the server side) are assumed to be exactly identical. Therefore, any changes to them must be applied identically to the server-side files on both server and client (otherwise the PCR23 hash check will fail).
-
The NRAS URL is specified at the following location inside
verify_ncc_attestation()inHumane-RAChain-NS/client/ra_verifier.py:NRAS_URL = "https://nras.attestation.nvidia.com/v3/attest/gpu"
If you need to change this endpoint for any reason â e.g. NRAS API version updates â modify this line directly.
-
Currently, the functionality to reproduce hashes of the firmware-layer PCR0â7 by building from firmware source on the client side is unimplemented. If needed, you can implement firmware verification after
check_tpm_quote()completes successfully insideverify_response()ofHumane-RAChain-NS/client/ra_verifier.py, using your prepared reproduced hashes. -
If self-verification of NCC Attestation Evidence is not needed, as described in the usage section, set the corresponding argument in
verify_response()(inHumane-RAChain-NS/client/settings.yaml, this isverify_ncc_flag) toFalse. -
If you want each entry of the IMA log to be verified, specify the path to the verification policy in the following part of
Humane-RAChain-NS/client/settings.yaml:# Path to the IMA appraise policy file (YAML). Specify as a relative # path from client.py or as an absolute path. Can be generated by # subtools/ima_appraise_policy_generator.py. Only referenced when # verify_pcr10_flag is true. ima_appraise_policy_path: "ima_appraise_policy.yaml"
ima_appraise_policy.yamlconsists of measurement-target paths (in fnmatch format) and an allow list (or deny list) of hash values:home_Humane_RAChain_NS_server_sh: path: /home/**/Humane-RAChain-NS/server/*.sh allow: - 28f97e660dd1061224c64ee4ad9d3a63c9b402465323de962f70ee318d8a88e7 home_Humane_RAChain_NS_server_py: path: /home/**/Humane-RAChain-NS/server/*.py allow: - 0dce80960c8b3464639aeb7a49eb8a1f13964617f3c06c095db8795a4069245a - 0e0de7474b3e4b368d518fd657b4fd6701b27c962b258992dd55e418b96262aa - 4ed066d8cc9ea214d78d7de5ad65b76e953c82023efe43f76c1006a3403a5e4b - aebf70b1aa84c4bdccd288462ae4c4cb7228695ae27797b0e5c2325481b95a9b home_Humane_RAChain_NS_server_policy_server_gpu_ra_policy_json: path: /home/**/Humane-RAChain-NS/server/policy/server_gpu_ra_policy.json allow: - 61e6919e3834b4a07a857de19e475695fa7db1d9bd3d247e8ce828ed8fcbf59b usr_bin_python3: path: /usr/bin/python3 allow: - e1efa562c2cc2e35521a5c9c9b9939921001ff8ca9708a13ef15ace68cc2ccd7
For example, by logging into the CVM in a previously-trusted situation and running
Humane-RAChain-NS/subtools/ima_appraise_policy_generator.py, the IMA verification policy can be auto-generated based on the hash values of the target files at that point in time:python3 ima_appraise_policy_generator.py
Measurement targets for IMA verification-policy generation are configured at the following location in
ima_appraise_policy_generator.py:# List of path patterns to be specified as IMA appraise policy. # Each element is a path pattern interpreted as a glob (and at run time as fnmatch). # If you want recursive expansion, include "**"; this script expands with glob.glob(recursive=True). # Note: at runtime, matching is done with fnmatch.fnmatchcase, so write # patterns as strict as possible matching the file_path in the actual IMA log. APPRAISE_TARGETS = [ "/home/**/Humane-RAChain-NS/server/*.sh", "/home/**/Humane-RAChain-NS/server/*.py", "/home/**/Humane-RAChain-NS/server/policy/server_gpu_ra_policy.json", "/usr/bin/python3", ]
This section describes the execution procedure for running Humane-RAChain-NS as-is.
With the server venv activated, run the launcher shell script as follows. Since run-server.sh itself does not activate the venv or install dependencies, the venv must be created in advance per the installation procedure, and source venv/bin/activate must already have been performed:
cd Humane-RAChain-NS/server/
source venv/bin/activate
./run-server.shTo disable NCC Attestation, run with the --no-gpu flag:
source venv/bin/activate
./run-server.sh --no-gpuAn example of execution is shown below (only the tail of the log is shown since stdout is large):
[Fetch TPM Attestation PubKey]
Fetched TPM Attestation PubKey successfully.
[Reset PCR bank 23]
PCR 23 was successfully reset.
[Extend PCR with evidences]
Extended PCR 23 with VCEK Cert/AK Pub successfully.
Extended PCR 23 with NCC evidences successfully.
[Get TPM Quote]
Generated TPM Quote successfully.
Generated PCR values list successfully.
[Get IMA-related files]
Got IMA-related files successfully.
INFO: 127.0.0.1:36756 - "POST /attestation HTTP/1.1" 200 OK
[Execute sample secret addition]
Added secrets successfully.
INFO: 127.0.0.1:36756 - "POST /sample-addition HTTP/1.1" 200 OKWith the client venv activated, run client.py as follows. The venv must be created in advance per the installation procedure, and source venv/bin/activate must already have been performed:
cd Humane-RAChain-NS/client/
source venv/bin/activate
python3 client.pyAn example of execution is shown below (excerpted because stdout is large):
GPU attestation: disabled
[Send attestation challenge]
Generated Nonces:
NCC Nonce: 5aab8cd9863372289fb2ad9fb9a412e9ab09545926537ac5afccdd80e1820f08
TPM Nonce: e3891742fbd624d256fb2acb119f7c699abc24722954f16bec4cafa9a80dd136
SNP Nonce: 75bef4d5574b8a3625c09e3ec796d7f692cf2e0e12f5cc1ec84b0037a3d9bafae16129df2a9cadd103290b1abf51c4d782a1caee0206676a8d8ad4cd069c6343
...
[Verify HCL Report Data binding]
REPORT_DATA expected (sha256, zero-padded) ->
c855dd11a2ba68ab08653b6becb99e91cc22ca9257db5b596ee3605636b8b3710000000000000000000000000000000000000000000000000000000000000000
REPORT_DATA actual ->
c855dd11a2ba68ab08653b6becb99e91cc22ca9257db5b596ee3605636b8b3710000000000000000000000000000000000000000000000000000000000000000
SNP REPORT_DATA matches hash of Runtime Claims.
Runtime Claims user_data matches client-supplied nonce.
[Verify VCEK Cert with ARK Cert]
The AMD ARK was self-signed!
The AMD ASK was signed by the AMD ARK!
The VCEK was signed by the AMD ASK!
SEV-SNP VCEK is valid.
[Verify SEV-SNP Report]
Reported TCB Boot Loader from certificate matches the attestation report.
Reported TCB TEE from certificate matches the attestation report.
Reported TCB SNP from certificate matches the attestation report.
Reported TCB Microcode from certificate matches the attestation report.
VEK signed the Attestation Report!
SEV-SNP's measurement hash->
e14f74982d655d4cbd686b91bcb9431ddb98b6e210e59647089d203035cf99d9a76efbdee19f0958ff3f1aa4518e86e0
Expected measurement ->
e14f74982d655d4cbd686b91bcb9431ddb98b6e210e59647089d203035cf99d9a76efbdee19f0958ff3f1aa4518e86e0
...
[Verify PCR 10]
Received PCR 10 hash (IMA related PCR) ->
f0d6af60d98acded3c1d509922d1d0579e210dc3431fee065631e03f30d36b18
Calculated PCR 10 hash ->
f0d6af60d98acded3c1d509922d1d0579e210dc3431fee065631e03f30d36b18
Received PCR 10 hash matched calculated PCR 10 hash.
[Verify boot_aggregate]
Received boot_aggregate ->
bbdbca85a82cf96aad024bdfedaa4fcc791d857b338b6f7c5a4625bce0118ac4
Calculated boot_aggregate ->
bbdbca85a82cf96aad024bdfedaa4fcc791d857b338b6f7c5a4625bce0118ac4
Received boot_aggregate matched calculated boot_aggregate.
[Appraise IMA log against IMA appraise policy]
IMA appraise policy path -> /home/azureuser/Humane-RAChain-NS/client/ima_appraise_policy.yaml
IMA appraisal passed: 525 entries (1 allow, 524 neutral).
IMA evidences verification passed.
[Skip NVIDIA CC Attestation]
Accepted RA. Proceed to next process.
Pinned session to attested cert (SHA-256 DER): 089413c0c2f90cb264f5356910955aa909322c27371b3512e69a6f1a16945145
[Request sample secret addition]
Sample secret addition result ->
300An example of the Attestation-evidence JSON returned in response to an Attestation request sent to the Humane-RAChain-NS server is shown below (the --no-gpu case). This JSON example is shared by both the English and Japanese versions of this document; the Japanese version references this section.
{
"status": "success",
"message": "Attestation completed",
"ssl_cert": "-----BEGIN CERTIFICATE-----\nMIIBxDCCAWqgAwIBAgIUFGJCY7pAQRM+lmRUW6n1IU+d0E4wCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBUFpY2hpMQ8wDQYDVQQHDAZOYWdveWEx\nGzAZBgNVBAoMEkFjb21wYW55IGNvLiwgTHRkLjEVMBMGA1UEAwwMYXR0ZXN0ZWQt\nY3ZtMB4XDTI2MDUyMDA0MjEzM1oXDTI2MDYxOTA0MjEzM1owYjELMAkGA1UEBhMC\nSlAxDjAMBgNVBAgMBUFpY2hpMQ8wDQYDVQQHDAZOYWdveWExGzAZBgNVBAoMEkFj\nb21wYW55IGNvLiwgTHRkLjEVMBMGA1UEAwwMYXR0ZXN0ZWQtY3ZtMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAERlr4Def7dhTa8ZZA11cSXt/NY5YZUHjC9a//3GLN\n2dm89/WN+WHPDd4pw4pL8cGVUKpBWRocDHKl9Y7RFjNCSjAKBggqhkjOPQQDAgNI\nADBFAiEA0ZC9gK/iBXt5eFr/8ZbFLdU6YyVW5szJuO+Obr0cA5MCIEDNEwfl3nYp\nvdE9FflbOn2qk6hOLQBXPXPIL8K5/fdt\n-----END CERTIFICATE-----\n",
"vcek_cert": "-----BEGIN CERTIFICATE-----\nMIIFPzCCAvOgAwIBAgIBADBBBgkqhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAgUA\noRwwGgYJKoZIhvcNAQEIMA0GCWCGSAFlAwQCAgUAogMCATAwezEUMBIGA1UECwwL\nRW5naW5lZXJpbmcxCzAJBgNVBAYTAlVTMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExHzAdBgNVBAoMFkFkdmFuY2VkIE1pY3JvIERldmljZXMxEjAQ\nBgNVBAMMCVNFVi1HZW5vYTAeFw0yNTAyMDkxNjA5MDNaFw0zMjAyMDkxNjA5MDNa\nMHoxFDASBgNVBAsMC0VuZ2luZWVyaW5nMQswCQYDVQQGEwJVUzEUMBIGA1UEBwwL\nU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMR8wHQYDVQQKDBZBZHZhbmNlZCBNaWNy\nbyBEZXZpY2VzMREwDwYDVQQDDAhTRVYtVkNFSzB2MBAGByqGSM49AgEGBSuBBAAi\nA2IABOEBbhhd+xsYLHvfExQV2Splb3+8Jw49jCxvmgtsd0eD1kX3gR+t8BDUqUmz\nLA8PTQ3elvF8/jPazeWm3JPawojMiX8sWR5qwNlsodSgtkYKc16clIwrUzEhJllL\nM0cIVKOCARMwggEPMBAGCSsGAQQBnHgBAQQDAgEAMBQGCSsGAQQBnHgBAgQHFgVH\nZW5vYTARBgorBgEEAZx4AQMBBAMCAQowEQYKKwYBBAGceAEDAgQDAgEAMBEGCisG\nAQQBnHgBAwQEAwIBADARBgorBgEEAZx4AQMFBAMCAQAwEQYKKwYBBAGceAEDBgQD\nAgEAMBEGCisGAQQBnHgBAwcEAwIBADARBgorBgEEAZx4AQMDBAMCARcwEQYKKwYB\nBAGceAEDCAQDAgFUME0GCSsGAQQBnHgBBARAd2a1bXO9BnkuUrp2RTlmNLJdfW2p\nfn8EvCMg/BmG/UsuU4gxoxr3eL9cRsaZiVM0xTgFlDSie1GYmmc+grTRkDBBBgkq\nhkiG9w0BAQowNKAPMA0GCWCGSAFlAwQCAgUAoRwwGgYJKoZIhvcNAQEIMA0GCWCG\nSAFlAwQCAgUAogMCATADggIBAI3gcYG3rXc+Uo2/wrsxhUIeU5tmOwEOUKToZJwM\no5EFywhHR8ZdYuJFRo4Ne3mbRKh8zZZY+h6g+0bibx9QvNquGMSmJWld1r86ioT0\n/dR4Zh/e0Cqbqdz19j52WD6PZ9xEUkoEBaber9ptE6Du0PiPpfS7Yj3bhkuhJn83\nK9jA/nyfe1mVKdzYp8TIq7m7MIijJOjjylgYvmDj3lOim2cPXCnzJSl8nBwvl3Yz\nIUwAKJbc/zL/Ost7PG3QQCzdHUqP/vFGIJ8BN8kMYPiw/0atoUyf1RqClT7lKGlk\nldB//aF9anXszvEC0EvQ7V9ggOLGT5uhio+KJdUouphTiwW039jipuiE1b3V6+Du\nIn23iWM0rnEyRqvqbREdN9lPVbrvXMEYZV5sqbj9TenB9DZM6srKuCMVwQjK2Ui9\nntpZi6fiv6T3gNSzkbZTXMV+5+HwU+QdnLE5n/DFNW83uExBYA4v5qnbTmCExbWL\nTdl6ovkDwrwneCUmsdMtwoZv41RBnFqiThIOQ3D6wQSCxuCKoSdjbN7RpIb8AeTB\nMGYkn3kWIN4D55T9kdanMPGektFeeRlPZSLtnoIGFfO5eG+b4FNgY0W5oZMKuPEP\nqgb/DRNOin+rZiZlOpV32X99SrF69gsr9CHR0RctviutlSGoTz1NTJzCi52kXfc6\nSwGH\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n/wMz1R1BHg==\n-----END CERTIFICATE-----\n",
"snp_report": "SENMQQIAAACECQAAAgAAAAAAAAAAAAAAAAAAAAAAAAADAAAACwABAB8AAwAAAAAAASMgAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAoAAAAAABdUJwAAAAAAAAAAAAAAAAAAAB2E/DzDm6+Z0zNss8df/1UAMmlL0gh5h+QBksimEJcxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhT3SYLWVdTL1oa5G8uUMd25i24hDllkcInSAwNc+Z2adu+97hnwlY/z8apFGOhuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQv2T695up6lu+t6vxg8caz0Q5wOx2v11Vbkvfz0y0OAGdnZIy6WxAq89ZXVq9BdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkrBaBucfyTg1fPjkrWsGseXlbHPZC9ZsJ1jeoy4IzS//////////////////////////////////////////8KAAAAAAAXVBkRAQAAAAAAAAAAAAAAAAAAAAAAAAAAAHdmtW1zvQZ5LlK6dkU5ZjSyXX1tqX5/BLwjIPwZhv1LLlOIMaMa93i/XEbGmYlTNMU4BZQ0ontRmJpnPoK00ZAKAAAAAAAXVCg3AQAoNwEACgAAAAAAF1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz4rDC5riTKnnZ88/SFAC9YclpL+NofMT6irgWRznuj+QVMu2kGf9GOHvcDc4JEHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACygEQM3ZeJTX6kZ8l/8Xa6OgoYWsCsOTKfDpnIcj12+E/FHRLdevOxvfffmufzgGsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQEAAABAAAAAgAAAAEAAACwBAAAeyJrZXlzIjpbeyJraWQiOiJIQ0xBa1B1YiIsImtleV9vcHMiOlsic2lnbiJdLCJrdHkiOiJSU0EiLCJlIjoiQVFBQiIsIm4iOiJweVJmTWdBQktfejV0aTRUNmZwcGRxNzBMUEp2bU5mVTY1T3hoOWdaNTlPNk5rVWYySzF2MmsyanF0ODZBb3NNSHExc1N5V2R6U1JmT2ZfTjk1c3hzNXkwTG51ZXg0bW5YeGtKVmNOd3BKMktiVlpGVkRHTGdkdi1IV1Z4NDIzU0g5ejhQX215QVdaRFJuR2MyZmJNaENoLXZMNlQ4eVZaS2ZmOEh0R2dHUm9nczdQWUY1d1VsSGJzZnQ0RENVVldxUDJXVG1jcEVwR0dLdzIxeUg5cEdMZklvbV9ybjA0TlBHblc3WG9TSm13c0I5dzh4Z0JVZUIxWFgxcjVfR3RrU05iRnE4TFRIRFZVcVA4S0dvOEJLRDI2RFJobkxJM0REWWhnSWE5QTVWUlc4a1Z4dk93ZEd6VHkxdnQtTEV1ZzNGbWJaOURQcFRadEl6VDR3T2dYMXcifSx7ImtpZCI6IkhDTEVrUHViIiwia2V5X29wcyI6WyJlbmNyeXB0Il0sImt0eSI6IlJTQSIsImUiOiJBUUFCIiwibiI6InNuaDVQd0FBWTRKQjlBQ3l1SDMtdHpWVTljQTFkekpOT0VMVkhUMUJrSFg3THVVVXRrbU5PRGRkNTZUemhHLW5CSHc4N3dQU0dKX1ZqZ3lXcDZoQUctZFhxeTJ2QmplT0ZxdWhYVnF4N2NrdTA1a3FONTRRSUt0VWN0aVM3eFJtMmhUM3RZeEJwWjFDa1ZiVkFHSWk4dUFnMjFMWWVEZmdDRjN3cGVKaFEycUZwVWQwS2JYYi1ZMWFzZkZMUGg5SDY5ekZXeUV4VnlVaVY2blBxQnctUlB5SWNXZnZkRGNmWjNVSjRPQVRIWHVfNkxUSEp1NjZKd3ZFTkVxdlRnS0FnWWx6OC01UUVhYUZidENoVC1RMy1IYk10NjNCVUEwQUVsVTV3SzV4VENoTlloLXlFVTRIVFkzbTVNVWxqWjNETnpZUGpQRllrTG9xdTlLNGJMRlhnUSJ9XSwidm0tY29uZmlndXJhdGlvbiI6eyJjb25zb2xlLWVuYWJsZWQiOnRydWUsInJvb3QtY2VydC10aHVtYnByaW50IjoiNm5aWm5ZYUpjNEtxVVpfeXZBLW11Y0ZkWU5vdXZsUG5JVG5OTVhzSGwtMCIsInNlY3VyZS1ib290Ijp0cnVlLCJ0cG0tZW5hYmxlZCI6dHJ1ZSwidHBtLXBlcnNpc3RlZCI6dHJ1ZSwidm1VbmlxdWVJZCI6Ijg2OTg1MjYzLTE4NzItNEQzOS04OTAzLTQxNjE2MkU4OTg4MyJ9LCJ1c2VyLWRhdGEiOiI0QkE4RTdCN0U5NDUzOTBFRTAxOTk4MjM2ODUwRkUxMzZCODExRDUxNTNBOEU0MUJCNjExMDRCMTc5Njc0NjJCMzBEQ0Y1NzdGMDk5QTk4ODc2NzJFQzY0NDMwMTk3MkM2NTQ4OTc1NjE1QzhCNzI4MDg3RDU3RjY4MDhFRENCMCJ9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
"ak_pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApyRfMgABK/z5ti4T6fpp\ndq70LPJvmNfU65Oxh9gZ59O6NkUf2K1v2k2jqt86AosMHq1sSyWdzSRfOf/N95sx\ns5y0Lnuex4mnXxkJVcNwpJ2KbVZFVDGLgdv+HWVx423SH9z8P/myAWZDRnGc2fbM\nhCh+vL6T8yVZKff8HtGgGRogs7PYF5wUlHbsft4DCUVWqP2WTmcpEpGGKw21yH9p\nGLfIom/rn04NPGnW7XoSJmwsB9w8xgBUeB1XX1r5/GtkSNbFq8LTHDVUqP8KGo8B\nKD26DRhnLI3DDYhgIa9A5VRW8kVxvOwdGzTy1vt+LEug3FmbZ9DPpTZtIzT4wOgX\n1wIDAQAB\n-----END PUBLIC KEY-----\n",
"tpm_quote": {
"quote": "/1RDR4AYACIACznDprW0htDuqmRPKNUVnkO5hFe9rEuIJeaYccnceYruACClF1EbFAmH5nW+y1UUQKqE0wQOLKD8jJkZtXO0dPdY9QAAAAAGtAdAAAAACwAAAAABICADEgASAAMAAAABAAsD/1eAACAExyvnvb4FwY7he9B45yEzOhvD/uQUTMl4nbyXf7nSZQ==",
"signature": "ABQACwEAG5GrMFbZwcbLaNQPxqrEeH9DNNT+yll5PB89J+Lbx/w3BymHo0vvPPA1P0x1zl0dfauj80gdAYsbJDCV0SMWSf21dnAfChC47NGTdmF0MoH7aVjPTM0v5YRVnIXqx+A4F0BNd0gA/N6s8fS+jkSiJip9wLCdJxmgLVGAszUYSnWYWzGprJ/ChWdGFJ6iZpaKy6jQ6LosCMBWUu57CdgSsfD/vs1bGdKbJ/SHFMgvGXxklJL0K7LvYSZWHK137UcahG0CVsDMttWuBAFIDKillrn2DDIRN+xG+EGg5s/gKGIrExF6oZ0iAuDtR9Wnwu31jFJRg4J69QaOXT6QdF51Iw==",
"pcr_selector": "sha256:0,1,2,3,4,5,6,7,8,9,10,12,14,23",
"pcr_value": "Exd6ZTW63xlBXAZYlwXdWhiQ9zVFxKn+96z+LGF3ore5FD92r/7VVdhir88GqppoKsaJryHLgOkLhU/ag7htFT1FjP5VzAPqH0Q/FWK+7I31HHXhSp/PmnI0oT8ZjnlpPUWM/lXMA+ofRD8VYr7sjfUcdeFKn8+acjShPxmOeWmrYTRrL+U6POY47LGG9VgNu/e9UinSYYB66Z/YvOgZThjIxWvpP16a3HM2px0ZTDXCRpLGcfI6hi3871QTU6UC+3hn1x1u4jAuw4zvSzIrLZyk0U8yFjNzeXcab3x4DME7IOAiQW/fYdcuTaMrQ1R4G+PeBggRaXbSj/2tjDQdKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAKnGa8k7WMM0xrJIAPtZgP1Jvpk8FPWfhwpFAwwtYxaOw2/+baFA8jnJlszzkBjPWYJyf5xJCe8jHCxKNxK/fGhQsU1hufiIj7HTl9NGklClWsf2ax4+vzfhRF6o0XaMG+di5TxfZPcbnz49cedZS60xsTRPeLd3CSvQW4T7K+aHhPEDAyltmo5GjA/IOToey3BpbEWsspQXkBtgMYYUA=="
},
"ima": {
"ima-policy": "",
"ima-measurement": "10 498c9bbfb84cee61be6e0768d4190c4b9b385b3a ima-ng sha256:bbdbca85a82cf96aad024bdfedaa4fcc791d857b338b6f7c5a4625bce0118ac4 boot_aggregate\n10 5a9c34240b2f0cca9f47b4c1fab6d23829392470 ima-ng sha256:9b403ac5877723c568548723d1988e91d30d8a8bb171bdae001126729ee93047 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/fs/autofs/autofs4.ko.zst\n10 a66f62e131afe972f8eec94f91070f5a35499860 ima-ng sha256:910c77268babfc7ea567615d11e393f247db00ee988a8a27117974c1c81d8d2b /usr/lib/modules/6.17.0-1005-azure-fde/kernel/fs/nls/nls_iso8859-1.ko.zst\n10 7d26cfd812dfaf0aad0eef0241bcb2200d7e1e62 ima-ng sha256:1dab38e3bdfa4237150b16a0d07acf273ba72fb691c7008a8cc2cafb5755bcdb /usr/lib/modules/6.17.0-1005-azure-fde/kernel/drivers/md/dm-crypt.ko.zst\n10 3a37c30e81aac2549f1be949be782fa8e0224aad ima-ng sha256:9f0a3cd745d9d1a1726b8da9d4f8c2075b467e5bb5eb479c93db5b8301034e55 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/x_tables.ko.zst\n10 1e09e1660f6614fd151bd082fe83872cbe5187a4 ima-ng sha256:e0a0aa856a800bfe0d6942e69797a22dac5f204c0d5977c56c78452f41926e8e /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/ipv4/netfilter/ip_tables.ko.zst\n10 a83d1f35ea2bc128d40dec0d1cc02c10c6df00c5 ima-ng sha256:6fae76abacca399f5ca92d9c12402c43a48aa11d9ffd835454a9bd57c03a55db /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/nfnetlink.ko.zst\n10 15b66c4d41920e9da332c26f04893be851c05f30 ima-ng sha256:ff91a4f45969da556f8a0f4ee4eaac5e7c5dfaec38eb8b9544da9aad155b08f0 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/drivers/firmware/efi/efi-pstore.ko.zst\n10 e2e6a22495b392f04137f01a6ed6a3536148e897 ima-ng sha256:1f83aa67d4970d43f0b9146d0ef8cd86797b29c100db4a777a9e8529605ec734 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/drivers/nvme/host/nvme-fabrics.ko.zst\n10 d193ce1b99c0451593bb3b5bc2505ff64f40bb4c ima-ng sha256:c415957fe3da568a97bba088238f58667d9e87f5abc45fc4872b201cbd52e8b2 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/arch/x86/kernel/msr.ko.zst\n10 8f5e95c8825c166037826b24539c7bf0395f3981 ima-ng sha256:599765c622fbe9422bf69e18ed17ff83acc794e7096b7027c02429120101fafd /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/sched/sch_fq_codel.ko.zst\n10 90a59ada9f6241995896eea56ff4caadfacf4d98 ima-ng sha256:b57bd3d7025ff272b4a2da2605798c0456e2b2a80b8947c8e652d4aca1617789 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/drivers/net/hyperv/hv_netvsc.ko.zst\n10 b4c505fcf67959a6b8fef4b3c35b4906abf29279 ima-ng sha256:7b0db1906a3faaf1f2617c07c28b455a471d49e39a2cb05e5f8aa73567cdd9af /usr/lib/modules/6.17.0-1005-azure-fde/kernel/arch/x86/crypto/ghash-clmulni-intel.ko.zst\n10 8d23f2ab9a30a70fbb6d3bfb011a8b2837990bc7 ima-ng sha256:b3d8ec65d4a58030d218dfa89feacd8d56260a3af354350ef51de9bf37792b80 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/arch/x86/crypto/polyval-clmulni.ko.zst\n10 ffeebc34d50b1204fe51d778c9c10fbb25e3c470 ima-ng sha256:22c06a98f245471ef184b55b87ab9f48c2f5222c1f737378a5f237b28d484694 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/fs/binfmt_misc.ko.zst\n10 2cce7cca474ace0c092c1560cf42971a2bf42b95 ima-ng sha256:87b05612f1a971db4b0699eb3e920201a8accf97d4cb9f84ef9d7fec74595c49 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/nf_tables.ko.zst\n10 9ef38d7864eff99d1373d245ce182c5aed085d2f ima-ng sha256:77f0a0b4fe97b6587d5aec481674d1a954a1f2a53b873ed58f07176f70667d2f /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/nft_compat.ko.zst\n10 4e72419b8787154d060effd4cb2f494361ee8126 ima-ng sha256:29cdd6c455f23f709db5f4f8e0af114ce61f73cc3f2833e67b4d8f3ce97932b9 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/ipv4/netfilter/nf_defrag_ipv4.ko.zst\n10 0fd73de3de67a4b9fd0f91cbb6e41100fd2a009d ima-ng sha256:ea6a9d2e3ced16a0e2019d7ddaa884c19ef871261894b9035eeba76ecac37517 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/ipv6/netfilter/nf_defrag_ipv6.ko.zst\n10 f1219752b5c5f246a1d06bfd78418bd83860850e ima-ng sha256:5c1a9b00749a9279915f6f3e205eff617d4a3ffba601e537aa51908bcc886218 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/nf_conntrack.ko.zst\n10 a487a4980cf8602376f0bafd66cc294775031038 ima-ng sha256:c3f37be880c51223066903933cb0d53e91e9c8c1486a05ff462f38eb4cec4d71 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/xt_conntrack.ko.zst\n10 d9b00a070e8d534f61f58afd84e7ec9995e9c5de ima-ng sha256:d1252ae6be621cbc1837fefc3e175744659f61675b959b64754c507d33173ffb /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/xt_tcpudp.ko.zst\n10 ab08356ffee1e35c96504084d0a6da81439c03ac ima-ng sha256:6b181e5b5eb63c84801c7daf982fc77533ebb6ce13205c76a8fba42157e2c7de /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/netfilter/xt_owner.ko.zst\n10 8e2f0c0e4d094cae01b252f4c0682f61e1f0255e ima-ng sha256:9ecded669738c8b4662a977f1861479813c469abd008fbd5cac9f1b80dbd2548 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/llc/llc.ko.zst\n10 8ee6f3faaf41dce57f8f9fae75a8b0629542a177 ima-ng sha256:583908083e80875d126b8549e0b49e5388b5a53af046ffccbbade7795183dddf /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/802/stp.ko.zst\n10 b296405c888119c34f313f86a545d4930a3c299e ima-ng sha256:d749d850fca26cd0f26f08c933788702ad2b9cacc9ed2949daf76ae18add1e2a /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/802/mrp.ko.zst\n10 e9595e6002ea3ba2ab0a23ddaee9a72240dbee4d ima-ng sha256:4484903ef010b3d7c381c706243fa2fc93a7804262acfae4111e6101de1c2553 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/802/garp.ko.zst\n10 6ce809c30c77453b22a78e8e03ce5cb2e3687377 ima-ng sha256:41b59c82e3cb2909a3655461d177ba2359959903d7ec7de59fe98d6ecb869710 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/8021q/8021q.ko.zst\n10 1803758d74c3fdb901039974bcb956efd6d411e5 ima-ng sha256:4006fc13e5cab0cbacf448a049ae8f0e468a67ad099242a9d923d867b0b5f593 /usr/lib/modules/6.17.0-1005-azure-fde/kernel/net/tls/tls.ko.zst\n"
}
}Because the range of what IMA can measure is extremely broad, it is difficult to define a single optimal configuration for IMA policy. The default IMA policy assumed in this repository is shown again below:
# PROC_SUPER_MAGIC
dont_measure fsmagic=0x9fa0
# SYSFS_MAGIC
dont_measure fsmagic=0x62656572
# DEBUGFS_MAGIC
dont_measure fsmagic=0x64626720
# TMPFS_MAGIC
dont_measure fsmagic=0x1021994
# DEVPTS_SUPER_MAGIC
dont_measure fsmagic=0x1cd1
# BINFMTFS_MAGIC
dont_measure fsmagic=0x42494e4d
# SECURITYFS_MAGIC
dont_measure fsmagic=0x73636673
# SELINUX_MAGIC
dont_measure fsmagic=0xf97cff8c
# SMACK_MAGIC
dont_measure fsmagic=0x43415d53
# CGROUP_SUPER_MAGIC
dont_measure fsmagic=0x27e0eb
# CGROUP2_SUPER_MAGIC
dont_measure fsmagic=0x63677270
# NSFS_MAGIC
dont_measure fsmagic=0x6e736673
# Measurement targets and measurement triggers
# Measure files MMAP-ed for program execution
measure func=MMAP_CHECK mask=MAY_EXEC
# Measure executed binary programs
measure func=BPRM_CHECK mask=MAY_EXEC
# Measure files opened by root (uid=0)
# measure func=FILE_CHECK mask=MAY_READ uid=0
# Measure loaded kernel modules
measure func=MODULE_CHECK
# Measure firmware loaded into the kernel
measure func=FIRMWARE_CHECK
With measure func=BPRM_CHECK mask=MAY_EXEC present, all executed binaries are measured. Combined with measurement of kernel modules, etc., at least basic execution can be traced.
The issue is the commented-out measure func=FILE_CHECK mask=MAY_READ uid=0 portion. Since execution is measured by BPRM_CHECK, measuring all other file reads, writes, and appends requires replacing this part with the following:
measure func=FILE_CHECK mask=MAY_READ
measure func=FILE_CHECK mask=MAY_WRITE
measure func=FILE_CHECK mask=MAY_APPEND
However, this measures all file operations by all users and produces an enormous log volume, raising performance concerns.
There is also a behavior in which the measurement value becomes all-zero when a Read-Open is performed during a Write-Open, so there are operational concerns beyond simple policy definition. In the extreme, this means excluding content that can perform such operations from the source â but in real operation this is not always feasible.
These difficulties with IMA configuration are out of scope for Humane-RAChain-NS, so here we only note that there is a gradient of strictness in IMA configuration.
Although many of these overlap with what has been described, the limitations are restated:
-
For the firmware-layer PCR0â7, the functionality to build from firmware source, reproduce the hash, and verify it is not implemented. In Azure's case, since the firmware layer is non-public, such implementation would have to assume another cloud or on-premises environment.
-
Root-filesystem hash measurement is not implemented. If needed, it would have to be combined appropriately with the technique proposed by e.g. SNPGuard; the difficulty is high.
-
Measurement acquisition and RA binding for various Python libraries and the interpreter itself are not implemented. This is fundamentally delegated to IMA.
-
While IMA can measure content beyond the OS kernel, IMA itself does not measure the IMA policy, so the policy can be changed â an IMA-specific issue. We plan to publish a solution to this on the repository when it is resolved.
-
The IMA policy included as evidence is copied from either the loaded policy at
/sys/kernel/security/ima/policyor the custom IMA policy file at/etc/ima/ima-policy. The latter is the policy loaded at the next CVM boot, and can be freely rewritten once the CVM is running, so it is not guaranteed to match the former. Read permission to the former is set by the kernel configuration optionCONFIG_IMA_READ_POLICY. On Azure NCC machines it is set tofalseby default, so/etc/ima/ima-policyis used.
-
On the server side, the simplest approach is to write additional definitions (such as additional workload-execution requests) directly into
Humane-RAChain-NS/server/api.py. If you write a server script from scratch â for example because you do not wish to use FastAPI/uvicorn â first add the following import:from attester import do_attestation
Then call the Humane-RAChain-NS server-side Attestation API in your endpoint function as follows:
result = do_attestation( data.ncc_nonce, data.tpm_nonce, cert_pem.decode("utf-8"), gpu_enabled )
Note that
cert_pemis the TLS self-signed certificate dynamically generated per session; this dynamic generation and the directive to use it must also be implemented separately. -
In
Humane-RAChain-NS/server/api.py, after creatinguvicorn.Config, the SSL context is built withconfig.load(), and TLS session-ticket resumption is disabled withconfig.ssl.options |= ssl.OP_NO_TICKET. This ensures that a full TLS handshake is always performed on each reconnect, so that client-side certificate pinning (AttestedCertPinningAdapterinclient/client.py) is evaluated every time. Only subsequent requests over a TLS session using the same RA-confirmed certificate are accepted after Attestation.
For the client-side usage example, the do_attestation() function in Humane-RAChain-NS/client/client.py is a necessary-and-sufficient sample. Detailed implementation details are documented as comments inside that function â refer to those. The do_attestation() function can also of course be reused as-is. Some of the configuration written inside this function is also described in subsequent sections.
-
To use Humane-RAChain-NS on the client side, first add the following import:
from ra_verifier import init_verifier, send_attestation_challenge, verify_response
-
After specifying the server URL and the snpguest path, call the
init_verifier()function for initialization. -
While taking the server response, the NCC Attestation nonce, and the TPM Quote nonce as return values, call
send_attestation_challenge()to send the Attestation request to the CVM. The nonces are randomly generated on the client side inside the called function. -
If the above request completes successfully, call
verify_response()to verify the Attestation evidence and judge whether RA is accepted. -
Output like the following is displayed because a self-signed certificate is used. As previously described, this is intentional for RA-TLS-style operation and can be ignored:
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1020: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings warnings.warn(
-
If RA is accepted, that TLS session is maintained almost permanently until the client closes it, so use that TLS session to send further processing requests to the CVM. In the Humane-RAChain-NS sample,
Humane-RAChain-NS/server/sample.pyis invoked, which simply adds two integers (no GPU is used); however, GPU-using requests are of course possible. With NCC enabled, GPU processing also runs in a TEE-protected state.
Tree:
Humane-RAChain-NS/
âââ README.md
âââ sequence.pu
âââ sequence.svg
âââ client
â âââ client.py
â âââ policy
â â âââ client_gpu_ra_policy.json
â âââ ra_verifier.py
â âââ settings.yaml
âââ server
â âââ api.py
â âââ attester.py
â âââ cert_gen.py
â âââ policy
â â âââ server_gpu_ra_policy.json
â âââ run-server.sh
â âââ sample.py
âââ subtools
âââ hashlist_generator.py
âââ ima_appraise_policy_generator.py
âââ measurement_extractor.py
-
README.md: this file.
-
sequence.pu: sequence-diagram source.
-
sequence.svg: sequence diagram.
-
client: stores client-side scripts and policy files.
- client.py: script that uses Humane-RAChain-NS to request RA processing and subsequent Confidential Computing. When writing your own application with Humane-RAChain-NS, this is the script-equivalent portion you implement.
- policy
- client_gpu_ra_policy.json: Attestation policy file for NCC Attestation. Used on the client side, but since the server is expected to verify at the same level as the client, keeping it identical to
server_gpu_ra_policy.jsonis safest.
- client_gpu_ra_policy.json: Attestation policy file for NCC Attestation. Used on the client side, but since the server is expected to verify at the same level as the client, keeping it identical to
- ra_verifier.py: module that handles the client-side RA processing. When developing your own application, import this.
- settings.yaml: client config file. Configures the snpguest install path, NCC-Attestation enable/disable, PLATFORM_INFO Appraise Policy, enable/disable of per-PCR reproduction-and-verification, etc.
-
server:
- api.py: script to run the Humane-RAChain-NS-augmented RA-enabled server. When writing your own application with Humane-RAChain-NS, this is the script-equivalent portion you implement.
- cert_gen.py: script implementing the logic to dynamically generate the per-session TLS self-signed certificate.
- policy:
- server_gpu_ra_policy.json: NCC Attestation policy file. Used on the server side, but since it should be verified at the same level as the client, keeping it identical to the client policy is safest.
- run-server.sh: server-side launcher script. After verifying that IMA-related files exist, it invokes
api.py. To disable NCC Attestation, run with the--no-gpuflag. - sample.py: sample secure-computation script. Just adds two integers it receives. No GPU computation is performed; if you want to benefit from NCC, supply your own.
-
subtools:
- hashlist_generator.py: script that computes the hash list of files targeted for PCR23 Extend. To disable NCC Attestation, run with the
--no-gpuflag. - ima_appraise_policy_generator.py: script that generates the verification policy for IMA logs.
- measurement_extractor.py: script that obtains the SEV-SNP Attestation Report on the SEV-SNP CVM and extracts the Measurement. Its significance and usage are as described earlier.
- hashlist_generator.py: script that computes the hash list of files targeted for PCR23 Extend. To disable NCC Attestation, run with the
The portions specific to this repository are provided under the MIT License.
client/policy/client_gpu_ra_policy.json and server/policy/server_gpu_ra_policy.json are derived from NVGPURemotePolicyExample.json of nvtrust (Apache-2.0 License), so the Apache-2.0 License applies to these.
For details, see LICENSE.
æ¬ãªããžããªã¯ãäž»ã«Azureã®Standard_NCC40ads_H100_v5ã§ã®å®è¡ãæ³å®ãããNVIDIA Confidential ComputingïŒNVIDIA Hopperã¢ãŒããã¯ãã£GPUãã察å¿ããŠããGPU TEEïŒä»¥äžãNCCïŒãšAMD SEV-SNPåæ¹ã«å¯ŸããŠãRemote AttestationïŒRAïŒã宿œããããã®RAãã§ãŒã³ãã¬ãŒã ã¯ãŒã¯ãæäŸãããã®ã§ããã
NCCã¯ãSEV-SNPãã¯ãããšããCVMïŒConfidential VMïŒããAttestationãå®è¡ããå¿ èŠããããCVMã«å¯Ÿãããªã¢ãŒããŠãŒã¶ïŒRelying PartyïŒããCVMãçµç±ããã«ãªã¢ãŒãããçŽæ¥RAãè¡ãäºã¯ã§ããªãããŸããSEV-SNPèªäœãTCBïŒTrusted Computing BaseïŒã倧ããäºãããŒãã·ãŒã±ã³ã¹ã®å€æ®µæ§ãããç°å¢ãéã¿ãäžã§ã»ãã¥ãªãã£çã«ãã¹ããã©ã¯ãã£ã¹ã§ã®RAãè¡ãäºã¯éåžžã«é£ãããæ¢åã®ãã¬ãŒã ã¯ãŒã¯ããªããªãååšããªãç¶æ³ã§ããã
ããã§ãHumane-RAChain-NSã¯ããŸãNCCã«å¯ŸããAttestationã宿œãããã®èšŒè·¡ããã®çµæããSEV-SNPïŒã®AMD Root KeyïŒããã©ã¹ãã¢ã³ã«ãŒãšãããã©ã¹ããã§ãŒã³ïŒå ·äœçã«ã¯ããã®Attestation KeyãSEV-SNP Attestation Reportã«ãã€ã³ããããŠããvTPM QuoteïŒã«çžãä»ããããã®äžã§ãSEV-SNP Attestation ReportãvTPM Quoteãå¯èœãªéãé©åã«æ€èšŒããäºã§ãNCCãSEV-SNPãVMã®äœã¬ã€ã€å±€ïŒvTPMãOVMFçïŒãã«ãŒãã«ããããŠåžæããã¯ãŒã¯ããŒãã«è³ããŸã§ãé£éçã«RAã«ããä¿¡é Œæ§ã®ç¢ºç«ãè¡ãïŒRAãã§ãŒã³ã確ç«ããïŒäºãã§ããã
çŸæç¹ã§ã¯ãAzure以å€ã§ã®åäœã¯åäœä¿èšŒå€ãšããŠããã
å ·äœçã«ã¯ã以äžã®ãããªåæã»ç®æšãå®çŸããåŠçãããã®Humane-RAChain-NSã«ãã宿œããäºãã§ããããªããååçã«ä»¥äžã®å šãŠã®åŠçã¯Humane-RAChain-NSã«ããèªåçã«å®è¡ããããã®ã§ããããã®ã©ã€ãã©ãªãçšããéçºè ã»ãŠãŒã¶ã¯ãåã«å©çšããäžã§ã¯ãããã®åŠçãæèïŒå®è£ ïŒããå¿ èŠã¯ãªãã
-
ãŸãã¯SEV-SNP CVMãNCCã®Attestationã宿œãããã®åŸãã®SEV-SNPãã¯ãããšããCVMã®Attestationã宿œããäºã§ãNCCããRelying PartyãŸã§ã®RAãã§ãŒã³ã確ç«ãããšããæç¶ãã®æµããåãããã£ãŠããŸãã¯NCCã®Attestationãã宿œããã
-
CVMã¯ãNVIDIAã®Attestation SDKãçšããäºã«ãããNCCã®EvidenceïŒSGXã«ãããQuoteçžåœïŒãååŸããããã®åŸãHumane-RAChain-NSã§ã¯ãNRASïŒNVIDIA Remote Attestation ServiceïŒã«äŸé Œããäºã§ãEvidenceã®æ€èšŒãå®çŸããŠããïŒRemote GPU AttestationïŒãããã«ãããCVM-NCCéã®Attestationãå®çŸã§ãããã¯ã©ã€ã¢ã³ãïŒRelying PartyïŒãnonceãéä¿¡ãããããCVMåŽã§çšããäºã§ãEvidenceã®åçæ»æå¯Ÿçãè¡ã£ãŠããã
-
ãã®Evidenceãæ€èšŒçµæïŒAttestation ReportïŒã¯ãAMDããã©ã¹ãã¢ã³ã«ãŒãšãããã©ã¹ããã§ãŒã³ã§ä¿¡é Œæ§ã®æ ä¿ãããvTPMïŒä»¥äžãåã«vTPMãšã衚çŸããïŒã®PCRïŒãã©ãããã©ãŒã æ§æã¬ãžã¹ã¿ïŒã«ãã®ããã·ã¥å€ãæ ŒçŽããããã£ãŠããããããŒã¿åã³TPM Quoteãçšããäºã§ããã®å®å šæ§ãä¿èšŒã§ããä»çµã¿ãšãªã£ãŠããã
-
PCRãã³ã¯ã«ã€ããŠã¯ãããã·ã¥ã¢ã«ãŽãªãºã ïŒsha1, sha256, sha384ïŒãããããå¥ã ã®é åïŒPCRãã³ã¯ç©ºéïŒãæã€ããHumane-RAChain-NSã§ã¯sha256ã®ãã³ã¯ãäžåŸã§äœ¿çšããŠããã
-
-
CVMãšRelying Partyãšã®TLSéä¿¡ã«ã¯ãCVMãã»ãã·ã§ã³ããšã«åçã«çæããèªå·±çœ²åèšŒææžåã³TLSã»ãã·ã§ã³ïŒTLSéä¿¡è·¯éµå«ãïŒã䜿çšãããèªå·±çœ²åèšŒææžã¯vTPMã®PCRã§ããã·ã¥æž¬å®ããããããRAãåçããäžã§ãã®èªå·±çœ²åèšŒææžã«çŽã¥ãTLSéä¿¡ãç¶ããéããRelying Partyã¯éä¿¡çžæãæåŸ ããCVMã§ããäºã確信ããäºãã§ããã
- èªå·±çœ²åèšŒææžãšTLSæå·éµããã€ã³ããããŠããäºã¯ãRAã«ããHumane-RAChain-NSãæ£ããåäœããŠããäºãæ€èšŒããäºã§ãèªåçã«ä¿èšŒãããã
-
NCCã®AttestationåŸã次ã«CVMã¯SEV-SNPã®Attestation ReportïŒSGXã«ãããQuoteãšAttestation Reportãå Œãããããªæ§é ïŒãçæãããAzure CVMã«ãããŠã¯ãHCL ReportïŒSEV-SNP ReportãREPORT_DATAã«ãã€ã³ããããJSONãããã·ã¥ã¢ã«ãŽãªãºã ïŒTEEã¿ã€ãçã®ã¡ã¿ããŒã¿ãããªãæ§é äœïŒã«æ ŒçŽãããç¶æ ã§çæããããåæã«ãAttestation Reportãžã®çœ²åã«äœ¿çšããVCEKã«å¯ŸããèšŒææžïŒVCEK CertïŒããSEV-SNPã®Attestation Reportã«ã忢±ïŒå³ã¡ãAMDã®ãã©ã¹ããã§ãŒã³ã«ãã€ã³ãïŒãããŠããTPM AKïŒAttestation KeyïŒå ¬ééµã®ååŸã宿œããã
- ãããã¯Relying Partyã«åãæž¡ãããSEV-SNP Attestation Reportã®çæ£æ§ã®ç¢ºèªããTPM AKã®çæ£æ§ã®ç¢ºèªãRelying PartyåŽã§å®æœããå®è£ ã«ããŠããïŒRelying PartyåŽã§Attestationã®æ€èšŒã宿œããïŒã
-
SEV-SNPã®Attestationé¢é£ããŒã¿ã®ååŸãå®äºããããæ¬¡ã¯vTPMã®PCRãã³ã¯23çªã«å¯ŸãããHumane-RAChain-NSå«ãã©ã³ã¿ã€ã ã¯ãŒã¯ããŒãã®æž¬å®ãè¡ããå ·äœçã«ã¯ã以äžã®ããŒã¿ããã¡ã€ã«ã鿬¡PCR23çªã«Extendããäºã«ãããPCR23çªã«ããå¿ èŠãªã³ã³ããã³ãã®å®å šæ§è¿œè·¡ãè¡ããããã«ããŠããïŒ
- CVMå ã§åççæããTLSèªå·±çœ²åèšŒææžãåè¿°ã®éãCVMãšã®ã»ãã·ã§ã³ã®äžæãªèå¥ã®ããã«åç §ã§ããããŒã¿ã§ãã
- SEV-SNP Attestation Reportãžã®çœ²åã«äœ¿çšãããVCEKã«å¯ŸããVCEK Cert
- TPM AKå ¬ééµ
- NCC Attestationã®Evidence
- NCC Attestation Report
- Humane-RAChain-NSã®ãµãŒãåŽã¹ã¯ãªããåã³NCC Attestationããªã·
- RAåŸã«å®è¡ããã¯ãŒã¯ããŒãã¹ã¯ãªãã
ããã«ãããäžèšããŒã¿ã®åºæã確å®ã«éä¿¡çžæã®CVMã§ããäºããRelying Partyã¯ç¢ºä¿¡ããäºãã§ããã
-
ãã®æç¹ã§SEV-SNP Attestation Reportã®çæãå®äºããŠããããã€PCRãžã®å¿ èŠãªããŒã¿ã®æž¬å®å€ç»é²ãæžãã§ããããããŠãã®PCRçã«åºã¥ãTPM Quoteãžã®çœ²åã®ããã®AKã«å¯Ÿããå ¬ééµã¯SEV-SNP Attestation Reportã«ãã€ã³ããããŠããããã£ãŠã次ã¯å®éã«TPM Quoteã®çæã宿œããããã®çæã®éã«ã¯ãNCCã®Attestationæåæ§ãRelying Partyããéä¿¡ãããnonceãå«ããäºã«ãããåçæ»æå¯Ÿçã宿œããŠããã
-
TPM Quoteã«å«ããPCRãã³ã¯ã¯ãããã©ã«ãã§ã¯0ã10ã12ã14ã23ã§ãããPCR0ã7ã¯ã²ã¹ãOSã®çŽåãŸã§ã®ãã¡ãŒã ãŠã§ã¢å±€ïŒVMPL0ã2ïŒãPCR10ã¯IMAïŒIntegrity Measurements ArchitectureïŒããªã·ïŒOSã«ãŒãã«å±€åã³äžéšã®ã©ã³ã¿ã€ã ã¯ãŒã¯ããŒãïŒã23ã¯äžè¿°ã§ç»é²ããåçš®ããŒã¿ã«å¯Ÿããããã·ã¥å€ãæ ŒçŽãããŠããã9ã10ã12ã14ã¯IMAé¢ä¿ã§å€åãçºçããå¯èœæ§ããããã念ã®çºå梱ããŠãããIMAãã°ã®boot_aggregateãšã³ããªã¯PCR0ã9ã®é£çµã®ããã·ã¥å€ã§ããããããæ€èšŒããããã«PCR8çªã忢±ããŠããã
-
Humane-RAChain-NSã®åçš®ã¹ã¯ãªãããã©ã³ã¿ã€ã ã¯ãŒã¯ããŒããæž¬å®å¯Ÿè±¡ãšããIMAããªã·ãããŒãæã«ããŒãããŠããäºã§ãSEV-SNPâãã¡ãŒã ãŠã§ã¢âOSã«ãŒãã«âHumane-RAChain-NSã»ã¯ãŒã¯ããŒããšãããã»ãã¥ã¢ããŒããMeasured Bootçãªãã©ã¹ããã§ãŒã³ãSEV-SNPã¬ãã«ã§ä¿èšŒããäºãã§ããããã ããçŸæç¹ã§ã¯IMAããªã·èªäœãçžãæ©æ§ãååšããªãããããã©ã¹ããã§ãŒã³ã®ç¹ãããäžå®å šã§ããã
-
PCR0ã7ã«å¯Ÿå¿ãããã¡ãŒã ãŠã§ã¢å±€ïŒOVMFãSVSMãvTPMå®è£ æ¬äœçã®å«ãŸããå±€ïŒã¯ãAzureã«ãã£ãŠãœãŒã¹ã³ãŒããå ¬éãããŠããªããããAzureäžã§åäœãããå Žåã«ã¯ãããããªã¬ãªã¬æž¬å®å€ã®ç¶æ³ãšãªã£ãŠããããã ãããœãŒã¹ãå ¬éãããŠããã¯ã©ãŠãã§äœ¿çšãããšããœãŒã¹ãšã®æž¬å®å€æ€èšŒã䜵ããäºã§ãå®å šã«ãŒããã©ã¹ãçã«æ€èšŒã§ããããã«ãªãã
-
-
ããã«ãããSEV-SNPãHumane-RAChain-NSåã³ã¯ãŒã¯ããŒãã«åã¶ãã§ãŒã³ã蚌æããããã®èšŒè·¡ãæã£ããããCVMã¯Relying Partyã«ä»¥äžã®ããŒã¿ã転éããïŒ
- åççæããèªå·±çœ²åTLSèšŒææž
- VCEK Cert
- HCL ReportïŒSEV-SNP Attestation Reportãå«ãïŒ
- NCC Attestationã®Evidenceåã³Attestation Report
- TPM AKå ¬ééµ
- TPM Quote
- IMAããªã·åã³æž¬å®ãã°
-
究極çã«ã¯Linuxã®IMAã«ããå šãŠã®OSã«ãŒãã«ä»¥éã®ã©ã³ã¿ã€ã ã³ã³ãã³ããæž¬å®ã§ãããããPCR23çªãžã®Extendã¯IMAããªã·ã®èšå®æ¬¡ç¬¬ã§ã¯æå³çã«ã¯åé·ãšãªããããããIMAãã°ã¯éåžžã«é·å€§ãšãªãäºãå€ãããããç®èŠç¢ºèªãããšããã®ã¯è² æ ã倧ããããã£ãŠãŠãŒã¶ããªãã£ã®èгç¹ãããæäœéã®ã³ã³ãã³ãïŒåè¿°ã®éãïŒã«é¢ããŠã¯PCR23çªã«ãExtendããŠç°¡æçã«ç¢ºèªã§ããããã«ããå®å šãã€ç¶²çŸ çã«ç¢ºèªãããå Žåã«ã¯PCR10çªããã§ãã¯ããäºãå¯èœããšãã2段æ§ãã®æ§æãšããŠããã
-
Relying Partyã¯ãCVMããäžèšåããŒã¿ãåä¿¡åŸããŸãã¯VCEK Certã®æ€èšŒã宿œãããAMDã®äžéCAèšŒææžïŒASKïŒåã³AMDã«ãŒãCAèšŒææžïŒARKïŒã«ããæ€èšŒãã䜿çšãããVCEKã®çæ£æ§ã確èªããã
-
次ã«ãæ€èšŒããVCEK CertãçšããªãããHCL Reportã®æ€èšŒã宿œããã
- SEV-SNP Attestation Reportã®çœ²åãVCEK Certã§æ€èšŒãããã®äžã§æåŸ ããSEV-SNP枬å®å€ãšäžèŽããããæåŸ ãããã·ã³æ§æïŒSMTç¡å¹åãTSMEæå¹åç¶æ³ãè匱æ§è»œæžçæå¹åç¶æ³çïŒèŠä»¶ãæºãããŠãããã確èªããã
- SEV-SNP Attestation Reportå ã®REPORT_DATAããHCL Reportå ã®JSONïŒRuntime ClaimsïŒã®ããã·ã¥å€ãšäžèŽããããJSONå ã®"user-data"ãšããŠnonceãå«ãŸããŠãããã確èªããã
-
ãã®åŸã次ã¯TPM Quoteã®æ€èšŒãè¡ãããããããŸãã¯TPM Quoteãžã®çœ²åã«äœ¿çšãããŠããTPM AKã®æ€èšŒã宿œãããSEV-SNP Attestation Reportã«ãã€ã³ããããJSONå ã®TPM AKãšãã¬ã¹ãã³ã¹ã®äžéšãšããŠCVMããåãåã£ãïŒvTPMããçŽæ¥ååŸããïŒAKãšã§äžèŽãããã確èªããäºã§ããã®TPM AKã®å®å šæ§ã®æ€èšŒã宿œããã
-
TPM AKã®æ€èšŒåŸã¯ãåãåã£ãTPM Quoteã«ã€ããŠãAKãçšããŠã®çœ²åã®æ€èšŒã宿œããããã®æãåä¿¡ããPCRãªã¹ãã®å®å šæ§ã«ã€ããŠãåæã«æ€èšŒããŠããã
-
TPM Quoteã®æ€èšŒãå®äºããããPCRãã³ã¯ã«ã€ããŠãæåŸ ããããã·ã¥ãšäžèŽãããã確èªããã
-
PCR0ã7ã«ã€ããŠã¯ãäºãäºåã«CVMã«ãã°ã€ã³ããŠãã®ããã·ã¥å€ãååŸããŠããããããšAttestationçµæå ã®PCRå€ãšäžèŽãããã確èªããäºçã§ãã¡ãŒã ãŠã§ã¢å±€ã®å³éãªãã§ãã¯ãã§ããããçŸæç¹ã§ã¯ãã®ãã§ãã¯æ©èœã¯å®è£ ããŠããªãã
-
PCR23ã«ã€ããŠã¯ã枬å®å¯Ÿè±¡ã§ãããã¡ã€ã«ïŒã®ã³ããŒïŒããæåŸ ãããPCR23å€ãèšç®ãããå ·äœçã«ã¯ãCVMåŽã§PCR Extendããã®ãšåãé åºã§ãã¯ã©ã€ã¢ã³ãåŽã§ãããã·ã¥ã®Updateãè¡ããããããæçµçãªããã·ã¥å€ãPCRãã³ã¯23çªãšäžèŽãããã確èªããã
-
PCR10ã«ã€ããŠã¯ãIMAãã°ããåçŸãããPCRå€ãšäžèŽããããšã確èªããããšã§ãIMAãã°ã®çæ£æ§ã確蚌ããããã®äžã§ãIMAãã°ã®åãšã³ããªã«ãæåŸ ãããããã·ã¥å€ãèšé²ãããŠãããã©ããã確èªããããšã§ãã¯ãŒã¯ããŒãã®å®å šæ§ãä¿èšŒããã
-
-
æåŸã«ãNCC Attestationã念ã®çºRelying PartyåŽã§å®æœããããšããããŒãºã®ããïŒäŸïŒå³å¯ã«Measured Bootã§çžãã°ç¡ããšã¯æãããã²ã¹ãOSãäœããã®æ¹æ³ã§NCC Attestationãè¿åããäºãçããŠãŒã¶çïŒãRelying Partyãèªåã§NCC Attestationãå®è¡ã§ããããã«ããŠãããCVMåŽåæ§ãNCC Attestationã®EvidenceããNRASã«æããäºã«ãã£ãŠAttestationæ€èšŒãè¡ããEvidenceã«ã¯Relying Partyæå®ã®nonceãå«ãŸãããããããã«ããèªåã§ç¢ºå®ã«NCCã®AttestationãRelying Partyã®æã«ãã£ãŠå®æœããäºãã§ããã
- OS: Ubuntu 22.04.5 LTS
- Azure VMã€ã³ã¹ã¿ã³ã¹: Azure Standard_NCC40ads_H100_v5
- Linuxã«ãŒãã«: 6.8.0-1018-azure
- nvattest CLI:
nvattest 1.2.0+1772475102 (Linux/x86_64)ïŒæ§nv-attestation-sdkã®åŸç¶ïŒ - snpguest: ããŒãžã§ã³0.8.2
- Python: 3.10.12
- tpm2_pytss: ããŒãžã§ã³2.3.0
- tpm2-tools: ããŒãžã§ã³5.2-1build1
- OS: Ubuntu 24.04.1 LTS
- Azure VMã€ã³ã¹ã¿ã³ã¹: Azure Standard DC2ads_v6
- Linuxã«ãŒãã«: 6.14.0-1017-azure-fde
- snpguest: v0.10.0
- Python: v3.12.3
- tpm2_pytss: Commit c7fd022
- tpm2-tools: Commit d15fc36 (次æãªãªãŒã¹v5.8.0)
ãµãŒããšåäžãã·ã³ïŒç°å¢ïŒäžã§ã®åäœã¯ç¢ºèªæžã¿ã
åæã«ã以äžã®ç°å¢ã§ã®ãªã¢ãŒãã§ã®åäœãç¢ºèªæžã¿ã§ããã
- OS: Ubuntu 22.04.3 LTS
- Azure VMã€ã³ã¹ã¿ã³ã¹: Standard_DC4s_v3
- Linuxã«ãŒãã«: 6.8.0-1018-azure
ãã®ä»ããµãŒããšéè€ããŠããåçš®ã©ã€ãã©ãªçã¯ãµãŒãã®ããŒãžã§ã³ã«åãããŠåäœç¢ºèªæžã¿ããŸããæå ã®ç°å¢ã®é¢ä¿äžãã¯ã©ã€ã¢ã³ãåŽã«ã€ããŠã¯Intel SGXã€ã³ã¹ã¿ã³ã¹ïŒStandard_DC4s_v3ïŒã§ãªã¢ãŒãã®åäœç¢ºèªãè¡ã£ãŠããããã¯ã©ã€ã¢ã³ãã»ãµãŒãå ±ã«Intel SGXæ©èœã¯äžåäžèŠã§ãããã¯ã©ã€ã¢ã³ãåŽã¯ãSGXå«ããäžåã®TEEãæèŒããŠããªãã€ã³ã¹ã¿ã³ã¹ã§ã®å®è¡ãåæã«å®è£ ããŠããã
æ¬ãªããžããªã®ãµãŒãã»ã¯ã©ã€ã¢ã³ãã¯ãPythonããã±ãŒãžã requirements.txt ã§ãŸãšããŠç®¡çããŠãããvenvé
äžã§å®è¡ããäºãåæãšããŠãããUbuntu 23.04以éã§ã¯ããããã pip install ã«ããã·ã¹ãã ããã±ãŒãžãžã®çŽæ¥ã€ã³ã¹ããŒã«ãããã©ã«ãã§å¶éãããŠããïŒPEP 668ïŒãããvenvã®äœ¿çšã¯ã»ãŒå¿
é ã«ãªãã
以äžã®å°å
¥æé ã§ã¯ããµãŒãåŽã¯ Humane-RAChain-NS/server/ é
äžãã¯ã©ã€ã¢ã³ãåŽã¯ Humane-RAChain-NS/client/ é
äžã«ãããã venv ãäœæããéçšãåæã«èšè¿°ãããvenvã®äœæã»æå¹åã»äŸåããã±ãŒãžã®å°å
¥ã¯å©çšè
åŽã§äºåã«å®æœããæ¹åŒãšããrun-server.sh çã®å®è¡ã¹ã¯ãªããåŽã§ã¯venvã®æå¹åãpip installã¯è¡ããªãã
venvããã±ãŒãžãå°å ¥ãããŠããªãå Žåã¯ã以äžã®ã³ãã³ãã§å°å ¥ããŠããã
sudo apt install -y python3-venvAzureã®NCCã€ã³ã¹ã¿ã³ã¹ã«å°å ¥ããäºãåæãšã説æããã
-
Humane-RAChain-NSã®ãªããžããªãã¯ããŒã³ããã以éã®åæããã±ãŒãžå°å ¥æé ã§ã¯ãã¯ããŒã³æžã¿ã§ããäºãåæãšããã
git clone https://github.com/acompany-develop/Humane-RAChain-NS.git
-
Pythonãpipãã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯ãå ¬åŒæé ã«åŸãã€ã³ã¹ããŒã«ããŠãããPythonã¯3.10.12ã«ãŠåäœç¢ºèªæžã¿ã§ããã
-
Pythonã§TPMæäœãè¡ãããã«å¿ èŠãªåæããã±ãŒãžãaptã«ãŠã€ã³ã¹ããŒã«ããã
sudo apt -y install libtss2-dev pkg-config python3-dev
-
åŸè¿°ã®Measurementæœåºã®TPMæäœã®éã«äœ¿çšããããã以äžã®ã€ã³ã¹ããŒã«ã宿œããã
sudo apt -y install tpm2-tools
-
å¿ èŠãªPythonããã±ãŒãžã¯
server/requirements.txtã«ãŸãšããŠèšè¿°ããŠããïŒtpm2-pytssã«ã€ããŠã¯PyPIäžã§æªä¿®æ£ã®ãã°ãåé¿ããããGitHubããææ°çãååŸããããã«ããŠããïŒããµãŒãçšã®venvããµãŒããã£ã¬ã¯ããªé äžã«äœæããæå¹åããäžã§ãŸãšããŠå°å ¥ãããcd Humane-RAChain-NS/server/ python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
以éããµãŒãåŽã®æäœïŒåŸè¿°ã®NCCé¢é£ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
run-server.shã®å®è¡çïŒã¯å šãŠsource venv/bin/activateãè¡ã£ãç¶æ ã§å®æœããäºã
-
Humane-RAChain-NSãå®è¡ãããŠãŒã¶ã«ãã°ã€ã³ãã以äžã®ã³ãã³ããå®è¡ãããããã«ãããvTPMã«å¯ŸããŠsudoç¡ãã§ã¢ã¯ã»ã¹ã§ããããã«ãªããå®è¡åŸã¯åèµ·åããäºã§ãã°ã«ãŒã远å ãåæ ãããã
sudo usermod -aG tss $USER newgrp tss
NCC Attestationã宿œããªãå Žåã以äžã®æé ã¯çç¥ããŠããã
-
NCC GPU Attestationã«ã¯ãNVIDIAå ¬åŒé åžã®
nvattestCLIã䜿çšããïŒæ§nv-attestation-sdkã¯DeprecatedïŒãnvattestã¯ã·ã¹ãã ãã€ããªãšããŠPATHäžã«é 眮ããŠããã°ãããPythonã®venvã«ã€ã³ã¹ããŒã«ããå¿ èŠã¯ãªããã€ã³ã¹ããŒã«ãããã«ã¯ããã¡ãã«è¡šç€ºãããŠãã以äžã®ã³ãã³ããå®è¡ãããwget https://developer.download.nvidia.com/compute/nvat/1.2.0/local_installers/nvat-repo-ubuntu2204-1-2-local_1.0-1_amd64.deb sudo dpkg -i nvat-repo-ubuntu2204-1-2-local_1.0-1_amd64.deb sudo cp /var/nvat-local-repo-ubuntu2204-1.2.0/nvat-*-keyring.gpg /usr/share/keyrings/ sudo apt-get update sudo apt-get -y install nvattestãã ããäžèšã³ãã³ãã¯ããŒãžã§ã³ã¢ããããŒãã«äŒŽãå€ããäºãäºæ³ãããããããªã³ã¯å ã§å®éã®ã³ãã³ãã確ãããäºãæšå¥šããããŸããéãOSããŒãžã§ã³ããã£ã¹ããªãã¥ãŒã·ã§ã³ã®å Žåã«ã¯ãäžèšãªã³ã¯å ã«ãŠèªèº«ã®ç°å¢ã«åãããéžæãè¡ãããã®åŸè¡šç€ºãããã³ãã³ãã«åŸãã€ã³ã¹ããŒã«ã宿œããäºã
-
ã€ã³ã¹ããŒã«åŸã以äžã®ã³ãã³ãã§ãã€ããªãPATHäžããèŠããŠããããšã確èªããŠããã
nvattest --version
Humane-RAChain-NSã¯ããµãŒãåŽã®
attester.pyãããã®nvattestãsubprocessçµç±ã§åŒã³åºãã以äžã®2ã¹ãããã§Attestationã宿œãããnvattest collect-evidenceã§ GPU EvidenceïŒSGXã«ãããQuoteçžåœïŒãååŸnvattest attest --verifier localã§Evidenceã®çæ£æ§ãæ€èšŒããAttestation ReportãååŸ
ããã©ã«ãã§ã¯ãåŸè¿°ã®PCR23çªã«ãã®nvattestã®ãã€ããªãExtendãããããã¯ã©ã€ã¢ã³ãåŽã§ã®åèšç®ã®ããã«ã¯ã©ã€ã¢ã³ããšåãããŒãžã§ã³ïŒãã£ã¹ããªãã¥ãŒã·ã§ã³å«ãïŒã®ãã®ãçšæããäºããããã¯ãåŸè¿°ã®èª¬æã«åŸããPCR23çªãžã®æ¡åŒµå¯Ÿè±¡ããé€å€ããäºãå¯èœã§ããã
-
Azureã®å ¬åŒæé ã§ã¯CUDA Toolkitãã€ã³ã¹ããŒã«ãããªããããHumane-RAChain-NSäžã§åäœããã¯ãŒã¯ããŒãåãã®GPUããã°ã©ãã³ã°ãè¡ãæã®ããã«ããããã€ã³ã¹ããŒã«ããŠããã
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update sudo apt -y install cuda-toolkit-13-1
以äžã®ã³ãã³ããå®è¡ããããŒãžã§ã³æ å ±ãåºãã°æ£åžžã«å°å ¥ã§ããŠããã
export PATH=/usr/local/cuda-13.1/bin:$PATH nvcc --version
ãŠãŒã¶ã¯ãŒã¯ããŒãçãOSã«ãŒãã«ãããå ã®ã³ã³ãã³ããæž¬å®ããã«ã¯ãLinuxã®IMAæ©èœãçšããå¿ èŠãããããã£ãŠããã®IMAã«é¢ããèšå®ã宿œããã
-
TDã«ãã°ã€ã³ãã
/etc/ãã©ã«ãé äžã«imaãšãããã©ã«ããäœæãããsudo mkdir /etc/ima
-
äœæãããã©ã«ãã«ç§»åãã
ima-policyãšãããã¡ã€ã«ãäœæããããã以éãäžå®å šãªç¶æ ã§TDã®é»æºãèœã¡ããšåŸ©å äžèœãªç Žå£ãæããããããããããç¶ãæé 以å€ã®æ¹æ³ã§ã¯çµ¶å¯Ÿã«TDãèœãšããªãäºãcd /etc/ima sudo touch ima-policy -
äœæããäžèšãã¡ã€ã«ã«ä»¥äžã®å 容ãèšèŒãããFILE_CHECKã®è¡ã¯ãäžæŠã¯ã³ã¡ã³ãã¢ãŠãã®ãŸãŸã§è¯ããåŸè¿°ã®ãIMAã®è©³çްèšå®ãã»ã¯ã·ã§ã³ã«ãŠããã宿 ã«å³ãã詳现ãªèšå®æ¹æ³ã«ã€ããŠèª¬æããã
# PROC_SUPER_MAGIC dont_measure fsmagic=0x9fa0 # SYSFS_MAGIC dont_measure fsmagic=0x62656572 # DEBUGFS_MAGIC dont_measure fsmagic=0x64626720 # TMPFS_MAGIC dont_measure fsmagic=0x1021994 # DEVPTS_SUPER_MAGIC dont_measure fsmagic=0x1cd1 # BINFMTFS_MAGIC dont_measure fsmagic=0x42494e4d # SECURITYFS_MAGIC dont_measure fsmagic=0x73636673 # SELINUX_MAGIC dont_measure fsmagic=0xf97cff8c # SMACK_MAGIC dont_measure fsmagic=0x43415d53 # CGROUP_SUPER_MAGIC dont_measure fsmagic=0x27e0eb # CGROUP2_SUPER_MAGIC dont_measure fsmagic=0x63677270 # NSFS_MAGIC dont_measure fsmagic=0x6e736673 # 枬å®å¯Ÿè±¡åã³æž¬å®ããªã¬ã®èšå® # ããã°ã©ã ã®å®è¡ã«éããŠMMAPããããã¡ã€ã«ã®æž¬å® measure func=MMAP_CHECK mask=MAY_EXEC # å®è¡ããããã€ããªããã°ã©ã ã®æž¬å® measure func=BPRM_CHECK mask=MAY_EXEC # root (uid=0) ã«ãã£ãŠopenããããã¡ã€ã«ã®æž¬å® # measure func=FILE_CHECK mask=MAY_READ uid=0 # ããŒããããã«ãŒãã«ã¢ãžã¥ãŒã«ã®æž¬å® measure func=MODULE_CHECK # ã«ãŒãã«ã«ããŒãããããã¡ãŒã ãŠã§ã¢ã®æž¬å® measure func=FIRMWARE_CHECK -
VMã€ã³ã¹ã¿ã³ã¹ãåèµ·åããã
-
Humane-RAChain-NSã®ãªããžããªãã¯ããŒã³ããã以éã®åæããã±ãŒãžå°å ¥æé ã§ã¯ãã¯ããŒã³æžã¿ã§ããäºãåæãšããã
git clone https://github.com/acompany-develop/Humane-RAChain-NS.git
-
ãµãŒãã®å°å ¥æé åæ§ãPythonãpipãã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯ãå ¬åŒæé ã«åŸãã€ã³ã¹ããŒã«ããŠãããPythonã¯3.10.12ã«ãŠåäœç¢ºèªæžã¿ã§ããã
-
TPMæäœïŒTPM Quoteæ€èšŒïŒã«å¿ èŠãªä»¥äžã®ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ã宿œããã
sudo apt -y install tpm2-tools
2026幎2æçŸåšãtpm2-toolsã®ææ°ããŒãžã§ã³5.7ã§æªä¿®æ£ã®ãã°ãååšããæ¬ãªããžããªã¯äžéšã®ãã°ã®åœ±é¿ãåãããåœè©²ãã°ã¯æ¬¡æãªãªãŒã¹5.8ã§ä¿®æ£äºå®ã§ãããåœé¢ã®éã¯ã以äžã®ã³ãã³ãã«ãããGitHubãããããé©çšæžã¿ã®ææ°çãèªåã§ãã«ãããã
sudo apt install -y build-essential autoconf autoconf-archive automake libtool pkg-config libssl-dev libtss2-dev libcurl4-openssl-dev git clone https://github.com/tpm2-software/tpm2-tools.git cd tpm2-tools ./bootstrap mkdir -p build cd build ../configure make -j"$(nproc)" cd tools sudo install -m 0755 ./tpm2 /usr/local/bin/tpm2 sudo ln -sf /usr/local/bin/tpm2 /usr/local/bin/tpm2_checkquote
-
SEV-SNP Attestation ReportãVCEK Certã®æ€èšŒã«çšãããsnpguestãšããã«å¿ èŠãªRustã®ã€ã³ã¹ããŒã«ã宿œããã
sudo apt install -y build-essential clang curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" git clone https://github.com/virtee/snpguest.git cd snpguest cargo build -r
-
å¿ èŠãªPythonããã±ãŒãžïŒ
requestsãcryptographyãpyyamlãåã³IMAãã°æ€èšŒçšã®IMA-PCR-UtilsïŒã¯client/requirements.txtã«ãŸãšããŠèšè¿°ããŠãããã¯ã©ã€ã¢ã³ãçšã®venvãã¯ã©ã€ã¢ã³ããã£ã¬ã¯ããªé äžã«äœæããæå¹åããäžã§ãŸãšããŠå°å ¥ãããcd Humane-RAChain-NS/client/ python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt
以éãã¯ã©ã€ã¢ã³ãåŽã®æäœïŒåŸè¿°ã®NCCé¢é£ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
client.pyã®å®è¡çïŒã¯å šãŠsource venv/bin/activateãè¡ã£ãç¶æ ã§å®æœããäºã
NCC Attestationã宿œããªãå Žåã以äžã®æé ã¯çç¥ããŠããã
-
ã¯ã©ã€ã¢ã³ãåŽã§NCCã®Evidenceãããã«ãã§ãã¯ïŒ
settings.yamlã®verify_ncc_flag: trueïŒããå Žåã¯ããµãŒãåŽãšåæ§ã«NVIDIAå ¬åŒé åžã®nvattestCLIãã¯ã©ã€ã¢ã³ãç°å¢ã®PATHäžã«é 眮ããŠããå¿ èŠãããïŒæ§nv-attestation-sdkã¯DeprecatedïŒããã¡ããPythonã®venvã«ã€ã³ã¹ããŒã«ããå¿ èŠã¯ãªããã€ã³ã¹ããŒã«åŸã以äžã®ã³ãã³ãã§ãã€ããªãPATHäžããèŠããŠããããšã確èªããŠããã
nvattest --version
Humane-RAChain-NSã®ã¯ã©ã€ã¢ã³ãã¯ããµãŒãããåä¿¡ããEvidenceé åãäžæãã¡ã€ã«ã«æžãåºãã
nvattest attest --verifier local --gpu-evidence-source fileãsubprocessçµç±ã§åŒã³åºãäºã§åæ€èšŒãè¡ããããã©ã«ãã§ã¯ãåŸè¿°ã®PCR23çªã«ãã®nvattestã®ãã€ããªãExtendãããããã¯ã©ã€ã¢ã³ãåŽã§ã®åèšç®ã®ããã«ãµãŒããšåãããŒãžã§ã³ïŒãã£ã¹ããªãã¥ãŒã·ã§ã³å«ãïŒã®ãã®ãçšæããäºããããã¯ãåŸè¿°ã®èª¬æã«åŸããPCR23çªãžã®æ¡åŒµå¯Ÿè±¡ããé€å€ããäºãå¯èœã§ããã
ãšã«ããå®è¡ç¢ºèªã ããããå Žåã¯ããã®ã»ã¯ã·ã§ã³ã§ã¯expected_measurement.datã®ååŸãšPLATFORM_INFOã®æå®ïŒ[2, 2, 2, 2, 2, 2]ãšãããšå
šãŠã®PLATFORM_INFOæ€èšŒãã¹ãããããïŒã®ã¿ç¢ºèªã»å®æœããåŸç¶ã®ãå®è¡ãã»ã¯ã·ã§ã³ã®æé ã«åŸãå®è¡ããäºãå§ããã
-
PCRãã³ã¯23çªã«ç»é²ãããHumane-RAChain-NSã®åã¹ã¯ãªãããNCC Attestationçšããªã·ãåã³ã©ã³ã¿ã€ã ã¯ãŒã¯ããŒãïŒHumane-RAChain-NSã«ããRAåçåŸã«å®è¡ãããã¹ã¯ãªããïŒã¯ã
Humane-RAChain-NS/server/attester.pyã®ä»¥äžã®éšåã§èšå®ããŠããã# PCR Extend察象ã®Humane-RAChain-NSã¹ã¯ãªãããã¡ã€ã«å PCR_EXTEND_TARGET_HUMANE_BASE = [ "api.py", "attester.py", "cert_gen.py", ] # NCC Attestationæå¹æã«è¿œå ããããã¡ã€ã« PCR_EXTEND_TARGET_HUMANE_GPU = [ "policy/server_gpu_ra_policy.json", "/usr/bin/nvattest", ] # ... # PCR Extend察象ã®ã¯ãŒã¯ããŒããã¡ã€ã«å PCR_EXTEND_TARGET_WORKLOADS = [ "sample.py" ]
ããHumane-RAChain-NSæ¬äœã®ã¹ã¯ãªããæ§æãNCC Attestationããªã·ãã¡ã€ã«æ§æã«å€æŽãå ããå Žåã«ã¯ãäžåŽã®
PCR_EXTEND_TARGET_HUMANEéšåã®ç·šéãå¿ããªãããã«ããäºãããã«èšèŒãããŠããªããã¡ã€ã«ã¯ãTPM Quoteäœæã®éã«PCRãã³ã¯23çªã«æž¬å®å€ãç»é²ãããªããªãã
äžæ¹ã§ãã©ã³ã¿ã€ã ã¯ãŒã¯ããŒãã®æ¹ã倿Žããå Žåã¯ãäžåŽã®PCR_EXTEND_TARGET_WORKLOADSã®æ¹ã«è¿œèšã倿Žãé©çšããäºãäŸãã°ãããã©ã«ãã®ãµã³ãã«ã¹ã¯ãªãã以å€ãå®è¡ãããå Žåã«ã¯ãå¿ ããã®éšåã®å€æŽãå¿ èŠã«ãªãã
ãã©ã«ããæå®ãããšããã®äžèº«ã«ã€ããŠãååž°çã«æž¬å®ããã -
NRASã®URLã¯ã
Humane-RAChain-NS/server/attester.pyã®attest_ncc()å ã®ä»¥äžã®éšåã§æå®ããŠãããNRAS_URL = "https://nras.attestation.nvidia.com/v3/attest/gpu"
NRASã®APIããŒãžã§ã³ãã¢ããããŒããããçãäœããã®çç±ã§ãã®ãšã³ããã€ã³ãæå®ã«å€æŽãå ãããå Žåã«ã¯ããã®éšåãçŽæ¥å€æŽããã
-
TPM Quoteã®çæã®éãã©ã®PCRãã³ã¯ãå«ãããã«ã€ããŠã¯ã
Humane-RAChain-NS/server/attester.pyã®get_tpm_quote()å ã®ä»¥äžã®éšåã§æå®ããŠããã# PCRãªã¹ããã¡ã€ã«ã®çæ # ããã©ã«ãã§ã¯0ã10ã12ã14ã23çªã®PCRãã³ã¯ãå«ãã # å šãŠã®PCRãã³ã¯ãå«ããå Žå㯠sha256:all ãšæå®ãã selector_str = "sha256:0,1,2,3,4,5,6,7,8,9,10,12,14,23" pcr_indices = selector_str_to_pcr_indices(selector_str)
-
çŸç¶ãIMAãã¡ã€ã«ã¯CVMå ã«ååšããããªã·ãšãã°ãã³ããŒããŠã¯ã©ã€ã¢ã³ãã«æç€ºããã ãã§ããïŒPCRãã³ã¯10çªãžã®IMAé¢é£ããã·ã¥ã®é©çšã¯èªåçã«å®æœãããŠããïŒãããããã®ãã¡ã€ã«ã®äœçœ®æå®ã¯
Humane-RAChain-NS/server/run-server.shã«ãŠå®æœããŠãããSRC_POLICY="/etc/ima/ima-policy" SRC_MEASUREMENTS="/sys/kernel/security/ima/ascii_runtime_measurements"
ç°å¢ã®çžéçã«ãããäœããã®çç±ã§ãã®ãã¹ã倿Žããå¿ èŠãããå Žåã¯ãäžèšã®ç®æã倿Žããã
-
ã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ããåä¿¡ããããŒãã倿Žãããå Žåã«ã¯ã
Humane-RAChain-NS/server/api.pyã®ä»¥äžã®éšåïŒport=8080ïŒãçŽæ¥å€æŽãããconfig = uvicorn.Config( app=app, host="0.0.0.0", port=8080, ssl_certfile=cert_file_path, ssl_keyfile=key_file_path, ) config.load() config.ssl.options |= ssl.OP_NO_TICKET server = uvicorn.Server(config) server.run()
-
ãã«ããã
snpguestã®ååšãããã£ã¬ã¯ããªã®ãã¹ãclient/settings.yamlå ã®# snpguest_path = "$HOME/snpguest/target/release" snpguest_path: "~/snpguest/target/release"
ã§æå®ãããããã©ã«ãèšå®ã¯ããã°ã€ã³äžã®ããŒã ãã£ã¬ã¯ããªçŽäžïŒäŸïŒ
/home/username/é äžïŒã«snpguestãã¯ããŒã³ããŠãã«ãããå Žåã®ãã¹ã§ããããã以å€ã®å Žæã«ã¯ããŒã³ããå Žåãããããã°ãã«ããå®è¡ããå Žåã¯é©å®ãã¹ãä¿®æ£ããäºã -
NCCé察å¿ã®SEV-SNP CVMã䜿çšããŠããçãNCC Attestationã宿œããªãå Žåã¯ã
client/settings.yamlå ã®ä»¥äžã®é ç®ãtrueããfalseã«å€æŽããã# NCC Attestationãæå¹ãç¡å¹ãã®ãã©ã°ãtrueã§æå¹ã gpu_enabled: true
-
SEV-SNPã®Attestationã®ããã«ã¯ãäºãSEV-SNPã®MeasurementïŒåäžæ§æž¬å®å€ïŒãååŸããŠããå¿ èŠããããäŸãã°äºåã«ä¿¡é Œå¯èœãªç¶æ³äžïŒäŸïŒVMãããã€åã®æå ïŒã§CVMã«ãã°ã€ã³ãã
Humane-RAChain-NS/subtools/measurement_extractor.pyãå®è¡ããäºã§ãexpected_measurement.datãçæããŠãããcd subtools python3 measurement_extractor.pyããã©ã«ãã§ã¯ããµãŒããšã¯ã©ã€ã¢ã³ããããŒã«ã«ãã¹ãäžã§åäœãããæ§æã§ã®èšå®ã«ããŠãããããåã«ãã®ã¹ã¯ãªãããå®è¡ããã°ãèªåçã«
clientãã©ã«ãé äžã«äžèšã®datãã¡ã€ã«ãæ ŒçŽãããããªã¢ãŒãã§å®è¡ããå Žåçã¯ãçæãããdatãã¡ã€ã«ãã¯ã©ã€ã¢ã³ãç°å¢ã®clientãã©ã«ãçŽäžã«èªåã§ç§»åãããã -
ãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠã¯ãHumane-RAChain-NSã®ãµãŒãåŽãœãŒã¹ãã©ã³ã¿ã€ã ã¯ãŒã¯ããŒãã®å®è£ ã³ãŒããéå ¬éã«ãããããããã¯ããããã¯ã©ã€ã¢ã³ãåŽã§ãã¡ã€ã«ããã·ã¥ã®åèšç®ãããããªãããšããã±ãŒã¹ãååã«èããããããã®ãããªå Žåãäºãæž¡ããããçšæãããããããã·ã¥ãªã¹ãã§PCR23ã®åçŸåŠçãè¡ããªãã·ã§ã³ãæäŸããŠããã
client/settings.yamlã®ä»¥äžã®éšå# PCR23çªã®ããã·ã¥ãã§ãã¯ã®éãã¯ã©ã€ã¢ã³ãåŽã§ããã·ã¥åèšç®ãè¡ãã®ã§ã¯ãªãã # åã«æž¡ãããããã·ã¥ãªã¹ããTPM Quoteã®PCR23çªå€ãšæ¯èŒãããå Žåã¯ã # 以äžã®å€æ°ã«falseãèšå®ãããããã·ã¥ãªã¹ãã®çæã«ã¯ã # subtools/hashlist_generator.pyã䜿çšå¯èœã # åèšç®ãããå Žåã¯Trueã«ããäºã recalculate_pcr23_flag: true
ãtrueããfalseã«å€ãããšã
clientãã©ã«ãçŽäžã®expected_pcr23_hash.datå ã®ããã·ã¥ãªã¹ãã«ããçŽæ¥Extendã宿œããïŒãã¡ã€ã«ããã·ã¥ã®åèšç®ã¯è¡ããªãïŒããã®ããã·ã¥ãªã¹ããã¡ã€ã«ã¯ãsubtools/hashlist_generator.pyã«ããçæã§ãããcd subtools/ python3 hashlist_generator.py
NCC Attestationãç¡å¹ã«èšå®ããŠããå Žåã¯ã以äžã®ããã«
--no-gpuãã©ã°ãç«ãŠãŠå®è¡ãããpython3 hashlist_generator.py --no-gpu
ãã¡ã€ã«ä»¥å€ã®ãRAã»ãã·ã§ã³ããšã«åçã«æž¡ãããAttestation蚌跡ã«ã€ããŠã¯ããã®ãªãã·ã§ã³ã«é¢ãããåä¿¡ããããŒã¿ããã®ããã·ã¥åèšç®ã宿œããã
ããPCR23察象ã®ãã¡ã€ã«ã倿Žããå Žåã¯ãhashlist_generator.pyé äžã®ä»¥äžã®éšåãç·šéããäºã# PCR Extend察象ã®Humane-RAChain-NSã¹ã¯ãªãããã¡ã€ã«åïŒGPUç¡ãïŒ PCR_EXTEND_TARGET_HUMANE_BASE = [ "../server/api.py", "../server/attester.py", "../server/cert_gen.py", ] # GPUæå¹æã«è¿œå ããããã¡ã€ã« PCR_EXTEND_TARGET_HUMANE_GPU = [ "../server/policy/server_gpu_ra_policy.json", "/usr/bin/nvattest", ] # PCR Extend察象ã®ã¯ãŒã¯ããŒããã¡ã€ã«å PCR_EXTEND_TARGET_WORKLOADS = ["../server/sample.py"]
-
PLATFORM_INFOãšãããSEV-SNPã®æ§æïŒåè¿°ã®SMTæå¹åç¶æ³çïŒã瀺ããããåãAttestation Reportã«å«ãŸããHumane-RAChain-NSã§ããã®æ€èšŒãè¡ã£ãŠãããã¯ã©ã€ã¢ã³ãã¯ã
Humane-RAChain-NS/client/settings.yamlã®ä»¥äžã®éšåã§ãæåŸ ããå€ãæå®å¯èœã§ããã# SEV-SNP Reportå ã®PLATFORM_INFOã®ãã§ãã¯ã«äœ¿ããªã¹ãã # ãµã€ãºã¯6ã§ãããé ããé ã«SMTæå¹ãééçSMEæå¹ãECCæå¹ãRAPLç¡å¹ã # DRAMã®æå·æé èœæ©èœæå¹ãBadRAM軜æžçæå¹ã«ã€ããŠä¿æããã # 0ã1ã§æåŸ ãããã®ãå ¥ãããæ€èšŒããªãé ç®ã®ã¡ã³ãã¯2ã«ããŠããã expected_platform_info: [0, 2, 0, 0, 0, 2]
åèŠçŽ ã«å¯Ÿå¿ããæ§ææ©èœã®èª¬æã¯ä»¥äžã®éãïŒå é ã®0çªç®èŠçŽ ãã説æïŒïŒ
- åæãã«ãã¹ã¬ããã£ã³ã°ïŒSMTïŒãæå¹åãããŠãããã0ã¯ç¡å¹ã1ã¯æå¹ã瀺ããSMTã¯ç¹ã«TEEã®æèã§ã¯æ§ã ãªæ»æã«æªçšãããäºãå€ããããç¡å¹åãããŠããäºãæãŸããã
- ééçSMEãæå¹åãããŠãããã0ã¯ç¡å¹ã1ã¯æå¹ã瀺ããCãããã«é¢ä¿ãªããå šãŠã®ã¡ã¢ãªãèªåçã«æå·åããããAMD SMEã®æ©èœã
- ECCãæå¹åãããŠãããã0ã¯ç¡å¹ã1ã¯æå¹ã瀺ããECCãæå¹åãããŠãããšãæå³ããªãã¡ã¢ãªã®ãããå転ãããããã¯æå³çã«ã¡ã¢ãªããããå転ãããæ»æïŒRowHammeræ»æçïŒã«å¯Ÿããäžå®ã®èæ§ãåŸãããã
- RAPLãç¡å¹åãããŠãããã0ã¯æå¹ã1ã¯ç¡å¹ãRAPLãšã¯CPUã¬ãã«ã§æäŸãããŠããæ¶è²»é»åç£èŠã€ã³ã¿ãã§ãŒã¹ã§ããããæå¹åãããŠãããšSGXã«ãããPLATYPUSãã¯ãããšãããããªãäžå®ã®ãµã€ããã£ãã«æ»æã«æªçšãããå¯èœæ§ãããç¹ã«æ³šæã
- SEV-SNPã®Ciphertext Hidingãæå¹åãããŠãããã0ã¯ç¡å¹ã1ã¯æå¹ã瀺ãããããæå¹åãããŠãããšãSEV-SNPã§ä¿è·ãããã¡ã¢ãªãå€åŽããèªã¿åºããå Žåãéåžžã¯æå·æãåŸãããæãç¹å®ã®åºå®å€ãè¿ãããã«ãªããSGXã«ãããAbort Page Semanticsã«è¿ãæ©èœã
- BadRAMæ»æã«å¯Ÿãã軜æžçãæå¹åãããŠãããã0ã¯ç¡å¹ã1ã¯æå¹ã瀺ããæå¹åãããŠããã«è¶ããäºã¯ç¡ããã2025幎1æçŸåšã§ã¯ãŸã ãã®ãããã䜿ãããŠããªãã±ãŒã¹ãå€ããšæãããã
以äžãèžãŸããåºæ¬çã«ã¯0ãŸãã¯1ã§æåŸ ããããããæå®ããããã ããã©ã¡ãã§ãè¯ããšå€æãããã®ã«é¢ããŠã¯ã2ãšæå®ããäºã«ããããã®æ€èšŒã®ã¹ããããæå®ã§ãããåè¿°ã®
expected_platform_info = [0, 2, 0, 0, 0, 2]ã¯ããããèžãŸãããšä»¥äžã®æå³ãæã€äºã«ãªãïŒ- SMTç¡å¹åãèŠæ±
- ééçSMEã®æå¹åç¶æ³ã¯é¢ç¥ããªã
- ECCç¡å¹åãèŠæ±
- RAPLæå¹åãèŠæ±
- Ciphertext Hidingç¡å¹åãèŠæ±
- BadRAMè匱æ§è»œæžçã¯é¢ç¥ããªã
ãã ããããã¯ãã®ã»ããã¢ãããæé©ã§ããäºã瀺ããã®ã§ã¯æ±ºããŠç¡ããã»ãã¥ãªãã£é¢ã ãã§èŠãã°ã
[0, 2, 1, 1, 1, 1]ãæåã§ã¯ããããããããæºããããã¯ã¯ã©ãŠãã®çšæããŠãããã·ã³ã«ã匷ãäŸåããããã£ãŠãèªèº«ã®ããŒãºãç°å¢ã«åããããã®éšåã¯æè»ã«å€æŽããäºãã¡ãªã¿ã«ã察象CVMã§PLATFORM_INFOãã©ããªã£ãŠããããçŽæ¥ç¢ºèªãããå Žåã«ã¯ã以äžã®ããã«SEV-SNP Attestation Reportã確èªããäºã§ãã§ãã¯ã§ããïŒCVMäžã§å®è¡ããïŒïŒ
export PATH=$PATH:$HOME/snpguest/target/release tpm2_nvread -C o 0x01400001 > ./snp_report.bin dd skip=32 bs=1 count=1184 if=./snp_report.bin of=./guest_report.bin snpguest display report guest_report.bin
snpguest displayã®å®è¡çµæã«ã¯ã以äžã®ããã«PLATFORM_INFOã«é¢ããæ å ±ãå«ãŸããŠããïŒBadRAM軜æžçã«å¯Ÿå¿ããALIAS_CHECK_COMPLETEã€ããŠã¯çŸæç¹ã§ã¯æªå¯Ÿå¿ïŒïŒPlatform Info (0): SMT Enabled: 0 TSME Enabled: 0 ECC Enabled: 0 RAPL Disabled: 0 Ciphertext Hiding Enabled: 0
-
CVMã®URLæå®ã¯ã
client/configs.yamlã®ä»¥äžã®éšåã§å®æœããŠããããããªã¢ãŒãã§å®è¡ããå Žåç倿Žã®éã«ã¯ããã®éšåãç·šéããã# æ«å°Ÿã®"/"ãå¿ããªãããã«ããäºã server_url: "https://localhost:8080/"
-
PCRãã³ã¯23çªã«æž¬å®å€ãç»é²ãããŠããäºãæåŸ ãããHumane-RAChain-NSã®ã¹ã¯ãªãããããªã·ããããŠã©ã³ã¿ã€ã ã¯ãŒã¯ããŒãã¯ãã¯ã©ã€ã¢ã³ãåŽã§ã¯
Humane-RAChain-NS/client/ra_verifier.pyã®ä»¥äžã®éšåã«ãããŠåæããŠããïŒ# PCR Extend察象ã®Humane-RAChain-NSã¹ã¯ãªãããã¡ã€ã«å PCR_EXTEND_TARGET_HUMANE_BASE = [ "../server/api.py", "../server/attester.py", "../server/cert_gen.py", ] # NCC Attestationã«è¿œå ããããã¡ã€ã« PCR_EXTEND_TARGET_HUMANE_GPU = ["../server/policy/server_gpu_ra_policy.json"]
ãµãŒãã®èšå®æåæ§ãå¿ èŠã«å¿ããŠãã®éšåã远èšã»å€æŽã®äºããªãããªã¢ãŒãã§ã¯ã©ã€ã¢ã³ããåäœãããå Žåãã¯ã©ã€ã¢ã³ãã®æå ã«ãããµãŒãçšã¹ã¯ãªããã»ããªã·ãšããµãŒãã§å®éã«äœ¿çšãããŠãããã®ïŒãµãŒãåŽã§PCR23çªã«ç»é²ããããã®ïŒã¯ãå®å šã«äžèŽãããã®ã§ãããšããåæãããããã£ãŠããããã«å¯ŸããŠäœããã®å€æŽãå ããå Žåã«ã¯ããµãŒããšã¯ã©ã€ã¢ã³ãåæ¹ã«é 眮ãããŠãããµãŒãé¢ä¿ãã¡ã€ã«ããå šãåã圢ã§å€æŽããå¿ èŠãããïŒã§ãªããšPCR23çªã®ããã·ã¥ãã§ãã¯ã«å€±æããïŒã
-
NRASã®URLã¯ã
Humane-RAChain-NS/client/ra_verifier.pyã®verify_ncc_attestation()å ã®ä»¥äžã®éšåã§æå®ããŠãããNRAS_URL = "https://nras.attestation.nvidia.com/v3/attest/gpu"
NRASã®APIããŒãžã§ã³ãã¢ããããŒããããçãäœããã®çç±ã§ãã®ãšã³ããã€ã³ãæå®ã«å€æŽãå ãããå Žåã«ã¯ããã®éšåãçŽæ¥å€æŽããã
-
çŸç¶ã§ã¯ããã¡ãŒã ãŠã§ã¢å±€ã«çžåœããPCR0ã7ã®ããã·ã¥å€ããã¯ã©ã€ã¢ã³ãåŽã«ãŠãã¡ãŒã ãŠã§ã¢ãœãŒã¹ãããã«ããããã·ã¥ãåçŸããæ©èœã¯æªå®è£ ã§ãããå¿ èŠãªå Žåã«ã¯ãåçŸããããã·ã¥ãçšæããäžã§ã
Humane-RAChain-NS/client/ra_verifier.pyã®verify_response()颿°ã®å ãcheck_tpm_quote()颿°ã®æ£åžžå®è¡ãå®äºããåŸã§PCR0ã7ã®æ€èšŒåŠçã宿œãããšè¯ãã -
NCC Attestationã®Evidenceã®èªåæ€èšŒãå¿ èŠãšããªãå Žåã«ã¯ãäœ¿çšæ¹æ³ã®ã»ã¯ã·ã§ã³ã§ãèšè¿°ã®éãã
verify_reponse()颿°ã®åŒã³åºãæã®åœè©²åŒæ°ïŒHumane-RAChain-NS/client/settings.yamlã§ã¯verify_ncc_flagïŒãFalseã«ããã -
IMAãã°ã®åãšã³ããªã®æ€èšŒã宿œããå Žåã¯ã
Humane-RAChain-NS/client/settings.yamlã®ä»¥äžã®éšåã§æ€èšŒããªã·ã®ãã¹ãæå®ããã# IMA appraise policyãã¡ã€ã«ïŒYAMLïŒãžã®ãã¹ãclient.pyããã®çžå¯Ÿãã¹ã # ãããã¯çµ¶å¯Ÿãã¹ã§æå®ãããsubtools/ima_appraise_policy_generator.pyã§ # çæå¯èœãverify_pcr10_flagãtrueã®å Žåã®ã¿åç §ãããã ima_appraise_policy_path: "ima_appraise_policy.yaml"
ima_appraise_policy.yamlã¯æž¬å®å¯Ÿè±¡ã®ãã¹ïŒfnmatchãã©ãŒãããïŒåã³ããã·ã¥å€ã®Allowãªã¹ãïŒãŸãã¯Denyãªã¹ãïŒãããªããhome_Humane_RAChain_NS_server_sh: path: /home/**/Humane-RAChain-NS/server/*.sh allow: - 28f97e660dd1061224c64ee4ad9d3a63c9b402465323de962f70ee318d8a88e7 home_Humane_RAChain_NS_server_py: path: /home/**/Humane-RAChain-NS/server/*.py allow: - 0dce80960c8b3464639aeb7a49eb8a1f13964617f3c06c095db8795a4069245a - 0e0de7474b3e4b368d518fd657b4fd6701b27c962b258992dd55e418b96262aa - 4ed066d8cc9ea214d78d7de5ad65b76e953c82023efe43f76c1006a3403a5e4b - aebf70b1aa84c4bdccd288462ae4c4cb7228695ae27797b0e5c2325481b95a9b home_Humane_RAChain_NS_server_policy_server_gpu_ra_policy_json: path: /home/**/Humane-RAChain-NS/server/policy/server_gpu_ra_policy.json allow: - 61e6919e3834b4a07a857de19e475695fa7db1d9bd3d247e8ce828ed8fcbf59b usr_bin_python3: path: /usr/bin/python3 allow: - e1efa562c2cc2e35521a5c9c9b9939921001ff8ca9708a13ef15ace68cc2ccd7
äŸãã°ãäºåã«ä¿¡é Œå¯èœãªç¶æ³äžã§CVMã«ãã°ã€ã³ãã
Humane-RAChain-NS/subtools/ima_appraise_policy_generator.pyãå®è¡ããããšã«ããããã®æç¹ã§ã®ã¿ãŒã²ãããã¡ã€ã«ã®ããã·ã¥å€ã«åºã¥ããIMAæ€èšŒããªã·ãèªåçæã§ãããpython3 ima_appraise_policy_generator.py
IMAæ€èšŒããªã·çææã®æž¬å®ã¿ãŒã²ããã¯
ima_appraise_policy_generator.pyã®ä»¥äžã®ç®æã§èšå®ãããŠããã# IMA appraise policyãšããŠæå®ããããã¹ã®ãã¿ãŒã³ã®ãªã¹ãã # åèŠçŽ ã¯globïŒããã³å®è¡æã«ã¯fnmatchïŒãšããŠè§£éããããã¹ãã¿ãŒã³ã # ååž°å±éãããå Žå㯠"**" ãå«ããŠãæ¬ã¹ã¯ãªããã¯glob.glob(recursive=True)ã§å±éããã # 泚: å®è¡æã®ç §åã¯fnmatch.fnmatchcaseãªã®ã§ãã§ããã ãå®éã®IMA logäžã® # file_pathãšäžèŽããããã«å³å¯ãªãã¿ãŒã³ãæžãããšã APPRAISE_TARGETS = [ "/home/**/Humane-RAChain-NS/server/*.sh", "/home/**/Humane-RAChain-NS/server/*.py", "/home/**/Humane-RAChain-NS/server/policy/server_gpu_ra_policy.json", "/usr/bin/python3", ]
Humane-RAChain-NSããã®ãŸãŸå®è¡ããå Žåã®å®è¡æé ã«ã€ããŠèª¬æããã
ãµãŒãçšvenvãæå¹åããç¶æ
ã§ã以äžã®ã³ãã³ãã§å®è¡ã·ã§ã«ã¹ã¯ãªãããå®è¡ãããrun-server.sh èªäœã¯venvã®æå¹åãäŸåããã±ãŒãžã®å°å
¥ãè¡ããªããããå°å
¥æé ã«åŸã£ãŠäºåã« venv ãäœæããsource venv/bin/activate ãæžãŸããŠããå¿
èŠãããã
cd Humane-RAChain-NS/server/
source venv/bin/activate
./run-server.shNCC Attestationãç¡å¹ã«èšå®ããå Žåã¯ã以äžã®ããã« --no-gpu ãã©ã°ãç«ãŠãŠå®è¡ããã
source venv/bin/activate
./run-server.sh --no-gpuå®è¡äŸã¯ä»¥äžã®éãïŒæšæºåºåã倧ããããããã°ã®æåŸã®æ¹ã®ã¿æ²èŒïŒïŒ
[Fetch TPM Attestation PubKey]
Fetched TPM Attestation PubKey successfully.
[Reset PCR bank 23]
PCR 23 was successfully reset.
[Extend PCR with evidences]
Extended PCR 23 with VCEK Cert/AK Pub successfully.
Extended PCR 23 with NCC evidences successfully.
[Get TPM Quote]
Generated TPM Quote successfully.
Generated PCR values list successfully.
[Get IMA-related files]
Got IMA-related files successfully.
INFO: 127.0.0.1:36756 - "POST /attestation HTTP/1.1" 200 OK
[Execute sample secret addition]
Added secrets successfully.
INFO: 127.0.0.1:36756 - "POST /sample-addition HTTP/1.1" 200 OKã¯ã©ã€ã¢ã³ãçšvenvãæå¹åããç¶æ
ã§ã以äžã®ã³ãã³ãã«ãã client.py ãå®è¡ãããå°å
¥æé ã«åŸã£ãŠäºåã« venv ãäœæããsource venv/bin/activate ãæžãŸããŠããå¿
èŠãããã
cd Humane-RAChain-NS/client/
source venv/bin/activate
python3 client.pyå®è¡äŸã¯ä»¥äžã®éãïŒæšæºåºåã倧ããããæç²ïŒïŒ
GPU attestation: disabled
[Send attestation challenge]
Generated Nonces:
NCC Nonce: 5aab8cd9863372289fb2ad9fb9a412e9ab09545926537ac5afccdd80e1820f08
TPM Nonce: e3891742fbd624d256fb2acb119f7c699abc24722954f16bec4cafa9a80dd136
SNP Nonce: 75bef4d5574b8a3625c09e3ec796d7f692cf2e0e12f5cc1ec84b0037a3d9bafae16129df2a9cadd103290b1abf51c4d782a1caee0206676a8d8ad4cd069c6343
...
[Verify HCL Report Data binding]
REPORT_DATA expected (sha256, zero-padded) ->
c855dd11a2ba68ab08653b6becb99e91cc22ca9257db5b596ee3605636b8b3710000000000000000000000000000000000000000000000000000000000000000
REPORT_DATA actual ->
c855dd11a2ba68ab08653b6becb99e91cc22ca9257db5b596ee3605636b8b3710000000000000000000000000000000000000000000000000000000000000000
SNP REPORT_DATA matches hash of Runtime Claims.
Runtime Claims user_data matches client-supplied nonce.
[Verify VCEK Cert with ARK Cert]
The AMD ARK was self-signed!
The AMD ASK was signed by the AMD ARK!
The VCEK was signed by the AMD ASK!
SEV-SNP VCEK is valid.
[Verify SEV-SNP Report]
Reported TCB Boot Loader from certificate matches the attestation report.
Reported TCB TEE from certificate matches the attestation report.
Reported TCB SNP from certificate matches the attestation report.
Reported TCB Microcode from certificate matches the attestation report.
VEK signed the Attestation Report!
SEV-SNP's measurement hash->
e14f74982d655d4cbd686b91bcb9431ddb98b6e210e59647089d203035cf99d9a76efbdee19f0958ff3f1aa4518e86e0
Expected measurement ->
e14f74982d655d4cbd686b91bcb9431ddb98b6e210e59647089d203035cf99d9a76efbdee19f0958ff3f1aa4518e86e0
...
[Verify PCR 10]
Received PCR 10 hash (IMA related PCR) ->
f0d6af60d98acded3c1d509922d1d0579e210dc3431fee065631e03f30d36b18
Calculated PCR 10 hash ->
f0d6af60d98acded3c1d509922d1d0579e210dc3431fee065631e03f30d36b18
Received PCR 10 hash matched calculated PCR 10 hash.
[Verify boot_aggregate]
Received boot_aggregate ->
bbdbca85a82cf96aad024bdfedaa4fcc791d857b338b6f7c5a4625bce0118ac4
Calculated boot_aggregate ->
bbdbca85a82cf96aad024bdfedaa4fcc791d857b338b6f7c5a4625bce0118ac4
Received boot_aggregate matched calculated boot_aggregate.
[Appraise IMA log against IMA appraise policy]
IMA appraise policy path -> /home/azureuser/Humane-RAChain-NS/client/ima_appraise_policy.yaml
IMA appraisal passed: 525 entries (1 allow, 524 neutral).
IMA evidences verification passed.
[Skip NVIDIA CC Attestation]
Accepted RA. Proceed to next process.
Pinned session to attested cert (SHA-256 DER): 089413c0c2f90cb264f5356910955aa909322c27371b3512e69a6f1a16945145
[Request sample secret addition]
Sample secret addition result ->
300Humane-RAChain-NSã®ãµãŒãåŽã«AttestationèŠæ±ãéããè¿éãããAttestation蚌跡JSONã®äŸïŒ--no-gpuã®å ŽåïŒã¯ãæ¬ããã¥ã¡ã³ãååã®è±æçãExample of Attestation-evidence JSONãã»ã¯ã·ã§ã³ã«æ²èŒããŠããã®ã§ããã¡ããåç
§ãããããæ²èŒããŠããJSONã¯è±æçã»æ¥æ¬èªçã«å
±éã§ããã
IMAããªã·ã«é¢ããŠã¯ãIMAã®æž¬å®å¯Ÿè±¡ãéåžžã«å€å²ã«ããããã®ã§ãããšããã®ããããäžæŠã«èšå®ã®æé©è§£ãå®ãããšããã®ã¯é£ããã以äžã«ãæ¬ãªããžããªã§åæãšããŠããããã©ã«ãã®IMAããªã·ãåæ²ããïŒ
# PROC_SUPER_MAGIC
dont_measure fsmagic=0x9fa0
# SYSFS_MAGIC
dont_measure fsmagic=0x62656572
# DEBUGFS_MAGIC
dont_measure fsmagic=0x64626720
# TMPFS_MAGIC
dont_measure fsmagic=0x1021994
# DEVPTS_SUPER_MAGIC
dont_measure fsmagic=0x1cd1
# BINFMTFS_MAGIC
dont_measure fsmagic=0x42494e4d
# SECURITYFS_MAGIC
dont_measure fsmagic=0x73636673
# SELINUX_MAGIC
dont_measure fsmagic=0xf97cff8c
# SMACK_MAGIC
dont_measure fsmagic=0x43415d53
# CGROUP_SUPER_MAGIC
dont_measure fsmagic=0x27e0eb
# CGROUP2_SUPER_MAGIC
dont_measure fsmagic=0x63677270
# NSFS_MAGIC
dont_measure fsmagic=0x6e736673
# 枬å®å¯Ÿè±¡åã³æž¬å®ããªã¬ã®èšå®
# ããã°ã©ã ã®å®è¡ã«éããŠMMAPããããã¡ã€ã«ã®æž¬å®
measure func=MMAP_CHECK mask=MAY_EXEC
# å®è¡ããããã€ããªããã°ã©ã ã®æž¬å®
measure func=BPRM_CHECK mask=MAY_EXEC
# root (uid=0) ã«ãã£ãŠopenããããã¡ã€ã«ã®æž¬å®
# measure func=FILE_CHECK mask=MAY_READ uid=0
# ããŒããããã«ãŒãã«ã¢ãžã¥ãŒã«ã®æž¬å®
measure func=MODULE_CHECK
# ã«ãŒãã«ã«ããŒãããããã¡ãŒã ãŠã§ã¢ã®æž¬å®
measure func=FIRMWARE_CHECK
measure func=BPRM_CHECK mask=MAY_EXECãããäºã«ããããã€ããªãå®è¡ãããå Žåã«ãããã¯å
šãŠæž¬å®ãããããã«ãªãã䜵ããŠãã«ãŒãã«ã¢ãžã¥ãŒã«çãæž¬å®ããèšå®ã«ãªã£ãŠãããå°ãªããšãåºæ¬çã«å®è¡ã«é¢ããŠã¯ãã¬ãŒã¹ã§ããããã«ãªã£ãŠããã
åé¡ã¯ã³ã¡ã³ãã¢ãŠãããŠããmeasure func=FILE_CHECK mask=MAY_READ uid=0ã®éšåã§ãããå®è¡ã¯BPRM_CHECKã§æž¬å®ãããã®ã§ããã以å€ã®ãã¡ã€ã«ã®èªã¿æžã远èšå
šãŠã枬å®ãããšãªããšããã®éšåã以äžã®å
容ã§çœ®ãæããäºã«ãªãïŒ
measure func=FILE_CHECK mask=MAY_READ
measure func=FILE_CHECK mask=MAY_WRITE
measure func=FILE_CHECK mask=MAY_APPEND
ããããããã¯å šãŠãŒã¶ã®å šãã¡ã€ã«æäœã枬å®ããäºã«ãªããèšå€§ãªéã®ãã°ãçºçããäºã«ãªããããã©ãŒãã³ã¹äžã®æžå¿µãçããããªãã
ãŸããäŸãã°Write-Openæã«Read-Openãããšæž¬å®å€ããªãŒã«0ã«ãªããšãã仿§ããããåã«ããªã·ã§å®ãã以å€ã«ãéçšäžã®æžå¿µç¹ã¯ååšãããããã¯æ¥µè«ã¯ãã®ãããªæäœããåŸã倧å ã®ã³ã³ãã³ããå ¥ããªãããã«ããããšããäºã«ãªãããå®éçšäžã¯ãããšã¯å²ãåããªãéšåãããã®ã確ãã§ããã
ãã®ãããªIMAèšå®ã«é¢ããé£ããã¯Humane-RAChain-NSã®ã¹ã³ãŒãããã¯éžè±ãããã®ã§ããããããããŸã§äžèšã®ããã«èšå®ã®å³å¯ãã«ã°ã©ããŒã·ã§ã³ãããäºã瀺ãã«ããã§ã¯çããã
åè¿°ãŸã§ã®èª¬æãšéè€ããéšåãå€ããæ¹ããŠåæããã
-
ãã¡ãŒã ãŠã§ã¢å±€ã«å¯Ÿå¿ããPCR0ã7çªã«ã€ããŠã¯ããã¡ãŒã ãŠã§ã¢ãœãŒã¹ãããã«ããããã·ã¥ãåçŸããåŸããããšç §åããæ©èœã¯å®è£ ããŠããªããAzureã®å Žåã¯ãã¡ãŒã ãŠã§ã¢å±€ãéå ¬éã§ãããããããå®è£ ããã®ã§ããã°ä»ã®ã¯ã©ãŠãç°å¢ããªã³ãã¬ãã¹ç°å¢åæãšãªãã
-
ã«ãŒããã¡ã€ã«ã·ã¹ãã ã«å¯Ÿããããã·ã¥æž¬å®ã¯å®æœããŠããªããå¿ èŠãªå ŽåãSNPGuardçã§ææ¡ãããŠããææ³ãšãHumane-RAChain-NSãšãé©åã«åäœãããŠäœ¿çšããå¿ èŠããããé£æåºŠã¯é«ãã
-
Pythonã®åçš®ã©ã€ãã©ãªãæ¬äœçã«å¯ŸããMeasurementã®ååŸãšRAãžã®ãã€ã³ãã¯å®æœããŠããªããããã¯åºæ¬çã«IMAåŽã«äŸæ ããäºãšãªãã
-
OSã«ãŒãã«ããå ã¯IMAã«ãã£ãŠæž¬å®å¯èœã§ããããIMAããªã·èªäœã¯æž¬å®ãããªããã倿Žã§ããŠããŸããšããIMAç¹æã®åé¡ãããããã¡ãã解決ã§ããå Žåã«ã¯æ¬ãªããžããªã«å±éããäºå®ã§ããã
-
蚌跡ã«å梱ããIMAããªã·ã¯ãããŒãæžã¿ããªã·
/sys/kernel/security/ima/policyãŸãã¯ã«ã¹ã¿ã IMAããªã·ãã¡ã€ã«/etc/ima/ima-policyããã³ããŒããŠãããåŸè ã¯æ¬¡åCVMããŒãæã«ããŒãããããã®ã§ãããCVMèµ·ååŸã¯èªç±ã«æžãæãå¯èœã§ããããããã£ãŠåè ãšäžèŽããä¿èšŒã¯ãªããåè ã®èªã¿åãæš©éã¯ã«ãŒãã«æ§æãªãã·ã§ã³CONFIG_IMA_READ_POLICYã«ãã£ãŠèšå®ããããAzure NCCãã·ã³ã§ã¯ããã©ã«ãã§falseã«èšå®ãããŠããããã/etc/ima/ima-policyã䜿çšãããã
-
ãµãŒãåŽã«ã€ããŠã¯ã
Humane-RAChain-NS/server/api.pyã«åçš®å®çŸ©ïŒè¿œå ã®ã¯ãŒã¯ããŒãã®å®è¡ãªã¯ãšã¹ãçïŒã远èšãã圢ã§å®è¡ããã®ãæãç°¡åã§ããã
ããFastAPI/uvicornã䜿çšããããªãçã®çç±ã§ãµãŒãã¹ã¯ãªãããã¹ã¯ã©ããã§æžãå ŽåããŸãã¯ä»¥äžã®importæãèšè¿°ãããfrom attester import do_attestation
ãã®åŸãAttestationã宿œãããšã³ããã€ã³ã颿°ã®å®çŸ©ã«ãããŠã以äžã®ããã«Humane-RAChain-NSã®ãµãŒãåŽAttestation APIãåŒã³åºãã
result = do_attestation( data.ncc_nonce, data.tpm_nonce, cert_pem.decode("utf-8"), gpu_enabled )
ãã ãã
cert_pemã¯ã»ãã·ã§ã³ããšã«åççæããTLSèªå·±çœ²åèšŒææžã§ããããã®åççæåã³äœ¿çšæå®ã«ã€ããŠããå¥åå®è£ ããå¿ èŠãããã -
Humane-RAChain-NS/server/api.pyã§ã¯ãuvicorn.ConfigçæåŸã«config.load()ã§SSLã³ã³ããã¹ããæ§ç¯ããconfig.ssl.options |= ssl.OP_NO_TICKETã§TLSã»ãã·ã§ã³ãã±ããåéãç¡å¹åããŠãããããã«ããã忥ç¶ã®ãã³ã«å¿ ãå®å šãªTLSãã³ãã·ã§ã€ã¯ãå®è¡ãããã¯ã©ã€ã¢ã³ãåŽã®èšŒææžãã³ãã³ã°ïŒclient/client.pyã®AttestedCertPinningAdapterïŒãæ¯åè©äŸ¡ããããAttestationåŸã®åŸç¶ãªã¯ãšã¹ãã¯ãRAã§çæ£æ§ã確èªãããåäžèšŒææžã䜿çšããTLSã»ãã·ã§ã³ã®ã¿ãåçãããã
ã¯ã©ã€ã¢ã³ãåŽã§å©çšããäŸã¯ãHumane-RAChain-NS/client/client.pyã®do_attestation()颿°ããã®ãŸãŸå¿
èŠååãªãµã³ãã«ã³ãŒããšãªã£ãŠããã詳现ãªå®è£
æ¹æ³ã«ã€ããŠã¯ãã®é¢æ°ã«ã³ã¡ã³ããèšèŒããŠããããããã¡ããåç
§ã®äºãå¿è«ãdo_attestation()颿°ããã®ãŸãŸæµçšãã圢ã§ãåé¡ãªãããã®é¢æ°å
ã§èšè¿°ãããŠããåçš®èšå®ã®äžéšã«ã€ããŠã¯ãåŸç¶ã®ã»ã¯ã·ã§ã³ã«ãããŠã説æããã
-
ã¯ã©ã€ã¢ã³ãåŽã§Humane-RAChain-NSãçšããå ŽåããŸãã¯ä»¥äžã®importæãèšè¿°ããã
from ra_verifier import init_verifier, send_attestation_challenge, verify_response
-
ãµãŒãURLãšsnpguestã®ãã¹ãæå®ããäžã§ãåæåã®ããã«
init_verifier()颿°ãåŒã³åºãã -
ãµãŒãã¬ã¹ãã³ã¹ãNCC AttestationçšnonceãTPM Quoteçšnonceãæ»ãå€ãšããŠæ§ããªããã
send_attestation_challenge()颿°ã«ãŠAttestationèŠæ±ãCVMã«éããnonceã¯ãåŒã³åºãå 颿°å ã§ã¯ã©ã€ã¢ã³ãåŽã«ãŠä¹±æ°çã«çæãããã -
äžèšé¢æ°ã«ããèŠæ±ãæ£åžžã«å®äºããŠããããä»åºŠã¯
verify_response()颿°ãåŒã³åºãäºã«ãããAttestationèšŒè·¡ã®æ€èšŒåã³RAåç倿ãå®è¡ããã -
以äžã®ãããªè¡šç€ºã¯ãèªå·±çœ²åèšŒææžã䜿çšããŠããããã«è¡šç€ºããããåè¿°ã®éãããã¡ãã¯RA-TLSçãªéçšã®ããã«å®å šãèæ ®ããäžã§æå³çã«äœ¿çšããŠãããããç¡èŠã§è¯ãã
/usr/lib/python3/dist-packages/urllib3/connectionpool.py:1020: InsecureRequestWarning: Unverified HTTPS request is being made to host 'localhost'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings warnings.warn(
-
æ€èšŒã®çµæRAãåçãããããã®TLSã»ãã·ã§ã³ã¯åè¿°ã®éãã¯ã©ã€ã¢ã³ããåããŸã§ã»ãŒæ°žä¹ çã«ç¶æãããã®ã§ããã®ãŸãŸãã®TLSã»ãã·ã§ã³ãçšããŠæ¬¡ã®åŠçèŠæ±ãCVMã«å¯ŸããŠè¡ããHumane-RAChain-NSã®ãµã³ãã«ã§ã¯ãGPUã¯äœ¿çšããåã«ãªã¯ãšã¹ããã2ã€ã®æŽæ°ãè¶³ãåãããã¹ã¯ãªãããåŒã³åºãããŠãã
Humane-RAChain-NS/server/sample.pyããå¿è«GPUã䜿çšããåŠçã®èŠæ±ãå¯èœãNCCãæå¹åãããŠããã®ã§ãGPUåŠçãTEEã§ä¿è·ãããç¶æ ã§å®è¡ãããã
ããªãŒå³ïŒ
Humane-RAChain-NS/
âââ README.md
âââ sequence.pu
âââ sequence.svg
âââ client
â âââ client.py
â âââ policy
â â âââ client_gpu_ra_policy.json
â âââ ra_verifier.py
â âââ settings.yaml
âââ server
â âââ api.py
â âââ attester.py
â âââ cert_gen.py
â âââ policy
â â âââ server_gpu_ra_policy.json
â âââ run-server.sh
â âââ sample.py
âââ subtools
âââ hashlist_generator.py
âââ ima_appraise_policy_generator.py
âââ measurement_extractor.py
-
README.md: æ¬ãã¡ã€ã«
-
sequence.pu: ã·ãŒã±ã³ã¹å³ã®ãœãŒã¹ãã¡ã€ã«
-
sequence.svg: ã·ãŒã±ã³ã¹å³
-
client: ã¯ã©ã€ã¢ã³ãçšã®ã¹ã¯ãªãããããªã·ãã¡ã€ã«ãæ ŒçŽ
- client.py: Humane-RAChain-NSãçšããŠRAåŠçããã®åŸã®Confidential ComputingãèŠè«ããã¹ã¯ãªãããèªåã®ã¢ããªã±ãŒã·ã§ã³ãHumane-RAChain-NSãçšããŠæžãå Žåããã®ã¹ã¯ãªããçžåœã®éšåãå®è£ ãã圢ã«ãªãã
- policy
- client_gpu_ra_policy.json: NCC Attestationã®Attestationããªã·ãã¡ã€ã«ãã¯ã©ã€ã¢ã³ãåŽã䜿çšãããããµãŒãã¯ã¯ã©ã€ã¢ã³ããšåæ°Žæºã§æ€èšŒããäºãæåŸ
ãããã¯ãã§ããããã
server_gpu_ra_policy.jsonãšåäžã«ããã®ãç¡é£ã
- client_gpu_ra_policy.json: NCC Attestationã®Attestationããªã·ãã¡ã€ã«ãã¯ã©ã€ã¢ã³ãåŽã䜿çšãããããµãŒãã¯ã¯ã©ã€ã¢ã³ããšåæ°Žæºã§æ€èšŒããäºãæåŸ
ãããã¯ãã§ããããã
- ra_verifier.py: ã¯ã©ã€ã¢ã³ãåŽã®RAåŠçãæ åœããã¢ãžã¥ãŒã«ãèªåã®ã¢ããªã±ãŒã·ã§ã³éçºã®éã«ã¯ããããimportããŠå®è£ ããã
- settings.yaml: ã¯ã©ã€ã¢ã³ãã®èšå®ãã¡ã€ã«ãsnpguestã®ã€ã³ã¹ããŒã«ãã¹ãNCC Attestationã®æå¹å/ç¡å¹åãPLATFORM_INFOã®Appraise PolicyãåPCRã®åçŸèšç®ã»æ€èšŒã®æå¹å/ç¡å¹åãªã©ãèšå®ããã
-
server:
- api.py: Humane-RAChain-NSãçšããRAæ©èœä»ããµãŒããå®è¡ããããã®ã¹ã¯ãªãããèªåã®ã¢ããªã±ãŒã·ã§ã³ãHumane-RAChain-NSãçšããŠæžãå Žåããã®ã¹ã¯ãªããçžåœã®éšåãå®è£ ãã圢ã«ãªãã
- cert_gen.py: ã»ãã·ã§ã³ããšã«åççæããTLSèªå·±çœ²åèšŒææžãçæããããžãã¯ãå®è£ ãããã¹ã¯ãªããã
- policy:
- server_gpu_ra_policy.json: NCC Attestationã®Attestationããªã·ãã¡ã€ã«ããµãŒãåŽã䜿çšããããã¯ã©ã€ã¢ã³ããšåæ°Žæºã§æ€èšŒããäºãæåŸ
ãããã¯ãã§ããããã
server_gpu_ra_policy.jsonãšåäžã«ããã®ãç¡é£ã
- server_gpu_ra_policy.json: NCC Attestationã®Attestationããªã·ãã¡ã€ã«ããµãŒãåŽã䜿çšããããã¯ã©ã€ã¢ã³ããšåæ°Žæºã§æ€èšŒããäºãæåŸ
ãããã¯ãã§ããããã
- run-server.sh: ãµãŒãåŽå®è¡ã¹ã¯ãªãããIMAé¢é£ãã¡ã€ã«ã®ååšã確èªããåŸã
api.pyã®åŒã³åºãã宿œãããNCC Attestationãç¡å¹ã«ããå Žåã¯--no-gpuãã©ã°ãç«ãŠãŠå®è¡ããã - sample.py: ãµã³ãã«ç§å¯èšç®ã¹ã¯ãªãããåã«åãåã£ã2ã€ã®æŽæ°ãè¶³ãåãããã ãã®å®è£ ã§ãããGPUãçšããèšç®ã¯è¡ããªãã®ã§ãNCCã®æ©æµã«é ããããå Žåã«ã¯å¥åçšæããå¿ èŠãããã
-
subtools:
- hashlist_generator.py: PCR23çªãžã®Extendã®å¯Ÿè±¡ãšãªããã¡ã€ã«ã®ããã·ã¥ãªã¹ããèšç®ããã¹ã¯ãªãããNCC Attestationãç¡å¹ã«ããå Žåã¯
--no-gpuãã©ã°ãç«ãŠãŠå®è¡ããã - ima_appraise_policy_generator.py: IMAãã°ã®æ€èšŒããªã·ãçæããã¹ã¯ãªããã
- measurement_extractor.py: SEV-SNP CVMã«ãããŠSEV-SNP Attestation ReportãååŸããMeasurementãæœåºããããã®ã¹ã¯ãªãããæçŸ©ãäœ¿çšæ¹æ³ã¯åè¿°ã®éãã
- hashlist_generator.py: PCR23çªãžã®Extendã®å¯Ÿè±¡ãšãªããã¡ã€ã«ã®ããã·ã¥ãªã¹ããèšç®ããã¹ã¯ãªãããNCC Attestationãç¡å¹ã«ããå Žåã¯
æ¬ãªããžããªã«åºæã®éšåã¯MITã©ã€ã»ã³ã¹ã®ããšã§æäŸãããŸãã
client/policy/client_gpu_ra_policy.json ããã³ server/policy/server_gpu_ra_policy.json ã¯nvtrustïŒApache-2.0ã©ã€ã»ã³ã¹ïŒã® NVGPURemotePolicyExample.json ãæµçšããŠããããããããã«ã¯Apache-2.0ã©ã€ã»ã³ã¹ãé©çšãããŸãã
詳现ã¯LICENSEãåç §ããŠãã ããã