Как заставить Shared Keys .ssh / authorized_keys и sudo работать вместе?

15

Я настроил .ssh / authorized_keys и могу войти в систему с новым "пользователем", используя pub / private ключ ... Я также добавил "user" в список sudoers ... проблема, которая у меня сейчас возникает, когда Я пытаюсь выполнить команду sudo, например:

$ sudo cd /root

мне будет предложено ввести пароль, который я ввожу, но он не работает (я использую пароль, который я установил)

Кроме того, я отключил пароль пользователя с помощью

$ passwd -l user

Что мне не хватает?

Где-то мои первоначальные замечания были неправильно поняты ...

Я пытаюсь укрепить свою систему ... конечная цель - использовать публичные / закрытые ключи для входа в систему вместо простой аутентификации по паролю. Я разобрался, как все это настроить с помощью файла authorized_keys.

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

Для этого второго пользователя я хочу запретить регулярные входы в систему с паролем и принудительно входить только в паб / закрытый ключ, если я не блокирую пользователя с помощью "passwd -l user ... тогда, если я не использую ключ, я все еще могу попасть на сервер с обычным паролем.

Но что более важно, мне нужно заставить sudo работать с настройкой паб / закрытый ключ с пользователем, у которого его / ее пароль отключен.


Редактировать: ОК, я думаю, что у меня есть (решение):

1) Я настроил / etc / ssh / sshd_config и установил PasswordAuthentication no Это предотвратит вход в систему с паролем ssh (убедитесь, что перед этим настроена работающая настройка открытого / закрытого ключа).

2) Я настроил список sudoers visudoи добавил

root      ALL=(ALL) ALL
dimas     ALL=(ALL) NOPASSWD: ALL

3) root - единственная учетная запись пользователя, которая будет иметь пароль, я тестирую с двумя учетными записями пользователей "dimas" и "sherry", у которых не установлен пароль (пароли пустые passwd -d user)

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

Кроме того, пользователи в списке sudoers имеют права администратора. Они могут также suна разные аккаунты. Таким образом, в основном «dimas» может sudo su sherry, однако «dimas НЕ МОЖЕТ сделать su sherry. Точно так же любой пользователь НЕ в списке sudoers НЕ МОЖЕТ сделать su userили sudo su user.

ПРИМЕЧАНИЕ Вышеуказанное работает, но считается плохим. Любой сценарий, который может получить доступ к коду как "dimas" или "sherry" пользователи, сможет выполнить sudo для получения root-доступа. Ошибка в ssh, которая позволяет удаленным пользователям входить в систему, несмотря на настройки, удаленное выполнение кода в чем-то вроде Firefox или любой другой недостаток, который позволяет запускать нежелательный код, поскольку пользователь теперь может запускаться от имени пользователя root. Sudo всегда должен требовать пароль, иначе вы можете войти в систему как пользователь root, а не какой-либо другой пользователь.

farinspace
источник

Ответы:

10

sshи не sudoимеют ничего общего друг с другом. Настройка sshметода аутентификации ничего не даст sudo. sudoне поймет sshпароль.

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

Я думаю, что вы хотите, это NOPASSWDвариант в вашем sudoersфайле .

(PS, нет никаких причин для запуска cdкоманды с sudo. cdНе распространяется на родительские процессы, поэтому, как только sudoвыходы, вы вернетесь, где вы начали.)

Изменить: Вы продолжаете говорить, что вы хотите заблокировать пароль учетной записи и хотите, чтобы sudo понимал открытые / закрытые ключи. Извините, sudo не собирается использовать ssh-ключи. Это не ssh. Если вы не хотите, чтобы пользователи могли войти в систему со своими паролями, я думаю, что ответ заключается в том, чтобы отключить аутентификацию по ssh-паролям , а не блокировать учетную запись. Затем вы можете сохранить пароль для пользователей, который они могут использовать для sudo после того, как они войдут через ssh авторизованные ключи.

coneslayer
источник
хорошо, но факт, что пользователь не имеет пароля через: passwd -l user ..., заставляет команду sudo не работать?
Farinspace
@farinspace Да, я лучше понимаю вопрос и значительно расширил свои замечания. passwd -lудаляет пароль в том смысле, что учетная запись заблокирована - то есть пароль не будет работать. Вы хотите отключить аутентификацию по паролю в sudo.
конуслайер
какова эта логика: отключение пароля в файле sudoers будет по-прежнему безопасным, поскольку система защищена с помощью входа в систему с помощью открытого и закрытого ключей ... и снова только администратор сможет добавлять пользователей в список sudoers
farinspace
при использовании закрытого ключа обычно задают для него пароль или он достаточно безопасен, чтобы просто не устанавливать его и не
пропускать
4
@coneslayer этот ответ не на 100% точен. Как вы можете видеть ниже, sudo может быть настроен на соблюдение аутентификации ssh.
Андре де Миранда
18

То, что вы хотите сделать, возможно, но это потребует некоторого опыта, так как вам нужно будет скомпилировать модуль PAM с именем pam-ssh-agent-auth .

Процесс достаточно прост:

$ sudo aptitude install libssl-dev libpam0g-dev build-essential checkinstall
$ wget "http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v0.9.3/pam_ssh_agent_auth-0.9.3.tar.bz2"
$ tar -xjvf pam_ssh_agent_auth-0.9.3.tar.bz2
$ cd pam_ssh_agent_auth-0.9.3

$ ./configure --libexecdir=/lib/security --with-mantype=man

$ make
$ sudo checkinstall

Редактирование конфигурации sudo:

$ sudo visudo

Добавьте следующее:

Defaults env_keep += SSH_AUTH_SOCK

Продолжите, изменив настройки sudo PAM:

$ sudo vi /etc/pam.d/sudo

Добавьте (чуть выше строк @include):

**auth [success=2 default=ignore] pam_ssh_agent_auth.so file=~/.ssh/authorized_keys**
@include common-auth
@include common-account
Андре де Миранда
источник
Другой вариант можно найти по
Андре де Миранда
4
Это должен быть принятый ответ
Кристофер Монсанто
1
Эти инструкции (особенно /etc/pam.d/sudoинструкции) устарели для текущих версий Ubuntu. Я предоставил обновленные инструкции в своем ответе.
Крис Пик
4

Ответ Андре де Миранды дает хорошее решение с использованием pam_ssh_agent_auth , но некоторые части устарели. В частности, /etc/pam.d/sudoинструкции при использовании многих текущих версий Linux.

Если вы используете Ubuntu 12.04, я упростил процесс, предоставив сборку pam_ssh_agent_auth из ppa: ppa: cpick / pam-ssh-agent-auth .

Вы можете установить пакет, запустив:

sudo add-apt-repository ppa:cpick/pam-ssh-agent-auth
sudo apt-get install pam-ssh-agent-auth

После установки, если вы хотите использовать этот модуль PAM с sudo, вам нужно будет настроить параметры sudo и конфигурацию PAM, в Ubuntu 12.04, точнее, вы можете сделать это, создав следующие два файла:

/etc/sudoers.d/pam-ssh-agent-auth:

Defaults    env_keep+="SSH_AUTH_SOCK"

/etc/pam.d/sudo:

ent#%PAM-1.0

auth       required   pam_env.so readenv=1 user_readenv=0
auth       required   pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth       sufficient pam_ssh_agent_auth.so file=/etc/security/authorized_keys
@include common-auth
@include common-account
@include common-session-noninteractive

Если вы используете chef, описанный выше процесс можно автоматизировать с помощью моей кулинарной книги, которую можно найти в любом из двух следующих мест:
https://github.com/cpick/pam-ssh-agent-auth
http: //community.opscode .com / cookbooks / pam-ssh-agent-auth .

filesКаталог поваренной книги содержит описанные выше файлы /etc/pam.d/sudoи /etc/sudoers.d/pam-ssh-agent-authфайлы, которые работают с Ubuntu 12.04 точно, и должны быть полезной отправной точкой при использовании других версий / дистрибутивов.

Крис Пик
источник
-1

Единственный известный мне способ обойти ввод пароля - это отключить его в своем sudoersфайле.

Нечто подобное даст rootи всем участникам wheel полный доступ без пароля:

root    ALL=(ALL)   NOPASSWD: ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

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

Джек М.
источник
я не возражаю против использования пароля, проблема возникает после того, как я отключил пароль пользователя с помощью: passwd -l user ... Я все еще могу войти в систему через pub / private ключ (закрытый ключ имеет безопасный пароль) Когда я делаю sudo, он запрашивает пароль, но это не пароль от закрытого ключа, кажется, где этот пароль установлен, если я отключил его для пользователя (я бы предпочел избежать сохранения пароля в системе и на закрытый ключ)
farinspace
"где этот пароль установлен, если я отключил его для пользователя?" Нигде. Там нет пароля, который вы можете ввести, который будет работать, потому что вы заблокировали учетную запись.
конуслайер
Вам нужно будет повторно включить учетную запись в удаленной системе, а затем установить пароль. В любом случае, вы должны поддерживать пароль на обеих машинах. Если по какой-либо другой причине, кроме локальных входов в случае неисправности.
Джек М.