Использование Security-Enhanced Linux для ThingWorx Docker
Security-Enhanced Linux (SELinux) представляет собой набор изменений ядра и инструментов пользовательского пространства, которые добавляется в различные комплекты поставки программного обеспечения Linux. Архитектура SELinux поддерживает отделение применения решений безопасности из политики безопасности и оптимизирует количество программного обеспечения, задействованного в применении политики безопасности. Ключевые концепции, лежащие в основе SELinux, можно проследить до нескольких ранних проектов Агентства национальной безопасности США (NSA).
Пользователи и роли SELinux не обязательно должны быть связаны с реальными пользователями и ролями системы. Для каждого текущего пользователя или процесса SELinux назначает трехстрочный контекст, который включает имя пользователя, роль и домен (или тип). Это более гибкая система, чем требуется в обычных условиях. Как правило, большинство реальных пользователей совместно используют одно и то же имя пользователя SELinux, а контроль доступа полностью управляется с помощью третьего тега, домена. Необходимо настроить обстоятельства для разрешения процесса в определенном домене в политиках. Хотя можно использовать команду runcon для запуска процесса в явным образом указанном контексте (пользователь, роль и домен), SELinux может отклонить переход, если он не одобрен политикой.
Файлы, сетевые порты и другое оборудование также имеют контекст SELinux, включающий имя, роль (редко используется) и тип. В случае файловых систем сопоставление между файлами и контекстами безопасности называется маркировкой. Маркировка задается в файлах политики, но ее можно изменить вручную без изменения политики. Типы оборудования также подробно описаны, например bin_t (все файлы в папке /bin) или postgresql_port_t (порт PostgreSQL, 5432). Контекст SELinux для удаленной файловой системы можно задать явным образом во время монтирования.
SELinux добавляет переключатель -Z к командам оболочки ls, ps и некоторым другим, позволяющий видеть контекст безопасности файлов или процесса.
Обычно правила политики состоят из явных разрешений - например, какими доменами должен владеть пользователь, чтобы иметь возможность выполнять определенные действия с данным целевым объектом. Примеры таких действий: чтение, выполнение и, в случае сетевого порта, привязка или соединение. Также возможны более сложные сопоставления, включающие роли и уровни безопасности.
Типовая политика включает файл сопоставления (маркировки), файл правил и файл интерфейса, определяющий переход домена. Эти три файла должны быть скомпилированы с помощью инструментов SELinux для создания единого файла политики. Полученный файл политики можно загрузить в ядро, сделав его активным. Для загрузки и выгрузки политик не требуется выполнять перезагрузку. Файлы политик разрабатываются вручную или могут создаваться с помощью более простого в использовании инструмента управления SELinux. Обычно такие файлы вначале тестируются в разрешительном режиме, когда нарушения регистрируются, но допускаются. Позднее можно использовать инструмент audit2allow для создания дополнительных правил, чтобы расширить политику и разрешить все допустимые действия приложения, которые были ограничены.
Распространенные проблемы с SELinux
Наиболее распространенной проблемой с SELinux является отказ в разрешении, означающий, что SELinux не работает. Сообщения об ошибках с отказом в разрешении отображаются при попытке получить доступ к системному объекту, не связанному с программой или учетными данными пользователя, которые используются для обращения к этому объекту. Такие ошибки сложно устранить, однако существуют инструменты, которые могут в этом помочь.
Установка Setools и Setroubleshoot
Чтобы установить эти инструменты в системе, выполните следующие действия.
1. Войдите в систему сервера или настольного компьютера, используя учетную запись с правами администратора.
2. Откройте командную оболочку.
3. Установите пакеты setroubleshoot с помощью Yum:
yum install setroubleshoot setools
Предупреждения SELinux
Используйте инструмент sealert для анализа журнала аудита, используемого в SELinux. Этот инструмент сканирует файл журнала и отчет, а затем создает отчет, содержащий все обнаруженные проблемы SELinux.
Чтобы выполнить sealert из командной строки, нацельте его на журнал аудита SELinux. См. следующий пример.
sealert -a /var/log/audit/audit.log
В отчете описаны все проблемы и объясняется способ их устранения. Ниже приведен сокращенный пример выходных данных, создаваемых инструментом sealert:
100% done found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /usr/sbin/httpd from getattr access on the file
/myapps/app1/html/index.html.
***** Plugin catchall_labels (83.8 confidence) suggests ********************
If you want to allow httpd to have getattr access on the index.html file
Then you need to change the label on /myapps/app1/html/index.html
Do
# semanage fcontext -a -t FILE_TYPE '/myapps/app1/html/index.html'
where FILE_TYPE is one of the following: sssd_var_lib_t, public_content_t, anon_inodefs_t,
[..truncated..]
httpd_sys_ra_content_t, httpd_sys_rw_content_t, httpd_sys_rw_content_t,
httpd_w3c_validator_content_t.
Then execute:
restorecon -v '/myapps/app1/html/index.html'
***** Plugin catchall (17.1 confidence) suggests ***************************
If you believe that httpd should be allowed getattr access on the index.html file by
default. Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
Самая важная часть отчета, в которой объясняется, как устранить проблему, отображается в конце каждого предупреждения. Например, в приведенном выше отчете показано следующее решение:
If you believe that httpd should be allowed getattr access on the index.html file by
default. Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
Предлагаемое решение создает политику SELinux, которая должна быть применена к проблемному файлу. В этом примере файлу HTML назначен неверный контекст файла SELinux.
Ниже приведены дополнительные примеры потенциальных проблем с контейнерами ThingWorx Docker.
В этом примере показана проблема с PostgreSQL. В этом случае sealert выдает следующее предупреждение:
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /bin/chown from setattr access on the directory data.
***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow chown to have setattr access on the data directory
Then you need to change the label on data
Do
# semanage fcontext -a -t FILE_TYPE 'data'
where FILE_TYPE is one of the following: cgroup_t, nfs_t, svirt_home_t,
svirt_sandbox_file_t.
Then execute:
restorecon -v 'data'

***** Plugin catchall (17.1 confidence) suggests **************************
If you believe that chown should be allowed setattr access on the data directory by
default. Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'chown' --raw | audit2allow -M my-chown
# semodule -i my-chown.pp

Additional Information:
Source Context system_u:system_r:svirt_lxc_net_t:s0:c459,c1008
Target Context unconfined_u:object_r:usr_t:s0
Target Objects data [ dir ]
Source chown
Source Path /bin/chown
Port <Unknown>
Host <Unknown>
Source RPM Packages
Target RPM Packages
Policy RPM selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name ip-10-99-0-109.ec2.internal
Platform Linux ip-10-99-0-109.ec2.internal
3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20
20:32:50 UTC 2017 x86_64 x86_64
Alert Count 9
First Seen 2018-04-02 17:08:08 UTC
Last Seen 2018-04-02 17:08:27 UTC
Local ID 65bb52e5-bde9-4ec5-ba44-f0752ffef319
Raw Audit Messages
type=AVC msg=audit(1522688907.927:619): avc: denied { setattr } for pid=12142
comm="initdb" name="data" dev="nvme0n1p1" ino=826278009 scontext=system_u:system_r:
svirt_lxc_net_t:s0:c459,c1008 tcontext=unconfined_u:object_r:usr_t:s0 tclass=dir

type=SYSCALL msg=audit(1522688907.927:619): arch=x86_64 syscall=chmod success=no
exit=EACCES a0=5633eefb7310 a1=1c0 a2=0 a3=7f3c78d1d6a0 items=0 ppid=12116 pid=12142
auid=4294967295 uid=1001 gid=0 euid=1001 suid=1001 fsuid=1001 egid=0 sgid=0 fsgid=0
tty=(none) ses=4294967295 comm=initdb exe=/usr/lib/postgresql/9.4/bin/initdb
subj=system_u:system_r:svirt_lxc_net_t:s0:c459,c1008 key=(null)
Hash: chown,svirt_lxc_net_t,usr_t,dir,setattr
В этом отчете показано следующее предлагаемое решение.
If you want to allow chown to have setattr access on the data directory
Then you need to change the label on data
Do
# semanage fcontext -a -t FILE_TYPE 'data'
where FILE_TYPE is one of the following: cgroup_t, nfs_t, svirt_home_t,
svirt_sandbox_file_t.
Then execute:
restorecon -v 'data'
Ниже приведена команда, которую нужно ввести для применения этого решения:
semanage fcontext -a -t svirt_sandbox_file_t "/opt/postgresql-storage(/.*)?" restorecon -R /opt/postgresql-storage
Учтите, что предлагаемое решение применяет разрешения только к папке данных для PostgreSQL. Однако, поскольку требуется право на запись для табличного пространства ThingWorx, необходимо предоставить те же разрешения для всех элементов в этой папке.
В этом примере показана проблема с платформой ThingWorx. В этом случае sealert выдает следующее предупреждение:
found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------
SELinux is preventing /bin/mv from write access on the directory ThingworxStorage.
***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow mv to have write access on the ThingworxStorage directory
Then you need to change the label on ThingworxStorage
Do
# semanage fcontext -a -t FILE_TYPE 'ThingworxStorage'
where FILE_TYPE is one of the following: cgroup_t, container_var_lib_t, nfs_t,
svirt_home_t, svirt_sandbox_file_t, tmpfs_t, virt_home_t.
Then execute:
restorecon -v 'ThingworxStorage'

***** Plugin catchall (17.1 confidence) suggests **************************
If you believe that mv should be allowed write access on the ThingworxStorage
directory by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'mv' --raw | audit2allow -M my-mv
# semodule -i my-mv.pp

Additional Information:
Source Context system_u:system_r:svirt_lxc_net_t:s0:c320,c876
Target Context unconfined_u:object_r:usr_t:s0
Target Objects ThingworxStorage [ dir ]
Source mv
Source Path /bin/mv
Port <Unknown>
Host <Unknown>
Source RPM Packages
Target RPM Packages
Policy RPM selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name ip-10-99-0-109.ec2.internal
Platform Linux ip-10-99-0-109.ec2.internal
3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20
20:32:50 UTC 2017 x86_64 x86_64
Alert Count 13
First Seen 2018-04-02 17:13:18 UTC
Last Seen 2018-04-02 17:13:23 UTC
Local ID 1759a007-f347-4d80-99e8-ee414eae7602
Raw Audit Messages
type=AVC msg=audit(1522689203.86:708): avc: denied { write } forpid=14905
comm="java" name="ThingworxStorage" dev="nvme0n1p1" ino=864027929
scontext=system_u:system_r:svirt_lxc_net_t:s0:c320,c876
tcontext=unconfined_u:object_r:usr_t:s0 tclass=dir

type=SYSCALL msg=audit(1522689203.86:708): arch=x86_64 syscall=mkdir success=no
exit=EACCES a0=7f6480f76e80 a1=1ff a2=7f6480f76e80 a3=b items=0 ppid=14734
pid=14905 auid=4294967295 uid=1337 gid=1337 euid=1337 suid=1337 fsuid=1337
egid=1337 sgid=1337 fsgid=1337 tty=(none) ses=4294967295 comm=java exe=/opt/
jdk1.8.0_121/bin/java subj=system_u:system_r:svirt_lxc_net_t:s0:c320,c876 key=(null)
Hash: mv,svirt_lxc_net_t,usr_t,dir,write
В этом отчете показано следующее предлагаемое решение.
# semanage fcontext -a -t FILE_TYPE 'ThingworxStorage'
where FILE_TYPE is one of the following: cgroup_t, container_var_lib_t, nfs_t,
svirt_home_t, svirt_sandbox_file_t, tmpfs_t, virt_home_t.
Then execute:
restorecon -v 'ThingworxStorage'
Ниже приведена команда, которую нужно использовать для применения этого решения:
semanage fcontext -a -t svirt_sandbox_file_t "/opt/thingworx-storage(/.*)?"
restorecon -R /opt/thingworx-storage
Было ли это полезно?