воскресенье, 12 декабря 2010 г.

Как отключить (авто)монтирование флешек в Linux

Несколько новых способов работающих на новых дистрибутивах:

Способ № 1.
Для отключения:
chmod 0700 /media

Для включения:
chmod 0755 /media

Суть этого способа в том, что бы запретить пользователю читать данные с флешки, cd/dvd-диска и т.д. Большинство современных дистрибутивов с включённым автомонтирование монтируют все сменные устройства в директорию /media, поэтому запретив доступ к ней, запрещаем доступ ко всему ее содержимому.
Этот способ удобен, если нужно на одном и том же компьютере кому-то разрешить, а кому-то запретить доступ к внешним устройсвам хранения. В примере единственный пользователь, который может писать и чатать данные с флешки это root (если владелец и группа каталога /media - root).


Если сменить группу каталогу /media например на "storage" и сменить права на /media:
chmod 0750 /media
Только пользователи из группы "storage" смогут получить доступ к сменным носителям. (По поводу групп это все в теории так на практике не проверял)


P.S. Само устройство будет появляться и монтироватся, но с данными на нем работать будет нельзя.
P.S. CD/DVD диски пишутся НЕ копирование файлов в папку, поэтому запретить запись на них так не получится.


Способ № 2.
Для отключения:
rmmod usb_storage; echo 'blacklist usb_storage' > /etc/modprobe.d/blacklist-storage.conf

Для включения:
rm /etc/modprobe.d/blacklist-storage.conf; modprobe usb_storage

Здесь просто выгружается драйвер флешки и выключается из автоподгрузки при вставке устройства. В этом случае ни один пользователь за компьютером не сможет воспользоваться флешкой, но и сообщений о готовности устройства, как в первом способе, появляться не будет.

P.S. Если правильно помню, /etc/modprobe.d есть не во всех дистрибутивах, так что возможно потребуются незначительные изменения.

Все команды нужно выполнять от root. Тестировалось на Ubuntu 10.10.


ВНИМАНИЕ! все ниже описанное не работает с новым udev, он запрещает пустое имя устройства. Оставлено, так как может содержать полезную информацию.


От 13.12.08.

Нужно всего лишь выполнить команду:

Для отключения:
echo 'ATTRS{removable}=="1", SUBSYSTEMS=="block", NAME=""' > /etc/udev/rules.d/99-block-storage.rules

Или(если используется sudo):
sudo sh -c 'echo "ATTRS{removable}==\"1\", SUBSYSTEMS==\"block\", NAME=\"\"" > /etc/udev/rules.d/99-block-storage.rules'


Для включения:
rm /etc/udev/rules.d/99-block-storage.rules
Или закоментировать содержимое этого файла.

Разумеется все от root.
Перезагружаться, или что-то перезапусткать не нужно.

Теперь немного о том зачем все это нужно, и, что здесь все таки происходит.
Иногда, к примеру в организациях, нужно запретить сотрудникам использовать съемные носители данных(флешки, карточки, жесткие диски и т.д.). Конечно можно просто отключить USB в BIOS, но если к компьютеру подключен принтер, сканер, мышь или еще что, то задача усложняется.

Все решается просто, благодаря udev. Если коротко, то это подсистема Linux, которая отвечает за появление новый файлов устройств. Для нас важно, что можно писать правила для этих устройств.

Так выглядит наше правило:
ATTRS{removable}=="1", SUBSYSTEMS=="block", NAME=""

ATTRS{removable}=="1"
Нужны только отключаемые устройства (что бы жесткий диск случайно не отключить).

SUBSYSTEMS=="block"
Нас интересуют устройства хранения данных. (Я пробовал другие подсистемы и драйвера, но в этом случае отдельные партиции все равно подключались).

NAME=""
Собственно действие. Не создавать файл устройства.

Минусы данного подхода:

  • Нельзя выбрать пользователей которым можно или нельзя подключать флешки. (времена, когда только пользователи, входящие в группу plugdev, могли подлючать устройства прошли вместе с pmount)

  • Приведенное правило, теоретически, может совпасть с каким-нибудь устройством, которое использует SUBSYSTEMS=="block", но при этом не является устройством хранения. В этом случае в правило нужно добавить исллючение, об этом хорошо написано здесь.


Все выше описанное протестировано на Ubuntu 8.10, но должно работать на любом современном дистрибутиве.

Если подняться на уровень HAL, то открываются очень интересные возможности, как к примеру выбор пользователей кому,что и когда можно подключать. А если сюда еще замешать SELinux и/или FUSE то остановить ограничение пользователей может только фантазия :)