SELinux / PostgresQL «отказано {open} для [..] comm =» pg_ctl «path =» $ PGDATA / postgresql.conf "

Я установил PostgresQL на сервер Centos 7 с поддержкой SELinux и изменил это каталог данных по умолчанию в / srv / postgres, отдельная группа томов LVM с шифрованием LUKS / логический том, из соображений мобильности, если мне нужно переместить сервер, и конфиденциальности, если носитель данных будет украден или раскрыт во время движения. Я думаю, что задействованная функциональность LUKS / LVM не должна влиять на мою проблему, но упомяну об этом для полноты картины.

Теперь, когда я запускаю службу postgresql:

root@fafner:~ # systemctl start postgresql

... я получаю это в / var / log / audit / audit.log:

root@fafner:~ # tail -f /var/log/audit/audit.log | grep "postgresql" 
[..]
type=AVC msg=audit(1476614020.689:522): avc: denied  { open } for  pid=2900 comm="pg_ctl" path="/srv/postgres/data/postgresql.conf" dev="dm-4" ino=136 scontext=system_u:system_r:postgresql_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file type=SYSCALL msg=audit(1476614020.689:522): arch=c000003e syscall=2 success=no exit=-13 a0=7ffc681cc430 a1=0 a2=1b6 a3=24 items=1 ppid=1 pid=2900 auid=4294967295 uid=989 gid=986 euid=989 suid=989 fsuid=989 egid=986 sgid=986 fsgid=986 tty=(none) ses=4294967295 comm="pg_ctl" exe="/usr/bin/pg_ctl" subj=system_u:system_r:postgresql_t:s0 key=(null)
type=PATH msg=audit(1476614020.689:522): item=0 name="/srv/postgres/data/postgresql.conf" inode=136 dev=fd:04 mode=0100600 ouid=989 ogid=986 rdev=00:00 obj=unconfined_u:object_r:var_t:s0 objtype=NORMAL
type=AVC msg=audit(1476614020.725:523): avc: denied  { open } for  pid=2904 comm="postgres" path="/srv/postgres/data/postgresql.conf" dev="dm-4" ino=136 scontext=system_u:system_r:postgresql_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file type=SYSCALL msg=audit(1476614020.725:523): arch=c000003e syscall=2 success=no exit=-13 a0=befc30 a1=0 a2=1b6 a3=24 items=1 ppid=2900 pid=2904 auid=4294967295 uid=989 gid=986 euid=989 suid=989 fsuid=989 egid=986 sgid=986 fsgid=986 tty=(none) ses=4294967295 comm="postgres" exe="/usr/bin/postgres" subj=system_u:system_r:postgresql_t:s0 key=(null)
type=PATH msg=audit(1476614020.725:523): item=0 name="/srv/postgres/data/postgresql.conf" inode=136 dev=fd:04 mode=0100600 ouid=989 ogid=986 rdev=00:00 obj=unconfined_u:object_r:var_t:s0 objtype=NORMAL
type=SERVICE_START msg=audit(1476614021.712:524): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=postgresql comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=failed'

Я пробовал использовать audit2allow, чтобы исправить проблему:

root@fafner:~ # grep "postgresql" /var/log/audit/audit.log | audit2allow -M postgresql_tskjoedt
root@fafner:~ # semodule -i postgresql_tskjoedt.pp

... рендеринг некоторых результатов в /var/log/audit/audit.log, которые я [удалил с позиции t, поскольку это оказалось несущественным]. Однако это не устранило проблему, ошибка сохраняется в той же самой форме.

Я также пробовал:

root@fafner:~ # restorecon -Rv /usr/bin/pg_ctl
root@fafner:~ # restorecon -Rv /usr/bin/postgres
root@fafner:~ # restorecon -Rv /srv/postgres/data

... и даже прикоснулся к файлу '.autorelabel' в корневой файловой системе и файловой системе postgres и перезагрузился, чтобы пометить все, что связано с этим. Но я по-прежнему получаю ту же ошибку «отказано в открытии для pg_ctl на postgresql.conf» в audit.log.

Я проделывал это пару раз, предполагая, что изменения не являются кумулятивными.

Из этого ответа и некоторых ссылок, на которые он ссылается, я понял, что каким-то образом эти контексты / метки SELinux не выстраиваются должным образом:

root@fafner:~ # ls -Z /usr/bin/pg_ctl
-rwxr-xr-x. root root system_u:object_r:postgresql_exec_t:s0 /usr/bin/pg_ctl
root@fafner:~ # ls -Z /usr/bin/postgres
-rwxr-xr-x. root root system_u:object_r:postgresql_exec_t:s0 /usr/bin/postgres
root@fafner:~ # ls -Z /srv/postgres/data/postgresql.conf
-rw-------. postgres postgres unconfined_u:object_r:var_t:s0   /srv/postgres/data/postgresql.conf

Я мог бы просто перетасовать метки, пока что-то не запустится работает, но я не хочу произвольно устанавливать или разрушать метки SELinux только для того, чтобы все заработало; тогда я мог бы просто выключить SELinux.

Кроме того, я не понимаю, почему «audit2allow» не решает конкретную проблему; Разве эта команда не должна делать именно то, что, по сути, расширять контекст SELinux ровно настолько, чтобы была разрешена конкретная операция?

Весь этот вопрос, конечно, проистекает из моего непонимания SELinux и большей части аудита Для меня вывод .log относительно неясен. Может ли кто-нибудь указать, какую подсказку я должен улавливать?

С уважением,

LANerd

4
задан 13 April 2017 в 15:43
1 ответ

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

Filesystem                  Size  Used Avail Use% Mounted on
/dev/mapper/volgroup-pgsql  1.1T  128K  1.1T   1% /var/lib/pgsql

Если вы действительно хотите сохранить каталог данных не по умолчанию, то вам нужно сказать SELinux, какие контексты применить к этому каталогу и его содержимому. Это делается с помощью семантического контекста fcontext. В этом случае мы будем использовать опцию --equal, чтобы ваш каталог не по умолчанию имел те же самые контексты, что и каталог по умолчанию /var/lib/pgsql.

semanage fcontext --add --equal /var/lib/pgsql /srv/postgres

Из man-страницы:

       -e EQUAL, --equal EQUAL
              Substitute  target  path with sourcepath when generating default
              label. This is used with fcontext. Requires  source  and  target
              path  arguments.  The context labeling for the target subtree is
              made equivalent to that defined for the source.

Это постоянно, но это не меняет существующие метки. Чтобы закончить, нужно запустить restorecon, чтобы сбросить все метки.

restorecon -rv /srv/postgres
4
ответ дан 3 December 2019 в 03:28

Теги

Похожие вопросы