Webmin на Debian и Ubuntu: безопасная установка и удалённое управление сервером
Webmin полезен, когда сервером приходится управлять не только через SSH: посмотреть службы, быстро проверить диск, изменить расписание cron или создать пользователя. Но панель работает с системными настройками и фактически обладает административными правами, поэтому ставить её «на всякий случай» и открывать всему интернету — плохая идея.
Ниже настроим Webmin на Debian/Ubuntu так, чтобы он был доступен только из административной сети. Заодно разберём, что именно даёт каждый шаг, как проверить TLS и журналы и как полностью удалить панель без следов.
Что получим в итоге
- Webmin из официального репозитория;
- панель на HTTPS-порту 10000;
- доступ только из административной сети;
- отдельного администратора без прямого входа root;
- резервную копию конфигурации;
- понятную диагностику и rollback.
1. Проверяем сервер до установки
hostnamectl
ip -br addr
ip route
ss -lntup
df -h
free -hНас интересуют реальный IP сервера, занятые порты и свободное место. Если порт 10000 уже используется, это нужно выяснить заранее, а не после установки.
2. Создаём резервную точку
mkdir -p /root/webmin-backup
cp -a /etc/apt /root/webmin-backup/apt-before
nft list ruleset > /root/webmin-backup/nftables-before.txt 2>/dev/null || true
iptables-save > /root/webmin-backup/iptables-before.txt 2>/dev/null || trueWebmin ещё не установлен, но мы уже сохраняем состояние репозиториев и firewall. Это позволяет отделить проблемы панели от изменений, которые существовали раньше.
3. Подключаем репозиторий и устанавливаем Webmin
apt update
apt install -y curl ca-certificates gnupg
curl -fsSL https://download.webmin.com/jcameron-key.asc | gpg --dearmor -o /usr/share/keyrings/webmin.gpg
echo 'deb [signed-by=/usr/share/keyrings/webmin.gpg] https://download.webmin.com/download/repository sarge contrib' > /etc/apt/sources.list.d/webmin.list
apt update
apt install -y webminПосле установки пакет создаёт службу Webmin и обычно начинает слушать TCP 10000. Сразу проверяем не только статус systemd, но и фактический сокет.
systemctl status webmin --no-pager
ss -lntp | grep ':10000'
curl -kI https://127.0.0.1:10000/Ответ HTTP подтверждает, что веб-сервис поднялся локально. Ключ -k используется только для первичной проверки, потому что стартовый сертификат может быть самоподписанным.
4. Создаём отдельного администратора
adduser webadmin
usermod -aG sudo webadmin
id webadminВход под отдельной учётной записью лучше прямого использования root: действия проще отслеживать, пароль можно заменить отдельно, а доступ — быстро отозвать. В самой панели проверьте, что пользователь получает только необходимые модули.
5. Ограничиваем доступ к панели
Допустим, администраторы работают из сети 192.168.1.0/24. Открывать порт 10000 всему интернету не нужно: Webmin — не публичный сайт, а ключ от сервера.
ufw allow from 192.168.1.0/24 to any port 10000 proto tcp
ufw status numberedЕсли используется nftables, добавьте эквивалентное правило в постоянный конфиг, а не разовую команду. После применения проверьте доступ из LAN и убедитесь, что с внешнего адреса соединение не устанавливается.
6. Ограничиваем адреса внутри Webmin
cp -a /etc/webmin /root/webmin-backup/webmin-etc
printf '%s
' 'allow=127.0.0.1 192.168.1.0/255.255.255.0' >> /etc/webmin/miniserv.conf
systemctl restart webmin
systemctl status webmin --no-pagerЭто второй слой защиты. Даже если firewall когда-нибудь изменят неудачно, сам miniserv будет принимать подключения только от разрешённых адресов. Перед добавлением проверьте, нет ли в файле уже существующей директивы allow=.
7. Настраиваем нормальный сертификат
Для внутреннего сервера можно использовать сертификат корпоративного CA. Для публичного DNS-имени — сертификат ACME, но саму панель всё равно лучше не открывать всему миру.
openssl s_client -connect 127.0.0.1:10000 -servername webmin.example.ru </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -datesКоманда показывает, кому выдан сертификат, кем он подписан и когда истекает. После замены сертификата повторите проверку и откройте панель браузером без предупреждения о недоверенном соединении.
8. Проверяем основные сценарии
- вход под webadmin;
- просмотр загрузки CPU, памяти и дисков;
- просмотр состояния systemd-службы;
- чтение системных журналов;
- проверка cron без изменения критичных задач;
- выход из сессии и повторный вход.
Проверка нужна не ради красивой панели. Она подтверждает, что Webmin видит системные службы, а пользователь получил ровно тот уровень доступа, который планировался.
9. Смотрим журналы и активность
journalctl -u webmin --since '30 min ago' --no-pager
tail -n 100 /var/webmin/miniserv.log
tail -n 100 /var/webmin/webmin.log
ss -tnp | grep ':10000'miniserv.log помогает понять, кто подключался и почему вход был отклонён. webmin.log показывает действия внутри панели. Эти журналы стоит включить в резервное копирование и мониторинг свободного места.
10. Обновления без сюрпризов
apt update
apt list --upgradable 2>/dev/null | grep -i webmin || true
apt-cache policy webminПеред крупным обновлением сохраните /etc/webmin и проверьте changelog. Панель затрагивает много системных модулей, поэтому обновление лучше выполнять в обычное окно обслуживания, а не за минуту до отпуска.
11. Типовые проблемы
- Порт не слушает: проверьте
systemctl status webminиjournalctl -u webmin. - Локально открывается, из LAN нет: проверяйте firewall и директиву
allow=. - Браузер ругается на TLS: проверьте имя сертификата, цепочку и срок.
- Вход успешен, но модулей нет: проверяйте права пользователя Webmin.
- Панель медленная: смотрите DNS, загрузку CPU, диск и журналы.
12. Удаление и откат
systemctl disable --now webmin
apt remove --purge -y webmin
rm -f /etc/apt/sources.list.d/webmin.list /usr/share/keyrings/webmin.gpg
apt update
ss -lntp | grep ':10000' || trueПосле удаления порт 10000 не должен слушаться. Конфигурацию из /root/webmin-backup храните до тех пор, пока не убедитесь, что панель больше не нужна.
Критерий успеха: Webmin открывается по HTTPS только из административной сети, вход выполняется отдельным пользователем, журналы фиксируют действия, а с внешнего адреса порт недоступен.