Устанавливаем Apache Guacamole на платформе Docker, настраиваем обратный прокси для HTTPS-доступа и выполняем интеграцию с Active Directory


Базовая настройка


устанавливаем Docker Engine - Community и Docker Compose, как рассказывается в этой статье

создаем папку для хранения параметров развертывания контейнеров /etc/docker/guacamole

mkdir /etc/docker/guacamole

создаем файл с параметрами развертывания контейнеров /etc/docker/guacamole/docker-compose.yml

version: '3'

networks:
  net:
    ipam:
      config:
        - subnet: 192.168.100.1/24

volumes:
  db:
  shared:

services:
  db:
    container_name: guacamole_db
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always

  guacd:
    container_name: guacamole_guacd
    image: guacamole/guacd
    networks:
      - net
    volumes:
      - shared:/home/guacd/shared
    restart: always

  guacamole:
    depends_on:
      - db
      - guacd
    container_name: guacamole_guacamole
    image: guacamole/guacamole
    networks:
      - net
    ports:
      - 8080:8080
    environment:
      - GUACD_HOSTNAME=guacd
      - MYSQL_HOSTNAME=db
      - MYSQL_DATABASE=guacamole
      - MYSQL_USER=guacamole
      - MYSQL_PASSWORD=some_pass
    restart: always

создаем контейнеры

docker-compose -f /etc/docker/guacamole/docker-compose.yml up --no-start

создаем файл для инициализации базы данных

docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > /tmp/initdb.sql

копируем созданный файл в контейнер базы данных

docker cp /tmp/initdb.sql guacamole_db:/tmp/initdb.sql

запускаем контейнер базы данных

docker container start guacamole_db

находим в журнале контейнера автоматически сгенерированный пароль пользователя root

docker logs guacamole_db | grep PASSWORD

подключаемся к консоли MySQL

docker exec -it guacamole_db mysql -u root -p

изменяем пароль администратора

alter user 'root'@'localhost' identified by 'another_pass';

создаем базу данных

create database guacamole;

создаем пользователя базы данных

create user 'guacamole'@'%' identified with mysql_native_password by 'some_pass';

предоставляем пользователю права полного доступа к базе данных

grant all privileges on guacamole.* to 'guacamole'@'%';

инициализируем базу данных

use guacamole;
source /tmp/initdb.sql;

отключаемся от консоли MySQL

quit;

запускаем контейнер guacd

docker container start guacamole_guacd

создаем в контейнере папку для хранения копируемых в удаленный сеанс и из удаленного сеанса файлов

docker exec -it guacamole_guacd mkdir /home/guacd/shared
docker exec -it guacamole_guacd chown guacd:guacd /home/guacd/shared

замечание: в дальнейшем в этой папке для каждого пользователя будет создана своя подпапка

запускаем контейнер guacamole

docker container start guacamole_guacamole

проходим в браузере по ссылке http://guacamole.domain.local:8080/guacamole/ и авторизуемся с использованием
логина "guacadmin" и пароля "guacadmin"

переходим в разделы "Опции" -> "Подключения" и создаем новое подключение

Редактирование подключения
   Название - test
   Протокол - rdp
Настройки
   Сеть
      Сервер - test.domain.local
      Порт - 3389
   Аутентификация 
      Режим безопасности - RDP-шифрование
   Clipboard
      Line endings - Windows (CRLF)
   Перенаправление устройств
      Включить диск - включено
      Название диска - Shared Drive
      Путь для диска - /home/guacd/shared/${GUAC_USERNAME}
      Автоматически создавать путь для диска - включено

замечание: в зависимости от узла, к которому выполняется подключение, может потребоваться использование
других параметров подключения, например, режим шифрования "NLA" с опцией "Игнорировать сертификат сервера"

переходим в раздел "Главная" и выполняем подключение

замечание: копировать файлы и текст между локальным и удаленным компьютерами можно посредством меню,
вызываемого комбинацией клавиш Ctrl + Shift + Alt


Настройка HTTPS


редактируем файл /etc/docker/guacamole/docker-compose.yml

version: '3'

networks:
  net:
    ipam:
      config:
        - subnet: 192.168.100.1/24

volumes:
  db:
  shared:
  proxy:

services:
  db:
    container_name: guacamole_db
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always

  guacd:
    container_name: guacamole_guacd
    image: guacamole/guacd
    networks:
      - net
    volumes:
      - shared:/home/guacd/shared
    restart: always

  guacamole:
    depends_on:
      - db
      - guacd
    container_name: guacamole_guacamole
    image: guacamole/guacamole
    networks:
      - net
    environment:
      - GUACD_HOSTNAME=guacd
      - MYSQL_HOSTNAME=db
      - MYSQL_DATABASE=guacamole
      - MYSQL_USER=guacamole
      - MYSQL_PASSWORD=some_pass
    restart: always

  proxy:
    depends_on:
      - guacamole
    container_name: guacamole_proxy
    image: nginx
    networks:
      - net
    ports:
      - 443:443
    volumes:
      - proxy:/etc/nginx
    restart: always

запускаем контейнеры

docker-compose -f /etc/docker/guacamole/docker-compose.yml up -d

подключаемся к контейнеру прокси

docker exec -ti guacamole_proxy /bin/bash

устанавливаем текстовый редактор

apt-get update && apt-get install -y nano

вносим в файл конфигурации /etc/nginx/conf.d/default.conf изменения

  listen 443 ssl;

  ssl_certificate /etc/nginx/server.crt;
  ssl_certificate_key /etc/nginx/server.key;

  location /guacamole/ {
      proxy_pass http://guacamole:8080;
      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;
      access_log off;
   }

отключаемся от контейнера

exit

копируем сертификат и закрытый ключ в контейнер

docker cp /root/server.crt guacamole_proxy:/etc/nginx/server.crt
docker cp /root/server.key guacamole_proxy:/etc/nginx/server.key

замечание: как выпустить сертификат, используя инфраструктуру открытого ключа, или самоподписанный сертификат, рассказывается в этой и этой статьях соответственно

перезапускаем контейнер

docker container restart guacamole_proxy


Настройка LDAPS


редактируем файл /etc/docker/guacamole/docker-compose.yml

version: '3'

networks:
  net:
    ipam:
      config:
        - subnet: 192.168.100.1/24

volumes:
  db:
  shared:
  proxy:

services:
  db:
    container_name: guacamole_db
    image: mysql/mysql-server
    networks:
      - net
    volumes:
      - db:/var/lib/mysql
    restart: always

  guacd:
    container_name: guacamole_guacd
    image: guacamole/guacd
    networks:
      - net
    volumes:
      - shared:/home/guacd/shared
    restart: always

  guacamole:
    depends_on:
      - db
      - guacd
    container_name: guacamole_guacamole
    image: guacamole/guacamole
    networks:
      - net
    environment:
      - GUACD_HOSTNAME=guacd
      - MYSQL_HOSTNAME=db
      - MYSQL_DATABASE=guacamole
      - MYSQL_USER=guacamole
      - MYSQL_PASSWORD=some_pass
      - LDAP_HOSTNAME=dc.domain.local
      - LDAP_PORT=636
      - LDAP_ENCRYPTION_METHOD=ssl
      - LDAP_SEARCH_BIND_DN=CN=guacamole,OU=Special Users,DC=domain,DC=local
      - LDAP_SEARCH_BIND_PASSWORD=one_more_pass
      - LDAP_USER_BASE_DN=OU=Employees,DC=domain,DC=local
      - LDAP_USERNAME_ATTRIBUTE=sAMAccountName
      - LDAP_USER_SEARCH_FILTER=(&(objectclass=user)(memberOf=CN=Guacamole users,OU=Local Groups,DC=domain,DC=local))
    restart: always

  proxy:
    depends_on:
      - guacamole
    container_name: guacamole_proxy
    image: nginx
    networks:
      - net
    ports:
      - 443:443
    volumes:
      - proxy:/etc/nginx
    restart: always

добавляем корневой сертификат центра сертификации в хранилище сертификатов

docker cp /tmp/root.crt guacamole_guacamole:/tmp/root.crt
docker exec -ti -u root guacamole_guacamole keytool -trustcacerts -alias domain.local -import -keystore /opt/java/openjdk/jre/lib/security/cacerts -storepass changeit -file /tmp/root.crt

пересоздаем контейнеры

docker-compose -f /etc/docker/guacamole/docker-compose.yml up -d

замечание 1: в данной конфигурации будет только выполняться аутентификация пользователей из указанной группы. для того, чтобы настроить доступ пользователей к определенным подключениям, необходимо вручную добавить их в веб-консоли (пароль при этом указывать не нужно)

замечание 2: при необходимости настройки нешифрованного подключения следует изменить значения переменных LDAP_PORT и LDAP_ENCRYPTION_METHOD на 389 и none соответственно

У этой записи 14 комментариев

    1. Alexander

      Спасибо за замечание. Исправил

  1. Дмитрий

    "docker container start guacamole_db" в первом случае - он же не запустится, если контейнер не создан?

    1. Alexander

      Да, Вы правы - контейнеры нужно сначала создать. Добавил соответствующий пункт

  2. Дмитрий

    Скажите, пожалуйста, как сделать конфигурацию с несколькими контроллерами домена?

    1. Alexander

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

  3. Алексей

    Для того что бы можно было передавать файлы любого размера можно добавить следующий параметр
    client_max_body_size 0;
    в конфигурацию NGINX, секция location /guacamole/.

    1. Alexander

      ОК. Спасибо за информацию

  4. Игорь

    коллеги, привет. подскажите конфигурацию для активации записей сеансов.

      1. Данил

        Подскажите у сертификата обязательно должно быть расширение .crt или .cer тоже пойдёт?

        1. Alexander

          Расширение может быть любое. Главное, чтобы путь к файлу сертификата был верный

  5. Danil

    Добрый день, можете подсказать причину, почему может не работать авторизация LDAP. Guacamole настроен в докере

    #Ошибка
    "guacamole | 04:41:15.368 [http-nio-8080-exec-1] INFO o.a.g.a.l.AuthenticationProviderService - Unable to determine DN of user "guacweb" using LDAP server "domain.ru". Proceeding with next server...
    guacamole | 04:41:15.368 [http-nio-8080-exec-1] INFO o.a.g.a.l.AuthenticationProviderService - User "guacweb" did not successfully authenticate against any LDAP server.
    guacamole | 04:41:15.372 [http-nio-8080-exec-1] WARN o.a.g.r.auth.AuthenticationService - Authentication attempt from 10.120.2.2 for user "guacweb" failed"

    #docker-compose.yml
    LDAP_HOSTNAME: domain.ru
    LDAP_PORT: 389
    LDAP_ENCRYPTION_METHOD: none
    LDAP_USER_BASE_DN: OU=Users,DC=domain,DC=ru
    LDAP_SEARCH_BIND_DN: CN=guacweb,OU=Users,DC=domain,DC=ru
    LDAP_USERNAME_ATTRIBUTE: sAMAccountName
    LDAP_SEARCH_BIND_PASSWORD: 'mypass'

    1. Alexander

      Доброго дня. Скорее всего указан неправильный DN. По умолчанию Users - это не OU. Откройте свойства учетной записи и на вкладке "Редактор атрибутов" проверьте значение distinguishedName

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