Установка и настройка безопасности Webmin на Ubuntu 24.04
Установите Webmin на Ubuntu 24.04 и защитите панель управления. В руководстве описана настройка SSL от Let's Encrypt, двухфакторная аутентификация, Fail2ban и IP-фильтрация.
Что вы создаёте
Webmin — это веб-панель управления, предоставляющая графический интерфейс для администрирования всего сервера Linux: пользователей, пакетов, заданий cron, межсетевого экрана, Apache, BIND, дисков и сотен других модулей. Доступ к ней осуществляется по протоколу HTTPS через порт 10000. Установка выполняется тремя командами и занимает около минуты. Причина, по которой большая часть этого руководства посвящена второй половине, заключается в том, что Webmin авторизуется как root и обладает всеми правами пользователя root. Незащищённый или доступный без аутентификации Webmin — это не просто «риск при управлении», это полная компрометация сервера с готовой страницей входа. Поэтому установите его за десять минут, а затем потратьте оставшееся время на то, чтобы ограничить доступ к нему только для себя.
Предварительные требования и одно важное предупреждение
Свежий VPS на базе Ubuntu 24.04 KVM с доступом root или пользователя с правами sudo. Webmin написан на Perl и потребляет мало ресурсов: 1 ГБ оперативной памяти более чем достаточно, в простое он занимает менее четверти гигабайта. Он ожидает подключений на порту TCP 10000 через собственный встроенный веб-сервер (miniserv.pl), а не через Apache или nginx, поэтому предварительная установка стороннего ПО не требуется.
Перед началом необходимо принять два решения. Первое касается учетной записи: Webmin выполняет аутентификацию через PAM, поэтому вы входите в систему как root или как пользователь из группы sudo, используя Unix-пароль этой учетной записи. Облачные образы обычно настроены только на вход по ключам без пароля для пользователя по умолчанию, а Webmin не может авторизовать пользователя без пароля. Сначала установите пароль с помощью sudo passwd youruser, иначе вход в систему будет невозможен при любых введенных данных.
Второе — это предупреждение: не открывайте порт 10000 для доступа из Интернета без ограничений. Заранее решите, будете ли вы подключаться к Webmin через SSH-туннель (рекомендуемый вариант, ничего не выставляется наружу) или ограничите доступ только своим IP-адресом. Это решение определяет каждый последующий шаг, поэтому ознакомьтесь с обоими вариантами, прежде чем настраивать межсетевой экран.
Установка Webmin из официального репозитория
Webmin предоставляет подписанный apt-репозиторий. Скрипт настройки добавляет репозиторий и его GPG-ключ, чтобы последующие вызовы apt upgrade загружали Webmin как любой другой пакет. Это обеспечивает получение проверенных обновлений вместо загрузки .deb, который не обновляется автоматически.
curl -o webmin-setup-repo.sh https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh
sudo sh webmin-setup-repo.shСкрипт выводит список предстоящих действий и запрашивает Setup repository? (y/N), введите y. После завершения работы скрипта установите пакет. Флаг --install-recommends загружает необходимые зависимости Perl и SSL, чтобы отдельные модули в дальнейшем не выдавали ошибки из-за отсутствующих библиотек.
sudo apt-get install --install-recommends webminWebmin ранее переименовывал этот скрипт, в старых руководствах упоминается setup-repos.sh. Если по прямой ссылке возвращается ошибка 404, возьмите актуальную команду для установки с сайта webmin.com/download, вместо того чтобы использовать фиксированное имя файла. Корректная установка завершается строкой вида Webmin install complete. You can now login to https://your-host:10000/ as root. Сервис включен и запущен, конфигурация находится в /etc/webmin, запросы записываются в /var/webmin/miniserv.log, а неудачные попытки входа попадают в syslog (в Ubuntu 24.04 — в systemd journal).
Перед открытием браузера убедитесь, что сервис запущен и ожидает соединений:
sudo systemctl status webmin --no-pager
sudo ss -tlnp | grep 10000Вы должны увидеть статус active (running) и строку, указывающую, что miniserv.pl привязан к 0.0.0.0:10000. Этот адрес изменится на 127.0.0.1:10000, если вы воспользуетесь методом туннелирования, описанным ниже. Если ss не показывает ничего на порту 10000, значит, Webmin не запустился; перед продолжением ознакомьтесь с journalctl -u webmin -n 50.
Первый вход и предупреждение о сертификате
Откройте браузер по адресу https://YOUR_SERVER_IP:10000. На чистой системе произойдут два события.
Если активен ufw (в стандартном образе Ubuntu он выключен, но многие провайдеры включают его заранее), страница не загрузится вовсе; способы устранения этой проблемы описаны ниже. Если порт открыт, браузер выдаст полноэкранную блокировку: "Ваше подключение не защищено" с кодом NET::ERR_CERT_AUTHORITY_INVALID в Chrome или SEC_ERROR_UNKNOWN_ISSUER / "Внимание: потенциальная угроза безопасности" в Firefox. Это ожидаемое поведение, а не взлом. При установке Webmin сгенерировал самоподписанный сертификат (/etc/webmin/miniserv.pem), и поскольку ни один центр сертификации его не подтверждает, браузер отказывается доверять ему автоматически. Соединение остается зашифрованным, просто оно не верифицировано. Нажмите «Дополнительно» и «Перейти на сайт» (в Firefox — «Принять риск и продолжить»), позже мы заменим этот сертификат на корректный.
Войдите в систему под учетной записью root или вашим пользователем с правами sudo, используя его Unix-пароль. Вы попадете на панель управления System Information. Распространенная ошибка — ввод http:// вместо https://. В этом случае miniserv ответит по обычному HTTP текстом "This web server is running in SSL mode. Try the URL https://...". Решение заключается в том, чтобы просто изменить http на https в адресной строке браузера.
Вопрос безопасности: как вы будете подключаться к Webmin?
Теперь о главном. Панель управления с правами root не должна быть доступна из открытого интернета, принимая попытки входа от всех сканеров в сети. У вас есть два приемлемых варианта, расположенных в порядке предпочтения. С этим вопросом сталкивается любой администратор при размещении сервисов, поэтому безопасность Vaultwarden зависит скорее от его административного интерфейса и файлов резервных копий, чем от алгоритмов шифрования.
SSH-туннель в варианте B — лучший выбор, так как он не открывает порты наружу. Список разрешенных IP-адресов в варианте A допустим, если у вас статический адрес. Отказ от обоих методов — именно та ошибка, которую призвано предотвратить это руководство. Если вы предпочитаете подключаться к Webmin через частную сеть, разместите сервер за собственным VPN-шлюзом WireGuard и привяжите Webmin к адресу внутри туннеля, а не к публичному IP.
Вариант A: ограничение доступа к Webmin по IP
В панели управления откройте Webmin, затем Webmin Configuration, затем IP Access Control. Выберите "Only allow from listed addresses" и введите ваш публичный IP-адрес, который можно узнать, выполнив curl ifconfig.me на вашем ноутбуке. Сохраните изменения. Webmin запишет это в строку allow= в файле /etc/webmin/miniserv.conf и перезапустится.
Ловушка: если ваш домашний IP-адрес динамический и меняется, или вы допустили опечатку при вводе адреса, вы потеряете доступ к панели. Браузер отобразит сообщение "Access denied for <your IP>" без формы входа, и вернуться в веб-интерфейс будет невозможно. Исправить это можно через консоль сервера по SSH или через VNC вашего провайдера:
sudo nano /etc/webmin/miniserv.conf
# find the line that begins allow=
# correct your IP, or delete the whole line to allow all again
sudo systemctl restart webminУдаление строки allow= восстанавливает полный доступ, поэтому делайте это только для восстановления, после чего сразу установите корректное значение.
Вариант B: привязка к localhost и туннелирование через SSH (рекомендуется)
Лучший способ защиты — не слушать публичный интерфейс вовсе. Настройте miniserv на привязку только к loopback, а затем подключайтесь через доверенный зашифрованный SSH-туннель.
Отредактируйте /etc/webmin/miniserv.conf и добавьте или измените одну строку:
bind=127.0.0.1Перезапустите сервис с помощью sudo systemctl restart webmin. Теперь Webmin недоступен из Интернета, сканирование порта 10000 ничего не покажет, а проверка ss, выполненная ранее, подтвердит привязку к 127.0.0.1:10000. С вашего ноутбука откройте туннель:
ssh -L 10000:localhost:10000 youruser@YOUR_SERVER_IPНе закрывайте эту сессию и перейдите по адресу https://localhost:10000. Трафик передается внутри SSH, который уже аутентифицирован вашим ключом и зашифрован, поэтому вы можете безопасно принять самоподписанный сертификат — уровень SSH обеспечивает реальную защиту. Закройте SSH-сессию, и Webmin исчезнет. Не нужно настраивать списки разрешенных IP, ничего не выставлено наружу, нет дополнительных сервисов для защиты.
Если вы установили bind=127.0.0.1 и забыли про туннель, удаленный доступ просто прекратится — это штатная работа функции, а не ошибка. Восстановите доступ так же, как в Варианте A: через консоль удалите строку bind или установите bind=0.0.0.0, затем перезапустите сервис. Это тот же метод туннелирования, который вы используете для доступа к удаленной машине для разработки с запущенным Claude Code в tmux: одна SSH-сессия, всё остается приватным, ничего лишнего не слушает на публичном интерфейсе.
Замена самоподписанного сертификата на настоящий
Если вы открываете доступ к Webmin по имени хоста согласно варианту A, избавьтесь от предупреждения браузера с помощью настоящего сертификата Let's Encrypt. Вам потребуется DNS-имя, например panel.example.com, с A-записью, указывающей на сервер, и сервис, отвечающий на HTTP-запрос (challenge) через 80 порт во время проверки.
В Webmin эта функция встроена: перейдите в Webmin, затем Webmin Configuration, затем SSL Encryption, и выберите вкладку Let's Encrypt. Введите имя хоста, укажите в поле "website root directory" путь, который обслуживается на 80 порту для этого домена, и запросите сертификат. Webmin получит сертификат, обновит строки certfile= и keyfile= в файле miniserv.conf за вас и будет автоматически продлевать его до истечения срока действия. Перезагрузите страницу, и значок замка станет корректным.
Единственная реальная сложность: собственный сервер Webmin работает на порту 10000, а не 80, поэтому для http-01 challenge требуется настоящий веб-сервер (Apache или nginx), отвечающий за panel.example.com на 80 порту, либо использование проверки на основе DNS. На сервере, где работает только Webmin и ничего нет на 80 порту, запрос завершится ошибкой проверки, пока вы не предоставите Let's Encrypt способ доступа к файлу проверки. Механика работы, DNS-записи, проверка через 80 порт и продление сертификата такие же, как и для любого другого веб-сайта. Если вам нужны подробности, руководство по TLS-сертификатам Let's Encrypt с использованием Certbot и nginx подробно описывает процесс проверки и настройки DNS. Если вы выбрали вариант с SSH-туннелем, этот раздел можно полностью пропустить: самоподписанный сертификат вполне подходит для работы через SSH, а настоящий сертификат, выданный для panel.example.com, при посещении https://localhost:10000 всё равно вызовет предупреждение о несоответствии имени.
Включение двухфакторной аутентификации
Одного пароля недостаточно для защиты панели root, поэтому добавьте второй фактор. Откройте Webmin, затем Webmin Configuration, после чего перейдите в Two-Factor Authentication. Выберите провайдера Google Authenticator. Это стандартный протокол TOTP, поэтому он совместим с Authy, 1Password или любым другим приложением-аутентификатором. Сохраните настройки. Webmin установит необходимый небольшой модуль Perl (Authen::OATH и генератор QR-кодов) и активирует функцию. На данном этапе учетные записи еще не защищены.
Затем каждая учетная запись должна зарегистрировать свое устройство. После включения 2FA откройте Webmin, перейдите в Webmin Users, выберите нужную учетную запись и нажмите Enable Two-Factor For User. Webmin отобразит QR-код: отсканируйте его в приложении и введите один сгенерированный код для подтверждения. С этого момента при входе в систему после ввода пароля потребуется шестизначный токен. Выполните регистрацию устройства до того, как выйдете из системы. Если 2FA станет обязательной, а ваша учетная запись не прошла регистрацию, вы сможете сбросить это требование через консоль, но гораздо проще настроить всё заранее.
Добавление Fail2ban для блокировки попыток подбора пароля
Даже ограниченная точка входа для авторизации должна наказывать за повторяющиеся ошибки. Webmin записывает неудачные попытки входа в syslog в формате webmin[12345]: Invalid login as root from 10.0.0.9 или Non-existent login as ..., если имя пользователя не является учетной записью Unix. В Ubuntu 24.04 эти строки попадают в systemd journal, так как в стандартном образе отсутствует /var/log/auth.log. Fail2ban поставляется со встроенным фильтром webmin-auth, который соответствует именно этим двум строкам, а приведенная ниже jail сама устанавливает backend = systemd, поэтому создание регулярных выражений или указание пути к логам не требуется.
Создайте /etc/fail2ban/jail.d/webmin.local:
[webmin-auth]
enabled = true
port = 10000
filter = webmin-auth
backend = systemd
maxretry = 4
bantime = 1hПерезагрузите конфигурацию командой sudo systemctl restart fail2ban, затем убедитесь, что jail активна:
sudo fail2ban-client status webmin-authВы должны увидеть jail в списке со счетчиком блокировок, равным нулю (при использовании бэкенда journal строка File list: отсутствует). Чтобы проверить работоспособность всей цепочки, намеренно введите неверные данные для входа несколько раз из другой сети, затем повторно выполните команду статуса и проследите, как растет Currently banned. Если значение не увеличивается, убедитесь, что вы не тестируете вход с адреса, входящего в ignoreip Fail2ban, и выполните journalctl SYSLOG_IDENTIFIER=webmin на сервере, чтобы подтвердить, что строки Invalid login действительно записываются. Если Fail2ban еще не установлен на этом сервере, в руководстве по установке Fail2ban в Ubuntu 24.04 для SSH описан процесс установки и настройки SSH-jail, которую следует использовать параллельно с этой.
Ограничение прав доступа пользователей Webmin
Не каждому пользователю панели управления требуются права root для всех операций. В разделе Webmin, then Webmin Users можно создать дополнительные учетные записи и предоставить каждой из них доступ только к необходимым модулям. Например, оператор резервного копирования может видеть только модули cron и filesystem. При редактировании пользователя отображается список всех модулей; снятие флажка с модуля удаляет его из меню пользователя и блокирует доступ к соответствующим URL. Это метод эшелонированной защиты: даже в случае компрометации сессии пользователя с низкими привилегиями, злоумышленник не сможет изменить /etc/shadow, если модуль Users отсутствует в списке доступных для этой учетной записи.
Поддержание Webmin в актуальном состоянии
Поскольку вы выполнили установку из репозитория apt, sudo apt update && sudo apt upgrade загружает новые релизы Webmin вместе с остальными обновлениями системы. Устанавливайте патчи своевременно, так как панель управления является популярной целью для атак. Webmin также может обновляться самостоятельно через Webmin, затем Webmin Configuration, затем Upgrade Webmin, но использование apt на Ubuntu предпочтительнее, так как это обеспечивает согласованность версий с остальными пакетами в системе. Не считайте это необязательным действием: несколько прошлых CVE в Webmin были связаны с уязвимостями удаленного выполнения кода, и разница между «защищенным» и «скомпрометированным» сервером зависела только от того, как быстро администратор выполнял обновление.
Режимы сбоев и соответствующие сообщения
"Your connection is not private" / NET::ERR_CERT_AUTHORITY_INVALID. Отображается при первой загрузке. Причина: самоподписанный сертификат, созданный Webmin при установке, не имеет доверенного издателя. Это не атака; канал зашифрован, но не подтвержден доверенным центром. Решение: временно проигнорируйте предупреждение, затем выпустите настоящий сертификат Let's Encrypt или примите его навсегда, если вы подключаетесь к Webmin через SSH-туннель.
"This web server is running in SSL mode. Try the URL https://..." Вы ввели http://server:10000. miniserv работает только по TLS на этом порту и сообщает об этом в виде простого текста. Решение: измените http на https в адресной строке.
Тайм-аут страницы, ERR_CONNECTION_TIMED_OUT / "This site can't be reached". Запрос не доходит до Webmin. В Ubuntu это почти всегда означает, что ufw блокирует порт 10000. Проверьте это с помощью sudo ufw status; если порт 10000 отсутствует в списке, откройте его командой sudo ufw allow 10000/tcp или, что лучше, оставьте его закрытым и используйте SSH-туннель из варианта B. Обратите внимание на разницу: тайм-аут означает, что брандмауэр молча отбрасывает пакеты, тогда как ERR_CONNECTION_REFUSED означает, что порт доступен, но Webmin не запущен — проверьте sudo systemctl status webmin.
"Access denied for <your IP>." Вы настроили IP Access Control в варианте A, и ваш текущий адрес отсутствует в списке разрешенных, ваш динамический IP изменился или допущена опечатка. Пути возврата через браузер нет. Решение из консоли: отредактируйте строку allow= в файле /etc/webmin/miniserv.conf, исправьте или удалите её, затем выполните sudo systemctl restart webmin.
"Login failed. Please try again." при вводе верных учетных данных. У учетной записи нет Unix-пароля, что является стандартом для облачных образов с доступом только по ключам. Webmin выполняет аутентификацию через PAM по Unix-паролю, а для этого пользователя он не задан. Решение: выполните sudo passwd youruser на сервере, затем войдите в систему. Если /var/webmin/miniserv.log показывает Non-existent login as ..., значит, вы вводите имя пользователя, которое вообще не является Unix-аккаунтом.
Если у вас более двух серверов, автоматизация масштабируется лучше, чем панель управления на каждом узле: ваш первый Ansible playbook — это то, с чего стоит начать.
FAQ
Безопасно ли открывать Webmin в публичный интернет?
Относитесь к Webmin, доступному из интернета, как к root-оболочке с веб-интерфейсом, потому что по сути это именно так и есть. Это становится достаточно безопасно только при многоуровневой защите: использование реального сертификата, двухфакторная аутентификация, Fail2ban, а также строгий список разрешенных IP-адресов или, что еще лучше, полное отсутствие доступа извне. Конфигурация с минимальным риском подразумевает привязку Webmin к 127.0.0.1 и доступ к нему через SSH-туннель, чтобы порт 10000 не отвечал на запросы из открытого интернета.
Как убрать предупреждение о сертификате Webmin?
Предупреждение (NET::ERR_CERT_AUTHORITY_INVALID) появляется, так как Webmin поставляется с самоподписанным сертификатом. Выпустите реальный сертификат через Webmin, перейдя в Webmin Configuration, SSL Encryption, Let's Encrypt, используя DNS-имя, которое указывает на ваш сервер, где работает сервис для прохождения проверки по порту 80. Если вы подключаетесь к Webmin только через SSH-туннель к localhost, предупреждение можно игнорировать: SSH уже шифрует и аутентифицирует соединение, поэтому вы можете безопасно принять самоподписанный сертификат.
Как ограничить доступ к Webmin только моим IP-адресом?
Перейдите в Webmin, Webmin Configuration, IP Access Control, выберите "Only allow from listed addresses" и введите ваш публичный IP из curl ifconfig.me. Webmin сохраняет эту настройку в строке allow= файла /etc/webmin/miniserv.conf. Будьте осторожны с динамическим домашним IP: если он изменится, вы потеряете доступ и будете вынуждены исправлять строку allow= через консоль сервера. На практике статический адрес или метод с SSH-туннелем более надежны.
Почему вход в систему не удается, даже если пароль верный?
Webmin выполняет аутентификацию через PAM, используя ваш Unix-пароль. Облачные образы обычно настроены только на вход по ключам, и пароль для учетной записи по умолчанию не задан, поэтому PAM не может выполнить проверку, и в доступе отказывается. Выполните sudo passwd youruser на сервере, чтобы задать пароль, а затем войдите в систему. Если в /var/webmin/miniserv.log присутствует строка Non-existent login as ..., это означает, что указанное имя пользователя не является реальной учетной записью Unix.
В чем преимущество Webmin по сравнению с обычным SSH?
Webmin — это уровень удобства и наглядности. Он действительно полезен для просмотра лог-файлов, управления пользователями и cron, редактирования правил межсетевого экрана, а также для мониторинга состояния дисков и сервисов без необходимости запоминать каждую команду. Это удобно для администраторов, работающих с системой эпизодически, или для команд с разным уровнем подготовки. Обычный SSH быстрее, поддерживает скрипты и имеет гораздо меньшую поверхность атаки для повседневных задач. Многие администраторы используют оба инструмента: SSH для ежедневной работы и Webmin, привязанный к localhost за туннелем, для редких задач, требующих графического интерфейса. Если ваш вопрос заключается в выборе панели управления, а не в сравнении панели с оболочкой, стоит сначала оценить Cockpit против Webmin, так как они различаются по глубине управления системой и методам аутентификации.