Не так давно пришло уведомление от NewReleases.
Например, обращаемся на url https://service.example.com/tuktuk/ssh/on, а Labean выполняет проброс порта на нужный сервер. То есть выполняет конкретное действие на сервере:
iptables -t nat -A PREROUTING -p tcp --dport 31001 \
-i ens18 -s {clientIP} -j DNAT --to 10.30.51.4:22
Или любое другое в зависимости от того, какой файрвол используете. Зашли и закрыли за собой дверь - https://service.example.com/tuktuk/ssh/off:
iptables -t nat -D PREROUTING -p tcp --dport 31001 \
-i ens18 -s {clientIP} -j DNAT --to 10.30.51.4:22
Проброс порта - частный случай, когда с помощью Labean реализуется принцип port knocking. Тут он удобен тем, что работает по HTTP и с большой долей вероятности не будет блокироваться, в отличии от некоторых других методов.
Можно выполнять и любые другие действия: снимать дамп с базы, перезаливать dev, обновлять контейнеры и т.д. Такой вот костылинг на небольших инфраструктурах и задачах.
Так как это HTTP, перед Labean можно поставить любой прокси типа Angie / Nginx / Traefik и т.д. и настроить там по желанию какие-то дополнительные проверки, логирования, ограничения, аутентификации и т.д.
По своей сути Labean - одиночный бинарник на Go и конфигурационный файл в формате JSON. Проще всего запускать через systemd на хосте, либо собрать свой Docker контейнер, но в данном случае не вижу большого смысла, если действия будут выполняться на хосте, а не внутри группы контейнеров, к которым его можно присоседить.
Работает Laben примерно так. Ставлю:
# wget https://github.com/noiseonwires/labean/releases/download/v260531/labean-linux-amd64
# chmod +x labean-linux-amd64
# mv labean-linux-amd64 /usr/local/bin/labean
Создаю конфигурацию /etc/labean/labean.conf:
{
"listen": "192.168.137.29:9191",
"url_prefix": "tuktuk",
"real_ip_header": "X-Real-IP",
"allow_explicit_ips": false,
"tasks": [
{
"name": "ssh",
"timeout": 30,
"on_command": "iptables -A INPUT -i ens18 -s {clientIP} -p tcp --dport 22 -j ACCEPT",
"off_command": "iptables -D INPUT -i ens18 -s {clientIP} -p tcp --dport 22 -j ACCEPT"
}
]
}
Создаю юнит для systemd - /etc/systemd/system/labean.service:
[Unit]
Description=Labean HTTP port knocker
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/labean /etc/labean/labean.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
Запускаю:
# systemctl daemon-reload
# systemctl start labean
Проверяю:
# ss -tulnp | grep 9191
tcp LISTEN 0 4096 192.168.137.29:9191 0.0.0.0:* users:(("labean",pid=1324,fd=7))
Открываю в браузере url 192.168.137.29:9191/tuktuk/ssh/on, на сервере выполняется команда:
iptables -A INPUT -i ens18 -s 192.168.137.200 -p tcp --dport 22 -j ACCEPT
где 192.168.137.200 - адрес, с которого я делал запрос.
Это я показал максимально простой пример для демонстрации возможностей. Если будете использовать в реальной ситуации, то слушать надо "listen": "127.0.0.1:9191", а внешние запросы принимать на прокси. В репозитории есть примеры для nginx и caddy. Там же пример конфигурации и юнита systemd.
Настройка простая и интуитивная. Я сходу настроил и запустил на тестовой сервере. Сразу всё корректно отработало. Как я уже сказал, так можно выполнять любые действия. Из наиболее актуальных - открывать доступ к vpn/rdp, запускать/перезапускать/останавливать службы, добавлять/удалять маршруты и т.д. В общем, тут кто во что горазд в костылинге.
#security #gateway