1. 디바이스·펌웨어 보안
펌웨어(Firmware): 하드웨어를 제어하고 소프트웨어와 하드웨어 사이의 커뮤니케이션을 돕는 일종의 소프트웨어이다.
1.1 Raspberry Pi 4 Secure Boot
- 개념: 시스템 부팅 시점에 신뢰된 코드만 실행되도록 부트 로더와 커널을 서명하여 검증하는 기술. 승인되지 않은 커널·부트로더 실행을 방지해 루트킷·부트킷 공격에 대응.
- 구현 방식:
- Pi 4 EEPROM 부트로더를 최신 stable 채널로 업데이트
rpi-eeprom-config
를 사용해BOOT_ORDER=0x82
(eMMC/SPI → USB → SD)로 설정- 서명된 커널 이미지만 로드하도록 EEPROM을 read-only 모드로 잠금
- 부팅 과정 중 SHA256 해시 검증 수행: EEPROM 내 공개키로 서명 검증 실패 시 부팅 중단
1.2 ESP32-CAM 펌웨어 서명·암호화
- 개념: 플래시 메모리에 저장된 펌웨어를 암호화하고, Secure Boot 서명을 통해 부팅 전 검증함으로써 펌웨어 변조와 탈취를 방지.
- 구현 방식:
- ESP-IDF 프로젝트의
partitions.csv
에nvs
파티션에 키 저장 설정 후secure_boot
활성화 make menuconfig
→ Security features →Enable Flash Encryption
및Enable Secure Boot
활성화- 개발 머신에서
idf.py security
명령으로 키 페어 생성 및 ESP32에 일회성 업로드 - 빌드 시점에 펌웨어 바이너리가 자동으로 AES-128 기반으로 암호화되고, Secure Boot 서명이 삽입됨
- ESP-IDF 프로젝트의
1.3. CHIPSEC 취약점 점검
- 개념: 인텔 칩셋 및 플랫폼 펌웨어 레벨 보안 취약점을 분석·검증하기 위한 오픈소스 프레임워크.
- 구현 방식:
- 호스트에 Python 환경 설치 후
pip install chipsec
chipsec_main.py
실행으로 하드웨어/펌웨어 검증 모듈(Platform, SMM, TPM 등) 선택- 자동 리포트 생성: 부팅 설정, SMM 권한, 메모리 보호 미설정 등 취약 항목 식별
- 호스트에 Python 환경 설치 후
2. 네트워크 분리 & 방화벽
2.1 VLAN 설계 & 구분
- 개념: 단일 물리 네트워크 장치를 논리적으로 분리해 서로 다른 트래픽 도메인을 구성, 보안 및 성능을 향상.
- 구현 방식:
- 스위치에서 VLAN 10(관리), 20(IoT), 30(외부) 각각 생성 및 이름 지정
- VLAN10: 관리망 (Raspberry Pi SSH)
- VLAN20: IoT 장치망 (ESP32, 센서)
- VLAN30: 외부 API 연동망 (ThinQ API)
- IoT 장치 포트는 Access VLAN 20, 라우터 연결 포트는 Trunk 모드로 설정:
interface Gi1/0/5 switchport mode access switchport access vlan 20 interface Gi1/0/24 switchport mode trunk switchport trunk allowed vlan 10,20,30
- 라우터/Layer 3 스위치에서 서브인터페이스로 각 VLAN 서브넷 라우팅 구성 스위치·라우터 쪽에서 802.1Q 트렁크/언태그드 포트 설정
- 스위치에서 VLAN 10(관리), 20(IoT), 30(외부) 각각 생성 및 이름 지정
2.2 호스트 방화벽 (Raspberry Pi iptables)
- 개념: 리눅스 커널의 netfilter 기능을 이용해 인바운드/아웃바운드 패킷 필터링, 네트워크 간 트래픽 제어.
- 구현 방식:
# 관리망 ⇄ IoT망 차단 iptables -A FORWARD -i eth0.20 -o eth0.10 -j DROP iptables -A FORWARD -i eth0.10 -o eth0.20 -j DROP # IoT망 → API망(ThinQ 서버) only HTTPS iptables -A FORWARD -i eth0.20 -p tcp --dport 443 -d api.thinq.lg.com -j ACCEPT iptables -A FORWARD -i eth0.20 -j DROP # 관리망 → Pi SSH 허용 iptables -A INPUT -i eth0.10 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i eth0.10 -j DROP # 기본 정책 iptables -P FORWARD DROP iptables -P INPUT DROP iptables -P OUTPUT DROP
- 규칙 저장:
iptables-save > /etc/iptables/rules.v4
- 부팅 시 자동 복원 설정
- 규칙 저장:
3. 통신 보안
3.1 MQTT over TLS/mTLS
- MQTT(Message Queuing Telemetry Transport): 사물 인터넷(IoT) 또는 기계 간(M2M) 장치와 애플리케이션 인터넷을 통해 연결하는 데 이상적인 널리 사용되는 가벼운 게시-구독 메시지 프로토콜이다.
- TLS(Transport Layer Security): 전송 계층 보안 프로토콜
-
mTLS(mutual TLS): 양방향 TLS
-
개념: MQTT 프로토콜을 TLS로 암호화하고, 클라이언트·서버 양방향 인증(mTLS)으로 무단 접근 차단.
- 구현 방식:
- Mosquitto Broker에 Let’s Encrypt 인증서 설치
-
mosquitto.conf
설정:listener 8883 cafile /etc/letsencrypt/live/your.domain/fullchain.pem certfile /etc/letsencrypt/live/your.domain/cert.pem keyfile /etc/letsencrypt/live/your.domain/privkey.pem require_certificate true # mTLS
- ESP32 펌웨어에
WiFiClientSecure
로 CA·클라이언트 인증서 포함 PubSubClient
라이브러리에서 TLS 연결 및 인증서 검증 수행
3.2 WebRTC DTLS-SRTP (음성 스트리밍)
- DTLS(Datagram Transport Layer Security)
- 개념: 실시간 미디어 스트림을 DTLS로 보호하고, SRTP로 패킷 암호화해 기밀성 및 무결성을 유지.
- 구현 방식:
- WebRTC PeerConnection 생성 시
sdpSemantics: "unified-plan"
설정 - ICE 구성 후 DTLS 핸드셰이크로 키 교환
- SRTP 세션에서
crypto-level
설정: AES-128-GCM - DTLS 인증서 핀닝 또는 공인 CA 사용으로 중간자 방지
- WebRTC PeerConnection 생성 시
3.3 REST API (ThinQ ↔ HA)
- 개념: OAuth2 Authorization Code Grant로 액세스 토큰을 안전하게 발급·관리, 토큰은 AES-GCM으로 암호화 저장.
- 구현 방식:
- OAuth2 클라이언트 등록: Redirect URI 등록 및 클라이언트 ID/비밀 획득
- 사용자 로그인 시 Authorization Code 획득 → Access/Refresh Token 교환
-
secret.json
에 AES-GCM 암호화:from cryptography.hazmat.primitives.ciphers.aead import AESGCM aesgcm = AESGCM(key) nonce = os.urandom(12) encrypted = aesgcm.encrypt(nonce, token_json.encode(), None)
- 토큰 호출 시 유효기간 검증 → 만료 5분 전 자동 리프레시
4. 데이터 보호 & 모니터링
4.1 음성 로그 AES-GCM-SIV 암호화
- 개념: AES-GCM-SIV는 재사용 방지(non-replay) 및 무결성 검증이 강화된 대칭키 암호화 모드.
- 구현 방식:
from cryptography.hazmat.primitives.ciphers.aead import AESGCM aesgcm = AESGCM(key_256bit) nonce = os.urandom(12) ct = aesgcm.encrypt(nonce, raw_audio_bytes, None) # 저장: base64(nonce) + ':' + base64(ct)
4.2 원본 음성 원천 비식별화 (FFT 특징 벡터)
- 개념: 원본 음성 신호를 주파수 영역으로 변환하여 개인 식별에 필요한 음색·포먼트 정보 제거.
- 구현 방식:
spec = numpy.fft.rfft(raw_audio, n=1024)
로 스펙트럼 벡터 계산spec_magnitude = np.abs(spec)
(FFT 벡터)만 DB에 저장- 원본 PCM 데이터 즉시 메모리·디스크에서 삭제
4.3 침입 탐지 시스템 (IDS)
- 개념: 네트워크/호스트 레벨 이벤트를 실시간 분석해 악성·의심 활동 탐지 후 경고.
- 구현 방식: Snort or Suricata
- Suricata 설치 및
suricata.yaml
기본 설정 -
custom.rules
에 IoT 특화 룰 추가:alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"Unauthorized API Access"; tls.version < 1.2; sid:1000001;)
systemctl enable suricata
후/var/log/suricata/fast.log
모니터링 스크립트 생성- 경고 발생 시 Python 스크립트로 SMS/이메일 알림 전송
- Suricata 설치 및
참고
- EEPROM 개념과 사용 예시
- Boot Order 결정하기
- 펌웨어 보안을 위합 팁 5가지
- 펌웨어 업데이트 가이드: 기기의 성능과 보안을 극대화하는 방법
- ESP-IDF와 ESP32의 간단 소개
- ESP32 IDF 펌웨어 무결성을 보호하는 방법
- CHIPSEC Document
- VLAN 생성 및 설정방법 (cisco Switch)
- VLAN 총정리 (개념, 명령어, 설정)
- 라즈베리파이에 방화벽 설정하기(feat. ufw)
- 라즈베리파이4 보안 설정(1) - 사용자 계정 설정
- 라즈베리파이4 보안 설정(2) - ssh 포트 변경
- 라즈베리파이4 보안 설정(3) - 방화벽 설정
- MQTT란 무엇인가?
- 초간단 TLS, mTLS, E2EE
- 상호 TLS(mTLS)란 무엇일까요?
- Protocol_6주차_WebRTC 구조
- RFC 5764: DTLS Document
- ICE candidate
- RTCIceCandidate
- SRTP, Secure Real-time Transport Protocol: 보안 실시간 전송 프로토콜
- [네트워크] REST API란? REST, RESTful이란?
- OAuth 2.0 동작 방식의 이해
- OAuth2.0 개념 및 연동
- OAuth 2.0을 사용하여 Google API에 액세스하기
- 암호 알고리즘 AES-GCM-SIV 최적화 작업 소개
- RFC 8452: AES-GCM-SIV Document
- SNORT
- Snort란
- Suricata
- Suricata로 트래픽 탐지
- 2023/08/11 UTM