Я пытаюсь заставить эту команду работать как пользователь 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