Product SiteDocumentation Site

5.7.2. Постоянные изменения: semanage fcontext

Команда /usr/sbin/semanage fcontext изменяет контекст SELinux для файлов. При использовании целевой политики targeted, изменение вносимые данной командой, добавляются в файл /etc/selinux/targeted/contexts/files/file_contexts, если изменения вносятся для существующих файлов, то они добавляются в файл file_contexts, или добавляютсяв файл file_contexts.local для новых файлов и каталогов, например при создании каталога /web/. setfiles, использующаяся при маркирование файловой системы и /sbin/restorecon, использующаяся для восстановления контекста SELinux по умолчанию, читают эти файлы. Это значит, что изменения вносимые командой /usr/sbin/semanage fcontext постоянно, даже если файловая система будет перемаркирована. Политика SELinux контролирует возможность пользователей изменять контекст файлов.
Быстрое ознакомление
Для внесения изменений в контекст SELinux изменений, которые сохранятся при перемаркировании файловой системы:
  1. Выполните команду /usr/sbin/semanage fcontext -a options file-name|directory-name, помня, что необходимо использовать полные пути к файлам и каталогам.
  2. Выполните команду /sbin/restorecon -v file-name|directory-name для применения изменений контекста.
Изменение типа файла
В следующем примере демонстрируется как изменить тип файла в контексте SELinux:
  1. От имени пользователя root, выполните команду touch /etc/file1 для создания нового файла. По умолчанию, вновь созданные файлы в каталоге /etc/ помечаются типом etc_t:
    # ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
  2. От имени пользователя root, выполните команду /usr/sbin/semanage fcontext -a -t samba_share_t /etc/file1 для изменения типа файла file1 на samba_share_t. Опция -a добавляет новую запись, а опция -t определяет тип (samba_share_t). Примечание: выполнение данной командой не изменяет тип напрямую - file1 до сих пор помечен типом etc_t:
    # /usr/sbin/semanage fcontext -a -t samba_share_t /etc/file1
    # ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
    Команда /usr/sbin/semanage fcontext -a -t samba_share_t /etc/file1 добавляет следующую запись в /etc/selinux/targeted/contexts/files/file_contexts.local:
    /etc/file1    unconfined_u:object_r:samba_share_t:s0
    
  3. От имени пользователя root выполните команду /sbin/restorecon -v /etc/file1 для изменения типа. Так как команда semanage добавила запись в file.contexts.local для /etc/file1, команда /sbin/restorecon изменяет тип на samba_share_t:
    # /sbin/restorecon -v /etc/file1
    restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
    
  4. От имени пользователя root выполните команду rm -i /etc/file1 для удаления file1.
  5. От имени пользователя root, выполните команду /usr/sbin/semanage fcontext -d /etc/file1 для удаления контекста добавленного для /etc/file1. Когда контекст удален, выполнение команды restorecon изменяет тип на etc_t, вместо samba_share_t.
Изменение типа каталога
В следующем примере демонстрируется создание нового каталога и изменение типа каталога на тип, используемый Apache HTTP Server:
  1. От имени пользователя root, выполните команду mkdir /web для создания нового каталога. Этот каталог помечен типом default_t:
    # ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    Команда ls -d с опцией выводит информацию о каталоге, а не о его содержимом, а опция -Z показывает контекст SELinux (в нашем примере, unconfined_u:object_r:default_t:s0).
  2. От имени пользователя root, выполните команду /usr/sbin/semanage fcontext -a -t httpd_sys_content_t /web для изменения типа каталога /web/ на httpd_sys_content_t. Опция -a добавляет новую запись, а опция -t определяет тип (httpd_sys_content_t). Примечание: выполнение этой команды не изменяет тип напрямую - /web/ до сих пор помечен типом default_t:
    # /usr/sbin/semanage fcontext -a -t httpd_sys_content_t /web
    # ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0   /web
    
    Команда /usr/sbin/semanage fcontext -a -t httpd_sys_content_t /web добавляет следующую запись в /etc/selinux/targeted/contexts/files/file_contexts.local:
    /web    unconfined_u:object_r:httpd_sys_content_t:s0
    
  3. От имени пользователя root, выполните команду /sbin/restorecon -v /web для изменения типа. Так как с помощью команды semanage добавлена запись в file.contexts.local для /web, то команда /sbin/restorecon изменяет тип на httpd_sys_content_t:
    # /sbin/restorecon -v /web
    restorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    По умолчанию, вновь созданные файлы и каталоги наследуют тип SELinux от своих родительских каталогов. При использовании данного примера и перед удалением контекста SELinux, добавленного для /web/, файлы и каталоги созданные в каталоге /web/ помечены типом httpd_sys_content_t.
  4. От имени пользователя root, выполните команду /usr/sbin/semanage fcontext -d /web для удаления контекста, добавленного для /web/.
  5. От имени пользователя root, выполните команду /sbin/restorecon -v /web для восстановления контекста SELinux по умолчанию.
Изменение типа каталога и его содержимого
В следующем примере демонстрируется создание нового каталога и изменение типа каталога (вместе с его содержимым) на тип, используемым Apache HTTP Server. Конфигурация в этом примере, может быть использована, если Apache HTTP Server использует другой корневой каталог (вместо /var/www/html/):
  1. От имени пользователя root, выполните команду mkdir /web для создания нового каталога и команду touch /web/file{1,2,3} для создания трёх пустых файлов (file1, file2 и file3). Каталог /web/ и файлы в внутри каталога помечены как тип default_t:
    # ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    # ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
  2. От имени пользователя root, выполните команду /usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" для изменения типа каталога /web/ и файла в нем, на httpd_sys_content_t. Опция -a добавляет новую запись, а опция -t определяет тип (httpd_sys_content_t). Регулярное выражение "/web(/.*)?" при выполнении команды semanage применяет изменения к каталогу /web/, а также файлам внутри него. Примечание: выполнение этой команды не изменяет тип напрямую - /web/ до сих пор помечен типом default_t:
    # ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    # ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
    Команда /usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" добавляет следующую запись в /etc/selinux/targeted/contexts/files/file_contexts.local:
    /web(/.*)?    system_u:object_r:httpd_sys_content_t:s0
    
  3. От имени пользователя root, выполните команду /sbin/restorecon -R -v /web для изменения типа каталога /web/, а также файлам внутри него. Опция -R определяет рекурсию, а это означает, что все файлы и каталоги внутри /web/ помечены типом httpd_sys_content_t. Так как с помощью команды semanage добавлены записи в file.contexts.local для /web(/.*)?, то команда /sbin/restorecon изменяет тип на httpd_sys_content_t:
    # /sbin/restorecon -R -v /web
    restorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file2 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file3 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    По умолчанию вновь созданные файлы и каталоги наследуют тип SELinux от родительских каталогов. В данном примере, файлы и каталоги созданные в каталоге /web/ будут помечены типом httpd_sys_content_t.
  4. От имени пользователя root выполните команду /usr/sbin/semanage fcontext -d "/web(/.*)?" для удаления контекста добавленного для "/web(/.*)?".
  5. От имени пользователя root выполните команду /sbin/restorecon -R -v /web для восстановления контекста SELinux по умолчанию.
Удаление добавленного контекста
В следующем примере демонстрируется добавление и удаление контекста SELinux:
  1. От имени пользователя root выполните команду /usr/sbin/semanage fcontext -a -t httpd_sys_content_t /test. Каталога /test/ не должно существовать. Эта команда добавляет следующих контекст в /etc/selinux/targeted/contexts/files/file_contexts.local:
    /test    system_u:object_r:httpd_sys_content_t:s0
    
  2. Для удаления контекста, выполните от имени пользователя root команду /usr/sbin/semanage fcontext -d file-name|directory-name, где file-name|directory-name является первой частью в file_contexts.local. Ниже показан пример контекста в file_contexts.local:
    /test    system_u:object_r:httpd_sys_content_t:s0
    
    В начале указан /test. Для предотвращения маркирования каталога /test/ контекстом httpd_sys_content_t после запуска /sbin/restorecon, или после перемаркирования файловой системы, выполните следующую команду от имени пользователя root для удаления контекста из file_contexts.local:
    /usr/sbin/semanage fcontext -d /test
Если контекст является частью регулярного выражения, например /web(/.*)?, заключите регулярное выражение в кавычки:
/usr/sbin/semanage fcontext -d "/web(/.*)?"
Refer to the semanage(8) manual page for further information about /usr/sbin/semanage.

Важно

При изменении контекста SELinux с помощью /usr/sbin/semanage fcontext -a, используйте полные пути к файлам или каталога для избежания ошибок после маркирования файловой системы, или после выполнения команды /sbin/restorecon.