Product SiteDocumentation Site

4.2. Неограниченные процессы

Неограниченные (unconfined) процессы выполняются в неограниченных (unconfined) доменах, программы запускаемые init выполняются в неограниченном unconfined initrc_t домене, неограниченные процессы ядра запускаются в домене kernel_t. Для неограниченных процессов правила политики SELinux также применяются, но правила политики существуют для разрешения практически всех доступов для процессов, запущенных в неограниченных доменах. Процессы запущенные в неограниченных доменах откатываются к использованию только правил DAC. Если неограниченный процесс скомпрометирован, SELinux не ограничивает атакующего от получения доступа к системным ресурсам и информации, но, конечно, правила DAC всё равно используются. SELinux это улучшение механизмов безопасности над дискретным доступом DAC - SELinux не заменяет правила дискретного доступа.
В следующем примере показывается как Apache HTTP Server (httpd) может получить доступ к данным, предназначенны для использования Samba, если запущен в неограиченном режиме. Примечание: по умолчанию в Fedora процесс httpd запускается в ограниченном httpd_t домене. Это пример, и он не является инструкцией по использованию в продуктивных средах. Подразумевается, что пакеты httpd, wget, setroubleshoot-server, dbus и audit установлены, используется целевая политика SELinux targeted и SELinux запущен в принудительном режиме enforcing:
  1. Для того, чтобы убедиться, что SELinux включен в принудительном режиме с целевой политикой, необходимо выполнить команду sestatus
    $ /usr/sbin/sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /selinux
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy version:                 23
    Policy from config file:        targeted
    
    Значение SELinux status: enabled возвращается, когда SELinux включен. Значение Current mode: enforcing возвращается, когда SELinux запущен в принудительном режиме. Значение Policy from config file: targeted возвращается, если используется целевая политика SELinux targeted.
  2. От имени пользователя Linux root выполните команду touch /var/www/html/test2file для создания файла.
  3. Для просмотра контекста SELinux выполните команду ls -Z /var/www/html/test2file:
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test2file
    
    По умолчанию, пользователи Linux работают неограниченно в Fedora, поэтому файл test2file помечен SELinux unconfined_u, RBAC используется только для процессов, не для файлов. Роли не имеют значения для файлов - роль object_r является универсальной для файлов (на постоянно подключенных хранилищах или сетевых файловых системах). В директории /proc/ файлы, относящиеся к процессам, могут использовать роль system_r.[7]. Тип httpd_sys_content_t разрешает процессу httpd получить доступ к этому файлу.
  4. Команда chcon перемаркирует файлы; однако такие изменения не сохраняются, когда файловая система перемаркируется. Для внесения постоянных сохраняющихся изменений используется команда semanage, которая обсуждается позже. От имени пользователя root выполните следующую команду для изменения типа на тип, используемый Samba:
    chcon -t samba_share_t /var/www/html/test2file
    Выполните команду ls -Z /var/www/html/test2file для просмотра изменений:
    -rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/test2file
    
  5. Выполните команду service httpd status для того убеждения в том, что процесс httpd не запущен:
    $ /sbin/service httpd status
    httpd is stopped
    
    Если вывод команды отличается, выполните команду service httpd stop от имени пользователя root для остановки процесса httpd:
    # /sbin/service httpd stop
    Stopping httpd:                                            [  OK  ]
    
  6. Для того, чтобы сделать работу процесса httpd неограниченной, выполните следующую команду от имени пользователя root для изменения типа файла /usr/sbin/httpd, на тип, который не перейдёт в ограниченный домен:
    chcon -t unconfined_exec_t /usr/sbin/httpd
  7. Выполните команду ls -Z /usr/sbin/httpd для подтверждения в том, что /usr/sbin/httpd помечен типом unconfined_exec_t:
    -rwxr-xr-x  root root system_u:object_r:unconfined_exec_t /usr/sbin/httpd
    
  8. От имени пользователя Lnux root выполните команду service httpd start для запуска процесса httpd Вывод команды показан ниже, если httpd запустился успешно:
    # /sbin/service httpd start
    Starting httpd:                                            [  OK  ]
    
  9. Выполните команду ps -eZ | grep httpd для того, чтобы убедиться, что httpd выполняется в домене unconfined_t:
    $ ps -eZ | grep httpd
    unconfined_u:system_r:unconfined_t 7721 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7723 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7724 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7725 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7726 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7727 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7728 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7729 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7730 ?      00:00:00 httpd
    
  10. Перейдите в директорию, где у вашего Linux пользователя есть права на запись, для выполнения команды wget http://localhost/test2file. Если конфигурация по умолчанию не изменена, то команда выполнится успешно:
    --2009-05-07 01:41:10--  http://localhost/test2file
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 0 [text/plain]
    Saving to: `test2file.1'
    
    [ <=>                            ]--.-K/s   in 0s      
    	
    2009-05-07 01:41:10 (0.00 B/s) - `test2file.1' saved [0/0]
    
    Несмотря на то, что процесс httpd не имеет доступа к файлам помеченным типом samba_share_t, демон httpd запущен в неограниченном unconfined_t домене и отступает к использованию правил DAC, таким образом, команда wget выполняется успешно. Если httpd запущен в ограниченном httpd_t домене, то команда wget завершится с ошибкой.
  11. Команда restorecon восстанавливает контекст SELinux по умолчанию для файлов. От имени пользователя root, выполните команду restorecon -v /usr/sbin/httpd для восстановления контекста SELinux по умолчанию для файла /usr/sbin/httpd:
    # /sbin/restorecon -v /usr/sbin/httpd
    restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_notrans_exec_t:s0->system_u:object_r:httpd_exec_t:s0
    
    Выполните команду ls -Z /usr/sbin/httpd для того, чтобы убедиться, что /usr/sbin/httpd помечен типом httpd_exec_t:
    $ ls -Z /usr/sbin/httpd
    -rwxr-xr-x  root root system_u:object_r:httpd_exec_t   /usr/sbin/httpd
    
  12. От имени пользователя root, выполните команду /sbin/service httpd restart для перезапуска httpd. После перезапуска, выполните ps -eZ | grep httpd для того, чтобы убедиться в запуске httpd в ограниченном httpd_t домене:
    # /sbin/service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]
    # ps -eZ | grep httpd
    unconfined_u:system_r:httpd_t    8880 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8882 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8883 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8884 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8885 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8886 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8887 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8888 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8889 ?        00:00:00 httpd
    
  13. От имени пользователя root, выполните команду rm -i /var/www/html/test2file для удаления test2file.
  14. Если нет необходимости в запущенном httpd, то от имени пользователя root выполните команду service httpd stop для остановки httpd:
    # /sbin/service httpd stop
    Stopping httpd:                                            [  OK  ]
    
Примеры в этом разделе, демонстрируют как данные могут быть защищены от уязвимых ограниченных процессов (confined-processes), защищенных с помощью SELinux, а также, как данные могут стать доступными для атакующего от уязвимых неограниченных (unconfined-processes), не защищенных с помощью SELinux.


[7] . При использовании других политик, таких как MLS, могут использоваться другие роли, например, secadm_r.