Build deterministik diperlukan untuk pengesahan beban kerja di On Device Trusted Execution Environment (TEE) Personalisasi (ODP) yang tersedia untuk umum di Google Cloud sebagai Ruang Rahasia (CS).
Gambar beban kerja harus menghasilkan hash gambar deterministik yang dapat digunakan oleh CS untuk pengesahan beban kerja (yang menggunakan RFC 9334 Remote ATtestation NIST Arsitektur prosedurS (RATS)).
Dokumen ini akan membahas implementasi dan dukungan untuk determenistik dibangun di odp-federatedcompute repositori resource. Layanan Agregator ODP dan Updater Model akan berjalan di Ruang Rahasia. Repositori mendukung build deterministik untuk semua layanan IT, yang diperlukan untuk kasus penggunaan produksi.
Build determenistik
Build deterministik terdiri dari dua komponen utama:
- Kompilasi biner yang diperlukan. Termasuk jar, {i>shared library<i}, dan metadata.
- Image dasar dan dependensi runtime. Basis lingkungan runtime yang digunakan untuk mengeksekusi biner yang telah dikompilasi.
Saat ini, repositori Federated Compute ODP mendukung jenis workload:
- Workload Java + Spring
- Tugas Tugas, Pengelolaan Tugas, Kolektor
- Java + Spring dengan workload tensorflow JNI
- ModelUpdater, Agregator
- Workload Python
- TaskBuilder
Dependensi
Daftar berikut adalah dependensi yang diandalkan ODP untuk mempertahankan determinisme dan ketersediaan:
- Bazel
- GitHub
- Maven
- PyPi
- Snapshot Debian
- Registry DockerHub
- Google Container Registry (GCR)
Workload determenistik
Semua workload dikompilasi menggunakan Bazel dengan toolchain khusus bahasa dan image container yang dibangun menggunakan rules_oci. WORKSPACE file mendefinisikan semua dependensi dengan versi dan {i>hash<i} yang sesuai.
Snapshot Debian
Semua image workload harus dibangun dalam dockerfile yang dibuat berdasarkan snapshot Debian. Debian snapshot memberikan snapshot repositori stabil dengan deterministik:
- Header dan library sistem
- Arsitektur sistem
- linux_x86_64
- Debian
- Compiler C++
Workload Java Spring
Bazel
remotejdk_17
sama dengan
yang digunakan untuk menyediakan Java hermetic untuk kompilasi. Dependensi Java lainnya adalah
dikelola dan ditetapkan di WORKSPACE
.
Workload Java Spring dikompilasi ke file jar bernama
<service>_application.jar
. Stoples berisi:
- File class Java
META-INF/
- Data manifes Bazel
build-data.properties
- Data build Bazel
BOOT-INF/
- Dependensi jar yang dipaketkan, yang dihasilkan oleh rules_spring.
Lapisan gambar
Image workload Java Spring terdiri dari dua lapisan:
- Lapisan image dasar
- Image dasar Java:
gcr.io/distroless/java17-debian11
- Image dasar Java:
- Lapisan workload
binary_tar.tar
<service>_application.jar
Konfigurasi gambar
- Titik entri
java -jar <service>_application.jar
Workload Tensorflow JNI
Workload JNI Tensorflow dibangun berdasarkan workload Java Spring. J toolchain Bazel hermetic Clang+LLVM disediakan menggunakan Clang+LLVM bawaan 16 dengan sysroot yang disediakan oleh image snapshot Debian untuk mengompilasi kode mesin.
Beban kerja JNI dikompilasi ke library bersama yang bernama libtensorflow.so
bersama
dengan <service>_application.jar
.
Lapisan gambar
Image beban kerja tensorflow JNI terdiri dari beberapa lapisan:
- Lapisan image dasar
- Image dasar Java:
gcr.io/distroless/java17-debian11
- Image dasar Java:
- Lapisan dependensi paket Debian. Lapisannya dibuat menggunakan deb
arsip yang didownload dari snapshot debian dan dikemas ulang sebagai lapisan gambar
libc++1-16_amd64.tar
libc++abi1-16_amd64.tar
libc6_amd64.tar
libunwind-16_amd64.tar
libgcc-s1_amd64.tar
gcc-13-base_amd64.tar
- Lapisan workload
binary_tar.tar
<service>_application.jar
libtensorflow-jni.so
libaggregation-jni.so
Konfigurasi gambar
- Label (Hanya untuk gambar yang dibangun untuk berjalan di dalam TEE)
"tee.launch_policy.allow_env_override": "FCP_OPTS"
- Memungkinkan variabel lingkungan
FCP_OPTS
untuk disetel di rahasia. ruang penyimpanan. Workload akan menggunakanFCP_OPTS
pada saat startup untuk mengonfigurasi parameter yang diperlukan. - Variabel lingkungan
FCP_OPTS
ditetapkan saat gambar dijalankan (bukan dibuat) untuk mempertahankan determinisme build.
- Memungkinkan variabel lingkungan
"tee.launch_policy.log_redirect": "always"
"tee.launch_policy.monitoring_memory_allow": "always"
- Titik entri
java -Djava.library.path=. -jar <service>_application.jar
Workload Python
rules_python dari Bazel digunakan untuk menyediakan toolchain Python 3.10 hermetic. Persyaratan pip terkunci file digunakan untuk pengambilan dependensi pip secara deterministik. Snapshot Debian image memastikan distribusi determenistik diambil berdasarkan platform kompatibilitas dan menyediakan toolchain C++ untuk mengompilasi distribusi sumber.
Beban kerja Python akan dikemas ke dalam satu set paket pip yang diunduh, Distribusi Python 3.10, kode sumber Python ODP, dan startup Python {i>script<i}.
<service>.runfiles/
- Distribusi Python disimpan di
python_x86_64-unknown-linux-gnu/
- Kode sumber disimpan di
com_google_ondevicepersonalization_federatedcompute/
- Paket Pip disimpan di
pypi_<dependency_name>/
- Distribusi Python disimpan di
<service>.runfiles_manifest
- File manifes untuk direktori
<service>.runfiles/
- File manifes untuk direktori
<service>
- Skrip Python untuk menjalankan workload Python menggunakan runfile
Lapisan gambar
Image workload Python terdiri dari empat lapisan:
- Lapisan image dasar
- Image dasar Python python:slim
- Lapisan penerjemah
interpreter_layer.jar
<service>/<service>.runfiles/python_x86_64-unknown-linux-gnu/**
- Lapisan paket
packages_layer.jar
<service>/<service>.runfiles/**/site-packages/**
- Lapisan workload
app_tar_manifest.tar
- Berisi kode sumber, skrip startup, dan manifes.
<service>/<service>.runfiles_manifest
<service>/<service>
<service>/<service>.runfiles/com_google_ondevicepersonalization_federatedcompute/**
- Berisi kode sumber, skrip startup, dan manifes.
Konfigurasi gambar
- Titik entri
/<service>/<service>
Membuat image
Setelah workload dipilih, Anda siap membangun dan memublikasikan gambar.
Prasyarat
Prosedur
Gambar harus dibuat dalam container docker yang dibuat oleh dockerfile Anda. Dua skrip disediakan untuk membantu membangun gambar determenistik akhir.
- docker_run.sh
docker_run.sh
akan membangun image Docker dari file Docker, lalu pasang direktori kerja, memasang {i>daemon Docker <i} dan menjalankan{i> Docker <i}dengan memberikan perintah {i>bash<i}. Variabel apa pun yang diteruskan sebelum perintah {i>bash<i} akan diperlakukan sebagai flag run docker.
- build_images.sh
build_images.sh
akan menjalankanbazel build
untuk semua gambar dan menghasilkan output {i>hash<i} gambar yang dihasilkan untuk setiap gambar yang dibuat.
Buat semua image
./scripts/docker/docker_run.sh "./scripts/build_images.sh"
Hash gambar yang diharapkan untuk setiap rilis dapat ditemukan di GitHub federatedcompute odp rilis.
Memublikasikan gambar
Publikasi dikonfigurasi menggunakan oci_push Aturan Bazel. Untuk setiap layanan, repositori target harus dikonfigurasi untuk semua:
- agregator
- kolektor
- model_updater
- task_assignment
- task_management
- task_scheduler
- task_builder
Memublikasikan satu gambar
Untuk memublikasikan satu gambar:
./scripts/docker/docker_run.sh "bazel run //shuffler/services/<servicename_no_underscore>:<servicename_with_underscore>_image_publish"
Image bawaan
Semua gambar yang dibuat harus disimpan dan dihosting oleh kreator, seperti dalam Registry artefak GCP.