DDS Security the Hard(ware) Way - SGX:Part 2 (Micro + Security + SCONE)
这是第六部分中的第二部分-关于这个主题的博客系列。如果您错过了第 1 部分概述,请在此处阅读。
Software Guard Extensions (SGX) 的开发最初由英特尔® 设计为一个重构过程。每个应用程序都将从头开始设计或重新构建以将机密和机密管理代码与其他代码分开,然后使用 SGX 软件开发工具包 (SDK) 进行编译以保护敏感代码分区。这符合英特尔将可信计算基础 (TCB) 减少到尽可能小的区域的目标。
然而,对于现有的应用程序,这是一个相当大的过程。在测试中,英特尔和美国空军学院在一项早期访问研究中重构了一个开源 PDF 查看器。重构包括向文档的任何部分添加访问控制(数字编校)和开源视频电话会议 (VTC) 应用程序(线对屏加密)。完成这两个项目的过程耗时两年。
由于重构/重新编译既是一项繁重的工作,更糟糕的是,由于代码访问而并非总是可行,因此许多其他项目已经出面创建受 SGX 保护的容器/LibOS 和交叉编译器。 Graphene 和 SCONE 是可公开完成这些任务的项目的好例子。我已经研究过石墨烯和 SCONE,对于成功构建的最终结果,两者都各有利弊。但是,SCONE 已经可以交叉编译 RTI Connext® DDS Micro 和 RTI Connext DDS 安全插件,只需调整构建脚本和/或创建微不足道的 musl 库更改。
此外,SCONE 生成了一个静态链接的应用程序,该应用程序可在安装了 SGX 驱动程序(和功能强大的 CPU)的 vanilla Ubuntu 16.04 上执行。
Graphene 需要实现至少一个新的系统调用 (getifaddrs) 或更改 DDS 以避免调用,以及对其他 DDS 调用的一些更改,这些更改通常在 Connext DDS Micro 中使用更有限的操作系统(即 nanosleep)完成。石墨烯也必须作为 docker 容器来执行。因此,第一个重点是使用 SCONE 实现安全的 Connext DDS Micro 应用程序。稍后我们将在本系列博客中更多地讨论石墨烯。
其中一个 SCONE 项目包含一个交叉编译器,该编译器输出一个可执行二进制文件,该二进制文件将应用程序包装在 SGX 保护的环境中。这个交叉编译器静态链接到 musl 而不是 GLibC。因此,我们将静态编译构建应用程序所需的所有组件,包括 OpenSSL 和 Connext DDS Micro。
要继续,您将需要 RTI DDS Connext Micro 3.0(包括可构建的源代码)、openssl 1.0.2r 源代码和 SCONE。 RTI Connext DDS 产品可通过联系 RTI 获得(获得许可访问); OpelSSL 可在 https://www.openssl.org/source/ 获得; SCONE 是通过 dockerhub 上的 SCONE 精选图像访问的。这些 SCONE 容器是私有的,您必须通过 [email protected] 联系 SCONE 获得访问权限。
我的主机系统支持 SGX 并运行 Ubuntu 16.04 LTS。您可以在没有新交所系统的情况下跟进。如果您有 SGX 系统——并且想要使用 SGX——您必须从 https://github.com/intel/linux-sgx-driver 安装英特尔 SGX 驱动程序。如果您正在阅读此博客,则假设您知道如何使用 docker、docker hub 和 Linux(或愿意学习)。
首先,我将 RTI DDS Connext Micro 3.0 和 OpenSSL 1.0.2r 都放在我的主目录中。我将它们解压到主目录中,最终得到两个目录:
<代码>openssl-1.0.2r
rti_connext_dds_micro-3.0.0
以下所有命令都特定于这些目录。登录 docker 并确保您位于主目录中。运行以下命令以交互模式启动容器。如果您在没有 SGX 的情况下跟随,请省略 --device=/dev/isgx 来自命令。
<代码>cd ~
docker run -it --device=/dev/isgx -v "$PWD":/home
sconcuratedimages/crosscompilers:ubuntu
我发现容器在一些必要的(和一些方便的)工具上有点不足。要解决此问题,请直接安装工具。
适当的更新
apt install -y make default-jre cmake nano less
apt install -y perl --reinstall
接下来,让我们编译 OpenSSL。之前重新安装 perl 解决了配置脚本中一些缺少的模块。要制作、测试 OpenSSL 并将其安装到您的容器,请运行以下命令。预先警告,测试需要一些时间才能完成。对于棒球基准测试,在 i5 NUC 上运行以下命令需要 45 分钟。
cd /home/openssl-1.0.2r
./config
制作
进行测试
进行安装
导出 OPENSSLHOME=/usr/local/ssl
ln -s /usr/local/ssl/lib/libcrypto.a /usr/local/ssl/lib/libcryptoz.a
ln -s /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libsslz.a
命令末尾的软链接将有助于我们将使用的示例中的 Makefile。是的,它有点老套(你对安全人员有什么期望?),但它有效。
接下来,让我们编译 RTI DDS Micro 3.0。运行以下命令。
cp /opt/scone/cross-compiler/x86_64-linux-musl/lib/libpthread.a /opt/scone/cross-compiler/x86_64-linux-musl/lib/libnsl.a
PATH=$PATH:/opt/scone/cross-compiler/libexec/gcc/x86_64-linux-musl/7.3.0/
导出 RTIMEHOME=/home/rti_connext_dds_micro-3.0.0
导出 RTIMEARCH=sgxLinux_x64gcc
cd /home/rti_connext_dds_micro-3.0.0/
./resource/scripts/rtime-make -DRTI_NO_SHARED_LIB:bool=true -DOPENSSLHOME=/usr/local/ssl --delete --target self --name $RTIMEARCH -G "Unix Makefiles" --build --配置发布
在这一点上,我们应该将来自 OpenSSL 和 RTI DDS Micro(包括安全性)的库链接到 musl 而不是 GLibC。
让我们继续测试应用程序。运行以下命令。
cd /home/
cd rti_connext_dds_micro-3.0.0/example/unix/C/
cd HelloWorld_dpde_secure
rm -rf 对象
制作
如果一切顺利,我们将在以下目录中同时拥有发布者和订阅者:/home/rti_connext_dds_micro-3.0.0/example/unix/C/HelloWorld_dpde_secure/objs/sgxLinux_x64gcc/。让我们运行它看看我们有什么。
SCONE_VERSION=1 SCONE_HEAP=87108864 ./objs/sgxLinux_x64gcc/HelloWorld_publisher
输出应该类似于:
导出 SCONE_QUEUES=1
导出 SCONE_SLOTS=256
导出 SCONE_SIGPIPE=0
导出 SCONE_MMAP32BIT=0
导出 SCONE_SSPINS=100
导出 SCONE_SSLEEP=4000
导出 SCONE_KERNEL=0
导出 SCONE_HEAP=87108864
导出 SCONE_STACK=81920
export SCONE_CONFIG=/home/jason/sgx-musl.conf
导出 SCONE_ESPINS=10000
导出 SCONE_MODE=hw
export SCONE_SGXBOUNDS=no
export SCONE_VARYS=no
export SCONE_ALLOW_DLOPEN=no
export SCONE_MPROTECT=no
修订版:4be39d5943d5c15e11fa17055b859de4a25c0288(2018 年 8 月 23 日星期四 14:14:04 +0200)
分支:cf-java-fix (dirty)
配置选项:--enable-shared --enable-debug --prefix=/home/christof/GIT/subtree-scone/built/cross-compiler/x86_64-linux-musl
飞地哈希:14fa1810e1d35799ba9910243cab89660b7146f96babb97a32caef9c06b3c9a2
[1555446711.154091000]错误:ModuleID=0 Errcode=17 X=1 E=0 T=1
osapi/posixThread.c:96/OSAPI_Thread_get_policy:sysrc=38
# 身份 CA, :file:security/ca/ca.pem
# 权限 CA, :file:security/ca/ca.pem
# PEER 证书:file:security/ca/certs/publisher.pem
# PEER 密钥:file:security/ca/certs/publisher_key.pem
# XML 治理:file:security/xml/governance.p7s
# XML 权限:file:security/xml/permissions_publisher.p7s
[1555446711.159431000]错误:ModuleID=0 Errcode=17 X=0 E=1 T=1
[1555446711.159704000]错误:ModuleID=0 Errcode=17 X=0 E=1 T=1
[1555446711.197874000]错误:ModuleID=0 Errcode=17 X=0 E=1 T=1
你好世界! (0)
世界你好! (1)
世界你好! (2)
世界你好! (3)
世界你好! (4)
不要害怕报告的错误。它们仅供参考,是由于 Connext DDS Micro 库试图检查操纵线程先验的能力。 Musl 不支持这一点。可以通过在指示的行(在本例中为第 96 行)编辑 posixThread.c 来删除报告的错误,以简单地设置默认策略而不进行检查,从而消除错误报告(再次,hacky,我知道).
所以这一切都很好,但我们完成了什么?我们可以在 SCONE 容器内的 SGX enclave 内运行我们的 DDS 应用程序。虽然这很有用,但更有用的是我们的新应用程序二进制文件是自包含的,可以在 vanilla Ubuntu 16.04 环境中运行。
让我们试试吧。由于我们在映射目录中创建了可执行文件,因此当我们退出容器时它会持续存在。我们需要为我们的 SCONE 环境设置一个配置文件。使用以下命令创建它。
tee ~/sgx-musl.conf <
Q 4
e -1 0 0
s -1 0 0
e -1 1 0
s -1 1 0
e -1 2 0
s -1 2 0
e -1 3 0
s -1 3 0
EOF
现在我们可以运行我们的应用程序了:
cd ~/rti_connext_dds_micro-3.0.0/example/unix/C/HelloWorld_dpde_secure/
SCONE_CONFIG=~/sgx-musl.conf SCONE_VERSION=1 SCONE_HEAP=87108864 ./objs/sgxLinux_x64gcc/HelloWorld_publisher
检查他们是否沟通:
SCONE_CONFIG=~/sgx-musl.conf SCONE_VERSION=1 SCONE_HEAP=87108864 ./objs/sgxLinux_x64gcc/HelloWorld_subscriber
我们现在已经编译了我们的第一个受 SGX 保护的应用程序。
这当然只是一个“hello world”类型的示例,不包含有关如何安全地将信息存储在磁盘、内存中或远程验证应用程序的任何信息。但是,我们现在有了工作的基础。
在第 3 部分中,我将研究 SGX 环境中的强化 DDS 服务。
物联网技术