Здравствуйте, уважаемые читатели. Сегодня тема статьи: "Как спрятать службу за веб-сервером". В статье рассмотрим возможности маскировки (скрытия) службы, за веб-сервером.

Бывают ситуации, когда нужно скрыть некую службу, например VPN-сервер, от глаз провайдера, или системного администратора. Либо просто защитить службу от посягательств. В некоторых случаях, возможным является использование в этих целях только 80 или 443 порта. Именно в такой ситуации, может помочь программа Labean.

Cтраница разработчика: https://github.com/uprt/labean/

Принцип работы Labean заключается в том, что она запускается как служба, и прослушивает определённый порт, на предмет запросов с определённым префиксом. После получения нужного запроса, Labean выполняет заложенную команду. Значит мы можем запустить nginx, и настроить в нём функцию проксирования на порт прослушиваемый Labean. Таким образом, у нас появится возможность взаимодействия с Labean через 80 или 443 порт веб-сервера, а Labean в свою очередь, будет выполнять команды, которые мы в неё заложим.

В статье я буду прятать за Nginx, OpenConnect Vpn-сервер. Nginx работает на 80 порту (доменное имя test.ru), а OpenConnect Vpn-сервер на 4443 порту. Все действия, буду производить в операционной системе CentOS 7.

  • Labean написан на языке Go, поэтому чтобы произвести его сборку и запуск, нам нужно установить платформу Go.

Установка Go в CentOS 7

  • Заходим в рабочую директорию.
# cd /usr/src
  • Перед скачиванием Go, произведём установку некоторых нужных пакетов:
# yum -y install git wget nano
  • Теперь можно скачивать архив Go, с версией go1.12.7. Есть версии и новее, но при их использовании, сборка получается с ошибками.
# wget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz
скачивание архива Go
  • Разархивируем архив.
# tar -C /usr/local -xzf go1.12.7.linux-amd64.tar.gz
  • Теперь нужно произвести некоторые настройки, для правильной работы Go.
  • Открываем файл /etc/profile.d/path.sh, и добавляем в него одну строчку.
# nano /etc/profile.d/path.sh

 Добавляем в файл:
 export PATH=$PATH:/usr/local/go/bin
  • После этого, открываем следующий файл, и добавляем в конеце две строчки.
# nano ~/.bash_profile

Добавляем в файл:
export GOBIN="$HOME/projects/bin" 
export GOPATH="$HOME/projects/src"
  • Чтобы изменения вступили в силу, нужно произвести перечтение настроек.
# source /etc/profile && source ~/.bash_profile
  • Предварительные действия завершены, и можно переходить к установке Labean.

Установка Labean в CentOS 7

  • Запускаем клонирование labean.git
# git clone https://github.com/uprt/labean.git
клонирование labean.git
  • Заходим в папку labean, и запускаем сборку.
# cd labean
# go build
  • Копируем бинарный файл в директорию /usr/sbin/.
# cp /usr/src/labean/labean /usr/sbin/

Конфигурация Labean

  • Создаём конфигурационный файл /etc/labean.conf.
  • Образец конфигурационного файла, который предлагает разработчик, выглядит таким образом:

{
  "listen": "127.0.0.1:8080",
  "url_prefix": "secret",
  "external_ip": "192.30.253.113",
  "real_ip_header": "X-Real-IP",
  "allow_explicit_ips": false,
  "tasks": [ 
    {
      "name": "vpn",
      "timeout": 30,
      "on_command": "iptables -t nat -A PREROUTING -p tcp -s {clientIP} --dport 443 -j REDIRECT --to-port 4443",
      "off_command": "iptables -t nat -D PREROUTING -p tcp -s {clientIP} --dport 443 -j REDIRECT --to-port 4443"
    },
    {
      "name": "sshd",
      "timeout": 0,
      "on_command": "/etc/init.d/sshd start",
      "off_command": "/etc/init.d/sshd stop"
    }
    ]
}

  1. listen – локальный адрес и порт, который будет прослушивать Labean
  2. url_prefix – префикс к запросу, который задействует Labean (на Ваше усмотрение)
  3. external_ip – внешний ip-адрес сервера
  4. tasks – команды для Labean
  5. "name": "vpn" и "name": "sshd" - имя команды для выполнения Labean (на Ваше усмотрение)
  6. timeout – время (в секундах) действия опции команды "on_command" (если стоит ноль, то опция "on_command будет завершена, только после запуска опции "off_command")
  • Первая команда, создаёт редирект на скрытый VPN-сервис, для запустившего команду ip-адреса. А вторая команда, нужна для запуска и отключения службы sshd.

В случае с "sshd", я бы посоветовал задуматься, так как при её использовании, в случае падения веб-сервера, Вы попросту не сможете получить доступа к серверу. Но если у Вас есть альтернативные способы доступа, то и этот вариант вполне заслуживает внимания.

  • Для наших целей, мы можем использовать и вариант предлагаемый разработчиком. Только удалим из него лишнее, то есть блок "sshd". Убираем блок, вносим изменения под себя, и добавляем всё это в конфигурационный файл. В моём случае, конфигурация будет такой:

{
  "listen": "127.0.0.1:8080",
  "url_prefix": "fikvam",
  "external_ip": "192.168.10.12",
  "real_ip_header": "X-Real-IP",
  "allow_explicit_ips": false,
  "tasks": [ 
    {
      "name": "step1",
      "timeout": 30,
      "on_command": "iptables -t nat -A PREROUTING -p tcp -s {clientIP} --dport 80 -j REDIRECT --to-port 4443",
      "off_command": "iptables -t nat -D PREROUTING -p tcp -s {clientIP} --dport 80 -j REDIRECT --to-port 4443"
    }
    ]
}

  • Я изменил префикс, вписал свой ip-адрес, изменил имя команды, и порт, с которого будет производится редирект. В моём случае, это 80 порт.

Запуск Labean

  • После сохранения файла с настройками, можно запускать Labean.
  • Для того, чтобы Labean работала как служба, копируем специальный файл в /etc/systemd/system/.
# cp ./examples/labean.service.ex /etc/systemd/system/labean.service 
  • Перечитываем настройки служб.
# systemctl daemon-reload
  • Теперь мы можем управлять программой, как обычной службой.
  • Запускаем, и добавляем Labean в автозагрузку.
# systemctl start labean
# systemctl enable labean

Настройка Nginx для проксирования на порт Labean

  • Для настройки проксирования Nginx на порт Labean, нам нужно добавить один блок location, в конфигурационный файл nginx, или работающего сайта.

location ~ ^/labean/(.*) {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_pass http://127.0.0.1:8080/$1;
  }


  • Для дополнительной защиты, Вы может настроить дополнительную аутентификацию. Нужно установить пакет утилит, создать файл .htpasswd, и внести в него данные для аутентификации.
# yum install httpd-tools
# htpasswd -bc /usr/share/nginx/html/.htpasswd admin 123
  • Для примера, в команде выше, я создал пользователя admin, с паролем 123.
  • При использовании дополнительной защиты, блок для nginx, будет выглядеть таким образом:

location ~ ^/labean/(.*) {
    auth_basic      "User Login";
    auth_basic_user_file  /usr/share/nginx/html/.htpasswd;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_pass http://127.0.0.1:8080/$1;
  }


  • После внесения изменений, перезапускаем веб-сервер.
# systemctl restart nginx

Проверка связки Nginx и Labean

  • Переходим к настройке vpn-клиента.
  • Создаем профиль с явным указанием 80 порта, но пока не подключаемся.
  • Для OpenConnect-GUI VPN client, это будет так:
https://192.168.10.12:80
  • Открываем браузер, и производим нужный запрос. В моём случае, это будет:
http://test.ru/labean/fikvam/step1/on

Если Вы настроили дополнительную защиту, то потребуется ввести пароль и логин.

  • Открывается страница, с сообщением о произведённой команде.
  • После введённого запроса, как Вы помните из произведённых настроек, у нас есть 30 секунд прямого редиректа нашего ip-адреса с 80 на 4443.
  • Запускаем подключение OpenConnect-GUI VPN client к сереру, и удачно подключаемся.
OpenConnect-GUI VPN client подключился к сереру

Соединение будет работать до конца сессии.

  • Через 30 секунд, никто даже с нашего ip-адреса, не сможет повторить наше подключение. Потребуется повторить всю процедуру.
  • Всё работает, как и должно. Но можно модифицировать алгоритм. В данном случае, у нас постоянно открыт порт 4443, на котором работает VPN-сервер. Можно закрыть его, и открывать только при подключении клиента.
  • Закрываем порт 4443 в брандмауэре, и модифицируем конфигурацию Labean, в конфигурационном файле /etc/labean.conf:

{
  "listen": "127.0.0.1:8080",
  "url_prefix": "fikvam",
  "external_ip": "192.168.10.12",
  "real_ip_header": "X-Real-IP",
  "allow_explicit_ips": false,
  "tasks": [ 
    {
      "name": "step1",
      "timeout": 30,
      "on_command": "iptables -I INPUT -p tcp --dport 4443 -m state --state NEW -j ACCEPT",
      "off_command": "iptables -I INPUT -p tcp --dport 4443 -m state --state NEW -j DROP"
    },
    {
      "name": "step2",
      "timeout": 30,
      "on_command": "iptables -t nat -A PREROUTING -p tcp -s {clientIP} --dport 80 -j REDIRECT --to-port 4443",
      "off_command": "iptables -t nat -D PREROUTING -p tcp -s {clientIP} --dport 80 -j REDIRECT --to-port 4443"
    }
    ]
}

  • В конфигурации мы добавили одну команду, которая будет открывать порт 4443.
  • После внесённых, изменений перезапускаем Labean.
# systemctl restart labean
  • Теперь для возможности подключения к VPN-серверу, нам нужно произвести два запроса, в моём случае это будет:
http://test.ru/labean/fikvam/step1/on
http://test.ru/labean/fikvam/step2/on

Если Вы настраивали дополнительную защиту, то нужно будет ввести пароль и логин.

  • После отправленных запросов, можно спокойно подключатся к серверу. Как и в предыдущем примере, подключение будет действовать на время сессии. И через 30 секунд, никто, даже с Вашего ip-адреса, не сможет произвести подключение, не пройдя полную процедуру.

Сегодня мы рассмотрели тему: "Как спрятать службу за веб-сервером". Научились маскировать от провайдера VPN-сервер, либо другую службу. Смотрите так же, видео по теме.

Надеюсь статья была вам полезна. До встречи в новых статьях.

С уважением, Андрей Бондаренко.


Видео на тему "Как спрятать службу за веб-сервером":