Назад | Перейти на главную страницу

Лучший способ ограничить некоторых пользователей SSH только аутентификацией с открытым ключом (отключить аутентификацию по паролю)

Я использую Mac OS X Server.app на Yosemite, и у меня включен SSH для пользователей с настройками по умолчанию в /etc/sshd_config (открытый ключ и аутентификация по паролю включены по умолчанию). Однако мне нужно ограничить git локальный пользователь должен иметь доступ к публичному ключу ТОЛЬКО через SSH.

Полное раскрытие, Server.app включает некоторые дополнительные параметры Kerberos и GSSAPI (хотя я не уверен на 100%, как они влияют на мои вопросы ниже):

# Kerberos options
KerberosAuthentication yes
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes

# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GSSAPIStrictAcceptorCheck yes
GSSAPIKeyExchange no

/etc/sshd_config говорит следующее:

# To disable tunneled clear text passwords both PasswordAuthentication and
# ChallengeResponseAuthentication must be set to "no".

Тем не мение, ChallengeResponseAuthentication не допускается в операторах соответствия, поэтому я попытался просто отключить аутентификацию по паролю:

Match User git
      PasswordAuthentication no

Это не работает - я все еще мог войти в систему с именем пользователя / паролем на git@my.server :(

Однако добавление KbdInteractiveAuthentication no казалось, работает правильно:

Match User git
      PasswordAuthentication no
      KbdInteractiveAuthentication no

Теперь я получаю Permission denied (publickey,gssapi-keyex,gssapi-with-mic) при попытке авторизации без открытого ключа. Похоже, это указывает на то, что есть еще методы, помимо publickey, которые позволят войти в систему из git пользователь (т.е. gssapi-keyex и gssapi-with-mic)

Похоже, что лучший подход - просто ограничить метод аутентификации publickey:

Match User git
    AuthenticationMethods publickey

Это дает ответ `Permission denied (publickey).

Вопросы:

  1. какая разница между ChallengeResponseAuthentication и KbdInteractiveAuthentication? Почему KbdInteractiveAuthentication разрешено в операторах соответствия, но не ChallengeResponseAuthentication?
  2. Есть ли какие-либо недостатки / проблемы безопасности с AuthenticationMethods publickey подходить?
  3. (Бонус, если вы поможете мне понять gssapi-keyex/gssapi-with-mic и как они соотносятся с включенными параметрами GSSAPI / Kerberos)

Вот хорошее резюме разницы между ChallengeResponseAuthentication и KbdInteractiveAuthentication в http://blog.tankywoo.com/linux/2013/09/14/ssh-passwordauthentication-vs-challengeresponseauthentication.html - резюме состоит в том, что ChallengeResponse часто заканчивается просто запросом пароля (но настаивает на том, чтобы он предоставлялся в интерактивном режиме).

KbdInteractiveAuthentication и ChallengeResponseAuthentication это разные вещи. Просто это ChallengeResponseAuthentication может закончиться просто запросом пароля в простых случаях.

ChallengeResponseAuthentication является глобальным параметром и не может быть указан в Match пункт - см. sshd_config справочную страницу для подробностей.

Явное указание AuthenticationMethods publickey для git пользователь должен работать нормально и лучше, чем отключать те, которые вам не нужны (так как список может измениться).

В gssapi варианты вступают в игру, если вы работаете в Kerberos среда (например, домен Active Directory).

Мне не совсем понятно, есть ли разница, но, по крайней мере, ChallengeResponseAuthentication, похоже, требует KbdInteractiveAuthentication; он автоматически включается, если включен запрос-ответ.

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

Я нашел следующее в портативном источнике openssh (по состоянию на 20181214).

sshd.c, начиная со строки 1685:

 /* challenge-response is implemented via keyboard interactive */
 if (options.challenge_response_authentication)
    options.kbd_interactive_authentication = 1;

sshconnect2.c, начиная со строки 375:

 if (options.challenge_response_authentication)
    options.kbd_interactive_authentication = 1;