четверг, 29 декабря 2011 г.

CentOS, KVM, SElinux.

Для начала небольшое введение. SELinux - Security-Enhanced Linux (Линукс с улучшенной безопасностью) подсистема ядра, предназначенная для повышения защищённости ОС Линукс. Если говорить кратко, то с помощью SElinux Вы имеете возможность добавить дополнительные ограничения, вступающие в действия только если нет обычных ограничений. Простой пример. Есть каталог, пусть /web . Вы можете поставить на него права 777 (то есть все могут туда писать). А потом, с помощью SElinux, запретить одному конкретному пользователю (или группе пользователей) писать в этот каталог. Кстати говоря, наоборот сделать не получиться, т.е. нельзя поставить права 000 и разрешить посредством механизмов SElinux использовать каталог, к примеру, пользователю и/или группе, потому что проверки SElinux выполняются только в случае если получено разрешение механизма DAC (Discretionary Access Control - избирательное управление доступом, привычный механизм управления доступом в linux).

В прошлых статьях мы установили CentOS в виртуальную машину и подключили к ней том LVM. И нам, конечно, было бы полезно использовать механизмы SElinux для обеспечения безопасности нашей хост-системы и изоляции гостей друг от друга.

К счастью, делать ничего особо не нужно, всё работает что называется "из коробки".

Работа SELinux для libvirt обеспечивается с помощью подсистемы sVirt. sVirt обеспечивает создание уникального ограниченного домена, которому запрещено общаться с другими доменами. Это изолирует процессы гостя от возможности доступа к другим гостям или к домену. Повторю, что случае установок, подобных нашей, ничего настраивать не нужно вообще. Посмотреть, всё ли работает как надо можно так (для запущенного гостя):
# ls -Z /var/lib/libvirt/images/
-rw-------. qemu qemu system_u:object_r:svirt_image_t:s0:c180,c585 try14.img
Здесь нужно обратить внимание на тип svirt_image_t на подстроку c180,c585 (напоминаю, гость, который пользуется образом, запущен, иначе этих цифр видно не будет). Подстрока c180,c585 означает категорию и подкатегорию SElinux-контекста. Вместе с типом "svirt_image_t" это означает что только процесс с типом "svirt_t" и категорией/подкатегорией "c180,c585" будет иметь возможность читать или писать в файл. Сочетание катогерия/подкатегория генерируется динамически и уникально для каждого запуска вирутальной машины. У вас вывод, соответственно, будет немного отличаться. НО, точно то же сочетание категории/подкатегории будет и у процесса, который пользуется этим образом:
# ps -eZ
LABEL                             PID TTY          TIME CMD
system_u:system_r:svirt_t:s0:c180,c585 16201 ? 00:02:04 qemu-kvm
и у других ресурсов (файлов, дисков), которыми пользуется процесс:
# ls -l /dev/mapper/VGMainSpace-LVdb 
lrwxrwxrwx. 1 root root 7 Dec 27 21:05 /dev/mapper/VGMainSpace-LVdb -> ../dm-2
# ls -Z /dev/dm-2
brw-rw----. qemu qemu system_u:object_r:svirt_image_t:s0:c180,c585 /dev/dm-2
Поглядеть параметры контекста безопасности можно и с помощь virsh:
$ virsh dumpxml try14
<seclabel type='dynamic' model='selinux' relabel='yes'>
    <label>system_u:system_r:svirt_t:s0:c180,c585</label>
    <imagelabel>system_u:object_r:svirt_image_t:s0:c180,c585</imagelabel>
</seclabel>
В документации можно так же прочитать о том, какие ещё типы кроме svirt_image_t и svirt_t существуют и что они означают.

Ещё один момент: в документации есть упоминание, что нужно руками задавать тип для блочного устройства (например, тома lvm). Однако, у меня всё заработало автоматически. На той же странице можно найти булевские настройки SElinux, предназначенные для виртуализации.


Комментариев нет:

Отправить комментарий