webブラウザで画面共有が表示可能となる
本家様 http://guacamole.apache.org/
外部と内部を繋ぐサーバ(gate)があって、外部から内部のwindowsマシンとかLinuxマシンをブラウザから操作できるか確かめてみた
フラットファイルにアカウントとパスワード、そして接続先、接続方法(RDP,VNC)を予め定義して使用する方法の他に
データベースにそれら情報を格納してより便利に管理する方法もある。
ここではデータベース方式(PostgreSQL)を使ってみた.
Guacamoleの構築のために必要なパッケージをあらかじめインストールしておきます
[root@guacamole ~]# cat /etc/redhat-release
Rocky Linux release 8.7 (Green Obsidian)
[root@guacamole ~]# getenforce
Enforcing
[root@guacamole ~]# dnf install policycoreutils-python-utils
[root@guacamole ~]# dnf install cairo-devel libjpeg-turbo-devel libjpeg-devel libpng-devel libtool libuuid-devel
これで一応サーバアプリをコンパイルできるけど、GuacamoleでRDP対応とかのために追加のパッケージも入れます
詳細はこちらで確認できます https://guacamole.apache.org/doc/gug/installing-guacamole.html
[root@guacamole ~]# dnf repolist
repo id repo name
appstream Rocky Linux 8 - AppStream
baseos Rocky Linux 8 - BaseOS
extras Rocky Linux 8 - Extras
[root@guacamole ~]# dnf install epel-release yum-utils
[root@guacamole ~]# yum-config-manager --disable epel
[root@guacamole ~]# dnf install --enablerepo=powertools,epel freerdp-devel pango-devel libssh2-devel libtelnet-devel \
libvncserver-devel libwebsockets-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel libgcrypt-devel
*操作内容を録画したいなら「ffmpeg-devel」も必要. ただRockyLinuxリポジトリにもepelリポジトリにもないので
追加で「rpmfusion」リポジトリを入れて、他必要なパッケージを入手します.
[root@guacamole ~]# dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
[root@guacamole ~]# yum-config-manager --disable rpmfusion-free-updates
[root@guacamole ~]# dnf install --enablerepo=powertools,epel,rpmfusion-free-updates ffmpeg-devel ffmpeg
最新版(22.01時点)の1.4.0を取得します。ファイル名は「guacamole-server-1.4.0.tar.gz」となります。
http://guacamole.apache.org/releases/1.4.0/
[root@guacamole ~]# wget -O guacamole-server-1.4.0.tar.gz https://apache.org/dyn/closer.lua/guacamole/1.4.0/source/guacamole-server-1.4.0.tar.gz?action=download
[root@guacamole ~]# tar xf guacamole-server-1.4.0.tar.gz
[root@guacamole ~]# cd guacamole-server-1.4.0
[root@guacamole guacamole-server-1.4.0]#
[root@guacamole guacamole-server-1.4.0]# ./configure --with-systemd-dir=/etc/systemd/system --prefix=/opt/guacamole
:
:
------------------------------------------------
guacamole-server version 1.4.0
------------------------------------------------
Library status:
freerdp2 ............ yes
pango ............... yes
libavcodec .......... yes
libavformat.......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ yes
VNC ........... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
FreeRDP plugins: /usr/lib64/freerdp2
Init scripts: no
Systemd units: /etc/systemd/system
Type "make" to compile guacamole-server.
[root@guacamole guacamole-server-1.4.0]#
っでコンパイル、インストール、起動設定
[root@guacamole guacamole-server-1.4.0]# make && make install
[root@guacamole guacamole-server-1.4.0]# echo /opt/guacamole/lib > /etc/ld.so.conf.d/guacamole.conf
[root@guacamole guacamole-server-1.4.0]# ldconfig
[root@guacamole guacamole-server-1.4.0]# ls -l /etc/systemd/system
:
-rw-r--r--. 1 root root 990 Feb 15 20:14 guacd.service
:
[root@guacamole guacamole-server-1.4.0]# ls -lZ /etc/systemd/system/guacd.service
-rw-r--r--. 1 root root system_u:object_r:default_t:s0 990 Feb 16 04:17 /etc/systemd/system/guacd.service
[root@guacamole guacamole-server-1.4.0]# restorecon -v /etc/systemd/system/guacd.service
[root@guacamole guacamole-server-1.4.0]# ls -lZ /etc/systemd/system/guacd.service
-rw-r--r--. 1 root root system_u:object_r:systemd_unit_file_t:s0 990 Feb 16 04:17 /etc/systemd/system/guacd.service
[root@guacamole guacamole-server-1.4.0]# systemctl daemon-reload
[root@guacamole guacamole-server-1.4.0]# systemctl enable guacd.service
Guacamoleはserver部分とwebコンテンツで構成されています. server部分はこの前段のコンパイルで完了済み.
Guacamoleのwebコンテンツは servlet で提供されていて、動かすには servlet containerが必要となります.
(Guacamoleのwebコンテンツはソースからは作りません. すでに提供されているwarファイルを使います. 面倒なので.)
っでそのservlet containerですが、tomcatとかでもいいのですがここでは軽量の Jetty を使います.
jettyのバージョンは http://www.eclipse.org/jetty/download.php から 9 系列を使います.
jetty9はjava-1.8.0が必要でjreでいいです
[root@guacamole ~]# rpm -qa | grep "^java-"
java-1.8.0-openjdk-headless-1.8.0.352.b08-2.el8_7.x86_64
[jetty@guacamole ~]$ java -version
openjdk version "1.8.0_352"
OpenJDK Runtime Environment (build 1.8.0_352-b08)
OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode)
[jetty@guacamole ~]$
次にJettyを組み込みます. 場所は「/opt/jetty」を起点とします.
まずはjettyの稼働ユーザ[jetty]を用意します. system側のユーザなので[-r]を付けてユーザを作ります. そして/opt/jettyは作成せずアカウントのみ作成します
[root@guacamole ~]# useradd -r -s /sbin/nologin -d /opt/jetty -M jetty
[root@guacamole ~]# id jetty
uid=993(jetty) gid=989(jetty) groups=989(jetty)
[root@guacamole ~]#
jettyアプリを取得して/opt/jettyに展開します.
[root@guacamole ~]# cd /opt/
[root@guacamole opt]# curl -O https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.50.v20221201/jetty-distribution-9.4.50.v20221201.tar.gz
[root@guacamole opt]# tar xf jetty-distribution-9.4.50.v20221201.tar.gz
[root@guacamole opt]# mv jetty-distribution-9.4.50.v20221201 jetty
[root@guacamole opt]# chown -R jetty. jetty
[root@guacamole opt]# ls -l
total 18588
drwxr-xr-x. 10 jetty jetty 4096 Dec 2 07:18 jetty
-rw-r--r--. 1 root root 19029816 Feb 16 00:27 jetty-distribution-9.4.50.v20221201.tar.gz
[root@guacamole opt]#
起動スクリプトを準備します. rootで操作します
[root@guacamole ~]# cp /opt/jetty/bin/jetty.service /usr/lib/systemd/system/
[root@guacamole ~]# vi /usr/lib/systemd/system/jetty.service
[Unit]
Description=Jetty Web Application Server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/jetty/jetty.pid
ExecStart=/opt/jetty/bin/jetty.sh start
ExecStop=/opt/jetty/bin/jetty.sh stop
ExecReload=/opt/jetty/bin/jetty.sh restart
User=jetty
Group=jetty
[Install]
WantedBy=multi-user.target
[root@guacamole ~]# echo "d /run/jetty 755 jetty jetty" > /etc/tmpfiles.d/jetty.conf
[root@guacamole ~]# /usr/bin/systemd-tmpfiles --create /etc/tmpfiles.d/jetty.conf
[root@guacamole ~]# systemctl list-unit-files |grep jetty
jetty.service disabled
[root@guacamole ~]#
次に設定ファイルを用意します. 「/opt/jetty/bin/jetty.sh」から設定ファイルは「/etc/default/jetty」とします
[root@guacamole ~]# vi /etc/default/jetty
JETTY_HOME=/opt/jetty
JETTY_USER=jetty
JETTY_ARGS=jetty.http.port=8080
JETTY_RUN=/run/jetty
JETTY_SHELL=/bin/bash
JETTY_BASE=/opt/jetty
#JETTY_BASE=/opt/jetty/demo-base
[root@guacamole ~]#
上記は port 8080 でjettyを動かすことを意味してます.「lsof -i」とかでport 8080が既に使用されていないとかの確認が必要かもしれません。
これでservlet containerの準備は完了で、次にGuacamole webコンテンツをこのjettyに載せます
作業としてはjettyの「webapps」フォルダ「/opt/jetty/webapps/」に Guacamole の webコンテンツ(warファイル)を置くだけ.
https://guacamole.apache.org/releases/1.4.0/ から「guacamole-1.4.0.war」をダウンロードして「webapps」に入れる
[root@guacamole ~]# cd /opt/jetty/webapps/
[root@guacamole webapps]# wget -O guacamole-1.4.0.war https://apache.org/dyn/closer.lua/guacamole/1.4.0/binary/guacamole-1.4.0.war?action=download
[root@guacamole webapps]# chown jetty. guacamole-1.4.0.war
[root@guacamole webapps]# ls -l
total 12712
-rw-r--r--. 1 jetty jetty 13011205 Dec 29 2021 guacamole-1.4.0.war
-rw-rw-r--. 1 jetty jetty 1444 Dec 2 07:18 README.TXT
[root@guacamole webapps]#
servlet containerのjettyの稼働を確認するため、この段階で試しに動かしてみる.
その前に firewall とかで制限を掛けているなら 8080 ポートを開けてから jetty を起動させます
[root@guacamole ~]# firewall-cmd --add-port=8080/tcp --zone=public --permanent
[root@guacamole ~]# firewall-cmd --reload
[root@guacamole ~]# systemctl start jetty
他のマシンから「http://guacamole:8080」にアクセスすると下記のような画面になる
エラー画面ですが、「/guacamole-1.4.0」とあればOK
OSリポジトリでインストールできるpostgreSQLを使います.
既に別のpostgreSQLがあればそれを使っても大丈夫. 別のマシンで動ているpostgreQLでも可. 既に既設のpostgreSQLがあるならportを別にしたPostgreSQLを用意するか、その既設を使ってもいい. DBが異なるだけなので
[root@guacamole ~]# dnf module list postgresql
Last metadata expiration check: 0:28:48 ago on Thu 16 Feb 2023 12:32:20 AM JST.
Rocky Linux 8 - AppStream
Name Stream Profiles Summary
postgresql 9.6 client, server [d] PostgreSQL server and client module
postgresql 10 [d] client, server [d] PostgreSQL server and client module
postgresql 12 client, server [d] PostgreSQL server and client module
postgresql 13 client, server [d] PostgreSQL server and client module
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
[root@guacamole ~]# dnf module install postgresql:10/server
[root@guacamole ~]# postgresql-setup --initdb --unit postgresql
「/var/lib/pgsql/data/pg_hba.conf」の一部を修正してデータベースアカウントでアクセス可能にします
|
そして起動させます
[root@guacamole ~]# systemctl enable postgresql --now
そしてGuacamoleが使うDB「guacamole_db」を用意します
[root@guacamole ~]# su - postgres
[postgres@guacamole ~]$ createdb guacamole_db
[postgres@guacamole ~]$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
guacamole_db | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
[postgres@guacamole ~]$
作成したデータベース「guacamole_db」にスキーマオブジェクト(テーブルとか)を作ります
必要なスキーマオブジェクトは、「https://guacamole.apache.org/releases/1.4.0/」の「guacamole-auth-jdbc-1.4.0.tar.gz」に含まれているので、これを入手して展開します
[postgres@guacamole ~]$ wget -O guacamole-auth-jdbc-1.4.0.tar.gz https://apache.org/dyn/closer.lua/guacamole/1.4.0/binary/guacamole-auth-jdbc-1.4.0.tar.gz?action=download
[postgres@guacamole ~]$ tar xf guacamole-auth-jdbc-1.4.0.tar.gz
[postgres@guacamole ~]$ cd guacamole-auth-jdbc-1.4.0
[postgres@guacamole guacamole-auth-jdbc-1.4.0]$ ls -lF
total 28
drwxr-xr-x. 12 postgres postgres 4096 Feb 16 01:10 bundled/
-rw-r--r--. 1 postgres postgres 17001 Dec 29 2021 LICENSE
drwxr-xr-x. 3 postgres postgres 63 Feb 16 01:10 mysql/
-rw-r--r--. 1 postgres postgres 2695 Dec 29 2021 NOTICE
drwxr-xr-x. 3 postgres postgres 68 Feb 16 01:10 postgresql/
drwxr-xr-x. 3 postgres postgres 67 Feb 16 01:10 sqlserver/
[postgres@guacamole guacamole-auth-jdbc-1.4.0]$ cd postgresql/schema/
[postgres@guacamole schema]$ ls -l
total 32
-rw-r--r--. 1 postgres postgres 21749 Jul 21 2021 001-create-schema.sql
-rw-r--r--. 1 postgres postgres 2699 Jul 21 2021 002-create-admin-user.sql
drwxr-xr-x. 2 postgres postgres 4096 Jul 21 2021 upgrade
[postgres@guacamole schema]$
この「001-create-schema.sql」にはGuacamoleに必要なスキーマオブジェクト(テーブル,インデックスとか)が明記されて、
「002-create-admin-user.sql」には作成したテーブルへのデータ(コンテンツ)が明記されている.
これらを「guacamole_db」に反映させます
[postgres@guacamole schema]$ cat *.sql | psql -d guacamole_db -f -
Guacamole から postgreSQL へ接続するためのデータベースアカウントを用意します pg_hba.confの修正でデータベースアカウントでの接続を有効にしたので
[postgres@guacamole schema]$ psql -d guacamole_db
psql (10.23)
Type "help" for help.
guacamole_db=# CREATE USER guacamole_user WITH PASSWORD 'some_password'; <-- ユーザ「guacamole_user」を作ってそのパスワードを「some_password」にしてます
guacamole_db=# GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO guacamole_user; <-- ユーザ「guacamole_user」へ権限譲渡
guacamole_db=# GRANT SELECT,USAGE ON ALL SEQUENCES IN SCHEMA public TO guacamole_user; <-- ユーザ「guacamole_user」へ権限譲渡その2
guacamole_db=# \q
[postgres@guacamole schema]$
正しく作成できたかのテスト
[root@guacamole ~]# psql -h localhost4 -U guacamole_user -d guacamole_db
Password for user guacamole_user:
psql (10.23)
Type "help" for help.
guacamole_db=> \q
[root@guacamole ~]#
ここではpg_hba.confでipv4のみmd5としている. なので「localhost4」か「127.0.0.1」指定が必要. ipv6もmd5とすれば「localhost」でも行ける. あと別のマシンのpostgresqlを使うならpg_hba.confのさらなる設定が必要
Guacamole とデータベースとの接続は jdbc が使われる. なのでGuacamole側にjdbcドライバをインストールします
jdbcドライバは先ほど取得した「guacamole-auth-jdbc-1.4.0.tar.gz」に含まれている
[root@guacamole ~]# mkdir -p /etc/guacamole/{extensions,lib}
[root@guacamole ~]# cp ~postgres/guacamole-auth-jdbc-1.4.0/postgresql/guacamole-auth-jdbc-postgresql-1.4.0.jar /etc/guacamole/extensions/
次に postgreSQL側にも jdbcドライバも用意します
[root@guacamole ~]# dnf install postgresql-jdbc
[root@guacamole ~]# cd /etc/guacamole/lib
[root@guacamole lib]# ln -s /usr/share/java/postgresql-jdbc.jar .
Guacamoleからデータベースに接続するアカウント・パスワードらを定義します
「guacamole.properties」ファイルは存在しません. 自分で作成します
[root@guacamole ~]# vi /etc/guacamole/guacamole.properties
postgresql-hostname: localhost4 <-- ipv4のみ許可しているので
postgresql-port: 5432
postgresql-database: guacamole_db
postgresql-username: guacamole_user
postgresql-password: some_password
[root@guacamole ~]#
以上で基本設定は完了です
guacd(Guacamoleのサーバ)とjetty(Guacamoleのwebサービス)をsystemctlで稼働させて、
[root@gate ~]# systemctl start jetty guacd
jettyが起動できない場合は /opt/jetty 配下の所有者を確認する. すべてユーザjettyの所有者であることが必要です
その後にブラウザで「http://guacamole:8080/guacamole-1.4.0/」へアクセスしてみます. 下図がでたら成功.
「ユーザ名」には「guacadmin」、「パスワード」にも「guacadmin」を入力してログインを押下します。
するとログインができて、下記画面になります
org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
org.eclipse.jetty.LEVEL=INFO
jetty.logs=logs
[root@gate ~]# cd /opt/jetty
[root@gate jetty]# java -jar /opt/jetty/start.jar
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent --zone=external
firewall-cmd --remove-port=8080/tcp --zone=external --permanent
firewall-cmd --reload
[root@gate ~]# /opt/jetty/webapps
[root@gate webapps]# ls -l
-rw-r--r--. 1 jetty jetty 12277201 Jun 30 08:42 guacamole-1.3.0.war
[root@gate webapps]# mv guacamole-1.3.0.war ROOT.war
[root@gate webapps]# ls -l
-rw-r--r--. 1 jetty jetty 12277201 Jun 30 08:42 ROOT.war
[root@gate webapps]#
[root@gate ~]# /opt/jetty/webapps
[root@gate webapps]# ls -l
-rw-r--r--. 1 jetty jetty 12277201 Jun 30 08:42 guacamole-1.3.0.war
[root@gate webapps]# vi guacamole-1.3.0.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war">/opt/jetty/webapps/guacamole-1.3.0.war</Set>
</Configure>
[root@gate webapps]# chown jetty:jetty guacamole-1.3.0.xml
[root@c ~]# vi /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Timeout 600
Include conf.modules.d/*.conf
User apache
Group apache
<VirtualHost *:80>
ServerName web.chaperone.jp
DocumentRoot "/var/www/html"
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/w/.*$
RewriteRule ^/w/(.*)$ https://web.chaperone.jp/w/$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
ServerName web.chaperone.jp:443
SSLProxyEngine on
ProxyPass /guacamole/ http://gate.sybyl.local/guacamole-1.3.0/
ProxyPassReverse /guacamole/ http://gate.sybyl.local/guacamole-1.3.0/
ServerAlias web.chaperone.jp
SSLCertificateFile /etc/letsencrypt/live/web.chaperone.jp-0001/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/web.chaperone.jp-0001/privkey.pem
</VirtualHost>