본문 바로가기

개발

HW USB 동글 보안 시스템 구축하기 - Sentinel EMS 프로비저닝 실무

들어가며

지난 글에서 USB 동글 보안 원리를 학습하고, Sentinel 동글 솔루션의 구조를 분석했다.

이번 글에서는 한 단계 더 나아가 실제 Sentinel USB 동글에 라이선스 정보를 저장해 보려고 한다.

 

최종 목표는 현재 개발 중인 Software PLC 시스템에 USB 동글 기반 라이선스 인증 기능을 추가하기 위함이다.

이전 글 : 2026.02.12 - [개발] - USB 동글 보안 시스템 동작 원리 ㅡ KeyLock 보안 스택

 

USB 동글 보안 시스템 동작 원리 ㅡ KeyLock 보안 스택

들어가며이번 프로젝트가 Open Beta 출시를 앞두고, HW USB 동글을 활용한 보안 기능 개발을 담당하게 되었다. 프로젝트는 MuLiN이라는 SW PLC로,WindowsLinuxARM 기반 HW환경에서 동작하며,USB 동글이 꽂혀

prejudice.tistory.com


기존 동글 시스템 분석

개발을 시작하기 전에 기존 HMI 서비스에서 사용 중인 USB 동글 구조를 먼저 분석했다.

확인된 주요 특징은 다음과 같다.

  • Feature ID = 1
  • USB 동글 메모리에 Application 고유 데이터 저장

이를 기반으로 새로운 PLC 서비스용 동글 설계를 위해 다음과 같은 체크리스트를 작성했다.

  • ☑ 기존 HMI용 USB와 호환성 유지
  • ☑ PLC 서비스용 Feature ID = 2 사용
  • ☑ Feature 1 + Feature 2가 함께 존재하면 HMI + PLC 통합 동글로 동작
  • ☑ PLC 서비스만의 고유 데이터 저장

USB 동글 보안 설계

Sentinel에서 제공하는 hasp API를 분석한 뒤 최소 기능만 갖춘 구조로 클래스를 설계했다.

  • License Manager : 실제 라이선스 로직 처리
  • SentinelClient : Sentinel API호출 담당 및 동글 데이터 접근

Sentinel Client 클래스 설계를 통해 동글에 고유 데이터가 없다는 것을 확인했고, 바로 프로비저닝 구성으로 들어갈 수 있었다.

최소한의 기능만 갖춘 SentinelClient Class 설계


Sentinel EMS 프로비저닝 환경 구성

Sentinel은 USB 동글 관리 및 라이서스 발급을 위해

EMS(Entitlement Management System) 라는 웹 기반 관리 시스템을 제공한다.

EMS 설치 후 http://[ip]:8080/ems 주소로 접속할 수 있었다.


Feature 생성

먼저 PLC 서비스에서 사용할 Feature ID를 생성했다.

Catalog-Features-NewFeatur 버튼으로 Feature ID = 2 를 등록했다.

새로운 서비스로 사용할 Feature

*이미 상품화되어 사용중인 Feature가 있다면, 삭제 또는 수정에 주의하자.

새로운 Feature가 추가된 상태


Dynamic Memory 생성

Sentinel USB 동글 메모리를 사용하는 방법은 두 가지가 있다.

  • Fixed Memosy : 주소 기반으로 메모리를 직접 지정 (start address + size)
  • Dynamic Memory : 파일 형태로 접근 (File ID 기반 접근)

기존 HMI 시스템은 Fixed Memory를 사용하고 있었지만 테스트를 위해 Dynamic Memory 방식을 사용해 보기로 했다.

Catalog-DynamicMemory-New Memory 를 선택하여  100 Bytes의 크기를 갖도록 생성했다.

Dynamic Memory 생성 화면


Product 생성

Sentinel EMS에서 Product는 다음 요소를 포함하는 패키지 개념이다.

  • Feature
  • Memory
  • License 정책

이번 PLC 시스템을 위해 MuLiN_Standard 라는 신규 Product를 생성했다.

여기에 조금전 생성한 Feature2 와 Dynamic Memory를 등록했다.

PLC Software용 Product 생성

 

Product 설계 시 패키지구성이 중요한데 동글을 따로 팔기 위해서는 각각의 Product를 가지도록 구성해야 한다.

 

예를 들어 ProductA = Word + PPT + Excel  로 구성할 경우, 각각의 제품을 USB로 제작할 수 없다.

따라서 각각의 제품을 팔기 위해서는 다음과 같이 구성한 뒤, USB 생산 과정에서 조합하는 방식이 좋다.

ProductA = Word,ProductB = PPT,ProductC = Excel 


프로비저닝 버닝 작업

Entitlements 생성 (주문서)

USB 동글 시스템

 

Sentinel에서는 실제 USB 동글 생산을 Entitlement (주문서) 단위로 관리한다.

즉 프로비저닝 환경구성이 끝났다면, 제조/운영 환경은 Entitlement 로 관리할 수 있다.

 

우선 Entitlement-Entitlements-New Entitlement 로 새 주문서를 생성하고,

Product Details탭에서 새로 만든 MuLiN_Standard Product를 추가하고 Produce로 주문서를 발행한다.

*기존에 있던 HMI 서비스 권한과 새로 만든 PLC 서비스 권한을 가진 USB제품을 다음과 같이 제작할 수 있다.
All-In-One USB = HMI Product + PLC Product
단, 두 Product 간 고정메모리 영역을 사용할 경우 데이터가 덮어써지지 않도록 주의해야 한다.


USB Burn 작업

주문서 생성 후 실제 USB 동글을 연결 하면

EMS에서 바로 Burn 작업을 진행할 수 있다.

예상치 못한 문제
바로 Burn 작업을 진행했으나 회사에서 사용하는 HL Pro 동글 모델은 Dynamic Memory를 지원하지 않았다.
결국 임시로 메모리 기능 없이 Feature만 기록해 USB를 구웠다...

Entitlements-Check In Key-Check In 로 동글 정보(Feature, Memory)를 확인할 수 있다.

USB 동글에 구워진 MuLiN_Standard 정보


회고

완성된 보안 USB 동글

이번 글에서는 Sentinel EMS를 사용해 USB 동글을 실제로 프로비저닝 하는 과정을 다뤘다.

이전 글에서 동글 보안 구조를 공부했기 때문에

Feature, Product, Entitlement 개념을 이해하는데 큰 도움이 되었다.

 

실무적으로 흥미로웠던 부분은

개발자가 어디까지 담당해야 하는지였다.

우리 회사의 경우, ERP 주문관리 및 USB제작은 생산팀이 담당하는데

이번 실습을 통해 개발 영역과 생산 영역의 경계를 이해할 수 있었다.

 

다음 글에서는 실제로 제작한 USB 동글을 이용 해

라이선스를 검증하는 C++ 클래스를 구현하는 과정을 정리해 보려고 한다.

부족한 부분이나 더 궁금한 주제가 있다면 댓글로 남겨주세요.
직접 공부해서 다음 글로 정리해 보려고 합니다.