Fedora 12 - SELinux: Восстановление работоспособности

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

Что нужно знать о SELinux?

SELinux "живая" система, как тамогочи :). Все изменения происходят мгновенно и работают до тех пор, пока не вмешается человек. На мой взгляд, в настоящее время многое неудобно с точки зрения обычного пользователя. Все, что поставляется по дефолту лежит здесь: /usr/share/selinux. Активная система расположена здесь: /etc/selinux. До тех пор, пока в активной части будут оставаться ваши персональные файлы, они будут действовать либо как вам нужно, либо будут наоборот мешать.

Стандартных средств для восстановление "убитого" SELinux нет и скорей всего не будет. Поэтому надо все делать очень аккуратно. И рекомендую выставлять системную политику в /etc/selinux/config SELINUX=permissive в ходе восстановления системы.

Система не загружается

Начнем с того, что SELinux при неправильной настройке или сбое может полностью блокировать загрузку системы. Например, файловая система будет монтироваться в read-only режиме, какие-то программы откажутся запускатся и вообще все будет нехорошо. Обратить стоит внимание на сообщения, подобные этому:

libselinux.so.1: cannot open shared object file: Permission denied

Причина: контекст на файл libselinux.so.1 изменился. Проверяем так:

$ ls -Z /lib/libselinux.so.1

Результатом, скорее всего, будет просто символ вопроса '?'. Стандартными средствами с помощью chcon изменить контекст не получится. Исправить ситуацию легко. Первым делом перезагружаем систему, заходим в меню grub (по умолчанию оно не отображается, надо нажать любую клавишу). Редактируем строчку загрузки ядра, добавляя в самом конце следующее:

kernel /vmlinuz-2.6.31.6-166.fc12.i686 <часть параметров опущена> selinux=0 fs 1

Тем самым мы загрузимся в однопользовательский режим. Всё, что нам остается сделать, это установить правильный контекст и перегрузить систему:

# /sbin/fixfiles relabel
# reboot

Восстановление булевых переменных по умолчанию (Restore default booleans)

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

Что касается файлов /etc/selinux/booleans и /etc/selinux/booleans.local, то в настоящее время их поддержка в Fedora 12 отключена. Чтобы сбросить все исходное состояние, вам понадобятся файлы booleans-targeted.conf, booleans-mls.conf, booleans-minimum.conf, в зависимости от установленных политик. Эти файлы находятся в исходниках пакета selinux-policy.

$ yumdownloader --source selinux-policy
$ rpm -ivh selinux-policy-3.6.32-56.fc12.src.rpm

Файлы расположены в ~/rpmbuild/SOURCES или в отличном месте, если вы изменяли файл ~/.rpmmacros. Далее, с помощью стандартной утилиты setsebool нужно выставить каждое значение самостоятельно. Я для этого написал скрипт на перле, который делает эту работу за меня :)

Скрипт автоматического восстановления булевых переменных selinux (setbool.pl) download
#!/usr/bin/env perl

use strict;
use warnings;

my $file = 'booleans-targeted.conf';

open(FILE, "<", $file) or die "Can not open file $file: $!\n";

while (my $line = <FILE>) {
  $line =~ s/^#.*//g; # опускаем комментарии
  # меняем слова на цифры и убираем пробелы, т.к. setsebool
  # работает именно с таким форматом.
  $line =~ s/true/1/g;
  $line =~ s/false/0/g;
  $line =~ s/\ //g;
  print "> $line", "\n";
  # выполняем команду setsebool
  `setsebool -P "$line"`;
}

close(FILE);

Восстановление модулей по умолчанию (Restore default modules)

Как я говорил в самом начале, все что находится в /etc/selinux будет работать до тех пор, пока вы не сделаете изменения в файлах, расположенных там, самостоятельно. Для восстановления модулей придется немного поработать руками и головой :) Первым делом, нам надо почистить /etc/selinux. После установки собственных модулей данные о них прописывается в разных файлах, которые в последствии мешают восстановлению к изначальному состоянию.

# rm -rf /etc/selinux/*

Следующим шагом следует восстановить модули в активной директории. Я делаю это переустановкой части пакетов:

# rpm -Uvh --replacepkgs --replacefiles selinux-policy-3.6.32-56.fc12.noarch.rpm
# rpm -Uvh --replacepkgs --replacefiles selinux-policy-targeted-3.6.32-56.fc12.noarch.rpm

Пакеты можно скачать через yumdownloader. Также можно воспользоваться yum reinstall. Далее, стоит сказать системе провести изменения контекста для файлов после перезагрузки и перезагрузится:

# touch /.autorelabel
# reboot

Вместо заключения

Статья не претендует на полноту, поэтому буду рад конструктивным комментариям. Когда работаете с SELinux будьте просто внимательней и обдумывайте, записывайте каждое ваше действие, если не уверены на 200%, что делаете правильно.