Устанавливаем 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 соответственно
"проходим в браузере по ссылке http://:8080/guacamole/ " - точно эта ссылка?
Спасибо за замечание. Исправил
"docker container start guacamole_db" в первом случае - он же не запустится, если контейнер не создан?
Да, Вы правы - контейнеры нужно сначала создать. Добавил соответствующий пункт
Скажите, пожалуйста, как сделать конфигурацию с несколькими контроллерами домена?
С такой задачей не сталкивался, поэтому особо ничего не подскажу. В крайнем случае, если между доменами нет отношений доверия, можно запускать свои экземпляры контейнеров для каждого домена, используя общие контейнеры прокси и базы данных
Для того что бы можно было передавать файлы любого размера можно добавить следующий параметр
client_max_body_size 0;
в конфигурацию NGINX, секция location /guacamole/.
ОК. Спасибо за информацию
коллеги, привет. подскажите конфигурацию для активации записей сеансов.
Доброго дня. Ничего конкретного не подскажу, но судя по этой странице руководства, процесс не такой мудреный, и проблем возникнуть не должно
Подскажите у сертификата обязательно должно быть расширение .crt или .cer тоже пойдёт?
Расширение может быть любое. Главное, чтобы путь к файлу сертификата был верный
Добрый день, можете подсказать причину, почему может не работать авторизация 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'
Доброго дня. Скорее всего указан неправильный DN. По умолчанию Users - это не OU. Откройте свойства учетной записи и на вкладке "Редактор атрибутов" проверьте значение distinguishedName