산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 사물 인터넷 기술

DDS 보안 - 하드(웨어) 방식 - SGX:2부(마이크로 + 보안 + SCONE)

6편 중 2부 -이 주제에 대한 블로그 시리즈. 1부 개요를 놓쳤다면 여기에서 읽어보세요.

SGX(Software Guard Extensions)를 위한 개발은 원래 Intel®에서 리팩토링 프로세스로 설계되었습니다. 각 애플리케이션은 처음부터 설계되거나 다른 코드의 비밀 및 비밀 관리 코드를 분할하도록 재설계된 다음 민감한 코드 파티션을 보호하기 위해 SGX 소프트웨어 개발 키트(SDK)로 컴파일됩니다. 이는 TCB(신뢰할 수 있는 컴퓨팅 기반)를 가능한 가장 작은 영역으로 줄이려는 인텔의 목표와 일치했습니다.

그러나 기존 응용 프로그램의 경우 이는 상당한 프로세스입니다. 테스트에서 Intel과 United States Airforce Academy는 초기 액세스 연구에서 오픈 소스 PDF 뷰어를 리팩토링했습니다. 리팩토링에는 문서의 모든 부분에 대한 액세스 제어 추가(디지털 수정) 및 오픈 소스 VTC(Video Teleconferencing) 애플리케이션(Wire to Screen 암호화)이 포함되었습니다. 두 프로젝트를 완료하는 데 2년이 걸렸습니다.

리팩토링/재컴파일은 무거운 리프트이며 더 나쁜 것은 코드 액세스로 인해 항상 가능한 것은 아니기 때문에 SGX 보호 컨테이너/LibOS 및 크로스 컴파일러를 만들기 위해 많은 다른 프로젝트가 나왔습니다. 그래핀과 SCONE은 이러한 작업을 수행하기 위해 공개적으로 사용할 수 있는 프로젝트의 좋은 예입니다. 저는 Graphene과 SCONE을 모두 살펴보았고 둘 다 성공적인 빌드의 최종 결과에 대해 장단점이 있습니다. 그러나 SCONE은 스크립트를 빌드하거나 사소한 musl 라이브러리 변경을 생성하기 위한 조정만으로 이미 RTI Connext® DDS Micro 및 RTI Connext DDS Security 플러그인을 모두 교차 컴파일할 수 있습니다.

또한 SCONE은 SGX 드라이버(및 지원 CPU)가 설치된 바닐라 Ubuntu 16.04에서 실행 가능한 정적으로 연결된 애플리케이션을 생성합니다.

그래핀은 최소한 하나의 새로운 시스템 호출(getifaddrs)을 구현하거나 호출을 피하기 위해 DDS를 변경해야 하며, 더 제한된 운영 체제(예:nanosleep)가 있는 Connext DDS Micro에서 종종 수행되는 다른 DDS 호출에 대한 몇 가지 변경 사항이 필요합니다. 그래핀은 도커 컨테이너로도 실행되어야 합니다. 결과적으로 이 첫 번째 초점은 SCONE으로 보안 Connext DDS Micro 애플리케이션을 구현하는 것입니다. 이 블로그 시리즈의 뒷부분에서 Graphene에 대해 더 자세히 설명하겠습니다.

SCONE 프로젝트 중 하나는 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 컨테이너는 비공개이며 [email protected]을 통해 SCONE에 연락하여 액세스 권한을 얻어야 합니다.

내 호스트 시스템은 SGX를 지원하고 Ubuntu 16.04 LTS를 실행합니다. SGX 시스템 없이도 따라할 수 있습니다. SGX 시스템이 있고 SGX를 사용하려면 https://github.com/intel/linux-sgx-driver에서 Intel 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 ~
도커 실행 -it --device=/dev/isgx -v "$PWD":/home
sconecuratedimages/crosscompilers:우분투

나는 컨테이너가 일부 필요한(그리고 일부 편리한) 도구에 대해 약간 가볍다는 것을 발견했습니다. 이 문제를 해결하려면 도구를 직접 설치하세요.

적절한 업데이트
apt install -y는 default-jre cmake nano를 덜 만듭니다.
apt install -y perl --reinstall

다음으로 OpenSSL을 컴파일해 보겠습니다. 이전에 Perl을 다시 설치하면 구성 스크립트에서 일부 부족한 모듈이 처리되었습니다. OpenSSL을 만들고 테스트하고 컨테이너에 설치하려면 다음 명령을 실행합니다. 테스트를 완료하는 데 시간이 다소 걸릴 수 있음을 미리 알려드립니다. 야구장 벤치마크의 경우 i5 NUC에서 다음 명령을 실행하는 데 45분이 걸렸습니다.

cd /home/openssl-1.0.2r
<코드>./구성

만들다
테스트
설치
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:/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(보안 포함)의 라이브러리가 GLibC가 아닌 musl에 대해 연결되어야 합니다.

테스트 응용 프로그램으로 넘어 갑시다. 다음 명령어를 실행하세요.

cd /home/
cd rti_connext_dds_micro-3.0.0/example/unix/C/
cd HelloWorld_dpde_secure
rm -rf objs
만들다

모든 것이 순조롭게 진행되면 /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 내보내기
SCONE_CONFIG=/home/jason/sgx-musl.conf 내보내기
SCONE_ESPINS=10000 내보내기
SCONE_MODE=hw 내보내기
SCONE_SGXBOUNDS=no 내보내기
SCONE_VARYS=no 내보내기
SCONE_ALLOW_DLOPEN=no 내보내기
SCONE_MPOTECT=no 내보내기
개정:4be39d5943d5c15e11fa17055b859de4a25c0288 (2018년 8월 23일 목요일 14:14:04 +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
# ID 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
<찾을 수 없음>/<찾을 수 없음>:-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)

안녕하세요! (1)
안녕하세요! (2)
안녕하세요! (3)
안녕하세요! (4)

보고된 오류를 두려워하지 마십시오. 이는 정보 제공용이며 스레드 우선 순위를 조작하는 기능을 확인하려고 시도하는 Connext DDS Micro 라이브러리 때문입니다. Musl은 이것을 지원하지 않습니다. 보고된 오류는 표시된 행(이 경우 96행)에서 posixThread.c를 편집하여 검사를 수행하지 않고 기본 정책을 간단히 설정함으로써 제거할 수 있으며, 따라서 오류 보고를 제거할 수 있습니다(다시, 해킹 ).

이것은 모두 훌륭하고 좋은 것입니다. 그러나 우리는 무엇을 성취했습니까? SCONE 컨테이너 내부의 SGX 엔클레이브 내에서 DDS 애플리케이션을 실행할 수 있습니다. 이것이 유용하지만 새로운 애플리케이션 바이너리가 자체 포함되어 있으며 기본 Ubuntu 16.04 환경에서 실행할 수 있다는 것이 훨씬 더 유용합니다.

해 보자. 매핑된 디렉터리에 실행 파일을 만들었으므로 컨테이너를 종료할 때 실행 파일이 유지됩니다. SCONE 환경에 대한 구성 파일을 설정해야 합니다. 다음 명령어로 생성합니다.

티 ~/sgx-musl.conf <
Q4
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 서비스를 살펴보겠습니다.


사물 인터넷 기술

  1. DDS 보안 - 하드(웨어) 방식 - SGX 파트 3:강화된 DDS 서비스
  2. 산업용 IoT 보안으로 가는 길
  3. 산업용 IoT의 보안 취약점 해결
  4. 사이버 공격으로부터 IoT 보호
  5. IoT 위협 벡터 보호
  6. 에지에서의 하이퍼컨버전스 및 계산:3부
  7. 사물 인터넷이 제기하는 보안 문제:2부
  8. 사물 인터넷이 제기하는 보안 문제:1부
  9. 산업용 IoT 보호:차세대 접근 방식 채택 – 2부
  10. 보안은 IoT의 진정한 잠재력을 강화합니다