Должен признать, что в некоторых случаях мне нравятся серверы без паролей. Типичный сервер уязвим для всех, кто имеет физический доступ к нему. Поэтому в некоторых случаях целесообразно блокировать его физически и с тех пор доверять любому физическому доступу.
Основные понятия
Теоретически, когда я физически достигаю такого сервера, я могу выполнять административные задачи без пароля, просто введя 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
и тому подобное.
Больше идей после прочтения первых ответов
Просто идея - локальный корневой доступ может быть достигнут путем запуска корневых оболочек вместо процессов входа в систему. Но по-прежнему необходимо блокировать только аутентификацию по паролю, а не аутентификацию с открытым ключом.
Ответы:
Требования, по которым я буду предлагать решения, в качестве пулевых пунктов:
Следующие примеры основаны на Debian, так как это то, что я получил здесь для тестирования. Тем не менее, я не вижу причин, по которым эти принципы нельзя применять ни к одному дистрибутиву (или к любому производному * ix на основе PAM).
Вход в корневую консоль без пароля
Я думаю, что я подойду к этому, используя PAM и
/etc/securetty
файл конфигурации.В качестве предварительного условия необходимо установить «достаточно безопасный» корневой пароль. Это не требуется для входа в консоль, но существует, чтобы сделать попытки взлома методом "грубой силы" нереальными. В противном случае учетная запись является совершенно нормальной учетной записью root.
У
/etc/pam.d/login
меня есть следующий стандартный набор строк для аутентификации (те, которые начинаются с ключевого словаauth
):Указанный
common-auth
включаемый файл содержит следующие соответствующие строки: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
строке:Удаленный вход в систему без пароля от предварительно авторизованных пользователей
Это простое включение ключей 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).источник
.ssh/authorized_keys
файл содержит соответствующий открытый ключ. Это помогает?!
в поле пароля в/etc/shadow
. Согласно справочной странице это указывает на действительную учетную запись, для которой ни один пароль не может соответствовать.Похоже, вам нужны настоящие (не root) учетные записи пользователей с ключами ssh и полным
NOPASSWD
доступом через негоsudo
(который доступен по умолчанию в большинстве дистрибутивов Linux в настоящее время, а также является тривиальной установкой вручную). Вы можете иметь пустые пароли для каждой учетной записи пользователя (которая не будет работать удаленно), тогда пользователь либо запускается,sudo -s
либо пользователь~/.bash_profile
просто содержит эту команду.Судо
Добавьте каждого пользователя в группу
sudo
UNIX (напримерusermod -a -G sudo USERNAME
, хотя в старых системах будут менее интуитивные способы сделать это; в худшем случае вы будете редактировать/etc/groups
напрямую).В
/etc/sudoers
или/etc/sudoers.d/local
, вы хотите строку, как это:Если вы хотите автоматический root-доступ, добавьте его в профиль пользователя. Ибо
bash
это будет~/.bash_profile
:Это позволит вам увидеть, кто вошел в систему (попробуйте
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
и наблюдайте учетную запись с реальной информацией. Это будет включать три элемента, разделенных знаками доллара ($
). Они представляют механизм хеширования, затем соль , затем хеш. Обратите внимание на соль, затем запустите это:(Это использует MD5 в качестве механизма хеширования. Это пустой пароль, поэтому вы не должны возражать.) Когда появится запрос на ввод пароля, нажмите Enter. Сохраните эту строку, включая любые конечные точки, и вставьте ее после первого двоеточия в строке этого пользователя
/etc/shadow
(это должно заменить любой ранее существовавший контент между первым и вторым двоеточиями). (Пожалуйста, не используйте буквальноSALT
как соль!)SSH
Ваша
ssh
конфигурация демона живет в/etc/sshd_config
или/etc/ssh/sshd_config
. Для правильной безопасности, я рекомендую включить эти строки:См. Запись Secure Secure Shell о дополнительных мерах безопасности, которые вы можете добавить к своей конфигурации ssh, чтобы лучше защитить ее от искушенных злоумышленников.
Теперь ваши пользователи не могут войти через систему
ssh
из-за пустых паролей (это необходимая мера безопасности). Это означает, что они могут войти только с помощью ключей ssh.Каждый пользователь для каждой из своих клиентских систем должен создать пару ключей ssh, например
Это создает закрытый ключ в
$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
файла этого пользователя . Если у вас есть нарушение безопасности, у вас есть журналы, показывающие, кто вошел в систему.источник
passwd -d
в вопросе, позволяяsu
переключиться на этого пользователя без пароля. В разделе «Риски» описаны две вещи (связывание с данными других пользователей и получение root-прав), удаление которых является самой точкой вопроса. Поэтому, хотя отдельные разделы хорошо написаны, это ни в коем случае не является ответом на вопрос.