대상 OS: Rocky Linux 9
서버 보안에서 “물리”는 종종 맨 마지막에 밀립니다.
하지만 누군가가 USB를 꽂을 수 있는 환경이라면, 네트워크 하드닝만으로는 빈틈이 남습니다.
저장장치뿐 아니라 키보드처럼 위장한 악성 HID, 네트워크 어댑터, 시리얼 장치도 공격면이 될 수 있습니다.
그래서 현실적인 해법은 ‘USB를 전부 막기’가 아니라, 필요한 장치만 명시적으로 허용하는 것입니다.
Rocky Linux 9에서는 USBGuard로 USB 디바이스를 정책 기반으로 통제할 수 있습니다.
이 글은 “화이트리스트 기반 USB 정책”을 만들고 배포하는 방법, 운영 중 예외 처리, 그리고 사고 대응 시 어떤 로그를 보면 되는지까지 정리합니다.
---
1) USBGuard로 막을 수 있는 것 / 없는 것
1) 막을 수 있는 것: 허용되지 않은 USB 장치의 사용(차단/허용 정책)
2) 막을 수 있는 것: 특정 클래스(저장장치, HID, 네트워크 등)에 대한 제한
3) 막을 수 있는 것: 장치 단위의 화이트리스트(벤더/제품/시리얼/포트)
4) 없는 것: 이미 커널/펌웨어 레벨에서 뚫린 공격을 완전히 차단하는 만능 방패
USBGuard는 “운영 정책을 기술로 강제”하는 도구입니다. 문서만으로는 지켜지지 않는 규칙을 실제로 지키게 만들어 줍니다.
---
2) 도입 전 체크: 서버는 정말 USB가 필요한가
1) 랙 서버(원격 콘솔 있음)라면 USB를 거의 0으로 줄일 수 있다
2) 현장 유지보수(키보드/마우스)가 필요한 서버라면 HID 허용 범위를 고민해야 한다
3) 백업 동글/보안 토큰처럼 ‘반드시 필요한 USB’가 있다면, 그것만 허용 목록에 넣는 방향이 유리하다
도입 목표가 명확해야 정책이 깔끔해집니다.
---
3) 설치 및 서비스 상태 확인
1) 설치
sudo dnf -y install usbguard
2) 서비스 활성화
sudo systemctl enable --now usbguard
sudo systemctl status usbguard --no-pager
3) USBGuard CLI 확인
usbguard --version
usbguard list-devices | head -n 50
`list-devices`에서 현재 연결된 장치와 상태(allow/block 등)를 확인할 수 있습니다.
---
4) 가장 중요한 파일: 정책 파일(룰셋) 위치와 권한
USBGuard는 정책 파일을 기반으로 장치를 허용/차단합니다.
1) 기본 정책 파일 확인
sudo ls -la /etc/usbguard
sudo ls -la /etc/usbguard/rules.conf 2>/dev/null || true
2) 규칙 파일 권한 확인(원칙: root만 수정)
sudo stat -c '%A %U:%G %n' /etc/usbguard/rules.conf 2>/dev/null || true
---
5) 초기 정책 생성: “현재 연결된 장치”를 기준으로 시작
운영 서버에서 가장 안전한 시작 방법은 “현재 꽂혀 있는 장치만 허용”으로 룰을 생성한 뒤, 이후 연결되는 장치는 기본 차단하는 흐름입니다.
1) 초기 rules.conf 생성(현재 장치 기반)
sudo usbguard generate-policy > /etc/usbguard/rules.conf
2) 파일 확인
sudo head -n 40 /etc/usbguard/rules.conf
sudo wc -l /etc/usbguard/rules.conf
3) 정책 반영(서비스 재시작)
sudo systemctl restart usbguard
sudo systemctl status usbguard --no-pager
주의: generate-policy는 “현재 환경을 허용 목록으로” 만들어 주기 때문에, 정책 생성 시점에 꽂혀 있는 장치가 곧 허용됩니다. 정책 생성 전에 ‘불필요한 USB’를 뽑아두는 습관이 중요합니다.
---
6) 운영 정책 만들기: 기본은 deny, 필요한 것만 allow
USBGuard 정책은 장치 속성(벤더/제품/시리얼/포트/클래스 등)으로 제어할 수 있습니다.
운영에서는 보통 아래 방향을 추천합니다.
1) 기본: 알 수 없는 장치는 block
2) 허용: 키보드/마우스가 꼭 필요하면, 특정 포트(물리 위치) 또는 특정 모델만 허용
3) 저장장치: 원칙적으로 block, 예외는 승인 절차
정책을 너무 세밀하게 하면 유지보수가 어려워지고, 너무 느슨하면 통제 효과가 떨어집니다.
---
7) 장치 허용/차단을 즉시 조작하는 방법(현장 대응)
운영 중에는 “정책 수정 전 임시 허용”이 필요할 수 있습니다.
1) 현재 장치 목록 확인
sudo usbguard list-devices
2) 특정 장치 ID를 임시 허용/차단
sudo usbguard allow-device 1
sudo usbguard block-device 1
3) 변경 후 상태 확인
sudo usbguard list-devices
주의: allow-device로 허용해도 rules.conf에 영구 반영되는 건 아닐 수 있습니다. 영구적으로 허용하려면 rules.conf에 규칙을 추가하고 재시작하는 운영 흐름을 만드세요.
---
8) 예외 처리(승인 프로세스): ‘필요한 USB’만 정책에 추가
예외 처리는 기술보다 프로세스가 중요합니다.
1) 예외 요청 시 확인할 것
- 누가, 왜 필요한가
- 어떤 장치인가(벤더/모델/시리얼)
- 얼마 동안 허용할 것인가(기간)
- 사용 후 제거/반납 절차
2) 장치 속성 파악(usbguard 출력 활용)
sudo usbguard list-devices | sed -n '1,60p'
3) rules.conf 수정 후 적용
sudo cp -a /etc/usbguard/rules.conf /etc/usbguard/rules.conf.bak.$(date +%F_%H%M%S)
sudo vi /etc/usbguard/rules.conf
sudo systemctl restart usbguard
(편집기는 예시입니다. 운영 환경에서는 변경을 형상관리/배포 파이프라인으로 관리하는 게 더 안전합니다.)
---
9) 로그/감사: 사고 대응에서 어디를 보나
USB 통제의 가치는 “차단”뿐 아니라 “누가 언제 꽂았는지”라는 증거에도 있습니다.
1) usbguard 서비스 로그 확인
sudo journalctl -u usbguard -n 200 --no-pager
2) 커널 이벤트(USB 연결 흔적) 확인
sudo journalctl -k -n 200 --no-pager | grep -iE 'usb|hid|storage' | tail -n 80
3) 이상 징후 예시
- 평소 없던 USB 네트워크 어댑터가 연결됨
- HID 장치가 반복적으로 연결/해제됨
- 저장장치가 차단 이벤트를 유발함
이런 이벤트는 단순 실수일 수도 있지만, 침해사고/내부자 사고의 초기 신호일 수 있습니다.
---
10) 롤아웃 전략(서버 전체에 배포할 때)
1) 파일럿 1~2대에서 정책을 먼저 안정화한다
2) “기본 차단 + 허용 목록”을 표준 템플릿으로 만든다
3) 서버 타입별로 프로파일을 나눈다
- 랙 서버: HID도 최소화
- 현장 장비: HID는 제한적으로 허용
4) 예외 프로세스를 문서화하고, 임시 허용은 반드시 만료/회수한다
5) 정책 파일(rules.conf)을 중앙에서 관리(Git)하고 배포한다
USBGuard 정책은 한 번 정착하면 “USB를 꽂는 행위 자체가 이벤트”가 됩니다. 그 순간부터 물리 리스크는 관리 가능한 영역으로 들어옵니다.
---
마무리
Rocky Linux 9에서 USBGuard는 ‘물리적 반입’ 공격면을 줄이는 가장 현실적인 도구 중 하나입니다.
모듈 블랙리스트로 저장장치만 막는 방법도 있지만, USBGuard는 장치 단위로 더 정교한 정책을 만들 수 있고, 무엇보다 로그/감사 측면에서 운영 가치가 큽니다.
정리하면
- 초기에는 generate-policy로 “현재 장치만 허용”
- 운영에서는 화이트리스트 중심으로 예외를 최소화
- 로그를 정기 점검하고, 이상 이벤트는 즉시 확인
이 흐름으로 가면 USB는 더 이상 ‘통제 불가능한 구멍’이 아니라 ‘정책으로 관리되는 자원’이 됩니다.