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

Как я могу разрешить пользователю «postgres» на одном сервере выполнять синхронизацию с другим?

Я пытаюсь заставить эту команду работать как пользователь postgres (чтобы я мог отправлять файлы wal):

rsync -a /tmp/test postgres@server2:/tmp/test

Но я получаю ошибку:

Permission denied (publickey).

Я бегал ssh-keygen eval `ssh-agent` и ssh-add как пользователь postgres на server1. кейген создан /var/lib/postgresql/.ssh/id_rsa и id_rsa.pub и я вижу, что он отправлен с помощью ssh -vvv postgres@server2.

На server2 я создал /var/lib/postgresql/.ssh/authorized_keys поместите в него содержимое id_rsa.pub формы server1. Он принадлежит пользователю и группе postgres и chmod 600. .ssh Каталог также принадлежит postgres и chmod 700.

Из подробного журнала sshd на server2 я вижу, что Failed publickey for postgres...

пользователь postgres на обоих серверах: postgres:x:106:114:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

ssh -vvv postgres @ server2

...
debug1: Found key in /var/lib/postgresql/.ssh/known_hosts:1
debug1: ssh_ecdsa_verify: signature correct
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /var/lib/postgresql/.ssh/id_rsa (0x7f468e434000)
debug2: key: /var/lib/postgresql/.ssh/id_dsa ((nil))
debug2: key: /var/lib/postgresql/.ssh/id_ecdsa ((nil))
debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /var/lib/postgresql/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug1: Trying private key: /var/lib/postgresql/.ssh/id_dsa
debug3: no such identity: /var/lib/postgresql/.ssh/id_dsa
debug1: Trying private key: /var/lib/postgresql/.ssh/id_ecdsa
debug3: no such identity: /var/lib/postgresql/.ssh/id_ecdsa
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).  

server2 sshd_config (строки с комментариями удалены)

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel VERBOSE
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes

журнал аутентификации server2

Jan 16 03:54:21 ip-10-28-26-251 sshd[7972]: Set /proc/self/oom_score_adj to 0
Jan 16 03:54:21 ip-10-28-26-251 sshd[7972]: Connection from 10.28.123.97 port 49377
Jan 16 03:54:21 ip-10-28-26-251 sshd[7972]: Failed publickey for postgres from 10.28.123.97 port 49377 ssh2
Jan 16 03:54:21 ip-10-28-26-251 sshd[7972]: Connection closed by 10.28.123.97 [preauth]

Что мне не хватает? Я предполагаю, что sshd не смотрит на мой файл authorized_keys на server2

Предполагая, что ваш подчиненный сервер поддерживает аутентификацию по ключу, вам нужно только обновить /etc/ssh/sshd_config если вы установили AllowedUsers, в этом случае вам нужно убедиться postgres находится в этом списке.

Кроме этого, просто ssh-keygen (оставьте кодовую фразу закрытого ключа пустой), а затем добавьте ~/.ssh/authorized_keys каталог / файл на подчиненный сервер. Домашний каталог для postgres является /var/lib/postgresql, но если вы выполните эти операции, пока suкак postgres пользователь, вы можете просто использовать ~, не говоря уже о том, что вам не придется chown что угодно, потому что postgres будет владеть сгенерированными ключами ssh на главном сервере, и postgres будет владеть созданным каталогом / файлом на подчиненном сервере.

Обязательно установите права доступа к файлам как на главном, так и на подчиненном сервере:

# On master
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/known_hosts  # this one won't exist until you SSH once

# On slave
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Вам нужна следующая запись в sshd_config сервера 2:

AuthorizedKeysFile  .ssh/authorized_keys

Отключение всей системы selinux - плохое решение.

Гораздо лучше создать модуль политики, который позволит вам выполнить конкретное действие.

Вот что я сделал в RHEL6:

Я очистил журнал аудита, перезапустил rsyslogd и повторил проблему.

Затем используйте audit2allow, чтобы увидеть проблему, удобочитаемую человеком:

# audit2allow -w -a
type=AVC msg=audit(1438288591.000:8525): avc:  denied  { open } for  pid=6063 comm="sshd" path="/var/lib/pgsql/.ssh/authorized_keys" dev="dm-0" ino=920234 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:postgresql_db_t:s0 tclass=file
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

type=AVC msg=audit(1438288591.000:8525): avc:  denied  { read } for  pid=6063 comm="sshd" name="authorized_keys" dev="dm-0" ino=920234 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:postgresql_db_t:s0 tclass=file
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

type=AVC msg=audit(1438288591.000:8526): avc:  denied  { getattr } for  pid=6063 comm="sshd" path="/var/lib/pgsql/.ssh/authorized_keys" dev="dm-0" ino=920234 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:postgresql_db_t:s0 tclass=file
        Was caused by:
                Missing type enforcement (TE) allow rule.

                You can use audit2allow to generate a loadable module to allow this access.

Убедившись, что никаких лишних отказов не происходит и что они относятся к рассматриваемой проблеме, создайте модуль selinux, чтобы позволить sshd читать, открывать и getattr для postgres authorized_keys:

# audit2allow -a -M sshd_read_postgres_ssh_authorized_keys

Теперь установите получившийся модуль:

# semodule -i sshd_read_postgres_ssh_authorized_keys.pp

Я скопировал этот модуль на одноранговый сервер postgres и также установил там. Теперь я могу использовать ssh с аутентификацией с открытым ключом между ящиками как postgres, и я все еще нахожусь в принудительном состоянии selinux.

Вы можете включить журналы отладки на существующем ssh-сервере. В файле / etc / ssh / sshd_config изменить LogLevel DEBUG3 если причина неудачного входа в систему Could not open authorized keys '/var/lib/pgsql/.ssh/authorized_keys': Permission denied и права доступа к authorized_keys кажутся нормальными, тогда эта команда поможет

restorecon -FRvv /var/lib/pgsql/.ssh/

объяснение

Я обнаружил, что ответ Грегори только частично сработал для меня, хотя и указал мне правильное направление. Я обнаружил, что необходимы несколько правил / политик, и их можно сгенерировать только в определенном порядке.

Поскольку ssh-copy-id команда работает только в том случае, если на другом конце есть пароль, вам нужно будет scp открытый ключ и соответствующим образом настройте пользователя и разрешения. Таким образом, не требуется создавать пароль, а одна возможная точка доступа остается закрытой.

Чтобы создать пользовательский ключ postgres и разрешить ему использовать ssh в себе, но если вы перенесете этот ключ на другой сервер, он также будет работать.

# su postgres
$ cd
$ ssh-keygen # [enter....] * 
$ cd .ssh/
$ cp id_rsa.pub authorized_keys
$ chmod 0600 authorized_keys 

Каждая ошибка должна произойти до того, как для нее можно будет сгенерировать правило, поэтому после добавления каждой политики требуется еще одна попытка ssh с простым вводом в запросе пароля.

$ ssh postgres@192.168.0.10 

ssh в self для простоты, но он все еще работает. После этого ошибки:

$ exit
# audit2allow -a -M sshd_open_postgres_ssh_authorized_keys
# semodule -i sshd_open_postgres_ssh_authorized_keys.pp
# su postgres
$ ssh postgres@192.168.0.10 
$ exit
# audit2allow -a -M sshd_read_postgres_ssh_authorized_keys
# semodule -i sshd_read_postgres_ssh_authorized_keys.pp
# su postgres
$ ssh postgres@192.168.0.10 
$ exit
# audit2allow -a -M sshd_getattr_postgres_ssh_authorized_keys
# semodule -i sshd_read_postgres_ssh_authorized_keys.pp
# su postgres
$ ssh postgres@192.168.0.10 

должен работать на этот раз

ПРИМЕЧАНИЕ: '#' указывает на root, но используйте sudo, я написал это для простоты, а не для обозначения лучших практик

SELinux вызывал у меня эту проблему на Redhat 6.5. Исправлено с использованием:

setenforce Permissive