제가 만든 오픈소스 프로젝트를 소개해요. Windows 10/11 PC에서 USB 저장장치 접근을 차단, 읽기 전용, 허용으로 관리하는 작은 매체제어 도구예요.

GitHub: kh20134/usb-access-control (MIT 라이선스)

왜 만들었나

USB 저장장치는 지금도 정보유출과 악성코드 유입의 대표 경로예요. 그래서 공공·기업 환경에서는 매체제어를 기본 통제로 둬요.

전산시스템을 총괄하다 보면 상용 매체제어 제품이 내부에서 어떤 정책 모델로 움직이는지 궁금할 때가 많아요. 그 구조를 로컬 PC에서 직접 확인해 보려고 만들었어요.

  • 상용 DLP, 도메인 그룹 정책, Intune을 대체하는 도구는 아니에요.
  • 한 대 또는 소수 PC에서 정책을 시험하고 이해하는 용도예요.

주요 기능

  • 정책 모드: 차단, 읽기 전용, 허용
  • 화이트리스트: VID/PID/일련번호. 일련번호를 비우면 그 제품 전체 승인
  • 선택적 차단: 차단 + 승인 장치가 있으면 전역 거부는 끄고, 일치하지 않는 USBSTOR 장치만 비활성화
  • 감시: USB 연결·분리를 기록
  • 감사 로그: JSON Lines 저장, UTF-8 BOM CSV 내보내기
  • 보호: 변경 시 관리자 권한 필요, 선택형 관리자 암호(PBKDF2)
  • ACL: 정책 폴더는 Administrators와 SYSTEM만 접근
  • UI: 한국어 Avalonia 창과 usbac CLI

구조

.NET 8로 만들었고, 플랫폼 중립 Core 뒤에 Windows 계층을 두었어요. 정책 판단, 화이트리스트 대조, 감사 로그는 Windows API 없이 동작해요.

USB 저장장치 접근통제 구조도

(출처: 본인 깃허브, docs/architecture.svg를 PNG로 변환)

  • Core: 정책, 화이트리스트, 적용 계획, 감사 로그
  • Windows: 정책 레지스트리, SetupAPI 열거, cfgmgr32 장치 노드, WMI 이벤트
  • CLI·앱: 같은 정책 파일을 함께 사용

테스트는 38개(Core 33, CLI 3, UI 2)예요. Windows API는 가짜 구현으로 대체해서, GitHub Actions의 Ubuntu와 Windows에서 모두 돌아요. 러너의 USB 정책은 바꾸지 않아요.

실제 화면

USB 저장장치 접근통제 주 화면

(출처: 본인 깃허브. 화면의 장치 두 대는 미리보기용 예시 데이터이고, 캡처 중 레지스트리는 변경하지 않았어요)

차단 정책에서 승인된 SanDisk는 허용, 미승인 Kingston은 차단으로 판정되는 모습이에요. 아래에는 감사 로그가 바로 보여요.

설치·사용법

.NET 8 SDK가 필요해요. 먼저 테스트와 빌드를 해요(PowerShell 기준).

dotnet test `
  UsbAccessControl.sln `
  -c Release
dotnet build `
  UsbAccessControl.sln `
  -c Release

Windows 배포용 CLI는 이렇게 만들어요.

dotnet publish `
  src/UsbAccessControl.Cli `
  -c Release -r win-x64 `
  --self-contained false `
  -o artifacts/cli

정책 확인과 변경이에요. 저장과 적용은 분리돼 있어요.

usbac policy show
usbac policy set block
usbac policy apply --yes
  • policy set은 파일에 저장만 해요.
  • policy apply가 실제 레지스트리와 장치 노드를 바꿔요.
  • 차단 적용은 --yes가 있어야 해요.

승인 장치 등록과 로그 내보내기예요.

usbac whitelist add `
  --vid 0781 --pid 5581 `
  --name "SanDisk Ultra"
usbac whitelist list
usbac logs --limit 20
usbac logs export `
  --out audit.csv

선택적 차단을 유지하려면 감시 작업을 등록해요.

usbac task install
  • 시스템 시작 때 SYSTEM 권한으로 usbac.exe monitor가 실행돼요.
  • 창만 보려면 UsbAccessControl.exe --preview를 써요. 레지스트리를 쓰지 않아요.

한계와 주의사항

  • 로컬 관리자 우회: 관리자는 레지스트리와 정책 파일을 직접 고칠 수 있어요. 암호와 ACL은 OS 권한을 대신하지 못해요.
  • DLP가 아님: 파일 시스템 필터 드라이버가 없어요.
  • 그룹 정책 경합: 도메인 GPO가 같은 키를 관리하면 gpupdate 뒤 되돌아가요. 도메인 PC는 GPO나 Intune이 기준이에요.
  • 선택적 차단: 감시 프로세스가 없으면 새로 꽂은 장치가 열릴 수 있어요.
  • 읽기 전용은 PC 전역: 화이트리스트가 쓰기 예외가 되지 않아요. 승인 장치만 쓰게 하려면 차단 + 화이트리스트를 써요.
  • 범위: CD/DVD, 일부 카드리더, MTP 휴대폰, 네트워크·블루투스 전송은 장치 노드 제어 대상이 아니에요.
  • 감사 로그: 로컬 파일이라 중앙 수집과 위변조 방지가 없어요.
  • 처음 실행만으로는 USB가 막히지 않아요. 적용을 눌러야 해요.

앞으로 할 일

아래는 계획이에요. 일정은 정해지지 않았어요.

  • 감사 로그 중앙 수집(syslog 등) 연동 검토
  • 감사 로그 위변조 탐지(해시 체인) 검토
  • 서명된 배포 파일과 설치 안내 정리
  • 실제 Windows 장비 기준 동작 검증 사례 보강

FAQ

회사 PC에 바로 써도 되나요?

도메인에 가입된 PC는 GPO나 Intune을 기준으로 하세요. 이 도구는 소수 PC 시험용에 가까워요.

읽기 전용에서 승인 USB만 쓰기 가능하게 할 수 있나요?

아니요. 읽기 전용은 PC 전역이라, 기본 정책을 차단으로 두고 화이트리스트를 쓰셔야 해요.

키보드나 마우스도 막히나요?

아니요. 장치 노드를 끄는 건 인스턴스 ID가 USBSTOR로 시작하는 저장장치뿐이에요.

마무리

매체제어가 내부에서 어떻게 동작하는지 직접 보고 싶어서 만든 도구예요.

코드와 문서는 모두 공개돼 있으니 이슈와 의견을 편하게 남겨 주세요.

GitHub: https://github.com/kh20134/usb-access-control