[sisyphus] /dev/sg* permissions

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Вт Ноя 25 17:22:40 MSK 2008


On Tue, Nov 25, 2008 at 03:36:12PM +0300, Dmitry V. Levin wrote:
> On Tue, Nov 25, 2008 at 03:28:29PM +0300, Rafael Malikov wrote:
> > Dmitry V. Levin wrote:
[...]
> > > На файлы /dev/sg* должны быть другие права.
> > > У меня там сейчас группа cdwriter.
> > > Наверное, у вас udev создаёт эти файлы с неправильными правами.
> > >   
> > получается у меня тоже с неправильными?
> > 
> > [raf на raflinux ~]$ ls -all /dev/sg*
> > crw-r----- 1 root disk 21, 0 Ноя 24 11:15 /dev/sg0
> > crw-r----- 1 root disk 21, 1 Ноя 24 11:15 /dev/sg1
> > crw-r----- 1 root disk 21, 2 Ноя 24 11:15 /dev/sg2
> 
> Если устройства /dev/sg* имеют такие права, то к ним имеет доступ только
> root (и привилегированные программы).
> 
> > [raf на raflinux ~]$ uname -a
> > Linux raflinux.ancor.ru 2.6.27-std-pae-alt2 #1 SMP Mon Nov 10 19:20:48
> > UTC 2008 i686 GNU/Linux
> > [raf на raflinux ~]$ rpm -qa | grep udev
> > udev-rules-130-alt6
> > udev-130-alt6
> > udev_static-addon-0.2-alt1
> > udev-initramfs-130-alt6
> > 
> > и кто виноват? куда копать?
> 
> Хороший вопрос.  Между прочим, /dev/sg* могут использоваться не только с
> целью чтения audio cd.

И не только с целью их записи.

На самом деле передача SCSI-команд возможна и через обычные устройства
/dev/sr*, /dev/sd* - с использованием ioctl SG_IO.  Однако совсем
произвольные команды обычным пользователям выполнять запрещено (чтобы,
например, предотвратить возможность изменения прошивки привода).
Причём в различных версиях ядер условия фильтрации команд различаются:

 - В ядрах до 2.6.27 разрешённые коды команд жёстко прописаны в коде
   ядра, причём отдельно для доступа через SG_IO и /dev/sg*:
   
   - Список разрешённых команд для SG_IO (доступ через основной файл
     устройства) можно посмотреть в block/scsi_ioctl.c в исходниках
     ядра; он достаточно длинный, общий подход - при открытии только для
     чтения разрешены команды, использующиеся при чтении CD/DVD (в том
     числе работа с Audio-CD), при открытии на запись также разрешены
     команды, использующиеся при записи CD/DVD на стандартных
     устройствах (но для доступа к нестандартным возможностям некоторых
     устройств этих команд может быть недостаточно - именно по этому
     поводу в своё время возмущался автор cdrecord).  Для процессов,
     имеющих CAP_SYS_RAWIO, разрешено всё.

   - Фильтр для доступа через /dev/sg* реализован в drivers/scsi/sg.c
     (функция sg_allow_access()) и работает следующим образом:

     - Для SCSI-сканеров разрешены любые команды.

     - При открытии устройства только для чтения разрешён некоторый
       набор команд чтения (отличающийся от набора для чтения,
       используемого при фильтрации SG_IO).

     - При открытии устройства для записи разрешены любые команды.

 - Начиная с версии 2.6.27, в ядре используется общий фильтр команд для
   доступа через /dev/sg* и SG_IO, причём теперь этот фильтр может
   настраиваться через атрибуты устройства read_table и write_table в
   sysfs - для любой команды можно разрешить использование её при
   открытии устройства только для чтения, для записи, или запретить её
   использование без CAP_SYS_RAWIO (тем самым решается проблема с
   устройствами, требующими использования нестандартных команд в
   cdrecord или других утилитах - можно разрешить нужные команды,
   например, через правила udev в зависимости от модели устройства).
   Теперь доступ через обычный файл устройства и /dev/sg* будет давать
   одинаковые права на использование SCSI-команд (за единственным
   исключением - для SCSI-сканеров сохранено разрешение на использование
   любых команд через /dev/sg*, чтобы не ломать совместимость).

Таким образом, расширение прав доступа к /dev/sg* при использовании ядер
старее 2.6.27 приведёт к тому, что пользователи, имеющие право записи в
/dev/sg*, получат возможность передавать в устройство произвольные
команды (а не только ограниченный набор, доступный при разрешении записи
в /dev/sr*).  С другой стороны, для большинства программ должно быть
достаточно доступа через /dev/sr* - хотя, возможно, какие-то старые
программы до сих пор не умеют использовать этот интерфейс.

Кстати, в новых ядрах (>= 2.6.23) есть ещё /dev/bsg/* - ещё один
интерфейс для передачи произвольных команд, замена /dev/sg* с более
широкими возможностями (теоретически там может использоваться не только
SCSI).
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20081125/9bddf74d/attachment.bin>


Подробная информация о списке рассылки Sisyphus