Защищаем подключение к Ispmanager (прячем ihttpd за nginx)

Ispmanager пожалуй самая распространенная и удобная панель администрирования сервера. Однако по умолчанию доступ к панели осуществляется по логину и паролю, причем пароль передается в открытом виде, его можно перехватить и получить полный доступ к серверу. Используем возможности ispmanager чтобы защитить его самого.

С помощью ispmanager можно достаточно просто разместить свой веб-сайт и поддерживать его безопасность. Не прикасаясь к командной строке можно создать нового пользователя, базу данных, сам сайт, получить и установить SSL сертификаты для безопасного подключения к нему. Без сертификата все современные браузеры будут пугать пользователей, что подключение к сайту небезопасно.

Причем ispmanager при создании веб-сайта сразу делает для него конфигурацию из «тяжелого» Apache для работы движка сайта и быстрого nginx перед ним для поддержки https и передачи файлов. Такая конфигурация стала стандартом де-факто для хостинга сайтов.

Сам же Ispmanager живет на достаточно простом ihttpd и по умолчанию он доступен по незащищенному http-соединению. То есть при подключении к панели рутовый пароль передается в открытом виде, а перехватив его злоумышленники смогут сделать в вашим сервером все что им заблагорассудится. Так в VPS Яндекс Облака по умолчанию запрещен вход по логин/паролю даже по защищенному соединению, только по ключам, а тут пожалуйста - рутовый пароль в открытом виде!

Ispmanager позволяет выпустить самоподписанный сертификат для подключения к себе, но лучше и проще расположить панель за nginx сервером вашего сайта (ведь сайт у вас уже должен быть или по крайней мере домен для него). Тогда nginx будет отвечать за безопасное https соединение и проксировать его на внутренний ihttpd. Прямое соединение на него по 1500 порту можно будет потом закрыть.

По шагам:

Шаг 1. Открываем внутреннее соединение в конфигурации ihttpd. Добавляем в конец файла /usr/local/mgr5/etc/ihttpd.conf, который находится в следующие строки (это можно сделать встроенном файл менеджере панели):

listen {
    ip 127.0.0.1
    port 1500
}

Секцию с внешним IP пока не трогаем.

Шаг 2. Добавляем в конфигурационный файл nginx для вашего сайта (например example.ru) секцию проксирования на ihttpd по аналогии с основной кофигурацией проксирования на Apache:

server {  
  server_name example.ru www.example.ru;
  ssl_certificate "/var/www/httpd-cert/example/example.ru.crt";
  ssl_certificate_key "/var/www/httpd-cert/example/example.ru.key";
  ssl_ciphers EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4;
  ssl_prefer_server_ciphers on;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_dhparam /etc/ssl/certs/dhparam4096.pem;
  charset off;

      listen 10.10.10.10:4433 ssl;
  
    set $mgr_proxy "http://127.0.0.1:1500";         
     
   location ^~ /manimg/ {     
          alias /usr/local/mgr5/skins/;   
   }  
       
   location / {     
            proxy_pass $mgr_proxy;    
            proxy_redirect $mgr_proxy /;    
            proxy_set_header Host $host:$server_port;     
            proxy_set_header X-Forwarded-For $remote_addr;    
            proxy_set_header X-Forwarded-Proto $scheme;     
            proxy_set_header X-Real-IP $remote_addr;                
            proxy_set_header X-Forwarded-Secret l6cuykPaxMKHO0Hm;     
            chunked_transfer_encoding off; 
  }

  location ^~ /mancgi/ {
          proxy_pass $mgr_proxy;
          proxy_redirect $mgr_proxy /;
          proxy_set_header Host $host:$server_port;
          proxy_set_header X-Forwarded-For $remote_addr; 
                proxy_set_header X-Forwarded-Proto $scheme;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-Secret l6cuykPaxMKHO0Hm;
          chunked_transfer_encoding off;
  }
}

Причем секцию

server_name example www.example.ru;
  …
listen 10.10.10.10:4430 ssl;

копируем из конфигурации для основного сайта, вместо example.ru и 10.10.10.10 у вас будут имя вашего домена и ваш IP-адрес. Порт 4430 можно оставить или выбрать какой-нибудь другой 4х или 5 значный. По нему будет доступна ваша панель, в нашем примере это https://example.ru:4430.

Заменяем секретный ключ l6cuykPaxMKHO0Hm в примере на любой другой. Его же мы пропишем в конфигурацию панели на следующем шаге.

Шаг 3. Добавляем секретный ключ из предыдущего шага в конфигурацию панели. В файл /usr/local/mgr5/etc/core.conf добавляем строчку ForwardedSecret l6cuykPaxMKHO0Hm. И в файле /usr/local/mgr5/etc/ispmgr.conf меняем значение параметра ForwardedSecret на l6cuykPaxMKHO0Hm.

Шаг 4. Перегружаем панель и веб-сервисы командами в консоли:

service ihttpd restart
service nginx restart
killall core

Шаг 5. Проверяем, что панель Ispmanager открывается по новому адресу https://example.ru:4430. Если все ок, то тогда можно закрыть незащищенное соединение в конфигурационном файле ihttpd /usr/local/mgr5/etc/ihttpd.conf убрав секцию с внешним IP-адресом или на хостинге. В Яндекс облаке это можно сделать в группе безопасности вашего облака

Шаг 6.Теперь соединение к Ispmanager защищено и все передаваемая информация шифруется. Однако все равно не помешает включить двухфакторную аутентификацию в настройках пользователя в панели, тогда при логине потребуется еще дополнительно вводить код из приложения Google Authenticator на телефоне.