udev를 사용하는 USB 플래시용 화이트리스트

udev를 사용하는 USB 플래시용 화이트리스트

USB 플래시 드라이브에 대한 "화이트 리스트"와 같은 것을 만들고 싶습니다. "허용되지 않는 모든 것을 거부한다"는 뜻입니다.

나는 udev규칙을 사용해야 한다는 것을 알고 있습니다.

  1. /etc/udev/rules.d/모든 USB 플래시 드라이브를 거부하는 규칙 에 추가
  2. 내가 원하는 것을 허용하려면 더 높은 숫자의 다른 규칙을 추가하세요.

USB 플래시 드라이브만 다루고 싶습니다. 규칙은 USB 드라이브의 모든 정보를 기반으로 할 수 있습니다. 공급업체 ID, 일련번호를 의미합니다. 내 말은, 나는 이 사건에 대해 아무런 희망도 없다는 뜻이다. 모든 솔루션.

하지만 규칙 파일에 무엇을 써야 할지 모르겠습니다. 예를 들어주실 수 있나요?

UPD. 다음 내용으로 파일을 만듭니다.

deck@crunch /etc/udev/rules.d $ cat 90-deny-usbflash.rules 
BUS=="usb", OPTIONS+="ignore_device"

내가 아는 것처럼 이 폴더는 를 udev사용 하여 감시되므로 inotify변경 사항이 즉시 적용되어야 합니다. 하지만 변경사항이 적용되지 않았습니다.

답변1

모든 드라이브를 자동 마운트하는 다른 소프트웨어가 설치되어 있는지 여부는 밝히지 않았습니다. 아래 내 솔루션에서는 그렇지 않다고 가정합니다. 그렇다면 문제는 다릅니다. 누군가가 이를 제거하거나 제어하는 ​​방법을 제안할 수 있도록 문제가 무엇인지 지정해야 합니다.

다음은 허용된 드라이브만 마운트하는 udev 규칙의 예입니다(테스트하지는 않았지만 제가 사용하는 유사한 규칙을 기반으로 함).

#-- Skip if not an appropriate "sd" device
KERNEL!="sd[b-z]*", GOTO="99_exit"
SUBSYSTEM!="block", GOTO="99_exit"

#-- Handle 'remove' and 'change' events
SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/usr/bin/pumount /dev/%k", GOTO="99_exit"
ACTION=="remove|change", GOTO="99_exit"

#-- Create useful environment variables
SUBSYSTEMS=="usb", ENV{ID_SERIAL}!="?*", IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_FS_LABEL}!="?*", IMPORT{program}="/sbin/blkid -o udev -p %N"

#-- Skip if this is not a filesystem (e.g. if this is the whole drive, not a formatted partition)
ENV{ID_FS_USAGE}!="filesystem", GOTO="99_exit"

#-- Mount only allowed drives:
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="something_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/some_name"
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="other_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/other_name"

#-- Exit
LABEL="99_exit"

물론 사용하는 장착 명령은 원하는 대로 결정됩니다. 제가 보여드린 것은 하나의 예일 뿐입니다.

업데이트: 자동 마운트를 수행하는 기능이 설치되어 있다는 귀하의 의견을 수집했습니다. 내 시스템(Debian Wheezy)에서는 그렇지 않습니다. 제안한 grep을 시도했지만 다른 결과를 얻었습니다. 에서 /lib/udev/rules.d/80-udisks.rules다음 코드 섹션을 찾았습니다.

# Mark devices that shouldn't be automounted / autoassembled etc.
#
# Deny all, then punch holes for what looks like physical drives
# (TODO: this heuristic might need some work)
#

ENV{UDISKS_PRESENTATION_NOPOLICY}="1"
KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{DISKS_PRESENTATION_NOPOLICY}="0"

이는 다음을 시사합니다.만약에자동 마운트 소프트웨어를 설치했는데 UDISKS_PRESENTATION_NOPOLICY 환경 변수로 제어할 수 있었습니다. 배포판을 지정하지 않았지만 분명히 다릅니다.

답변2

당신은 시도해 볼 수 있습니다USBGuard. UDev 및 Linux 커널 USB 인증 프레임워크 위에 USB 장치 블랙리스트/화이트리스트를 구현합니다. 이미 제안한 대로 UDev를 사용하여 동일한 결과를 얻을 수 있지만 USBGuard는 해당 작업을 위한 전용 도구이며규칙 언어그리고 (선택적) GUI 애플릿.

USB 플래시 디스크에는 일반적으로 일련 번호가 있으므로 VID:PID 및 일련 번호를 사용하는 화이트리스트는 usbguard에서 다음과 같습니다.

allow 1234:5678 serial "123456" with-interface equals { 08:*:* }
allow 1234:5678 serial "abcdef" with-interface equals { 08:*:* }
block

이렇게 하면 대용량 저장 인터페이스 VID:PID 또는 1234:5678과 iSerial 값이 "123456" 또는 "abcdef"인 두 개의 USB 장치를 연결할 수 있습니다(인증). 다른 모든 것은 차단될 것입니다.

면책조항: 저는 해당 프로젝트의 저자입니다.

관련 정보