DDSセキュリティハード(ウェア)ウェイ-SGX:パート2(マイクロ+セキュリティ+スコーン)
これは6つのパート2です。 -このトピックに関するブログシリーズ。パート1の概要を見逃した場合は、こちらをお読みください。
Software Guard Extensions(SGX)の開発は、元々インテル®によってリファクタリングプロセスとして設計されました。各アプリケーションは、他のコードからシークレットとシークレット管理コードをパーティション化するようにゼロから設計または再設計され、機密性の高いコードパーティションを保護するためにSGXソフトウェア開発キット(SDK)でコンパイルされます。これは、トラステッドコンピューティングベース(TCB)を可能な限り最小の領域に縮小するというインテルの目標と一致していました。
ただし、既存のアプリケーションでは、これはかなりのプロセスです。テストでは、Intelと米国空軍アカデミーが早期アクセス調査でオープンソースのPDFビューアをリファクタリングしました。リファクタリングには、ドキュメントの任意の部分へのアクセス制御の追加(デジタル編集)とオープンソースのビデオ電話会議(VTC)アプリケーション(画面への配線暗号化)が含まれていました。このプロセスは、両方のプロジェクトを完了するのに2人年かかりました。
リファクタリング/再コンパイルは手間のかかる作業であり、さらに悪いことに、コードアクセスのために常に可能であるとは限らないため、SGXで保護されたコンテナ/ LibOSおよびクロスコンパイラを作成するために他の多くのプロジェクトが進められています。グラフェンとSCONEは、これらのタスクを実行するために公開されているプロジェクトの良い例です。私はグラフェンとSCONEの両方を見てきましたが、どちらもビルドを成功させるための長所と短所があります。ただし、SCONEは、RTIConnext®DDSMicroプラグインとRTI Connext DDS Securityプラグインの両方を、スクリプトをビルドしたり、ささいなmuslライブラリの変更を作成したりするための微調整だけですでにクロスコンパイルできます。
さらに、SCONEは、SGXドライバー(および対応CPU)がインストールされたバニラUbuntu16.04で実行可能な静的にリンクされたアプリケーションを生成します。
グラフェンでは、少なくとも1つの新しいシステムコール(getifaddrs)を実装するか、コールを回避するためにDDSを変更する必要があります。また、オペレーティングシステムが制限されているConnext DDS Micro(nanosleep)で頻繁に行われる他のDDSコールにいくつかの変更を加える必要があります。グラフェンは、Dockerコンテナとしても実行する必要があります。結果として、この最初の焦点は、SCONEを使用した安全なConnext DDSMicroアプリケーションの実装にあります。グラフェンについては、このブログシリーズの後半で詳しく説明します。
SCONEプロジェクトの1つは、SGXで保護された環境でアプリケーションをラップする実行可能バイナリを出力するクロスコンパイラで構成されています。このクロスコンパイラは、GLibCではなくmuslに対して静的にリンクします。その結果、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コンテナはプライベートであり、info @ scontain.com経由でSCONEに連絡してアクセスを取得する必要があります。
私のホストシステムはSGX対応で、Ubuntu 16.04LTSを実行しています。 SGXシステムがなくてもフォローできます。 SGXシステムを使用していて、SGXを使用する場合は、https://github.com/intel/linux-sgx-driverからIntelSGXドライバーをインストールする必要があります。このブログを読んでいる場合は、Docker、Docker Hub、およびLinuxの使用方法を知っている(または学習する意思がある)ことを前提としています。
まず、RTI DDS Connext Micro3.0とOpenSSL1.0.2rの両方をホームディレクトリに配置します。それらをホームディレクトリに解凍すると、2つのディレクトリになります:
<コード> 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
sconecuratedimages / crosscompilers:ubuntu
私は、コンテナがいくつかの必要な(そしていくつかの便利な)ツールで少し軽いことを発見しました。これを解決するには、ツールを直接インストールします。
apt update
apt install -y make default-jre cmake nano less
apt install -y perl --reinstall
次に、OpenSSLをコンパイルしましょう。以前のperlの再インストールは、構成スクリプトに欠けているいくつかのモジュールを処理しました。 OpenSSLを作成、テスト、およびコンテナーにインストールするには、次のコマンドを実行します。テストが完了するまでに時間がかかることに注意してください。野球場のベンチマークの場合、i5NUCで次のコマンドを実行するのに45分かかりました。
cd /home/openssl-1.0.2r
./ config
make
テストを行う
make install
export 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 Micro3.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/
export RTIMEHOME =/ home / rti_connext_dds_micro-3.0.0
export 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(セキュリティを含む)の両方のライブラリが、GLibCではなくmuslに対してリンクされているはずです。
テストアプリケーションに移りましょう。次のコマンドを実行します。
cd / home /
cd rti_connext_dds_micro-3.0.0 / example / unix / C /
cd HelloWorld_dpde_secure
rm -rf objs
make
すべてがうまくいけば、次のディレクトリにパブリッシャーとサブスクライバーの両方が存在します:/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
出力は次のようになります。
export SCONE_QUEUES =1
export SCONE_SLOTS =256
export SCONE_SIGPIPE =0
export SCONE_MMAP32BIT =0
export SCONE_SSPINS =100
export SCONE_SSLEEP =4000
export SCONE_KERNEL =0
export SCONE_HEAP =87108864
export SCONE_STACK =81920
export SCONE_CONFIG =/home/jason/sgx-musl.conf
export SCONE_ESPINS =10000
export SCONE_MODE =hw
export SCONE_SGXBOUNDS =no
export SCONE_VARYS =no
export SCONE_ALLOW_DLOPEN =no
export SCONE_MPROTECT =no
リビジョン:4be39d5943d5c15e11fa17055b859de4a25c0288(Thu Aug 23 14:14:04 2018 +0200)
ブランチ:cf-java-fix(ダーティ)
構成オプション:-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
#Identity CA、:file:security / ca / ca.pem
#パーミッションCA、:file:security / ca / ca.pem
#PEER証明書:file:security / ca / certs / publisher.pem
#PEER key:file:security / ca / certs / publisher_key.pem
#XMLガバナンス:file:security / xml / Government.p7s
#XMLパーミッション:file:security / xml / permits_publisher.p7s
[1555446711.159431000]エラー:ModuleID =0 Errcode =17 X =0 E =1 T =1
<コード> <見つかりません> / <見つかりません>:-1 / <見つかりません>:
[1555446711.159704000]エラー:ModuleID =0 Errcode =17 X =0 E =1 T =1
<コード> <見つかりません> / <見つかりません>:-1 / <見つかりません>:
[1555446711.197874000]エラー:ModuleID =0 Errcode =17 X =0 E =1 T =1
<コード> <見つかりません> / <見つかりません>:-1 / <見つかりません>:
"こんにちは世界" (0)
Hello World! (1)
Hello World! (2)
Hello World! (3)
Hello World! (4)
報告されたエラーを恐れないでください。これらは情報提供のみを目的としており、Connext DDSMicroライブラリがスレッドを優先的に操作する機能をチェックしようとしているためです。 Muslはこれをサポートしていません。報告されたエラーは、示された行(この場合は96行目)でposixThread.cを編集して、チェックを行わずにデフォルトポリシーを設定するだけで、エラーの報告を排除することで削除できます(ここでも、ハッキーです。 。
これはすべてうまくいっていますが、私たちは何を達成しましたか? DDSアプリケーションは、SCONEコンテナ内のSGXエンクレーブ内で実行できます。これは便利ですが、新しいアプリケーションバイナリが自己完結型であり、バニラのUbuntu16.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で保護されたアプリケーションがコンパイルされました。
これは確かに単なる「HelloWorld」タイプの例であり、情報をディスクやメモリに安全に保存する方法や、アプリケーションをリモートで証明する方法に関する情報は含まれていません。ただし、現在は作業の基盤があります。
パート3では、SGX環境での強化されたDDSサービスについて説明します。
モノのインターネットテクノロジー