Могу ли я использовать.pgpass в SELinux? [centos7, pgagent_96, postgresql 9.6.5]

.pgpass, кажется, не работает. Не могли бы вы проверить мои настройки pgagent?

OS : centos 7   ( I did NOT disable selinux )

Database : postgresql 9.6.5

pgagent : pgagent_96 3.4.0-9.rhel7  ( installed package using  yum )
  1. Я вошел на сервер Centos как пользователь 'Фрэнк'
  2. Перед запуском pgagent я проверил состояние pgagent. (Я не включил службу pgagent_96.)

    [frank@web]$ systemctl status pgagent_96.service
    
    ● pgagent_96.service - PgAgent for PostgreSQL 9.6
    
    Loaded: loaded (/usr/lib/systemd/system/pgagent_96.service; disabled; vendor preset: disabled)
    Active: inactive (dead)
    
  3. Я начал пгагент. Сначала это выглядит успешно. Но через десятки секунд он не смог создать соединение и умер. (Во время запуска CentOs спросил меня пароль ОС Фрэнка.)

    [frank@web]$ systemctl start pgagent_96.service
    [frank@web]$ systemctl status pgagent_96.service
    ● pgagent_96.service - PgAgent for PostgreSQL 9.6
       Loaded: loaded (/usr/lib/systemd/system/pgagent_96.service; disabled; vendor preset: disabled)
       Active: active (running) since 2017-10-16 16:42:11 KST; 5s ago
      Process: 9507 ExecStart=/usr/bin/pgagent_96 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
     Main PID: 9510 (pgagent_96)
       CGroup: /system.slice/pgagent_96.service
       └─9510 /usr/bin/pgagent_96 -s /var/log/pgagent_96.log hostaddr=127.0.0.1 dbname=postgres user=postgres port=5432
    
    16 Oct 16:42:11 web.frank.net systemd[1]: Starting PgAgent for PostgreSQL 9.6...
    16 Oct 16:42:11 web.frank.net systemd[1]: Started PgAgent for PostgreSQL 9.6.
    

(Через десятки секунд...)

   [frank@web]$ systemctl status pgagent_96.service
    ● pgagent_96.service - PgAgent for PostgreSQL 9.6
       Loaded: loaded (/usr/lib/systemd/system/pgagent_96.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since 2017-10-16 16:42:56 KST; 4min 9s ago
      Process: 9507 ExecStart=/usr/bin/pgagent_96 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
     Main PID: 9510 (code=exited, status=1/FAILURE)

    16 Oct 16:42:11 web.frank.net systemd[1]: Starting PgAgent for PostgreSQL 9.6...
    16 Oct 16:42:11 web.frank.net systemd[1]: Started PgAgent for PostgreSQL 9.6.
    16 Oct 16:42:56 web.frank.net systemd[1]: pgagent_96.service: main process exited, code=exited, status=1/FAILURE
    16 Oct 16:42:56 web.frank.net systemd[1]: Unit pgagent_96.service entered failed state.
    16 Oct 16:42:56 web.frank.net systemd[1]: pgagent_96.service failed.
  1. Я проверил журнал pgagent. (Войдите в систему /var/log/pgagent_96.log)

    WARNING: Couldn't create the primary connection (attempt 1): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 2): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 3): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 4): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 5): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 6): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 7): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 8): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 9): fe_sendauth: no password supplied
    WARNING: Couldn't create the primary connection (attempt 10): fe_sendauth: no password supplied
    ERROR: Stopping pgAgent: Couldn't establish the primary connection with the database server.
    
  2. Проверил мой файл.pgpass. (.pgpass находится в домашнем каталоге Фрэнка. /home/frank)

    [frank@web]$ ls -alZ .pgpass
    -rw-------. frank frank unconfined_u:object_r:user_home_t:s0 .pgpass
    [frank@web]$ ls -al .pgpass
    -rw-------. 1 frank frank 43 16 Oct 16:23 .pgpass
    [frank@web]$ id -Z
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    [frank@web]$ id
    uid=1000(frank) gid=1000(frank) groups=1000(frank),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    
  3. Проверил мой pg_hba.conf.

    [frank@web]$ su - postgres
    -bash-4.2$ pwd
    /var/lib/pgsql/9.6/data
    -bash-4.2$ ls -alZ pg_hba.conf
    -rw-------. postgres postgres unconfined_u:object_r:postgresql_db_t:s0 pg_hba.conf( pg_hba.conf )
    

[Содержание pg_hba.conf]

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
#local   all             all                                     peer
local   all             all                                md5

# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all   all   122.32.2.21/32       md5    (122.32.2.21  is my server's IP )

# IPv6 local connections:
#host    all             all             ::1/128                 ident
host    all             all             ::1/128                 md5

# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident
  1. Я изменил пароль пользователя postgres следующим образом.

    postgres=# ALTER USER postgres WITH PASSWORD 'pwd';
    
  2. Содержимое файла.pgpass.

    localhost:5432:postgres:postgres:pwd
    
  3. Я сменил владельца, группу.pgpass с откровенного на postgres. Но результат был таким же. Я протестировал то же самое для пользователя ОС 'root' (/root), 'postgres' (/var/lib/pgsql) и двух других обычных пользователей, у которых есть домашний каталог в / home.

(1) Попробуйте запустить как пользователь ОС "root"

    [root@web frank]# ls -al .pgpass
    -rw-------. 1 postgres postgres 43 10월 16 17:08 .pgpass
    [root@web frank]# ls -alZ .pgpass
    -rw-------. postgres postgres unconfined_u:object_r:user_home_t:s0 .pgpass
    [root@web frank]# cat .pgpass
    localhost:5432:postgres:postgres:pwd
    [root@web frank]# systemctl start pgagent_96      (Here, centos asked frank's OS password )
    [root@web frank]# systemctl status pgagent_96
    ● pgagent_96.service - PgAgent for PostgreSQL 9.6
       Loaded: loaded (/usr/lib/systemd/system/pgagent_96.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since 2017-10-16 23:33:15 KST; 3s ago
      Process: 25928 ExecStart=/usr/bin/pgagent_96 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
     Main PID: 25930 (code=exited, status=1/FAILURE)

    16 Oct 23:32:30 web.frank.net systemd[1]: Starting PgAgent for Postgre....
    16 Oct 23:32:30 web.frank.net systemd[1]: Started PgAgent for PostgreS....
    16 Oct 23:33:15 web.frank.net systemd[1]: pgagent_96.service: main pro...E
    16 Oct 23:33:15 web.frank.net systemd[1]: Unit pgagent_96.service ente....
    16 Oct 23:33:15 web.frank.net systemd[1]: pgagent_96.service failed.
    Hint: Some lines were ellipsized, use -l to show in full.

(2) Попробуйте запустить как пользователь ОС "откровенный"

    [frank@web ~]$ systemctl start pgagent_96    (Here, centos asked frank's OS password )
    [frank@web ~]$ systemctl status pgagent_96
    ● pgagent_96.service - PgAgent for PostgreSQL 9.6
       Loaded: loaded (/usr/lib/systemd/system/pgagent_96.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since 월 2017-10-16 23:41:03 KST; 1min 21s ago
      Process: 26531 ExecStart=/usr/bin/pgagent_96 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
     Main PID: 26533 (code=exited, status=1/FAILURE)

    16 Oct 23:40:18 web.frank.net systemd[1]: Starting PgAgent for Postgre....
    16 Oct 23:40:18 web.frank.net systemd[1]: Started PgAgent for PostgreS....
    16 Oct 23:41:03 web.frank.net systemd[1]: pgagent_96.service: main pro...E
    16 Oct 23:41:03 web.frank.net systemd[1]: Unit pgagent_96.service ente....
    16 Oct 23:41:03 web.frank.net systemd[1]: pgagent_96.service failed.
    Hint: Some lines were ellipsized, use -l to show in full.

(3) Попробуйте запустить как пользователь ОС 'postgres'

    -bash-4.2$ systemctl start pgagent_96       (Here, centos asked frank's OS password )
    -bash-4.2$ systemctl status pgagent_96
    ● pgagent_96.service - PgAgent for PostgreSQL 9.6
       Loaded: loaded (/usr/lib/systemd/system/pgagent_96.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since 월 2017-10-16 23:54:22 KST; 21s ago
      Process: 27511 ExecStart=/usr/bin/pgagent_96 -s ${LOGFILE} hostaddr=${DBHOST} dbname=${DBNAME} user=${DBUSER} port=${DBPORT} (code=exited, status=0/SUCCESS)
     Main PID: 27515 (code=exited, status=1/FAILURE)

(4) Контекст безопасности "root", "frank" и "postgres"

(корень)

[root@web ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

(откровенно)

[frank@web ~]$ id
uid=1000(frank) gid=1000(frank) groups=1000(frank),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

(postgres)

-bash-4.2$ id
uid=26(postgres) gid=26(postgres) groups=26(postgres) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  1. Конечно, я могу войти в базу данных, как это. Но я не могу использовать.pgpass файл.

    [root@web bin]# su - postgres
    -bash-4.2$ psql -h localhost -U postgres
    psql (9.6.5)
    postgres=#
    
  2. В настоящее время я думаю, что эта проблема может быть связана с контекстом безопасности.pgpass. Возможно, pgagent_96 или systemd не разрешено читать файл.pgpass... (Просто мое предположение ^^) Я проверил, может ли pgagent_96 или systemd читать.pgpass.

(1) Я установил переменную PGPASSFILE в /etc/profile [Содержимое / etc / profile]

export PGDATA=/var/lib/pgsql/9.6/data
export PGPASSFILE=/var/lib/pgsql/.pgpass

(2) Попытался запустить pgagent_96, изменив тип контекста.pgpass с user_home_t на postgresql_db_t, bin_t, usr_t. Но я получил ту же ошибку.

-bash-4.2$ echo $PGPASSFILE
/var/lib/pgsql/.pgpass
-bash-4.2$ ls -alZ .pgpass
-rw-------. postgres postgres unconfined_u:object_r:postgresql_db_t:s0 .pgpass
-bash-4.2$ systemctl start pgagent_96
     ====> failed to start pgAgent_96. same error.
-bash-4.2$ chcon --type bin_t .pgpass
-bash-4.2$ ls -alZ .pgpass
-rw-------. postgres postgres unconfined_u:object_r:bin_t:s0   .pgpass
-bash-4.2$ systemctl start pgagent_96
    ====> failed to start pgAgent_96. same error.
-bash-4.2$ chcon --type usr_t .pgpass
-bash-4.2$ ls -alZ .pgpass
-rw-------. postgres postgres unconfined_u:object_r:usr_t:s0   .pgpass
-bash-4.2$ systemctl start pgagent_96
    ====> failed to start pgAgent_96. same error.

[Контекст безопасности pgagent_96, systemd, pg_hba.conf]

[root@web frank]# ls -alZ /usr/bin/pgagent_96
-rwxr-xr-x. root root system_u:object_r:bin_t:s0   /usr/bin/pgagent_96
[root@web frank]# ls -alZ /usr/lib/systemd/systemd
-rwxr-xr-x. root root system_u:object_r:init_exec_t:s0 /usr/lib/systemd/systemd
[root@web frank]# ls -alZ /var/lib/pgsql/9.6/data/pg_hba.conf
-rw-------. postgres postgres unconfined_u:object_r:postgresql_db_t:s0 /var/lib/pgsql/9.6/data/pg_hba.conf

Теперь я не знаю, что мне следует попробовать. Помоги мне, пожалуйста...

ОБНОВИТЬ

  1. Я установил postgresql 10, pgagent_10. Но результат тот же... Я хочу запустить pgagent с помощью команды systemctl. Я включу сервис pagent для автоматического запуска сервиса pgagent.

1 ответ

Решение

У меня была такая же проблема с CentOS 7. Мое решение для вас:
сначала проверьте некоторые переменные в служебном скрипте:

cat /usr/lib/systemd/system/pgagent_96.service

1) по умолчанию User=pgagent и Group = pgagent - это владелец / группа вашего файла.pgpass,
вам нужно установить
chown pgagent: pgagent.pgpass
chmod 0600.pgpass
2) затем, переместите файл.pgpass в каталог, где пользователь pgagent может прочитать этот файл.
(/ home / frank не может быть изменен пользователем pgagent, попробуйте, например, установить ваш postgres dir /var/lib/pgsql/9.6 или / var / lib / pgsql)
3) проверьте переменную местоположения конфигурации pgagent_96,
по умолчанию EnvironmentFile = / etc / pgagent / pgagent_96.conf - вам нужно отредактировать этот файл.

Следующий шаг, откройте pgagent_96.conf в редакторе и внесите изменения:
а) изменить значение переменной DBHOST=localhost (это важно)
б) добавить переменную PGPASSFILE=/ путь / ваш /pgpasfile/.pgpass (PGPASSFILE=/var/lib/pgsql/.pgpass)

В моем случае pgagent начал работать без проблем.

Другие вопросы по тегам