Безопасное меню команд через SSH
Ограничиваем SSH-пользователя интерактивным меню разрешённых административных команд. Bash-скрипт, ForceCommand и точечное правило sudoers дают перезапускать сервисы без полноценного доступа к серверу.
Фото: Emre Karademir / PexelsЗдесь собраны все публикации блога Bashdays — заметки про Linux, DevOps и айтишные технологии.
Ограничиваем SSH-пользователя интерактивным меню разрешённых административных команд. Bash-скрипт, ForceCommand и точечное правило sudoers дают перезапускать сервисы без полноценного доступа к серверу.
Реализуем расширенную Basic Auth-аутентификацию в Nginx с помощью Lua и базы MySQL. Скрипт OpenResty читает заголовок Authorization, хеширует пароль, проверяет пользователя и передаёт запрос в защищённый location.
Настраиваем policy-based routing для сервера с двумя шлюзами: API-трафик уходит через один маршрут, а ответы SSH и HTTP возвращаются через внешний шлюз. Используем netplan, отдельную таблицу маршрутизации, ip rule, iptables MARK и …
Разбираемся, что такое magic numbers в ELF-файлах и какие константы ядро Linux требует для системного вызова reboot. В примерах — readelf, фрагменты kernel/reboot.c и пасхалки с датами семьи Линуса Торвальдса.
Разбираем коды завершения Linux-команд от 0 до 255 и специальную переменную $?. Учимся сохранять статус, строить обработку ошибок и завершать Bash-скрипт нужным кодом через exit.
Сравниваем время инициализации и выполнения разных вариантов for и while в Bash, а также цикла gawk. Тест на пяти миллионах итераций показывает влияние генерации списка, расхода памяти и содержимого тела цикла.
Настраиваем проброс SSH-портов VirtualBox, чтобы подключаться к гостевой Ubuntu из WSL через Windows-хост. Разбираем правила NAT для localhost, локальной сети и VPN, а затем добавляем удобные алиасы.
Перенаправляем stdout и stderr уже запущенного процесса в /dev/null без остановки. На примере tail, /proc и gdb разбираем файловые дескрипторы и вызов dup2 для потоков 1 и 2.
Пишем небольшой Bash-парсер, который превращает большой php.ini в компактный шаблон без комментариев и пустых строк. Разбираем чтение файла построчно, continue и регулярные выражения в конструкции [[ =~ ]].
Практический разбор зависания PHP-FPM и ошибки 502 Bad Gateway с помощью strace и lsof. По файловому дескриптору находим недоступный Elasticsearch, из-за которого воркер перестаёт обрабатывать запросы.
Добавляем в Bash-скрипты терминальные окна yes/no, поля ввода, меню и прогресс-бар с помощью whiptail. На готовых примерах разбираем коды возврата и перенаправление файловых дескрипторов.
Устанавливаем Bash-утилиту tmpmail и создаём одноразовый почтовый адрес прямо в терминале. Показываем генерацию адресов, выбор домена, просмотр входящих писем и получение последнего сообщения в текстовом виде.