선택한 USB 포트에서 대용량 저장 장치 만 사용하십시오-어떻게?


14

주어진 USB 포트에서 USB 대용량 저장 기능 만 허용하고 싶습니다. HID 장치, Bluetooth 어댑터, RS232 변환기, 아무것도 없습니다. 예를 들어 udev를 사용하여 이것을 수행하는 방법이 있습니까? 지정된 장치 또는 지정된 포트의 드라이버 를 포함 하기 위한 사용자 지정 udev 규칙을 작성할 수 있지만 다른 모든 드라이버를 제외 할 수 있습니까? USB 대용량 저장 장치, 한 종류 의 장치 만 허용하려고합니다 . 이 클래스에는 무수히 다른 장치 모델이 있으며 어떤 포트에 연결할 것인지 모릅니다 (클라이언트가 자체적으로 가져올 것이므로 영향을 줄 방법이 없습니다).

재 프로그래밍 된 USB 펌웨어의 위협 은 당분간 더 나빠질 것입니다. 이 유스 케이스를 위해 완화하려고합니다. 내부적으로 연결된 USB 주변 장치 (네트워크 카드, 특수 주변 장치, 키보드) 및 하나의 공용 USB 포트가있는 컴퓨터가 있으며 파일 전송에만 사용해야합니다. 따라서 다른 USB 모듈을 모두 블랙리스트에 올릴 수는 없습니다. 하지만 특정 포트를 "위생 (sanitize)"하기 위해 다른 장치 유형을 연결해도 아무런 효과가 없습니다.

케이스는 물리적으로 잠겨 있으므로 외부에서이 하나의 특정 USB 포트만 액세스 할 수 있으며 케이스와 간섭하거나 키보드 케이블에 스 플라이 싱하는 것은 물리적 보안 대응을 트리거 할만큼 의심 스럽습니다. 또한 대부분의 사용자가 적극적으로 악의적 인 것으로 기대하지는 않지만 재 플래시 USB 드라이브의 무의식적 인 통신 사업자 수가 증가 할 것으로 예상합니다 (요로의 플로피 부팅 섹터 감염과 마찬가지로). 보안에 관한 한, 사용자가 악의적 인 의도로 "무기화 된"USB 디스크를 가져 왔는지 또는 "감염된"것인지 모르는 것은 실제로 중요하지 않습니다.

완벽한 보안이 불가능하다는 것을 알고 있으며 사용자가 어떤 방식 으로든 시스템과 상호 작용할 수있게 하는 것은 위험 하다는 사실을 알고 있습니다. 그러나 유용성과 보안의 균형을 맞출 필요가 있습니다. 컴퓨터는 클라이언트가 사용할 수 있어야합니다. 또한 나는 이것을 사용하여 목표로 정한 공격자를 방어하려고 노력하지 않습니다. 오히려, 나는 이것을 완화 기술 중 하나로 사용하여 시스템이 매달린 과일이 아닙니다.


2
음 나는 물건을 배우는 것이므로 이것이 도움이 될지 확실하지 않지만 이것이 관련이 있는지 확인하십시오 : " linux-usb.org/FAQ.html "구체적으로 "내 다목적 저장 장치에서 하나의 장치 만 볼 수있는 이유는 무엇입니까? "질문과 행이 있습니다"모든 SCSI 장치에 대해이 작업을 수행하지 않으려면 다음을 사용하여 커널에 특정 장치를 검색하도록 지시 할 수 있습니다. echo> / proc / scsi / scsi "scsi add-single-device 0 0 0 1 ""
Sergiy Kolodyazhnyy

1
특정 포트만 USB 대용량 저장소에 고정 하시겠습니까?
Kaz Wolfe

3
"물리적 접근을 통해 보안을위한 전투는 사라집니다." ~ 모든 Security.SE 사용자.
Kaz Wolfe

1
@Piskvor 확실하지 않지만 security.stackexchange.com 또는 다른 고급 / 전문 지향 사이트 중 하나 에서 답을 찾는 것이 더 좋습니다 .
Brian Z

2
아마도 이것이 도움이 될 수 있습니다 : irongeek.com/… , 특히 3.2 UDEV를 사용하여 리눅스 잠금하기 섹션.
alci

답변:


16

그것은 우분투 14.04에서 저장 장치 및 USB 네트워크 어댑터 및 다른 유형의 웹캠으로 2 개의 플래시 키 및 안드로이드 전화로 작동합니다. (USB 허브 배치를 테스트 할 수 없었습니다)

  1. USB 포트 (플러그 된 장치의 상위 장치)를 확인하십시오.

    $ udevadm info --name=/dev/sdc --attribute-walk
    
      looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0':
        KERNELS=="2-1.2:1.0"
        SUBSYSTEMS=="usb"
        DRIVERS=="usb-storage"
        ATTRS{bInterfaceClass}=="08"
        ATTRS{bInterfaceSubClass}=="06"
        ATTRS{bInterfaceProtocol}=="50"
        ATTRS{bNumEndpoints}=="02"
        ATTRS{supports_autosuspend}=="1"
        ATTRS{bAlternateSetting}==" 0"
        ATTRS{bInterfaceNumber}=="00"
    
  2. usb-storage드라이버 없이 USB 포트 커널 이름과 일치하는 udev 규칙 생성

    /etc/udev/rules.d/90-remove-non-storage.rules

    첫 번째 인터페이스로 스토리지가있는 모든 장치 허용 (복합 장치 허용)

    KERNELS=="2-1.2:1.0", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
    

    스토리지 인터페이스가 아닌 모든 장치를 차단합니다 (복합 장치가 거부 됨)

    실제로 전화는 모뎀으로 /dev/ttyACM0KERNELS == "2-1.2 : 1.1"으로 마운트됩니다 . 이렇게하면 전화 (복합 장치)를 단순한 저장 장치 만 마운트 할 수 없습니다.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
    

    스토리지가 아닌 인터페이스 만 차단 (컴포지트 디바이스는 스토리지로만 허용됨)

    허용되지 않는 인터페이스 만 비활성화하는 방법에 대한 검색 후. 드라이버 바인딩 해제가 작동하는 것 같습니다. 내 휴대 전화는 저장 공간으로 만 사용할 수 있지만 만들지 않습니다 /dev/ttyACM0.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
  3. udev 규칙 재로드

    udevadm control --reload-rules
    

참고 문헌 :


나를 이길 ...
Kaz Wolfe

@Whaaaaaat, yep authorized도 작동하지만 remove사용자가 플러그를 뽑을 때보 다 깔끔한 방법입니다. 마운트 해제 된 드라이브를 확인했지만 여전히 usb-storage상위 노드의 드라이버로 사용됩니다. usb-storage사용하지 않을 수 있는 경우가 있음에 동의합니다 . BTW, :) u는 너무 많은 주석을 소비합니다 (2 분, 1 분). 첫 번째 주석을 편집 할 수 있습니다 (<5 분)
user.dz

@Whaaaaaat : 이것을 테스트 할 때, 블록 스토리지 장치가 생성되기 직전에 usb-storage 드라이버가로드되었습니다. 그것들을 장착 할 필요는 없었습니다.
Piskvor는

@Piskvor이 질문에 답변이 되었습니까? 그렇다면, 정답으로 표시하고 현상금을 수여해야합니다.
John Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.