Установка и настройка Apache Guacamole

  • 23.08.2023
  • 4 865
  • 3
  • 7
  • 7
  • 0
Установка и настройка Apache Guacamole

Описание

Apache Guacamole - это клиент для удаленного доступа по протоколам RDP, SSH, Telnet, VNC, который работает прямо в браузере, избавляя от необходимости установки дополнительного программного обеспечения на стороне клиента. Все что нужно сделать клиенту - запустить браузер, и перейти на страницу веб-интерфейса сервера Apache Guacamole, после чего начать работу по настроенному протоколу удалённого доступа.

В данном материале мы рассмотрим базовую настройку Guacamole для работы по RDP. Более подробную инструкцию по работе с данным программным обеспечением, включая настройку работы с другими протоколами, можно найти в официальной документации.

Все описанные в данной статье действия проводились в Debian 11.7.0.

Установка

В данном разделе мы рассмотрим установку двух версий Apache Guacamole - последней (на момент написания статьи) за номером 1.5.3 и версии 1.1.0. Версия 1.1.0 примечательна тем, что она последняя в которой без проблем работает браузер Internet Explorer 11, что может быть важным фактором в некоторых случаях.

Apache Guacamole 1.5.3

  1. Установим необходимые зависимости.
    apt install build-essential libcairo2-dev libjpeg62-turbo-dev libpng-dev libtool-bin uuid-dev freerdp2-dev libwebp-dev --no-install-recommends
  2. Скачаем последний релиз Guacamole-Server, найдя ссылку в разделе загрузок на официальном сайте.
    cd /tmp/
    wget https://dlcdn.apache.org/guacamole/1.5.3/source/guacamole-server-1.5.3.tar.gz
  3. Распакуем скачанный архив в одноименную директорию, и перейдем в неё.
    tar -xzf guacamole-server-1.5.3.tar.gz
    cd guacamole-server-1.5.3/
  4. Запустим скрипт конфигурации.
    ./configure --with-init-dir=/etc/init.d

    Если все проверки были пройдены успешно, то в итоге появится примерно следующее:

    ------------------------------------------------
    guacamole-server version 1.5.3
    ------------------------------------------------
    
       Library status:
    
         freerdp2 ............ yes
         pango ............... no
         libavcodec .......... no
         libavformat.......... no
         libavutil ........... no
         libssh2 ............. no
         libssl .............. yes
         libswscale .......... no
         libtelnet ........... no
         libVNCServer ........ no
         libvorbis ........... no
         libpulse ............ no
         libwebsockets ....... no
         libwebp ............. yes
         wsock32 ............. no
    
       Protocol support:
    
          Kubernetes .... no
          RDP ........... yes
          SSH ........... no
          Telnet ........ no
          VNC ........... no
    
       Services / tools:
    
          guacd ...... yes
          guacenc .... no
          guaclog .... yes
    
       FreeRDP plugins: /usr/lib/x86_64-linux-gnu/freerdp2
       Init scripts: /etc/init.d
       Systemd units: no
    
    Type "make" to compile guacamole-server.

    Обращаем внимание на раздел Protocol support - поскольку задачей стоит сделать работу по RDP, то напротив одноименного поля должно стоять значение "yes". Проверяем зависимости, и запускаем скрипт по новой. Если же все хорошо, то запускаем процедуру компиляции, выполнив соответствующую команду.

    make

    По её завершению, запустим установку.

    make install
  5. Установим Apache Tomcat:
    apt install tomcat9 --no-install-recommends
  6. Скачаем уже готовый образ клиента Apache Guacamole. Его можно найти в разделе загрузок на официальном сайте.
    cd /tmp/
    wget https://dlcdn.apache.org/guacamole/1.5.3/binary/guacamole-1.5.3.war
  7. Выполним его установку, просто скопировав его в директорию Tomcat, убрав из имени номер версии.
    cp guacamole-1.5.3.war /var/lib/tomcat9/webapps/guacamole.war
  8. Создадим директории extensions и lib внутри директории /etc/guacamole/.
    mkdir -p /etc/guacamole/{extensions,lib}
  9. Зададим переменную GUACAMOLE_HOME в файле конфигурации Apache Tomcat.
    echo 'GUACAMOLE_HOME=/etc/guacamole' >> /etc/default/tomcat9
  10. Если вы не отключили в системе IPv6, и при этом используете для работы в сети IPv4, то вам понадобиться вручную назначить прослушивание IPv4 интерфейса. Создаем текстовый файл /etc/guacamole/guacd.conf.
    nano /etc/guacamole/guacd.conf

    И добавим туда следующие строки:

    [server]
    bind_host = 127.0.0.1
  11. Запустим утилиту ldconfig, чтобы избежать ошибки при запуске сервиса Guacamole.
    ldconfig
  12. Включим и запустим сервис серверной части Guacamole.
    systemctl enable guacd
    systemctl start guacd

Теперь, остается только настроить пользователей, которым будет доступен доступ к RDP серверу, и при необходимости, установить нужные расширения. Прочитать про это можно в соответствующем разделе данной статьи.

Apache Guacamole 1.1.0

Данная версия является последней, которая работает с Internet Explorer 11. Именно по этому, процедура работы с данной версией описана здесь отдельно.

Официальную документацию по установке версии 1.1.0 можно найти в веб-архиве.
  1. Установим необходимые зависимости, где в отличии от более новых версий Guacamole, есть пакет OSSP UUID, и нет пакета uuid-dev.
    apt install build-essential libcairo2-dev libjpeg62-turbo-dev libpng-dev libtool-bin libossp-uuid-dev freerdp2-dev libwebp-dev --no-install-recommends
  2. Скачаем исходные коды серверной части Apache Guacamole версии 1.1 в директорию /tmp/.
    cd /tmp/
    wget https://archive.apache.org/dist/guacamole/1.1.0/source/guacamole-server-1.1.0.tar.gz
  3. Распакуем архив с исходными кодами, и перейдем в полученную в результате распаковки директорию.
    tar -xzf guacamole-server-1.1.0.tar.gz
    cd guacamole-server-1.1.0/
  4. Выполним скрипт конфигурации.
    ./configure --with-init-dir=/etc/init.d

    По его завершению, внимательно смотрим на вывод скрипта.

    ------------------------------------------------
    guacamole-server version 1.1.0
    ------------------------------------------------
    
       Library status:
    
         freerdp2 ............ yes
         pango ............... no
         libavcodec .......... no
         libavformat.......... no
         libavutil ........... no
         libssh2 ............. no
         libssl .............. yes
         libswscale .......... no
         libtelnet ........... no
         libVNCServer ........ no
         libvorbis ........... no
         libpulse ............ no
         libwebsockets ....... no
         libwebp ............. yes
         wsock32 ............. no
    
       Protocol support:
    
          Kubernetes .... no
          RDP ........... yes
          SSH ........... no
          Telnet ........ no
          VNC ........... no
    
       Services / tools:
    
          guacd ...... yes
          guacenc .... no
          guaclog .... yes
    
       FreeRDP plugins: /usr/lib/x86_64-linux-gnu/freerdp2
       Init scripts: /etc/init.d
       Systemd units: no
    
    Type "make" to compile guacamole-server.

    Если там нет ошибок, проверяем, что в разделе "Protocol support" напротив RDP стоит "yes". Если там стоит "no", изучаем лог configure, в котором должно быть указано, по какой причине данный протокол не поддерживается. Если же, в логе ошибок нет, скрипт конфигурации пишет о поддержке протокола RDP, то начнем сборку стандартной командой.

    make

    По завершению сборки, установим Apache Guacamole.

    make install
  5. Установим контейнер сервлетов Apache Tomcat.
    apt install tomcat9 --no-install-recommends
  6. Скачаем скомпилированный файл клиентской части Guacamole в директорию /tmp/, а затем скопируем его в директорию веб-приложений Tomcat:
    cd /tmp/
    wget https://archive.apache.org/dist/guacamole/1.1.0/binary/guacamole-1.1.0.war
    cp guacamole-1.1.0.war /var/lib/tomcat9/webapps/guacamole.war
  7. Создадим директории для Guacamole.
    mkdir -p /etc/guacamole/{extensions,lib}
  8. Зададим переменную GUACAMOLE_HOME.
    echo 'GUACAMOLE_HOME=/etc/guacamole' >> /etc/default/tomcat9
  9. Выполним утилиту ldconfig для формирования кэша о библиотеках, чтобы избежать ошибки при запуске серверной части Apache Guacamole
    ldconfig
  10. Включим и запустим серверную часть Apache Guacamole.
    systemctl enable guacd
    systemctl start guacd

Теперь осталось только создать пользователей, и при необходимости, установить нужные расширения. Данная часть одинакова для всех версий Apache Guacamole.

Создание пользователей

Для настройки доступных пользователей и соединений потребуется создать файл user-mapping.xml, в котором будут описаны как пользователи, так и доступные им соединения. Синтаксис данного XML файла следующий:

<user-mapping>
	<authorize username="[ИМЯ ПОЛЬЗОВАТЕЛЯ]" password="[ХЭШ MD5 ПАРОЛЯ]" encoding="md5">
		<connection name="[ИМЯ СОЕДИНЕНИЯ]">
			<protocol>[ПРОТОКОЛ]</protocol>
			<param name="[ИМЯ ПАРАМЕТРА]">[ЗНАЧЕНИЕ ПАРАМЕТРА]</param>
		</connection>
	</authorize>
</user-mapping>

Создадим данный файл и приведем его к нужному виду.

nano /etc/guacamole/user-mapping.xml

Сперва укажем пользователя - для примера пусть будет логин "test" и пароль "test1234". В данном файле пароль хранится в виде md5 хэша, по этому, сперва потребуется его получить с помощью вызова утилиты openssl.

echo -n test1234 | openssl md5

В результате выполнения данной команды будет получен md5 хэш для введенной строки - для строки "test1234" это будет "16d7a4fca7442dda3ad93c9a726597e4". В итоге, файл с пользователем test и его паролем будет выглядеть вот так:

<user-mapping>
	<authorize username="test" password="16d7a4fca7442dda3ad93c9a726597e4" encoding="md5">
	</authorize>
</user-mapping>

Теперь добавим первый RDP сервер, который будет иметь адрес 192.168.1.5. В данном примере так же будет указан параметр ignore-cert - он отвечает за игнорирование ошибки сертификата RDP сервера, которые могут возникнуть в случае, если у вашего терминального сервера будет самоизданный сертификат.

<user-mapping>
	<authorize username="test" password="16d7a4fca7442dda3ad93c9a726597e4" encoding="md5">
		<connection name="Test RDP">
			<protocol>rdp</protocol>
			<param name="hostname">192.168.1.5</param>
			<param name="port">3389</param>
			<param name="ignore-cert">true</param>
		</connection>
	</authorize>
</user-mapping>

Можно так же добавить в конфиг работу с приложением RemoteApp - для этого, следует добавить параметр remote-app. При этом, в начале значения данного параметра, наличие двух вертикальных черт перед именем опубликованного приложения строго обязательно!

<user-mapping>
	<authorize username="test" password="16d7a4fca7442dda3ad93c9a726597e4" encoding="md5">
		<connection name="Test RDP">
			<protocol>rdp</protocol>
			<param name="hostname">192.168.1.5</param>
			<param name="port">3389</param>
			<param name="ignore-cert">true</param>
			<param name="remote-app">||notepad</param>
		</connection>
	</authorize>
</user-mapping>

Можно так же добавить второе RDP подключение пользователю - для этого достаточно просто продублировать элемент connection, изменив его параметры на актуальные для второго сервера.

<user-mapping>
	<authorize username="test" password="16d7a4fca7442dda3ad93c9a726597e4" encoding="md5">
		<connection name="Test RDP">
			<protocol>rdp</protocol>
			<param name="hostname">192.168.1.5</param>
			<param name="port">3389</param>
			<param name="ignore-cert">true</param>
			<param name="remote-app">||notepad</param>
		</connection>
		<connection name="Test RDP2">
			<protocol>rdp</protocol>
			<param name="hostname">192.168.1.6</param>
			<param name="port">3389</param>
			<param name="ignore-cert">true</param>
		</connection>
	</authorize>
</user-mapping>

Для применения изменений, необходимо перезапустить Tomcat.

systemctl restart tomcat9

Теперь можно запустить браузер, и попытаться зайти на веб-интерфейс Apache Guacamole. Адрес должен выглядеть следующим образом - http://[АДРЕС ИЛИ ИМЯ СЕРВЕРА]:8080\guacamole.

В случае возникновения каких-либо ошибок в работе, вы можете изучить лог Guacamole, который расположен по адресу /var/log/tomcat9/catalina.out.

Работа с расширениями

Одновременно в Guacamole может работать только одно расширение для авторизации! То есть, вы не можете одновременно использовать расширения, описанные ниже.

Настройка авторизации через Active Directory

Расширение для авторизации через Active Directory не может работать с пользователями, содержащими не английские символы в имени пользователя, или в их Distinguished Name.

Авторизация через Active Directory подключается в Guacamole через расширение, которое доступно на официальном сайте в разделе загрузок, под именем guacamole-auth-ldap. Его необходимо скачать, и распаковать.

cd /tmp/
wget https://dlcdn.apache.org/guacamole/1.5.3/binary/guacamole-auth-ldap-1.5.3.tar.gz
tar -xvzf guacamole-auth-ldap-1.5.3.tar.gz

Затем, нужно скопировать jar файл в директорию для расширений:

cp guacamole-auth-ldap-1.5.3/guacamole-auth-ldap-1.5.3.jar /etc/guacamole/extensions/

Теперь, открываем файл /etc/guacamole/guacamole.properties и вносим в него нужные изменения:

nano /etc/guacamole/guacamole.properties

Добавляем строки с настройкой вашего LDAP сервера:

# Auth provider class
auth-provider: net.sourceforge.guacamole.net.auth.ldap.LDAPAuthenticationProvider

# LDAP properties
ldap-hostname: CONTROLLER.DOMAIN.LOCAL
ldap-user-base-dn: CN=Users,DC=DOMAIN,DC=local
ldap-username-attribute: sAMAccountName
ldap-search-bind-dn: CN=Guacamole,CN=Users,DC=DOMAIN,DC=local
ldap-search-bind-password: [ПАРОЛЬ ОТ ПОЛЬЗОВАТЕЛЯ]

Разберем данный файл конфигурации:

  • ldap-hostname - имя или адрес сервера LDAP (контроллер домена).
  • ldap-user-base-dn - путь навигации к объекту с пользователями.
  • ldap-username-attribute - используемый атрибут пользователя, по которому следует делать проверку логина.
  • ldap-search-bind-dn - в случае, если в используемом LDAP нет возможности проводить проверку анонимно, потребуется указать пользователя, под которым будет проводиться данная проверка. В данном случае, требуется указывать его Distinguished Name, он же путь к записи пользователя.
  • ldap-search-bind-password - пароль от пользователя, указанного в параметре ldap-search-bind-dn.

Для начала работы расширения, и применения изменений в настройках, следует перезапустить Tomcat.

systemctl restart tomcat9

Отключение авторизации Guacamole

Если ваш сервер с Guacamole находится внутри вашей локальной сети, и вы не видите смысла усложнять пользователям жизнь в виде дополнительной авторизации при заходе на веб-интерфейс Guacamole, то данную авторизацию можно выключить. Для этого, потребуется использовать нужное расширение, которое можно взять на официальном сайте в разделе загрузок версии 0.9.14, под именем guacamole-auth-noauth-0.9.14.

Поскольку последняя версия расширения была сделана под версию Guacamole 0.9.14, потребуется провести некоторые манипуляции, чтобы она заработала в актуальной версии. Первым делом, нужно скачать данный архив, и открыть или распаковать. Среди файлов в данном архиве будет находиться файл guacamole-auth-noauth-0.9.14.jar, который по сути является zip архивом - его так же следует открыть, и отредактировать файл guac-manifest.json, лежащий в корне архива. В нем следует заменить строку "guacamoleVersion" : "0.9.14", на используемую вами, после чего сохранить. Затем, копируем данный jar файл в директорию /etc/guacamole/extensions/.

Открываем файл /etc/guacamole/guacamole.properties и вносим в него следующие изменения:

# Auth provider class
auth-provider: net.sourceforge.guacamole.net.auth.noauth.NoAuthenticationProvider

# NoAuth properties
noauth-config: /etc/guacamole/noauth-config.xml

Создадим файл конфигурации /etc/guacamole/noauth-config.xml, и добавим туда информацию о соединении.

<configs>
    <config name="RDP" protocol="rdp">
        <param name="hostname" value="192.168.1.5" />
        <param name="port" value="3389" />
        <param name="ignore-cert" value="true" />
    </config>
</configs>

Для работы RemoteApp нужно добавить соответствующий параметр.

<configs>
    <config name="RDP" protocol="rdp">
        <param name="hostname" value="192.168.1.5" />
        <param name="port" value="3389" />
        <param name="ignore-cert" value="true" />
        <param name="remote-app" value="||notepad" />
    </config>
</configs>

Для начала работы расширения, или применения изменений в файлах конфигурации, необходимо перезапустить Tomcat.

systemctl restart tomcat9

Настройка обратного прокси в nginx

Если URL к веб-интерфейсу Guacamole покажется излишне сложным, и захочется его упростить, то здесь на помощь может придти веб-сервер nginx с его возможностями обратного проксирования. Поскольку в интернете и так достаточно инструкций по установке и настройке nginx, этот этап будет пропущен, и будет просто приведен готовый конфиг для nginx:

server
{
	listen 80;
	server_name guacamole.domain.local;
	access_log /var/log/nginx/guacamole-access.log;
	error_log /var/log/nginx/guacamole-error.log;

	location /
	{
		access_log off;
		proxy_pass http://localhost:8080/guacamole/;
		proxy_buffering off;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $http_connection;
	}
}
Была ли эта статья Вам полезна?

Комментарии к статье (3)

    • Прокопий

    "Обращаем внимание на раздел Protocol support - поскольку задачей стоит сделать работу по RDP, то напротив одноименного поля должно стоять значение "yes". Проверяем зависимости, и запускаем скрипт по новой. Если же все хорошо, то запускаем процедуру компиляции, выполнив соответствующую команду." - как включить поддержку других протоколов?

    • Установив все необходимые зависимости - в документации подробно отражено, какие требуются для какого протокола.

    • Прокопий

    1. Скачиваем и распаковываем модуль с версией соответствующей версии Apache Guacamole
    wget https://dlcdn.apache.org/guacamole/1.5.4/binary/guacamole-auth-ldap-1.5.4.tar.gz
    tar -xvzf guacamole-auth-ldap-1.5.4.tar.gz
    2. Создаем каталог и копируем в него модуль
    mkdir -p /opt/guacamole/ldap
    cp guacamole-auth-ldap-1.5.4/guacamole-auth-ldap-1.5.4.jar /opt/guacamole/ldap
    3. Добавляем в файл docker-compose.yml строки:
    # LDAP properties
    LDAP_HOSTNAME: "ldap://AD.DOMAIN.LOCAL"
    LDAP_PORT: 3389
    LDAP_USER_BASE_DN: "DC=DOMAIN,DC=LOCAL"
    LDAP_USERNAME_ATTRIBUTE: "sAMAccountName"
    LDAP_SEARCH_BIND_DN: "CN=guacamole,CN=Users,DC=DOMAIN,DC=LOCAL"
    LDAP_SEARCH_BIND_PASSWORD: "PASSWORD"
    4. Перезапускаем
    docker compose down
    docker compose up -d
    5. Авторизуемся в вебку под админом, создаем пользователя с именем как в AD, но без пароля. Пробую авторизоваться под пользователем AD с указанием именем и пароля.

    Но получаю ошибку "Неверные данные для входа"

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

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

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.