Установка VNC сервера, и настройка его работы поверх SSH

от автора


Да, отчего-то не все клиенты хотят работать в таком удобном и черном терминале, панель полностью не удовлетворяет их эстетические потребности, и вообще — «где мой такой любимый и удобный VNC?».
вопрос привычки и вкуса

В данной статье будет рассмотрен пример установки и настройки VNC server и графической оболочки (GUI) на примере OC Debian 8 jessie.


Вводная: на руках имеется чистый Debian 8 и жгучее желание получить на выходе защищенный vnc-доступ к серверу.

Приступим

Обновим список доступных пакетов.

# apt-get update 

Если система свежеустановленная — стоит обновиться.

# apt-get -y upgrade 

(!)Бездумно запускать данную команду не на свежеустановленном сервере не стоит, чревато сломанными зависимостями и перспективой работы напильником.

Устанавливаем Xfce и VNC server (любители GNOME, KDE, LXDE, etc. устанавливают оболочку по своему вкусу).

# apt-get install xfce4 xfce4-goodies tightvncserver 

Создаем пользователя от которого будем запускать vnc сервер.

# adduser vnc 

Устанавливаем sudo (в Debian данный пакет не установлен по умолчанию).

# apt-get install sudo 

Добавляем пользователя vnc в группу sudo.

# gpasswd -a vnc sudo 

Переходим под пользователя vnc.

# su - vnc 

Запускаем vnc сервер.

$ vncserver 

Если это первый запуск vnc сервера, будет создан конфиг файл и запрошены некоторые параметры:

$ vncserver   You will require a password to access your desktops.  Password:  Verify:    Would you like to enter a view-only password (y/n)? n xauth:  file /home/vnc/.Xauthority does not exist  New 'X' desktop is my.server:1    Creating default startup script /home/vnc/.vnc/xstartup  Starting applications specified in /home/vnc/.vnc/xstartup  Log file is /home/vnc/.vnc/my.server:1.log 

по умолчанию порт vnc сервера будет 5901, порт каждого следующего дисплея будет увеличиваться на 1 (5902,5903,…).

Проверить запущен ли VNC сервер и на каком порту слушает можно следующей командой.

$ netstat -nltp  Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      1054/Xtightvnc   

Убить конкретный дисплей можно так:

$ vncserver -kill :1 Killing Xtightvnc process ID 3246 

:1 — какой дисплей нужно убить.

Создание скрипта автостарта vnc сервера.

Сначала убьем запущенный дисплей :1 (если он запущен).

$ vncserver -kill :1   

создаем скрипт запуска

$ sudo nano /usr/local/bin/myvnc 

Добавляем следующие строки в файл:

#!/bin/bash PATH="$PATH:/usr/bin/" DISPLAY="1" DEPTH="16" GEOMETRY="1024x768" OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"  case "$1" in start) /usr/bin/vncserver ${OPTIONS} ;;  stop) /usr/bin/vncserver -kill :${DISPLAY} ;;  restart) $0 stop $0 start ;; esac exit 0 

если требуется — в скрипте можно изменить глубину цвета или разрешение экрана.

Делаем файл исполняемым.

$ sudo chmod +x /usr/local/bin/myvnc 

использование созданного нами скрипта:

$ myvnc start             ###запустить vnc сервер $ myvnc stop             ###остановить vnc сервер $ myvnc restart         ###перезапустить vnc сервер 

Теперь нужно позаботиться о том, чтобы настроенный нами vnc стартовал после загрузки сервера (запланированной и не очень).
Для этого создаем файл по следующему пути.

$ sudo nano /lib/systemd/system/myvnc.service 

Добавляем следующий текст в файл:

[Unit] Description=MyVnc  [Service] Type=forking ExecStart=/usr/local/bin/myvnc start ExecStop=/usr/local/bin/myvnc stop ExecReload=/usr/local/bin/myvnc restart User=vnc  [Install] WantedBy=multi-user.target 
Пояснение

[Unit] — указываем описание скрипта (так же можно указать требуемые зависимости и порядок запуска при загрузке).
[Service] — указываем какими командами запускать сервис, под каким пользователем, и тип сервиса.
[Install] — указываем на каком уровне должен запускаться скрипт (runlevel 3 — многопользовательский режим без графики).

Включаем юнит в автозагрузку при старте системы.

$ sudo systemctl enable myvnc.service Created symlink from /etc/systemd/system/multi-user.target.wants/myvnc.service to /lib/systemd/system/myvnc.service. 

Смотрим статус созданного нами юнита.

$ sudo systemctl -l status myvnc.service ? myvnc.service - MyVnc    Loaded: loaded (/lib/systemd/system/myvnc.service; enabled)    Active: inactive (dead) 

Дергаем systemd для поиска новых или измененных юнитов.

$ sudo systemctl daemon-reload 

Шифрование трафика

Голый VNC не шифрует трафик, и оставлять его в таком виде не стоит.
Кроме того, если на Ваш IP выйдут боты из Китая и начнут стучатся по портам, даже если пароль установлен действительно качественный (учтите, что пароль на vnc сессию ограничен 8-ю символами) и его не взломают, попасть на сервер посредством VNC будет затруднительно, из-за постоянной ошибки на количество неверных попыток авторизации.

vncpasswd

$ vncpasswd

Using password file /home/vnc/.vnc/passwd

Password:

Warning: password truncated to the length of 8.

Verify:

Would you like to enter a view-only password (y/n)? n

Пускаем VNC поверх SSH:

$ sudo nano /usr/local/bin/myvnc 

Изменяем строку:

OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"  на  OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost" 

Теперь для подключения к серверу сначала нужно создать тунель.

Под *nix:

# ssh vnc@xxx.xxx.xxx.xxx -L 5901:localhost:5901 

Теперь возможно подключение посредством vnc клиента, указав вместо IP удаленного сервера localhost и порт на котором слушает vnc-server.

# vncviewer localhost:5901

При использовании Windows и putty агента:

После запуска putty переходим Connection -> SSH -> Tunnels.
В поле Source Port вбиваем порт на котором слушает VNC сервер — 5901, в поле Destination вписываем — localhost:5901 и жмем кнопку Add.
должно получиться как на картинке.

Теперь возвращаемся на вкладку Session вписываем IP сервера и порт 22 (тут же можно и сохранить конфигурацию подключения), жмем Open.

паранойи мало не бывает К осторожности нужно приучать сразу, хоть теперь и попасть на наш сервер посредством VNC извне невозможно (для начала нужно залогиниться по ssh и создать тунель), все же стоит задуматься о дополнительной безопасности ssh подключений (помните — китайские боты не дремлют).

Установим и настроим fail2ban.
По умолчанию защита от брутфорса для SSH включена, что нам собственно и требуется.
при превышении заданного числа неудачных вводов пароля подряд (по умолчанию — 6) бан IP, с которого были попытки подбора на заданное время (по умолчанию — 600 секунд).

Устанавливаем пакет из репозитория.

$ sudo apt-get install fail2ban  

Основной интересующий нас файл настроек находится по пути /etc/fail2ban/jail.conf

Блок настроек для подключения по ssh:

[ssh]  enabled  = true port     = ssh filter   = sshd logpath  = /var/log/auth.log maxretry = 6 

Синтаксис

ignoreip — IP адреса, которые не должны быть заблокированы. Можно задать список IP адресов разделённых пробелами, маску подсети, или имя DNS сервера.

bantime — время бана в секундах, по истечении которого IP адрес удаляется из списка заблокированных.

maxretry — количество подозрительных совпадений, после которых применяется правило. В контексте ssh — это число неудавшихся попыток логина, после которых происходит блокировка.

enabled — значение true указывает что данный jail активен, false выключает действие изолятора.

port — указывает на каком порту или портах запущен целевой сервис. Стандартный порт SSH сервера — 22, или его буквенное наименование — ssh.

filter — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса. Фильтру sshd соответствует файл /etc/fail2ban/filter.d/sshd.conf.

logpath — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log файл /var/log/auth.log.

Дефолтная настройка удовлетворяет наши требования (6 неверных попыток авторизации по shh и IP летит в бан на 600 секунд), но я бы советовал добавить свой IP в доверенный список.
Обидно будет ждать почти два часа, в случае шестикратной ошибки ввода пароля со своего IP (шанс данного кейса отнюдь не нулевой).

Открываем конфиг файл.

$ sudo nano /etc/fail2ban/jail.conf 

В строке ignoreip = 127.0.0.1/8, адрес 127.0.0.1/8 заменяем на свой IP.

ignoreip = Your.IP 

Выходим из редактора nano (ctrl+x, отвечаем y на вопрос сохранения внесенных изменений).

Перегружаем сервис для применения изменений в правилах.

$ sudo service fail2ban restart 

В случае срабатывания бана в логах fail2ban, можно заметить строку предупреждения:

$ sudo tail -100 /var/log/fail2ban.log | less 2015-12-17 09:08:54,894 fail2ban.actions[7496]: WARNING [ssh] Ban  

И попытки подключения с данного адреса будут отбиваться сервером автоматически до истечения срока бана.

bash-3.2# ssh my.vnc -l vnc ssh: connect to host 37.48.90.203 port 22: Connection refused 

Готово, настройка VNC сервера завершена.

ссылка на оригинал статьи http://habrahabr.ru/post/273201/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *