Назад | Перейти на главную страницу

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, который я [удалил из сообщения, поскольку он оказался несущественным]. Однако это не устранило проблему, ошибка сохраняется в той же самой форме.

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

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, и большая часть вывода audit.log для меня относительно неясна. Может ли кто-нибудь указать, какую подсказку я должен улавливать?

С уважением,

LANerd

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

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

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

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

На странице руководства:

       -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