Вход по SSH вместо getty с локальным откатом

Это называетсякосвенным обращениеми имеет следующий синтаксис ${!reference}для подстановки значения переменной, имя которой находится в переменной reference. Например:

name='Jane Doe'
reference='name'
$ echo "${!reference}"
Jane Doe

5
28.08.2021, 21:48
1 ответ

Это действительно вполне достижимо. :Я делал что-то очень похожее в университете, примерно в 1998 году.

По сути, вам нужно настроить процесс gettyRasPi для вызова вашей собственной версии программы loginвместо стандартной /bin/login. Эта часть проста.

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

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

Возможно, для локального входа лучше потребовать преднамеренное действие, например переключение на вторую виртуальную консоль с неизмененной gettyконфигурацией. Вы можете добавить инструкции по нужному нажатию клавиши в /etc/issue, чтобы gettyотображал его перед запросом входа в систему. В качестве побочного эффекта ваш настраиваемый loginскрипт или двоичный файл может быть значительно упрощен до простого:

#!/bin/sh
REMOTEUSER="$1"
exec ssh -oEscapeChar=none "$REMOTEUSER"@your.server.example

Опция -oEscapeChar=noneпредотвратит использование управляющей клавиши OpenSSH, поэтому пользователи не смогут настраивать переадресацию портов или выполнять другие махинации с клиентом SSH (спасибо Ferrybig за напоминание! ).

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

Если у вас есть хоть малейший опыт в программировании, я бы порекомендовал вам загрузить пакет исходного кода для /bin/loginвыбранного вами дистрибутива Linux и посмотреть, сможете ли вы взломать его, чтобы сделать это.

По сути, вам нужно будет внести два изменения :вместо того, чтобы использовать имя пользователя, присвоенное ему в качестве параметра gettyдля выбора имени пользователя для входа в систему, вы заставите свою замену loginиспользовать жесткий -закодированное имя пользователя, которое вы зарезервируете только для исходящих соединений SSH. И вместо того, чтобы exec()вызывать оболочку пользователя в конце процесса входа в систему, вы должны exec()ввести команду SSH, задав ей в качестве параметров имя пользователя, полученное из getty, и имя вашего сервера.

9
28.08.2021, 23:33

Теги

Похожие вопросы