
У меня есть пользователь, которому нужно подключиться к удаленной машине M
(через ssh) и выполнить один из фиксированного набора команд (скажем, N
в общей сложности).
Эти команды полагаются на Python, его библиотеки и привилегированный доступ к сети (который M
есть у машины).
Существуют ли стратегии по умолчанию, ограничивающие оболочку пользователя Linux только выполнением этих N
команд, без какой-либо возможности:
- дальнейший доступ к фс
- чтение содержания самих команд
- получение привилегированного доступа к сети
- и тому подобное
Другими словами, каковы стратегии по умолчанию, позволяющие пользователю после входа в систему отображать ограниченную консоль, разрешающую, например, вводить только числа между 1
и N
?
решение1
В файле authorized_keys есть интересный трюк: вы можете использовать опцию command для определения команды, которая будет запущена при входе в систему, идентифицируемой ключом, так что если ваши N команд статические - вы можете определить их на сервере и вуаля. Это не ограничит сеть, а только запустит команду. Это будет выглядеть примерно так в файле authorized_keys:
command = "date" ssh-rsa AAAA
Более подробную информацию об этом вы можете найтируководство
Чтобы запретить пользователю доступ к сети, вы можете использовать SELinux или другое подобное программное обеспечение, также вы можете написать хук eBPF, чтобы разрешить именно то, что вам нужно.
решение2
Предположим, что это не крошечный chroot или контейнер, содержащий только то, что нужно, а многопользовательская операционная система общего назначения.
При достаточной автоматизации вход в хост может не потребоваться. Возможно, предоставьте через какую-то систему самообслуживания эти ограниченные возможности, что и делает автоматизация.
Чтобы позволить им делать это на хосте, попробуйте то, что я бы назвал меню captive text. Это скрипт, который вам, возможно, придется написать.
Чтобы строго ограничить действия человека, требующие от него соблюдения других правил, требуется несколько приемов.
- Войдите как непривилегированный, в идеале уникальный для них пользователь. Эскалируйте для привилегированных вещей с помощью инструментов, таких как doas или sudo.
- Это меню запускается с помощью
ForceCommand
блоков OpenSSH. - Также выполните его из профилей оболочки. exec, чтобы он заменил процесс оболочки, а при выходе из меню завершится и его сеанс.
- Сигналы ловушки в скрипте меню.
- Остерегайтесь программ, которые могут запускать произвольные команды. Раскошелиться — это тривиальнов vim команда такая
:shell
- Напишите и используйте в качестве скриптов-оболочек пунктов меню для более сложных операций или большего контроля над выводом.
Выберите языки сценариев для написания меню. Рассмотрите возможность использования существующей библиотеки текстовых меню. Цикл ввода сам по себе не сложен, но сделать его надежным, легко модифицируемым и с хорошим UX — это то, что вам на самом деле нужно в производстве.