全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan TEE SDK untuk mengembangkan dan membangun aplikasi Intel SGX 2.0

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan trusted execution environment (TEE) SDK untuk mengembangkan, membangun, dan menerapkan aplikasi Software Guard Extensions (SGX) 2.0 dari Intel. Sebagai contoh, digunakan aplikasi bernama helloworld. Aplikasi ini secara berkala menghasilkan pesan di dalam enklaf dan mengirimkannya ke buffer yang tidak terpercaya, lalu pesan tersebut ditampilkan di terminal.

Prasyarat

Cara kerja Intel SGX

Aplikasi Intel SGX 2.0 terdiri dari dua komponen: komponen yang tidak terpercaya dan komponen yang terpercaya.

  • Komponen yang tidak terpercaya adalah bagian dari memori yang tidak dienkripsi. Jika Anda menyimpan kode dan data aplikasi di bagian ini, fungsi entri main() juga harus ditempatkan di komponen yang tidak terpercaya. Pada gambar sebelumnya, fungsi main() dan bar() berada di komponen yang tidak terpercaya.

  • Komponen yang terpercaya, atau enklaf, adalah bagian dari memori yang dienkripsi. Komponen ini dibuat oleh CPU, dan data serta kode di dalamnya hanya dapat diakses oleh CPU. Pada gambar sebelumnya, fungsi helloworld() dan foo() berada di enklaf.

Untuk memanggil fungsi di enklaf dari komponen yang tidak terpercaya, aplikasi harus melakukan pemanggilan enklaf (ECALL). Untuk memanggil fungsi di komponen yang tidak terpercaya dari enklaf, aplikasi harus melakukan pemanggilan luar (OCALL). ECALL dan OCALL dideklarasikan dalam file Enclave Definition Language (EDL).

Kode contoh dan struktur direktori

Dalam contoh ini, aplikasi Intel SGX 2.0 bernama helloworld diimplementasikan. Untuk informasi lebih lanjut tentang kode sumber, kunjungi GitHub. Kode sumber mencakup kode untuk kompilasi aplikasi, pembuatan image, dan penerapan aplikasi. Contoh kode berikut menunjukkan struktur direktori.

App.hsgx-device-plugin/samples/hello_world/
                                    ├── Dockerfile
                                    ├── Makefile
                                    ├── README.md
                                    └── src
                                         ├── App
                                         │ ├── App.cpp
                                         │ └── App.h
                                         ├── Enclave
                                         │ ├── Enclave.config.xml
                                         │ ├── Enclave.cpp
                                         │ ├── Enclave.edl
                                         │ ├── Enclave.h
                                         │ ├── Enclave.lds
                                         │ └── Enclave_private.pem
                                         └── Makefile

Tabel berikut menjelaskan direktori src dan file terkait.

Direktori

Deskripsi

File

Deskripsi

App

Direktori App berisi kode yang tidak terpercaya, seperti fungsi utama() (fungsi entri) dan kode fungsi OCALL.

App.cpp

Kode di komponen yang tidak terpercaya.

App.h

File header.

Enclave

Kode di komponen yang terpercaya, termasuk kode fungsi ECALL.

Enclave.edl

File EDL.

Enclave.lds

Skrip linker enklaf.

Enclave_private.pem

Kunci privat yang digunakan untuk menandatangani file enclave.so.

Enclave.config.xml

File konfigurasi enklaf yang menentukan parameter, seperti ukuran tumpukan dan apakah akan mengaktifkan debugging.

Enclave.h dan Enclave.cpp.

Kode yang mengimplementasikan komponen yang terpercaya.

Langkah 1: Kompilasi hello_world

  1. Jalankan perintah berikut untuk menginstal Git:

    sudo yum install git
  2. Jalankan perintah berikut untuk mengompilasi aplikasi hello_world:

    git clone https://github.com/AliyunContainerService/sgx-device-plugin
    cd sgx-device-plugin/samples/hello_world
    SGX_SDK=/opt/alibaba/teesdk/intel/sgxsdk make build

    File biner bernama hello_world dihasilkan di direktori root proyek.

    Lihat isi file biner

    GEN  =>  App/Enclave_u.h
    CC   <=  App/Enclave_u.c
    CXX  <=  App/App.cpp
    LINK =>  app
    GEN  =>  Enclave/Enclave_t.h
    CC   <=  Enclave/Enclave_t.c
    CXX  <=  Enclave/Enclave.cpp
    LINK =>  enclave.so
    <EnclaveConfiguration>
        <ProdID>0</ProdID>
        <ISVSVN>0</ISVSVN>
        <StackMaxSize>0x40000</StackMaxSize>
        <HeapMaxSize>0x100000</HeapMaxSize>
        <TCSNum>10</TCSNum>
        <TCSPolicy>1</TCSPolicy>
        <!-- Saran mengubah 'DisableDebug' menjadi 1 untuk membuat enklaf tidak dapat dideteksi untuk rilis enklaf -->
        <DisableDebug>0</DisableDebug>
        <MiscSelect>0</MiscSelect>
        <MiscMask>0xFFFFFFFF</MiscMask>
    </EnclaveConfiguration>
    tcs_num 10, tcs_max_num 10, tcs_min_pool 1
    Memori yang diperlukan adalah 3960832B.
    Memori yang diperlukan adalah 0x3c7000, 3868 KB.
    Berhasil.
    SIGN =>  enclave.signed.so
    Proyek telah dibangun dalam mode debug perangkat keras

  3. Jalankan perintah ./hello_world pada instance yang mendukung SGX untuk menjalankan aplikasi hello_world.

    cd src/
    ./hello_world

    Output yang diharapkan:

    Wed May  6 06:53:33 2020
    Hello world From SGX Enclave!
    Wed May  6 06:53:34 2020
    Hello world From SGX Enclave!
    ...

Berikut ini menjelaskan cara mengompilasi aplikasi dan menampilkan struktur direktori kode yang dikompilasi:

Lihat prosedur kompilasi

  1. Gunakan alat sgx_edger8r dan fungsi ECALL sgx_ecall untuk menghasilkan kode yang tidak terpercaya (Enclave_u.c dan Enclave_u.h) di direktori App.

  2. Kompilasi file biner yang tidak terpercaya di direktori App.

  3. Gunakan alat sgx_edger8r untuk menghasilkan kode yang terpercaya (Enclave_t.c dan Enclave_t.h) di direktori Enclave.

  4. Kompilasi file enclave.so. Ini adalah pustaka dinamis yang terpercaya.

  5. Gunakan alat sgx_sign untuk menandatangani pustaka dinamis yang terpercaya. Nama pustaka dinamis yang terpercaya berubah menjadi enclave.signed.so.

  6. Aplikasi telah dikompilasi.

Lihat struktur direktori kode yang dikompilasi

sgx-device-plugin/samples/hello_world/src/
                                         ├── hello_world      #[dihasilkan]
                                         ├── App
                                         │ ├── App.cpp
                                         │ ├── App.h
                                         │ ├── App.o        #[dihasilkan]
                                         │ ├── Enclave_u.c  #[dihasilkan] 
                                         │ ├── Enclave_u.h  #[dihasilkan] 
                                         │ └── Enclave_u.o  #[dihasilkan]
                                         ├── Enclave
                                         │ ├── Enclave.config.xml
                                         │ ├── Enclave.cpp
                                         │ ├── Enclave.edl
                                         │ ├── Enclave.h
                                         │ ├── Enclave.lds
                                         │ ├── Enclave.o     #[dihasilkan]
                                         │ ├── Enclave_private.pem
                                         │ ├── Enclave_t.c   #[dihasilkan]
                                         │ ├── Enclave_t.h   #[dihasilkan]
                                         │ └── Enclave_t.o   #[dihasilkan]
                                         ├── enclave.signed.so #[dihasilkan]
                                         ├── enclave.so        #[dihasilkan]
                                         └── Makefile

Jalur File

Deskripsi

Kode contoh

Encalve/Enclave.edl

File EDL yang mendeklarasikan fungsi ECALL publik. Setidaknya salah satu dari fungsi berikut harus dideklarasikan di file EDL aplikasi SGX:

  • Fungsi ECALL dengan tipe.

  • trusted {...} mendeklarasikan fungsi ECALL.

  • untrusted {...} mendeklarasikan fungsi OCALL.

Dalam contoh ini, aplikasi tidak perlu memanggil fungsi OCALL. Oleh karena itu, hanya satu fungsi ECALL (ecall_hello_from_enclave) yang dideklarasikan. Fungsi ECALL ini digunakan untuk membuat buffer di enklaf dan menerapkan aplikasi helloworld. Kemudian, informasi di buffer disalin ke buffer yang tidak terpercaya di komponen yang tidak terpercaya. Aplikasi memanggil printf di komponen yang tidak terpercaya untuk mencetak informasi.

enclave {
    trusted {
        public void ecall_hello_from_enclave([out, size=len] char* buf, size_t len);
    };
};

Enclave/Enclave.lds

N/A

enclave.so
{
    global:
        g_global_data_sim;
        g_global_data;
        enclave_entry;
        g_peak_heap_used;
    local:
        *;
};

Enclave/Enclave.config.xml

N/A

<EnclaveConfiguration>
  <ProdID>0</ProdID>
  <ISVSVN>0</ISVSVN>
  <StackMaxSize>0x40000</StackMaxSize>
  <HeapMaxSize>0x100000</HeapMaxSize>
  <TCSNum>10</TCSNum>
  <TCSPolicy>1</TCSPolicy>
  <!-- Saran mengubah 'DisableDebug' menjadi 1 untuk membuat enklaf tidak dapat dideteksi untuk rilis enklaf -->
  <DisableDebug>0</DisableDebug>
  <MiscSelect>0</MiscSelect>
  <MiscMask>0xFFFFFFFF</MiscMask>
</EnclaveConfiguration>

Enclave/Enclave.h

Pada sebagian besar kasus, file header ini kosong.

#ifndef _ENCLAVE_H_
#define _ENCLAVE_H_
#endif

Enclave/Enclave.cpp

N/A

#include "Enclave.h"
#include "Enclave_t.h" /* print_string */
#include <string.h>

void ecall_hello_from_enclave(char *buf, size_t len)
{
    const char *hello = "Hello world";

    size_t size = len;
    if(strlen(hello) < len)
    {
        size = strlen(hello) + 1;
    }

    memcpy(buf, hello, size - 1);
    buf[size-1] = '\0';
}

Enclave/Enclave_private.pem

Kunci privat yang digunakan untuk menandatangani file enclave.so

openssl genrsa -out Enclave/Enclave_private.pem -3 3072

App/App.h

N/A

#ifndef _APP_H_
#define _APP_H_

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#include "sgx_error.h"       /* sgx_status_t */
#include "sgx_eid.h"     /* sgx_enclave_id_t */

#ifndef TRUE
# define TRUE 1
#endif

#ifndef FALSE
# define FALSE 0
#endif

# define TOKEN_FILENAME   "enclave.token"
# define ENCLAVE_FILENAME "enclave.signed.so"

extern sgx_enclave_id_t global_eid;    /* global enclave id */

#if defined(__cplusplus)
extern "C" {
#endif


#if defined(__cplusplus)
}
#endif

#endif /* !_APP_H_ */

App/App.cpp

N/A

#include <stdio.h>
#include <string.h>
#include <assert.h>

#include <time.h>
#include <ctime>

# include <unistd.h>
# include <pwd.h>
# define MAX_PATH FILENAME_MAX

#include "sgx_urts.h"
#include "App.h"
#include "Enclave_u.h"

/* Global EID shared by multiple threads */
sgx_enclave_id_t global_eid = 0;

int initialize_enclave(void)
{
    sgx_status_t ret = SGX_ERROR_UNEXPECTED;

    char enclavefile[256];
    getcwd(enclavefile, sizeof(enclavefile));
    strcat(enclavefile, "/enclave.signed.so");

    /* Call sgx_create_enclave to initialize an enclave instance */
    /* Debug Support: set 2nd parameter to 1 */
    ret = sgx_create_enclave(enclavefile, SGX_DEBUG_FLAG, NULL, NULL, &global_eid, NULL);
    if (ret != SGX_SUCCESS) {
        printf("Failed to create enclave, ret code: %d, enclave file: %s\n", ret, enclavefile);
        return -1;
    }

    return 0;
}

tm* get_time() {
    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    return timeinfo;
}

/* Application entry */
int SGX_CDECL main(int argc, char *argv[])
{
    (void)(argc);
    (void)(argv);

    const size_t max_buf_len = 100;
    char buffer[max_buf_len] = {0};


    /* Initialize the enclave */
    if(initialize_enclave() < 0){
        printf("Enter a character before exit ...\n");
        getchar();
        return -1;
    }

    /* Enclave calls */
    while(1) {
        ecall_hello_from_enclave(global_eid, buffer, max_buf_len);

        printf("%s%s\n", asctime(get_time()), buffer);
        fflush(stdout);

        sleep(1);
    }

    /* Destroy the enclave */
    sgx_destroy_enclave(global_eid);

    printf("Info: SampleEnclave successfully returned.\n");

    printf("Enter a character before exit ...\n");
    getchar();
    return 0;
}

Langkah 2: Bangun dan terapkan aplikasi helloworld

Disarankan untuk membangun image Alibaba Cloud Linux, menginstal versi terbaru SGX SDK, dan secara berkala memperbarui SDK untuk mengurangi risiko potensial.

Contoh Dockerfile

Contoh Dockerfile berikut menggunakan Alibaba Cloud Linux 3:

FROM registry.cn-hangzhou.aliyuncs.com/alinux/alinux3

ARG REGION_ID=cn-hangzhou

RUN yum install -y curl && \
	repo_url=https://enclave-${REGION_ID}.oss-${REGION_ID}.aliyuncs.com/repo/alinux/enclave-expr.repo && \
	yum install -y yum-utils && \
	yum-config-manager --add-repo ${repo_url} && \
	yum install -y libsgx-urts libsgx-uae-service # Tambahkan dependensi runtime SGX lainnya sesuai kebutuhan.

WORKDIR /src
COPY src/hello_world src/enclave.signed.so /src
ENTRYPOINT ["/src/hello_world"]

Prosedur

  1. Instal Docker.

    Untuk informasi lebih lanjut, lihat Instal Docker.

  2. Jalankan perintah berikut untuk mengompilasi dan membangun image uji.

    Ganti ${IMAGE_URL} dengan alamat image uji.

    cd sgx-device-plugin/samples/hello_world
    TARGET_IMAGE=${IMAGE_URL} SGX_SDK=/opt/alibaba/teesdk/intel/sgxsdk make image
    docker push ${IMAGE_URL}
  3. Jalankan perintah berikut untuk menerapkan aplikasi helloworld.

    Ganti ${IMAGE_URL} dengan alamat image uji yang Anda buat di langkah sebelumnya.

    cat <<EOF | kubectl create -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloworld
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: helloworld
      template:
        metadata:
          labels:
            app: helloworld
        spec:
          containers:
          - image: ${IMAGE_URL}
            imagePullPolicy: Always
            name: helloworld
            resources:
              limits:
                cpu: 250m
                memory: 512Mi
                alibabacloud.com/sgx_epc_MiB: 2
    EOF

Referensi