Если авторизация по ключу не проходит, авторизоваться с другим пользователем

Если авторизация по ключу не проходит, авторизоваться с другим пользователем

07.06.2017 08:27:54 Просмотров 28 Источник

Хочу реализовать следующий алгоритм авторизации по SSH:

  1. Попробовать авторизацию по ключу с пользователем username.
  2. Если не получилось, сразу начать авторизацию по паролю как defaultuser.

Такой алгоритм должен работать для всех хостов в некоторой подсети.

Можно ли реализовать это с помощью конфигурации SSH или отдельного инструмента? Если этот путь вообще не годится, неэффективен или небезопасен — расскажите, как правильно, такой ответ меня тоже устроит.


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

Ничего не приходилось бы настраивать, если бы $(whoami) и defaultuser совпадали.

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc#comment987560_676248
А что мешает создать своего пользователя, докинуть свой ключ и поправить sshd_config на этапе постран скриптов или вообще в файле ответов? Какие виртуалки разворачиваются? Бубен, центось, сюся?
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc#comment987578_676248
@donRumata постран скрипты не смогу поменять, т.к. использую PaaS. Что такое «файл овтетов» даже не знаю — подскажете, где почитать?
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc#comment987605_676248
@donRumata виртуалки — мне только Debian & Ubuntu бывают нужны.
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc#comment987619_676248
я создаю на них своего пользователя — вы это вручную делаете, или процесс автоматизирован?

Ответы - Если авторизация по ключу не проходит, авторизоваться с другим пользователем / Если авторизация по ключу не проходит, авторизоваться с другим пользователем

gbg

07.06.2017 08:33:53

Можно поправить ssh_config, задав в нем отбор хостов по маске и для этих хостов задать User defaultyser

https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676249#comment987485_676249
Можно, и у меня сейчас уже есть эта настройка. Но она не позволяет использовать своего пользователя и ключ для тех хостов, которые я уже «присвоил». Конфиг просто об этом не знает. А хосты я могу создавать и удалять каждый день, так что руками править конфиг — не вариант.
Является ответом!
aleksandr barakin

07.06.2017 09:45:15

можно, например, такой shell-функцией-обёрткой воспользоваться (без первой и последней строки превращается в shell-скрипт):

sshwrapper() {
  if [ $# -ne 1 ]
  then
    echo "ожидаю один аргумент"
    return 1
  fi
  if ! ssh -o passwordauthentication=no $1
  then
    ssh -o passwordauthentication=yes defaultuser@$1
  fi
}

это только концептуальная заготовка. реализована лишь проверка на количество аргументов. подразумевается, что аргумент всего один — имя машины, куда пытаемся подключиться.

делается две попытки подключения. первая — по имени текущего пользователя (или сконфигурированного через ~/.ssh/config) и с запретом на аутентификацию по паролю. если попытка оказалась неудачной, делается вторая попытка, с пользователем defaultuser и уже с явным разрешением на аутентификацию по паролю.

p.s. старался выдержать синтаксис posix-совместимым.

https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987566_676271
Забыл уточнить: SSH чаще пользуется ansible, чем я сам. Видимо, мне придется размещать содержимое этой функции где-нибудь в /usr/local/bin/, чтобы перекрыть основной SSH. Выглядит хрупко.
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987586_676271
@NickVolynkin, малознаком с ansible. ему разве нельзя указать, какую программу следует использовать вместо /usr/bin/ssh? кстати, в таком случае надо будет устраивать полноценный синтаксический разбор опций/параметров, чтобы найти первый параметр (с именем хоста) // «хрупко» — в каком именно месте?
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987591_676271
Но в целом это ответ. Конфигами решить нельзя, можно написать скрипт.
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987596_676271
Хрупко именно в том, что нужно делать разбор параметров и вообще писать и поддерживать код. Вот что придумал: для ansible я могу задать нужного пользователя конфигами самого ansible, а сам буду использовать вашу функцию.
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987613_676271
@NickVolynkin, кстати, а ansible сам по себе умеет использовать пароль только в том случае, если по ключу «не пустили»?
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987664_676271
Кажется, нет. Если соединение по ключу неуспешно, он «проваливает» выполнение задачи для конкретного хоста. Можно заранее указать параметр --ask-pass, чтобы он запросил ввод пароля. Наверное, так сделано, чтобы не вводить пароли «на ходу». Управляемых хостов может быть много, вводить пароль для каждого — нерационально. То есть предполагается, что мы уже перед запуском знаем, какой способ авторизации является верным.
https://ru.stackoverflow.com/questions/676248/%d0%95%d1%81%d0%bb%d0%b8-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%bf%d0%be-%d0%ba%d0%bb%d1%8e%d1%87%d1%83-%d0%bd%d0%b5-%d0%bf%d1%80%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f-%d1%81-%d0%b4%d1%80%d1%83%d0%b3%d0%b8%d0%bc-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc/676271#comment987669_676271
@NickVolynkin, а как же вы собирались «прикручивать» к ansible такой вариативный способ подключения? ну, если бы нашлась подходящая настройка для ssh. // я это спрашиваю не из праздного интереса: скоро самому придётся ansible осваивать, и, вероятно, использовать примерно в тех же сценариях, что и у вас.
Закрыть X