Аутентификация Открытого ключа SSH только работает, если активная сессия существует прежде

У меня есть довольно странная проблема с моей конфигурацией SSH. Я настроил свой сервер с помощью Карты Удаленного доступа и настроил все со средством просмотра KVM.

Таким образом, будучи зарегистрированным в сервер через Средство просмотра KVM я настроил SSH с только pubkey и попытался войти в систему от своего локального ноутбука. Это хорошо работало.

Если я вышел из Сессии KVM (или выход из системы с пользователем на сессии KVM), я не могу больше входить в систему через ssh (pubkey отклоненный). SSH входят только в работы, пока пользователь где-нибудь все еще зарегистрирован.

Какие-либо подсказки, какова проблема могла бы быть?


Консольный вывод для неудавшегося входа в систему (все переданные персональные данные):

OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011 debug1: Reading configuration data /Users/mylocaluser/.ssh/config debug1: Reading configuration data /etc/ssh_config debug1: /etc/ssh_config line 20: Applying options for * debug1: /etc/ssh_config line 103: Applying options for * debug1: Connecting to 100.100.100.100 [100.100.100.100] port 12345. debug1: Connection established. debug1: identity file /Users/mylocaluser/.ssh/id_rsa type 1 debug1: identity file /Users/mylocaluser/.ssh/id_rsa-cert type -1 debug1: identity file /Users/mylocaluser/.ssh/id_dsa type -1 debug1: identity file /Users/mylocaluser/.ssh/id_dsa-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.2 debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH* debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug1: Server host key: RSA ab:12:23:34:45:56:67:78:89:90:12:23:34:45:56:67 debug1: Host '[100.100.100.100]:12345' is known and matches the RSA host key. debug1: Found key in /Users/mylocaluser/.ssh/known_hosts:36 debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: Roaming not allowed by server debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /Users/mylocaluser/.ssh/id_rsa debug1: Authentications that can continue: publickey debug1: Offering RSA public key: /Users/mylocaluser/.ssh/id_rsa2 debug1: Authentications that can continue: publickey debug1: Trying private key: /Users/mylocaluser/.ssh/id_dsa debug1: No more authentication methods to try. Permission denied (publickey).

Консольный вывод для успешного входа в систему (только возможный, в то время как "активная сессия" существует): OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011 debug1: Reading configuration data /Users/mylocaluser/.ssh/config debug1: Reading configuration data /etc/ssh_config debug1: /etc/ssh_config line 20: Applying options for * debug1: /etc/ssh_config line 103: Applying options for * debug1: Connecting to 100.100.100.100 [100.100.100.100] port 12345. debug1: Connection established. debug1: identity file /Users/mylocaluser/.ssh/id_rsa type 1 debug1: identity file /Users/mylocaluser/.ssh/id_rsa-cert type -1 debug1: identity file /Users/mylocaluser/.ssh/id_dsa type -1 debug1: identity file /Users/mylocaluser/.ssh/id_dsa-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.2 debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 debug1: match: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2 pat OpenSSH* debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug1: Server host key: RSA ab:12:23:34:45:56:67:78:89:90:12:23:34:45:56:67 debug1: Host '[100.100.100.100]:12345' is known and matches the RSA host key. debug1: Found key in /Users/mylocaluser/.ssh/known_hosts:36 debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: Roaming not allowed by server debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey debug1: Next authentication method: publickey debug1: Offering RSA public key: /Users/mylocaluser/.ssh/id_rsa debug1: Server accepts key: pkalg ssh-rsa blen 279 debug1: Authentication succeeded (publickey). Authenticated to 100.100.100.100 ([100.100.100.100]:12345). debug1: channel 0: new [client-session] debug1: Requesting no-more-sessions@openssh.com debug1: Entering interactive session. debug1: Sending environment. debug1: Sending env LANG = de_DE.UTF-8 Welcome to Ubuntu 14.04.1 LTS

1
задан 21 August 2014 в 00:35
3 ответа

Когда домашняя директория пользователя зашифрована с ecryptfs sshd не может прочитать файл authorized_keys из домашней директории пользователя до того, как домашняя директория была смонтирована.

Во время входа в систему sshd будет использовать pam для аутентификации пользователя, а pam будет использовать пароль, введенный пользователем для монтирования зашифрованной домашней директории.

Это проблематично, если вы хотите ограничить sshd только разрешением аутентификации с помощью открытого ключа.

Однако вы можете поместить нешифрованный файл authorized_keys также и на сервер. Это позволит пользователю войти, используя ключ, но так как это не вызывает pam, домашний каталог не будет смонтирован, и монтирование домашнего каталога без знания пароля также не будет работать.

Так как незашифрованный домашний каталог скрывается зашифрованным домашним каталогом, размещение незашифрованного файла authorized_keys в первую очередь может быть немного хитроумным. Помочь в этом может крепление базовой файловой системы.

Если, например, /home - это просто каталог в корневой файловой системе, то можно сделать следующее:

mkdir /mnt/rootfs
mount --bind / /mnt/rootfs

А затем создать /mnt/rootfs/home/$USER/.ssh/authorized_keys

Можно сделать еще что-нибудь. Так как зашифрованная и нешифрованная версия authorized_keys - это два разных файла, вы можете поместить в них разное содержимое. Например, незашифрованная версия может вызвать скрипт для монтирования зашифрованного домашнего каталога:

command="/usr/local/bin/ecryptfs-mount-from-ssh" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDM1Ot12ThbTcPOGpfh7AiRqp3P4BMm3DNo4mDg7gDFPwCmM9rKRHTH0fBVSqkSGlXm84q29bckDukg7vfqkbTpbkP3e2YmTkP6p1J2SoX2QMUnBRRgL9It/ZiAfA2I4QzUrcywVvokO1F2DqcRLy5e5wKTUFfvIm6D2QfBmGbnW2Kkpn16hQyLT1ClXjFC1qXUhazePv0cAtWUCUGjRcLr/ipOphS7eOB46cGhYqtbMkKx0t93ZG4f6jM0o32cYy3RqprpZpTmCeG1gDyG+IlSLBYXYggr72iwTKsTZ9pMDTCBQ8Pb7l317TPOcJzTtDxnpgpGE3x4Vu/Ww+zhsIeT kasperd 2014 May 24

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

Если домашний каталог пользователя уже смонтирован, то этот authorized_keys файл скрыт, а вместо него используется зашифрованная версия. Зашифрованная версия файла authorized_keys не имеет команды , так что скрипт для монтирования домашнего каталога не запущен.

Итак, что происходит в скрипте. Вот моя версия:

#!/bin/bash -e

if [ $# = 1 ]
then
    PUBKEY="$(
        grep "$1" "$HOME/.ssh/authorized_keys" |
            sed -e 's/.* ssh-rsa //;s/ .*//')"
    /usr/local/bin/ssh-agent-ecryptfs-decryption.py "$PUBKEY" "$1" |
        ecryptfs-unwrap-passphrase "$HOME/.ecryptfs-ssh-wrapped/$1" - |
        ecryptfs-add-passphrase --fnek
fi
ecryptfs-mount-private
cd "$HOME"

if [ "$SSH_ORIGINAL_COMMAND" != "" ]
then
    exec /bin/bash -c "$SSH_ORIGINAL_COMMAND"
fi

exec /bin/bash -l

В примере выше, файл authorized_keys вызывается без аргументов, так что первый if блок пропускается. Таким образом, команда ecryptfs-mount-private запросит пароль пользователя. Но для этого не требуется sshd, чтобы была включена аутентификация паролем, и таким образом будет работать на sshd только с аутентификацией открытым ключом.

Следующая команда изменится на зашифрованную домашнюю директорию пользователя (до тех пор скрипт будет выполняться внутри незашифрованной домашней директории).

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

Одно из предостережений заключается в том, что это не работает с переадресацией X11, потому что домашняя директория еще не доступна, когда будет сохранен куки-файл. Но любой другой сеанс, открытый в то время, как домашний каталог уже смонтирован, сможет работать с переадресацией X11.

Использование ~/.ssh/rc вместо этого, возможно, решит проблему переадресации X11. Это то, что я еще не рассматривал.

Первый блок if немного хакерский, который я придумал, чтобы позволить монтировать домашнюю директорию пользователя без необходимости пароля. Вместо этого он использует переадресованный ssh-agent для монтирования домашнего каталога пользователя. Эта часть поставляется с оговорками об отсутствии экспертной оценки, так что доверять криптографии в ssh-agent-ecryptfs-decryption.py вы можете на свой страх и риск.

Питоновый скрипт выглядит следующим образом:

#!/usr/bin/env python

from sys import argv
from os import environ
import socket

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(environ['SSH_AUTH_SOCK'])

def encode_int(v):
    return ('%08x' % v).decode('hex')

def encode_string(s):
    return encode_int(len(s)) + s

def encode_mpint(v):
    h = '%x' % v
    if len(h) & 1: h = '0' + h
    return ('%04x%s' % (len(h) * 4, h)).decode('hex')

key_blob = argv[1].decode('base64')
msg = 'ecryptfs-decrypt ' + argv[2]

s.send(encode_string(chr(13) +
                     encode_string(key_blob) +
                     encode_string(msg) +
                     encode_int(0)))

response = s.recv(1024)

assert response == encode_string(chr(14) + response[5:]), argv[1]

passphrase = response[-48:].encode('base64').replace('\n', '')

print passphrase

Так как же работает дешифровка? Прежде всего, аргумент к скрипту, предоставленный authorized_keys - это любое случайное значение. uuid, генерируемый с помощью uuidgen, может работать. Скрипт оболочки использует grep для нахождения соответствующей строки в файле authorized_keys для извлечения открытого ключа.

Открытый ключ в кодировке base64, а также uuid предоставляются питоновому скрипту. Используется именно тот публичный ключ, которым аутентифицировался пользователь. Питоновый сценарий запрашивает у переадресованного агента подпись на определённом сообщении, используя указанный открытый ключ (поскольку подпись сообщений - это именно то, что может сделать ssh-agent). Часть подписи затем шифруется с помощью base64 для получения пароля.

Этот пароль используется для расшифровки обернутого файла паролей ecryptfs, но основной файл шифруется с помощью пароля для входа пользователя в систему. Этот файл зашифрован с помощью пароля, сгенерированного с помощью ключа ssh

.
5
ответ дан 3 December 2019 в 16:25

Вчера я так вдохновился идеей Касперда, что сделал вот это:

https://github.com/bjornnorman/decryptfs-ssh

Я уже немного опробовал его, и он, кажется, работает блестяще. Это делает действительно простым добавление/удаление ключей для безпассовой расшифровки домашних папок ecryptfs при использовании SSH....

Как и оригинал Касперда, он не был подвергнут экспертной оценке - но так как он находится на github сейчас, любой может внести свой вклад. :)

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

Наслаждайтесь!

3
ответ дан 3 December 2019 в 16:25

Вот простое решение но кажется не изящным.

Поскольку ваша домашняя папка зашифрована, просто поместите файл authorized_keys в незашифрованное место.

Затем вам нужно указать ssh, где authorized_keys есть. В / etc / ssh / sshd_config добавьте:

Match User [your_user_name]
AuthorizedKeysFile [new_path_to_authorized_keys]

ПРИМЕЧАНИЕ. Обязательно поместите Match в конец файла. Match остается действительным до конца файла или пока не будет выполнено другое Match .

Теперь вы можете войти в систему через ssh, и вам не нужно сначала входить локально. Но после входа в систему по ssh вам нужно запустить:

ecrypts-mount-private

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

0
ответ дан 3 December 2019 в 16:25

Теги

Похожие вопросы