Последовательный и безопасный подход к учетным записям без пароля с SSH

13

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

Основные понятия

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

При удаленном доступе к серверу, либо для администрирования, либо для учетной записи пользователя, я ожидаю всегда использовать закрытый ключ SSH. Настроить ключ SSH для только что созданной учетной записи очень просто, поэтому для (обычного) удаленного доступа системные пароли не требуются.

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

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

Детали локального доступа

Как мы можем обеспечить доступ к корневой учетной записи локально без пароля? Я не думаю, что мы можем использовать это, так passwd -dкак это сделает root-доступ слишком разрешительным, и непривилегированный пользователь может бесплатно переключиться на root, что неправильно. Мы не можем использовать, passwd -lпоскольку это мешает нам войти в систему.

Обратите внимание, что локальный доступ предназначен исключительно для доступа с использованием локальной клавиатуры. Поэтому правильное решение не должно допускать никакого переключения пользователя (с использованием suили sudo).

Детали удаленного доступа

До недавнего времени вышеуказанное решение работало, но теперь SSH начал проверять заблокированные учетные записи пользователей. Мы не можем, вероятно, использовать passwd -dпо тем же причинам. Мы не можем использовать, passwd -uпоскольку он просто жалуется, что это приведет к тому, что passwd -dделает.

Для этой части есть обходной путь с фиктивным паролем.

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

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

Финальные заметки

Меня интересует решение, которое позволит вам входить в систему с учетной записью root локально и со всеми учетными записями, включая root, без каких-либо паролей. С другой стороны, решение не должно влиять на безопасность, за исключением явно описанных способов, особенно не позволяя удаленным пользователям получать доступ к учетной записи root или учетной записи других пользователей. Решение должно быть достаточно надежным, чтобы не вызывать проблем безопасности косвенно.

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

Больше идей после прочтения первых ответов

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

Павел Шимерда
источник
Используйте настраиваемую конфигурацию PAM для локального доступа без пароля и то же самое для входа в систему sudo и SSH.
0xC0000022L

Ответы:

5

Требования, по которым я буду предлагать решения, в качестве пулевых пунктов:

  1. Вход в корневую консоль без пароля
  2. Удаленный вход в систему без пароля от предварительно авторизованных пользователей
  3. Удаленный вход без пароля для указанных учетных записей от предварительно авторизованных пользователей
  4. Удаленный вход без пароля для любой учетной записи от предварительно авторизованных пользователей

Следующие примеры основаны на Debian, так как это то, что я получил здесь для тестирования. Тем не менее, я не вижу причин, по которым эти принципы нельзя применять ни к одному дистрибутиву (или к любому производному * ix на основе PAM).

Вход в корневую консоль без пароля

Я думаю, что я подойду к этому, используя PAM и /etc/securettyфайл конфигурации.

В качестве предварительного условия необходимо установить «достаточно безопасный» корневой пароль. Это не требуется для входа в консоль, но существует, чтобы сделать попытки взлома методом "грубой силы" нереальными. В противном случае учетная запись является совершенно нормальной учетной записью root.

У /etc/pam.d/loginменя есть следующий стандартный набор строк для аутентификации (те, которые начинаются с ключевого слова auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

Указанный common-authвключаемый файл содержит следующие соответствующие строки:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

common-authФайл инструктирует РАМ пропустить одно правило (запрещающий) , если «UNIX Войти» преуспевает. Как правило, это означает совпадение в /etc/shadow.

auth ... pam_securetty.soЛиния сконфигурирована , чтобы предотвратить корневые входы , кроме как на TTY устройств , указанных в /etc/securetty. (Этот файл уже включает все консольные устройства.)

authСлегка изменив эту строку, можно определить правило, разрешающее вход в систему root без пароля от устройства tty, указанного в /etc/securetty. success=okПараметр должен быть изменен таким образом, что okзаменяется на число authстрок, пропускаемых в случае удачного матча. В показанной здесь ситуации это число 3, которое прыгает вниз к auth ... pam_permit.soстроке:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

Удаленный вход в систему без пароля от предварительно авторизованных пользователей

Это простое включение ключей ssh ​​для тех авторизованных пользователей, которые добавляются в корневой authorized_keysфайл.

Удаленный вход без пароля для указанных учетных записей от предварительно авторизованных пользователей

Это также простое включение ключей ssh ​​для авторизованных пользователей, добавляемых в .ssh/authorized_keysфайл соответствующего и соответствующего пользователя . (Типичный удаленный пользователь chris хочет без пароля войти в сценарий локального пользователя chris .)

Обратите внимание, что учетные записи могут оставаться в заблокированном состоянии по умолчанию после создания (т. Е. Только !в поле пароля для /etc/shadow), но разрешить вход в систему на основе ключа SSH. Это требует, чтобы root поместил ключ в .ssh/authorized_keysфайл нового пользователя . Что не так очевидно, так это то, что этот подход доступен только тогда, когда UsePAM Yesон установлен /etc/ssh/sshd_config. PAM различается !как «учетная запись заблокирована для пароля, но могут быть разрешены другие способы доступа» и !...«учетная запись заблокирована. Период». (Если UsePAM Noустановлено, то OpenSSH рассматривает любое присутствие !запуска поля пароля для представления заблокированной учетной записи.)

Удаленный вход без пароля для любой учетной записи от предварительно авторизованных пользователей

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

Я не могу протестировать этот сценарий, но я считаю, что этого можно достичь с помощью OpenSSH 5.9 или новее, что позволяет authorized_keysопределять несколько файлов в /etc/ssh/sshd_config. Отредактируйте файл конфигурации, чтобы включить второй файл с именем /etc/ssh/authorized_keys. Добавьте в этот файл открытые ключи выбранных авторизованных пользователей, убедившись, что разрешения таковы, что он принадлежит root и имеет доступ на запись только для root (0644).

roaima
источник
Мне придется изучить # 1 более тщательно и проверить его. Это выглядит очень интересно, хотя для него все еще требуется (надежный) настроенный пароль. № 3 не завершен, так как в настоящее время вновь созданный пользователь заблокирован по умолчанию также от входа SSH. Я на самом деле не спрашивал пункт № 4, но в любом случае это выглядит очень интересно, и я действительно мог бы использовать этот метод.
Павел Шимерда
Надежный пароль для root требуется, но никогда не используется. Я предполагал, что вы знали, как реализовать # 3; дайте мне знать, если вам нужно больше деталей. В системах (Debian) можно войти в систему с новой учетной записью, для которой еще не определен пароль, при условии, что .ssh/authorized_keysфайл содержит соответствующий открытый ключ. Это помогает?
Ройма
Я думаю, что мне нужен хороший и стандартный способ восстановить поведение, которое вы видите в Debian, то есть, что вновь созданная учетная запись блокируется только для аутентификации по паролю, а не для открытого ключа.
Павел Шимерда
Для тестовой учетной записи, которую я создал, чтобы подтвердить утверждение ssh в моем предыдущем комментарии, я вижу один !в поле пароля в /etc/shadow. Согласно справочной странице это указывает на действительную учетную запись, для которой ни один пароль не может соответствовать.
Ройма
1
Это интересно, это действительно не так очевидно, по крайней мере, спасибо.
Павел Шимерда
1

Похоже, вам нужны настоящие (не root) учетные записи пользователей с ключами ssh и полным NOPASSWDдоступом через него sudo(который доступен по умолчанию в большинстве дистрибутивов Linux в настоящее время, а также является тривиальной установкой вручную). Вы можете иметь пустые пароли для каждой учетной записи пользователя (которая не будет работать удаленно), тогда пользователь либо запускается, sudo -sлибо пользователь ~/.bash_profileпросто содержит эту команду.

Судо

Добавьте каждого пользователя в группу sudoUNIX (например usermod -a -G sudo USERNAME, хотя в старых системах будут менее интуитивные способы сделать это; в худшем случае вы будете редактировать /etc/groupsнапрямую).

В /etc/sudoersили /etc/sudoers.d/local, вы хотите строку, как это:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Если вы хотите автоматический root-доступ, добавьте его в профиль пользователя. Ибо bashэто будет ~/.bash_profile:

sudo -s

Это позволит вам увидеть, кто вошел в систему (попробуйте whoили last) и выйдет из системы /var/log/auth.log.

Логин без пароля

В гораздо более старых системах вы можете просто отредактировать /etc/passwd(или в более старых системах /etc/shadow) и удалить хеш, например, bob:$1$salt$hash:12345:0:99999:7:::просто bob::12345:0:99999:7:::. Это было все, что вам нужно. Современным системам это не нравится. Вероятно, есть другие способы сделать это, но способ, который я только что проверил, заключается в следующем (источник: Случайный материал Лео ) :

Откройте /etc/shadowи наблюдайте учетную запись с реальной информацией. Это будет включать три элемента, разделенных знаками доллара ( $). Они представляют механизм хеширования, затем соль , затем хеш. Обратите внимание на соль, затем запустите это:

openssl passwd -1 -salt SALT

(Это использует MD5 в качестве механизма хеширования. Это пустой пароль, поэтому вы не должны возражать.) Когда появится запрос на ввод пароля, нажмите Enter. Сохраните эту строку, включая любые конечные точки, и вставьте ее после первого двоеточия в строке этого пользователя /etc/shadow(это должно заменить любой ранее существовавший контент между первым и вторым двоеточиями). (Пожалуйста, не используйте буквально SALTкак соль!)

SSH

Ваша sshконфигурация демона живет в /etc/sshd_configили /etc/ssh/sshd_config. Для правильной безопасности, я рекомендую включить эти строки:

PermitRootLogin no
PermitEmptyPasswords no

См. Запись Secure Secure Shell о дополнительных мерах безопасности, которые вы можете добавить к своей конфигурации ssh, чтобы лучше защитить ее от искушенных злоумышленников.

Теперь ваши пользователи не могут войти через систему sshиз-за пустых паролей (это необходимая мера безопасности). Это означает, что они могут войти только с помощью ключей ssh.

Каждый пользователь для каждой из своих клиентских систем должен создать пару ключей ssh, например

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Это создает закрытый ключ в $HOME/.ssh/id_rsaи открытый ключ в $HOME/.ssh/id_rsa.pub. Пусть этот пользователь отправит вам свои открытые ключи и добавит их к этому серверу $HOME/.ssh/authorized_keys(обратите внимание, что каждый пользователь $HOME/.sshдолжен иметь режим 700, например mkdir -p ~user/.ssh && chmod 700 ~user/.ssh).

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

(Я фактически использовал эту технику, чтобы дать людям доступ к коллекции систем, когда я управлял ИТ-отделом. Он заставлял пользователей использовать ssh-ключи, и мне не нужно было давать им пароли. Их начальная ~/.bash_profileстрока имела две строки внизу: passwdа затем, mv ~/.bash_profile.real ~/.bash_profileчтобы они установили новый пароль при первом входе в систему.)

риски

Вы полностью доверяете своим пользователям. Ничто не мешает пользователю возиться с ~/.ssh/authorized_keysфайлом другого пользователя и, таким образом, меняет вашу способность отменять и проверять доступ, но это неизбежно, если вы предоставляете полный root-доступ.

Вывод

Каждый пользователь теперь является членом группы sudo и имеет полный бесполезный доступ к корневой оболочке. Эти пользователи не имеют паролей для своих учетных записей и могут удаленно войти в систему с помощью ключей ssh.

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

Адам Кац
источник
В части о sudo пропущен вопрос, поскольку речь шла исключительно о новых входах в систему, а не о смене пользователей. Поправил вопрос, чтобы было понятнее. Часть о входе без пароля демонстрирует точно такое же неправильное поведение, как и passwd -dв вопросе, позволяя suпереключиться на этого пользователя без пароля. В разделе «Риски» описаны две вещи (связывание с данными других пользователей и получение root-прав), удаление которых является самой точкой вопроса. Поэтому, хотя отдельные разделы хорошо написаны, это ни в коем случае не является ответом на вопрос.
Павел Шимерда
Я предполагал, что вы добавите пользователя, а затем ограничите его.
Адам Кац