[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