Як встановити й захистити Webmin на Ubuntu 24.04
Встановіть Webmin на Ubuntu 24.04 і захистіть порт 10000: SSH-тунель або IP allowlist, сертифікат Let's Encrypt, 2FA та Fail2ban.
Що ви створюєте
Webmin — це вебпанель керування, яка надає браузерний інтерфейс до всього Linux-сервера: користувачів, пакетів, cron-завдань, брандмауера, Apache, BIND, дисків і сотень інших модулів. Доступ до неї здійснюється через HTTPS на порту 10000. Встановлення складається з трьох команд і займає приблизно хвилину. Цей посібник приділяє більшу частину обсягу другій половині, оскільки Webmin входить у систему як root і може виконувати будь-які дії, доступні root. Відкритий для всіх або неавтентифікований Webmin — це не просто «ризик, яким потрібно керувати». Це повна компрометація сервера зі сторінкою входу перед нею. Тому встановіть його за десять хвилин, а решту години витратьте на те, щоб переконатися: доступ до нього маєте лише ви.
Передумови та важливе попередження
Потрібен новий Ubuntu 24.04 KVM VPS із root або користувачем із правами sudo. Webmin написаний на Perl і не потребує багато ресурсів: 1 GB RAM достатньо, а в режимі простою він використовує значно менше чверті GB. Webmin прослуховує TCP-порт 10000 через власний вбудований вебсервер (miniserv.pl), а не через Apache або nginx, тому спочатку нічого іншого встановлювати не потрібно.
Перед початком потрібно визначити два моменти. По-перше, обліковий запис, під яким ви входитимете: Webmin автентифікує Unix-облікові записи через PAM, тому вхід виконується як root або як користувач із групи sudo, використовуючи Unix-пароль цього облікового запису. У cloud-образах зазвичай використовується вхід лише за ключем, а для стандартного користувача пароль не встановлено. Webmin не може виконати вхід до облікового запису без пароля. Спочатку встановіть пароль за допомогою sudo passwd youruser, інакше вхід не відбудеться незалежно від введеного пароля.
По-друге, важливе попередження: не відкривайте порт 10000 для всього інтернету, залишаючи його без додаткового захисту. Заздалегідь вирішіть, чи підключатиметеся до Webmin через SSH-тунель (рекомендовано, без відкритих назовні портів), чи обмежите доступ власною IP-адресою. Це рішення визначає всі наведені нижче кроки, тому перед налаштуванням firewall ознайомтеся з обома варіантами.
Встановлення 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 Webmin stable repository? (y/N). Введіть y. Після завершення встановіть пакет. Прапорець --install-recommends встановлює поширені залежності Perl і SSL-модулів, щоб окремі модулі пізніше не завершувалися помилками через відсутні бібліотеки.
sudo apt-get install --install-recommends webminWebmin уже перейменовував цей скрипт. У старих посібниках згадується setup-repos.sh. Якщо raw URL повертає 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.
Перш ніж відкривати браузер, переконайтеся, що сервіс справді запущений і прослуховує порт:
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 постачається з неактивним ufw, але багато провайдерів вмикають його заздалегідь. Цей випадок описано нижче в розділі про типові помилки. Якщо порт відкритий, браузер блокує сторінку та показує повідомлення "Your connection is not private" з кодом NET::ERR_CERT_AUTHORITY_INVALID у Chrome або SEC_ERROR_UNKNOWN_ISSUER / "Warning: Potential Security Risk Ahead" у Firefox. Це очікувана поведінка, а не ознака зламу. Під час інсталяції Webmin створює самопідписаний сертифікат (/etc/webmin/miniserv.pem). Оскільки цей сертифікат не підтверджений центром сертифікації, браузер не довіряє йому автоматично. З’єднання все одно зашифроване, але його справжність не підтверджена. Тимчасово натисніть Advanced, а потім Proceed. Нижче ми належним чином замінимо цей сертифікат.
Увійдіть за допомогою 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, не повинна бути відкритою в Інтернеті та приймати спроби входу від усіх сканерів у світі. Є два обґрунтовані варіанти, розташовані в порядку переваги. Кожен self-hosted інтерфейс адміністрування порушує це саме питання. Тому безпека Vaultwarden залежить від його адміністративної кінцевої точки та файлу резервної копії, а не від шифрування.
SSH-тунель у варіанті B кращий, оскільки він взагалі нічого не відкриває назовні. Список дозволених IP-адрес у варіанті A прийнятний, якщо ваша адреса статична. Не використовувати жоден із цих варіантів — саме та помилка, якій має запобігти весь цей посібник. Якщо ви хочете підключатися до Webmin через приватну мережу, а не одним із цих способів, розмістіть сервер за self-hosted VPN на базі WireGuard і прив’яжіть Webmin до адреси тунелю, а не до публічної адреси.
Варіант 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. Після закриття SSH-сесії Webmin зникає з доступу. Не потрібно налаштовувати список дозволів, нічого не відкрито назовні, не потрібно додатково захищати окремий сервіс.
Якщо ви налаштуєте bind=127.0.0.1 і забудете про тунель, віддалений доступ просто припиниться. Це нормальна робота функції, а не несправність. Відновіть доступ так само, як у варіанті A: з консолі видаліть рядок bind або встановіть bind=0.0.0.0, а потім перезапустіть сервіс. Це та сама схема тунелювання, яку ви використовували б для доступу до віддаленого середовища розробки з Claude Code у tmux: одна SSH-сесія, усе приватне, жоден додатковий сервіс не прослуховує публічний інтерфейс.
Замініть самопідписаний сертифікат на справжній
Якщо ви відкриваєте Webmin за варіантом A, усуньте попередження браузера за допомогою справжнього сертифіката Let's Encrypt. Для сертифіката потрібне ім’я та спосіб, який дасть змогу Let's Encrypt звернутися до порту 80 під час перевірки. Зазвичай це DNS-ім’я, наприклад panel.example.com, з A-записом, що вказує на сервер. Починаючи з Webmin 2.650 (випущено 25 червня 2026 року), можна також використовувати публічну IP-адресу сервера, якщо встановлено Certbot 5.3 або новішу версію. Let's Encrypt видає сертифікати для IP-адрес лише за профілем із коротким терміном дії — приблизно шість днів. Тому задайте інтервал автоматичного поновлення Webmin у днях. Webmin не прийме довший інтервал для сертифіката IP-адреси.
Ця функція вже вбудована у Webmin: Webmin, потім Webmin Configuration, потім SSL Encryption, потім вкладка Let's Encrypt. Введіть ім’я хоста або IP-адресу, виберіть метод перевірки та надішліть запит. Webmin отримає сертифікат, оновить для вас рядки certfile= і keyfile= у miniserv.conf та автоматично поновлюватиме сертифікат до завершення строку його дії. Перезавантажте сторінку. Індикатор замка більше не показуватиме попередження.
Є одна важлива особливість: власний сервер Webmin працює на порту 10000, а не на 80. Тому під час перевірки http-01 на порту 80 має відповідати інший сервіс. Є три способи це налаштувати. Якщо Apache або nginx уже обслуговує це ім’я на порту 80, вкажіть каталог документів відповідного сайту для перевірки. Для IP-адреси потрібен Certbot 5.4 або новіший. Якщо на порту 80 нічого не працює, виберіть вбудований веб-сервер Certbot — автономний режим, який Webmin додав у версії 2.110. Certbot тимчасово запустить власний веб-сервер на порту 80. Для цього Certbot має бути встановлений, а порт 80 — вільний і відкритий у firewall. Також можна використати перевірку DNS. Вона працює для імен хостів, але не для IP-адрес. Власний пакет certbot в Ubuntu 24.04 має версію 2.9. Цього достатньо для автономної перевірки імені хоста, але недостатньо для сертифікатів IP-адрес. Для них встановіть актуальний Certbot, наприклад snap-версію, яка станом на жовтень 2026 року мала версію 5.8. Без будь-якого з цих способів запит завершиться помилкою перевірки. Механізм, DNS-записи, перевірка на порту 80 і поновлення такі самі, як під час випуску сертифіката для будь-якого вебсайту. Докладний опис цього процесу, зокрема перевірки та налаштування DNS, наведено в посібнику Let's Encrypt TLS-сертифікати з Certbot і nginx. Якщо ви використали 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 для блокування перебору паролів
Навіть обмежений endpoint для входу має блокувати повторні невдалі спроби. Webmin записує невдалі входи до syslog у форматі webmin[12345]: Invalid login as root from 10.0.0.9, а для імені користувача, яке взагалі не є обліковим записом Unix, — у форматі Non-existent login as .... В Ubuntu 24.04 ці рядки потрапляють до журналу systemd, оскільки стандартний образ не містить /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 має відображатися з лічильником блокувань, що дорівнює нулю. Для backend журналу вивід не містить рядка File list:. Щоб перевірити всю схему, навмисно кілька разів виконайте невдалий вхід з іншої мережі. Потім повторно виконайте команду перевірки стану та стежте, як зростає Currently banned. Якщо лічильник не змінюється, переконайтеся, що адресу, з якої ви тестуєте, не додано до ignoreip Fail2ban. Також виконайте на сервері journalctl SYSLOG_IDENTIFIER=webmin, щоб перевірити, чи справді записуються рядки Invalid login. Якщо Fail2ban ще не встановлено на цьому сервері, у посібнику Fail2ban в Ubuntu 24.04 для SSH описано встановлення та SSH jail, який слід запустити одночасно з цим jail.
Обмежте доступ кожного користувача Webmin
Не кожному, кому потрібна панель, потрібен root-доступ до всіх функцій. У розділі Webmin, потім Webmin Users створіть додаткові облікові записи Webmin і надайте кожному лише потрібні модулі. Наприклад, оператор резервного копіювання може бачити тільки модулі cron і файлової системи. Під час редагування користувача відображається список із прапорцями для всіх модулів. Зняття прапорця прибирає модуль із меню цього користувача та блокує відповідні URL. Це додатковий рівень захисту: навіть викрадена сесія Webmin із низькими привілеями не зможе перезаписати /etc/shadow, якщо модуля Users немає в її списку.
Оновлення Webmin
Оскільки ви встановили Webmin із apt-репозиторію, sudo apt update && sudo apt upgrade завантажує нові релізи Webmin разом з іншими оновленнями системи. Встановлюйте виправлення без зволікань, оскільки панелі керування часто є ціллю атак. Webmin також можна оновити через Webmin, потім Webmin Configuration, потім Upgrade Webmin, але в Ubuntu зручніше використовувати apt, оскільки так версії залишаються узгодженими з іншими пакетами. Не вважайте це необов’язковим: кілька попередніх 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. Якщо команда повідомляє Status: inactive, ufw нічого не блокує (в Ubuntu він вимкнений за замовчуванням, а додавання правила allow не вмикає його), тому перевірте наступну ланку, наприклад firewall у панелі керування вашого провайдера. Якщо команда повідомляє Status: active, виконайте sudo ufw status verbose, щоб переглянути політику для вхідного трафіку за замовчуванням і ширші правила. Якщо вхідний трафік заборонений, а порт 10000 не вказаний у правилах, відкрийте його за допомогою sudo ufw allow 10000/tcp або, що краще, залиште закритим і скористайтеся SSH-тунелем з варіанта B. Враховуйте різницю: тайм-аут означає, що firewall мовчки відкидає пакети, а 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 shell зі сторінкою входу, тому що саме цим він і є. Він достатньо безпечний лише за багаторівневого захисту: справжній сертифікат, двофакторна автентифікація, Fail2ban і або суворий список дозволених IP-адрес, або, що краще, повна відсутність публічного доступу. Найменший ризик має конфігурація, у якій Webmin прослуховує лише 127.0.0.1, а доступ до нього здійснюється через SSH-тунель. Тоді порт 10000 не приймає з’єднання з відкритого інтернету.
Як усунути попередження про сертифікат Webmin?
Попередження (NET::ERR_CERT_AUTHORITY_INVALID) з’являється, тому що Webmin постачається із самопідписаним сертифікатом. Випустіть справжній сертифікат у Webmin через Webmin, Webmin Configuration, SSL Encryption, Let's Encrypt. Використайте DNS-ім’я, яке вказує на сервер, або публічну IP-адресу сервера, якщо встановлено Certbot 5.3 або новішої версії. Порт 80 має бути доступним для перевірки. Запит може обробляти наявний вебсервер або власний standalone-сервер Certbot. Якщо ви завжди підключаєтеся до 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 на сервері, щоб встановити пароль, а потім увійдіть. Рядок Non-existent login as ... у /var/webmin/miniserv.log означає, що саме ім’я користувача не відповідає реальному обліковому запису Unix.
Для чого потрібен Webmin порівняно зі звичайним SSH?
Webmin спрощує пошук потрібних функцій і повсякденне адміністрування. Він справді корисний для перегляду журналів, керування користувачами та cron, редагування правил firewall, а також перевірки стану дисків і сервісів без запам’ятовування кожної команди. Це зручно для адміністраторів, які виконують такі завдання час від часу, або для команд із різним рівнем навичок. Звичайний SSH швидший, підтримує сценарії та створює значно меншу площу атаки для регулярної роботи. Багато адміністраторів використовують обидва варіанти: SSH для щоденної роботи, а Webmin, прив’язаний до localhost і доступний через тунель, — для періодичних завдань у графічному інтерфейсі. Якщо насправді ви вибираєте між панелями, а не між панеллю та shell, спочатку варто порівняти Cockpit і Webmin, оскільки вони відрізняються обсягом системних змін, які можуть вносити, і способом автентифікації користувача.