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

리눅스에서 디지털 서명으로 바이너리 파일 무결성 검증하기

소개

리눅스에서 디지털 서명으로 바이너리 파일 무결성 검증하기

데이터가 가로채지거나 변조될 수 있는 세상에서 수신 파일의 진위성에 대한 확신은 필수적입니다. 예를 들어 사용자 A가 이메일로 사용자 B에게 바이너리 파일을 보낼 때, B는 파일이 변조되지 않았음을 어떻게 확신할 수 있을까요? 디지털 서명(DS)은 데이터를 발신자의 고유 자격증명에 바인딩해 신뢰할 수 있는 솔루션을 제공합니다.

이 글은 리눅스에서 64비트 ELF 바이너리의 무결성 검증을 위한 실용적 DS 구현을 시연합니다. 이 접근은 직접 서명 방식(제3자 중재자 없음)을 사용하며 서명용 개인키와 검증용 공개 인증서에 의존합니다.

DS 구현 예제

서명 구현에는 다음 단계가 포함됩니다:

  1. 소스 바이너리의 MD5 해시 생성.
  2. 개인키와 자기 서명 공개 인증서 생성.
  3. 바이너리 서명:
    • MD5 해시를 개인키로 암호화.
    • 암호화된 해시를 ELF 파일의 새 .sig 섹션에 저장.
    • 인증서를 ~/.ssh에 저장해 추후 검증용.

전체 과정은 openssl, objcopy, md5sum으로 스크립트화할 수 있습니다. 아래는 ELF 바이너리 서명을 자동화하는 샘플 스크립트 sign_elf.sh입니다. (줄 번호 없는 소스 코드는 기사 끝에 있습니다.)

#!/bin/bash KEY_DIR="$HOME/.ssh" PRIVATE_KEY="$KEY_DIR/priv.key" CERTIFICATE="$KEY_DIR/pub.crt" SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com" if [ "$#" = "0" ]; then echo "Usage: sign_elfs.sh [ELF files]" exit 1 fi [ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR" # 개인키와 인증서 생성 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT" for ELF_BIN in "$@"; do ELF_BASE_NAME="${ELF_BIN##*/}" ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256" ELF_BIN_MD5="$ELF_BASE_NAME.md5" if [ ! -f "$ELF_BIN" ]; then echo "Error: no such file $ELF_BIN" exit 103 fi # 기존 .sig 섹션 제거 objcopy --remove-section=.sig "$ELF_BIN" # 512바이트 제로 채움 .sig 섹션 추가 rm -f dummy.txt touch dummy.txt truncate --size=512 dummy.txt objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN" # 바이너리 MD5 해시 계산 (.sig 섹션 포함) md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5" # 개인키로 MD5 해시 서명 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # 즉시 서명 검증 (선택 사항) openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # 암호화된 해시를 .sig 섹션에 임베드 objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN" # 검사를 위해 .sig 섹션 내용 표시 objdump -sj .sig "$ELF_BIN" done rm -f dummy.txt ls -ls ~/.ssh

리눅스에서 디지털 서명으로 바이너리 파일 무결성 검증하기
그림 1. ELF 바이너리 서명 과정. (출처: Auriga)

스크립트는 다음 작업을 상세히 수행합니다:

19행 – 인증서 생성

openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT" 

이 단계 후 ~/.ssh/priv.key에 개인키, ~/.ssh/pub.crt에 인증서가 저장됩니다. 개인키는 데이터 암호화용, 인증서는 검증용 공개키를 포함합니다.

ELF 파일 루프 (21행)

명령줄로 지정된 각 바이너리가 순차 처리됩니다. 스크립트는 서명 전 기존 .sig 섹션을 제거합니다.

섹션 관리 (33~40행)

해시 계산 (42행)

md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5" 

플레이스홀더 .sig 섹션 포함 바이너리 전체의 MD5를 계산해 바이너리명.md5에 저장.

해시 서명 (45행)

openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" 

MD5 해시를 개인키로 암호화해 서명 파일 생성(예: 바이너리명.sha256).

검증 (선택) (48행)

openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" 

인증서에서 추출한 공개키로 서명이 해시와 일치하는지 확인.

서명 임베딩 (52행)

objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN" 

암호화된 해시가 플레이스홀더를 대체해 서명된 ELF 바이너리 완성.

스크립트를 ELF 파일 세트에 실행하면 안전하게 배포 가능한 서명 바이너리가 생성됩니다. 수신자는 .sig 섹션을 추출하고 공개 인증서로 복호화해 수신 파일의 새로 계산된 해시와 비교함으로써 무결성을 검증할 수 있습니다.

사물 인터넷 기술

  1. IoT 시너지 주도: 보쉬 커넥티비티 CoC가 그리는 연결된 미래
  2. IoT로 제조 운영을 AI 준비시키기
  3. 디지털 트윈: 제조업에서 지능형 엣지 IoT 잠금 해제 – 2부
  4. 예측 유지보수: 인더스트리 4.0으로 중단 없는 생산 실현
  5. 제조 시설의 IoT 준비도: 실용적 가이드
  6. 디지털 보험: 보험 구매와 관리 방식을 혁신하는 5대 트렌드
  7. Western Digital, 산업용 IoT·에지컴퓨팅용 러기드 64단 3D NAND 스토리지 출시
  8. Western Digital, 산업용 IoT용 러기드 64단 3D NAND 스토리지 출시
  9. IoT 데이터 저장에 클라우드 컴퓨팅이 필수적인 이유
  10. 인더스트리 4.0 활용: 승리하는 디지털 로드맵 구축을 위한 검증된 전략