Я запускаю приложение Django, использующее PostgreSQL. Сервер работает под управлением RHEL 6.5 с SELinux. У меня проблема, когда приложение Django не может подключиться к БД, и я думаю, это потому, что SELinux блокирует его. Вот ошибка, которую я вижу в Django:
could not connect to server: Permission denied
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Как я могу это исправить? Я наткнулся эта почта, но я не знаю, как применить решение (chcon -t postgresql_exec_t /path/to/pgbouncer
) к моей проблеме.
Спасибо!
[редактировать]
Вот что /var/log/audit/audit.log
похоже, когда я пытаюсь зайти на сайт:
type=AVC msg=audit(1396289984.549:9245): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1396289984.549:9245): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe625273aa0 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1396289984.756:9246): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1396289984.756:9246): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe624d87890 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1396289984.757:9247): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1396289984.757:9247): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe625342c20 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1396289984.758:9248): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1396289984.758:9248): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe625603ac0 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
[edit2]
Вот несколько соответствующих опций SELinux, которые я включил.
-bash-4.1$ sudo getsebool -a | grep httpd_can_network_connect_db
httpd_can_network_connect_db --> on
-bash-4.1$ sudo getsebool -a | grep allow_user_postgresql_connect
allow_user_postgresql_connect --> on
Для будущих читателей, для меня было достаточно просто установить bool, чтобы httpd мог устанавливать соединения с БД; то есть:
setsebool -P httpd_can_network_connect_db 1
Вы можете проверить / убедиться, что параметр установлен:
getsebool httpd_can_network_connect_db
который должен вернуть '... => on'
После этого, если вы оставите -f /var/log/audit/audit.log и повторите попытку, это должно сработать.
Хорошо, с помощью системного администратора проблема теперь решена. Как оказалось, контекст SELinux, назначенный двоичным файлам в /usr/pgsql-9.3/bin
был неправ. Все, что потребовалось, чтобы исправить это, было chcon -t postgresql_exec_t /usr/pgsql-9.3/bin
. Чтобы изменить контекст символических ссылок, просто добавьте -h
.