webブラウザで画面共有が表示可能となる
本家様 http://guacamole.apache.org/

外部と内部を繋ぐサーバ(gate)があって、外部から内部のwindowsマシンをブラウザから操作できるか確かめてみた

2021y06m30d_075501659.png

フラットファイルにアカウントとパスワード、そして接続先、接続方法(RDP,VNC)を予め定義して使用する方法の他に
データベースにそれら情報を格納してより便利に管理する方法もある。
ここではデータベース方式(PostgreSQL)を使ってみた.

設定Guacamole/Setting

下拵え

必要なパッケージをインストールします
AlmaLinux 8.4ではパッケージ uuid-devel が対応していないのかコンパイル不可でした
CentOS 7.9です

[root@gate ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@gate ~]# yum -y groupinstall "Development Tools"
[root@gate ~]# yum -y install libjpeg-turbo-devel libpng-devel cairo-devel uuid-devel

これで一応サーバアプリはコンパイルはできるけど、RDP対応とかのために追加のパッケージも入れます
詳細はこちらで確認できます https://guacamole.apache.org/doc/gug/installing-guacamole.html

[root@gate ~]# yum -y install epel-release
[root@gate ~]# yum -y install freerdp-devel pango-devel libssh2-devel libtelnet-devel \
            libvncserver-devel libwebsockets-devel pulseaudio-libs-devel openssl-devel libvorbis-devel libwebp-devel

*録画もしたいなら「ffmpeg-devel」も必要. ただCentOSリポジトリにもepelリポジトリにもない
なので「https://pkgs.org/download/ffmpeg-devel」から「CERT Forensics Tools x86_64」の「ffmpeg-devel」を入れた

[root@gate ~]# rpm -Uvh https://forensics.cert.org/cert-forensics-tools-release-el7.rpm
[root@gate ~]# yum --enablerepo=forensics install ffmpeg-devel

サーバアプリの構築

最新版(21.06時点)の1.3.0を取得します。ファイル名は「guacamole-server-1.3.0.tar.gz」となります。
http://guacamole.apache.org/releases/1.3.0/

[root@gate ~]# tar xf guacamole-server-1.3.0.tar.gz
[root@gate ~]# cd guacamole-server-1.3.0/
[root@gate guacamole-server-1.3.0]#
[root@c guacamole-server-1.3.0]# ./configure --with-systemd-dir=/etc/systemd/system --prefix=/opt/guacamole
 :
 :
------------------------------------------------
guacamole-server version 1.3.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@gate guacamole-server-1.3.0]#
[root@gate guacamole-server-1.3.0]# make && make install
[root@gate guacamole-server-1.3.0]# echo /opt/guacamole/lib > /etc/ld.so.conf.d/guacamole.conf
[root@gate guacamole-server-1.3.0]# ldconfig
[root@gate guacamole-server-1.3.0]# ls -l /etc/systemd/system
 :
-rw-r--r--. 1 root root  990 Jun 29 03:42 guacd.service
 :
[root@gate guacamole-server-1.3.0]# systemctl daemon-reload
[root@gate guacamole-server-1.3.0]# systemctl enable guacd.service && systemctl start guacd.service

webアプリの準備

次にクライアントからの要求を受け入れるwebアプリの構築になります. java servletです. tomcatとかjettyとかの
servlet containerが必要となります. ここでは軽量の Jetty を使います.

まずjavaをインストール

[root@gate ~]# yum -y install java-1.8.0-openjdk-devel

次にJettyを組み込みます

[root@gate ~]# cd /opt
[root@gate opt]# curl -O https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.42.v20210604/jetty-distribution-9.4.42.v20210604.tar.gz
[root@gate opt]# tar xf jetty-distribution-9.4.42.v20210604.tar.gz
[root@gate opt]# ln -s jetty-distribution-9.4.42.v20210604 jetty
[root@gate opt]# ls -CF jetty/
bin/        etc/  license-eplv10-aslv20.html  modules/     README.TXT  start.ini  VERSION.txt
demo-base/  lib/  logs/                       notice.html  resources/  start.jar  webapps/
 
[root@gate opt]#

jettyの稼働ユーザを用意します. ここでは jetty:jetty としてます

[root@gate ~]# useradd -r -s /bin/false -d /opt/jetty -M jetty
[root@gate ~]# id jetty
uid=997(jetty) gid=995(jetty) groups=995(jetty)
 
[root@gate ~]# chown -R jetty:jetty /opt/jetty/

systemdで起動する様にします. サンプルが用意されていて「/opt/jetty/bin/jetty.service」これを参照に下記を作ります

[root@gate ~]# vi /etc/systemd/system/jetty.service
[Unit]
Description=Jetty Web Application Server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/jetty
PIDFile=/opt/jetty/logs/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
StandardOutput=null
 
[Install]
WantedBy=multi-user.target
 
[root@gate ~]# systemctl daemon-reload
[root@gate ~]# systemctl enable jetty

環境設定ファイルなEnvironmentFileは「/etc/sysconfig/jetty」で提供して、その中身は下記にします

[root@gate ~]# vi /etc/sysconfig/jetty
JETTY_HOME=/opt/jetty
JETTY_USER=jetty
JETTY_ARGS=jetty.http.port=8080
JETTY_RUN=/opt/jetty/logs
JETTY_SHELL=/bin/bash
JETTY_BASE=/opt/jetty
 
[root@gate ~]#

*port:80で動かしたいのだが、apache経由で80にした方が楽みたい

これでwebアプリの準備は完了で、次にwebアプリ、コンテンツを入れる

webコンテンツの導入

「webapps」フォルダに war ファイルを置くだけ. http://guacamole.apache.org/releases/1.3.0/ から「guacamole-1.3.0.war」を貰う
それを「webapps」に入れる

[root@gate ~]# cp guacamole-1.3.0.war  /opt/jetty/webapps/
[root@gate ~]# chown jetty:jetty /opt/jetty/webapps/guacamole-1.3.0.war

まだ途中だけどテストしてみる. firewallに穴を開けて

[root@gate ~]# firewall-cmd --add-port=8080/tcp --zone=public --permanent
[root@gate ~]# firewall-cmd --reload
 
[root@gate ~]# cd /opt/jetty
[root@gate jetty]# java -jar /opt/jetty/start.jar

として、ブラウザでアクセスしてみる.
2021y06m30d_084854880.png
エラー画面になるが、「/guacamole-1.3.0」があれば成功. 確認したらCtrl-Cで終了する

データベースの準備

次にデータベースを入れる. 使うのはPostgreSQL

[root@gate ~]# yum -y install postgresql-server
[root@gate ~]# postgresql-setup initdb
[root@gate ~]# vi /var/lib/pgsql/data/pg_hba.conf
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
 
[root@gate ~]# systemctl enable postgresql && systemctl start postgresql

「pg_hba.conf」を一部変更してます.
Guacamole向けのデータベース「guacamole_db」を作ります

[root@gate ~]# su - postgres -c "createdb guacamole_db"
[root@gate ~]# su - postgres -c "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)
 
[root@gate ~]#

データベースに必要なテーブル、コンテンツを組み込む

このデータベース「guacamole_db」へのスキーマ(テーブルとか)を作ります
スキーマオブジェクトは、「http://guacamole.apache.org/releases/1.3.0/」の「guacamole-auth-jdbc-1.3.0.tar.gz」に含まれています
「guacamole-auth-jdbc-1.3.0.tar.gz」の中身はこんな感じ.

[root@gate ~]# tar tvfz guacamole-auth-jdbc-1.3.0.tar.gz
 :
drwxr-xr-x mjumper/users     0 2020-09-01 10:04 guacamole-auth-jdbc-1.3.0/postgresql/schema/
drwxr-xr-x mjumper/users     0 2020-09-01 10:04 guacamole-auth-jdbc-1.3.0/postgresql/schema/upgrade/
-rw-r--r-- mjumper/users  2699 2020-09-01 10:04 guacamole-auth-jdbc-1.3.0/postgresql/schema/002-create-admin-user.sql
 :
-rw-r--r-- mjumper/users 21749 2020-09-01 10:04 guacamole-auth-jdbc-1.3.0/postgresql/schema/001-create-schema.sql
 :
-rw-r--r-- mjumper/users 5723345 2020-12-29 09:03 guacamole-auth-jdbc-1.3.0/mysql/guacamole-auth-jdbc-mysql-1.3.0.jar
-rw-r--r-- mjumper/users 5720551 2020-12-29 09:03 guacamole-auth-jdbc-1.3.0/postgresql/guacamole-auth-jdbc-postgresql-1.3.0.jar
-rw-r--r-- mjumper/users 5717088 2020-12-29 09:04 guacamole-auth-jdbc-1.3.0/sqlserver/guacamole-auth-jdbc-sqlserver-1.3.0.jar

必要なファイルのみを抽出します

[root@gate ~]# tar xf guacamole-auth-jdbc-1.3.0.tar.gz guacamole-auth-jdbc-1.3.0/postgresql
[root@gate ~]# cd guacamole-auth-jdbc-1.3.0/postgresql/schema/
[root@gate schema]# ls -l
total 28
-rw-r--r--. 1 1001 users 21749 Sep  1  2020 001-create-schema.sql
-rw-r--r--. 1 1001 users  2699 Sep  1  2020 002-create-admin-user.sql
drwxr-xr-x. 2 1001 users   242 Jun 30 12:01 upgrade
 
[root@gate schema]# cat *.sql | su - postgres -c "psql -d guacamole_db -f -"

これでテーブルとコンテンツがデータベース「guacamole_db」に組み込みられました.

データベースへアクセスできるアカウントを作成

このデータベース「guacamole_db」へ接続できる(データベース内)アカウントを作ります.

[root@gate ~]#  su - postgres -c "psql -d guacamole_db"
psql (9.2.24)
Type "help" for help.
 
guacamole_db=# CREATE USER guacamole_user WITH PASSWORD 'some_password';
guacamole_db=# GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO guacamole_user;
guacamole_db=# GRANT SELECT,USAGE ON ALL SEQUENCES IN SCHEMA public TO guacamole_user;
guacamole_db=# \q
[root@gate ~]#

っでテスト接続してみる

[root@gate ~]# psql -h localhost -U guacamole_user -d guacamole_db
Password for user guacamole_user:
psql (9.2.24)
Type "help" for help.
 
guacamole_db=> \q
[root@gate ~]#

Guacamole向けのjdbcドライバ

データベースとGuacamole を繋げるjdbcドライバをインストールします
jdbcドライバは「guacamole-auth-jdbc-1.3.0.tar.gz」に含まれている

[root@gate ~]# mkdir -p /etc/guacamole/{extensions,lib}
[root@gate ~]# mv guacamole-auth-jdbc-1.3.0/postgresql/guacamole-auth-jdbc-postgresql-1.3.0.jar /etc/guacamole/extensions/

これと同時にpostgreSQLのjdbcドライバも用意します

[root@gate ~]# yum install postgresql-jdbc
 
[root@gate ~]# cd /etc/guacamole/lib/
[root@gate lib]# ln -s /usr/share/java/postgresql-jdbc.jar .

guacamole.properties

Guacamoleからデータベースに接続するアカウント・パスワードらを定義します

[root@gate ~]# vi /etc/guacamole/guacamole.properties
postgresql-hostname: localhost
postgresql-port: 5432
postgresql-database: guacamole_db
postgresql-username: guacamole_user
postgresql-password: some_password
 
[root@gate ~]#

この「guacamole.properties」で決め打ちの設定も可能 https://guacamole.apache.org/doc/gug/configuring-guacamole.html

[root@gate ~]# vi /etc/guacamole/guacamole.properties
# guacd-hostname: localhost
# guacd-port: 4822
# user-mapping: /etc/guacamole/user-mapping.xml
 
[root@gate ~]# vi /etc/guacamole/user-mapping.xml
<user-mapping>
 
    <!-- Per-user authentication and config information -->
    <authorize username="USERNAME" password="PASSWORD">
        <protocol>vnc</protocol>
        <param name="hostname">localhost</param>
        <param name="port">5900</param>
        <param name="password">VNCPASS</param>
    </authorize>
 
    <!-- Another user, but using md5 to hash the password
         (example below uses the md5 hash of "PASSWORD") -->
    <authorize
            username="USERNAME2"
            password="319f4d26e3c536b5dd871bb2c52e3178"
            encoding="md5">
 
        <!-- First authorized connection -->
        <connection name="localhost">
            <protocol>vnc</protocol>
            <param name="hostname">localhost</param>
            <param name="port">5901</param>
            <param name="password">VNCPASS</param>
        </connection>
 
        <!-- Second authorized connection -->
        <connection name="otherhost">
            <protocol>vnc</protocol>
            <param name="hostname">otherhost</param>
            <param name="port">5900</param>
            <param name="password">VNCPASS</param>
        </connection>
 
    </authorize>
 
</user-mapping>
[root@gate ~]#

アクセス

以上で構築は完了

[root@gate ~]# systemctl start jetty guacd

とデーモンを起動させ、再度ブラウザでアクセスしてみる.「http://gate:8080/guacamole-1.3.0/#/
下記画面が表示されたら、ユーザ名に「guacadmin」、パスワードに「guacadmin」を入れて「ログイン」を押下します
2021y06m30d_122632223.png

もし下図のような「不正なログインです」と表記されたら
2021y06m30d_122742607.png

jettyを一旦止めてインターラクティヴモードで起動してみる
まず、jettyを止めて、$JETTY_HOMEにて「java -jar /opt/jetty/start.jar」を実行する

[root@gate ~]# systemctl stop jetty
 
[root@gate ~]# cd /opt/jetty
 
[root@gate jetty]# java -jar /opt/jetty/start.jar
2021-06-30 12:37:15.304:INFO::main: Logging initialized @224ms to org.eclipse.jetty.util.log.StdErrLog
2021-06-30 12:37:15.412:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, (略
2021-06-30 12:37:15.430:INFO:oejs.Server:main: jetty-9.4.42.v20210604; built: 2021-06-04T17:33:38.939Z; git: 5cd5e6d2375eeab146813b0de(略
2021-06-30 12:37:15.441:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///opt/jetty-distribution-9.4.42.v20210604/webap(略
 :
 :
2021-06-30 12:37:17.038:INFO:oejs.AbstractConnector:main: Started ServerConnector@18d910b3{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2021-06-30 12:37:17.039:INFO:oejs.Server:main: Started @1960ms
 :

のままにして再度ブラウザでアクセスしてみます。そこでエラーのメッセージらが流れるのでそれで対処してみる

メモ

  • jettyでデバックモードで調べたいなら「/opt/jetty/curt/resources/jetty-logging.properties」を作って中身は下記にして
    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
    とする.
  • 80番portで運用したい場合
    jettyを調整するのもいいが、firewallが動いているならポートフォワードを使う
    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
    これで80に届いたリクエストは8080へ渡される
    apacheと組み合わせるなら「リバースプロキシ」を使用する
  • コンテンツを「/」にしたい
    上記のままですと 「http://gate:8080/guacamole-1.3.0」でアクセスが必要. これを「http://gate:8080/」でguacamoleに繋げるには
    [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]#
    と「guacamole-1.3.0.war」を「ROOT.war」に名称変更する.
    参照先 https://www.eclipse.org/jetty/documentation/jetty-9/index.html#configuring-contexts
    あるいは、「/opt/jetty/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
  • apacheと連携して動かしたい
    例えば「http://web.chaperone.jp/」はそのままapacheでコンテンツを提供して、「http://web.chaperone.jp/Gacamole」は
    jettyに繋げたいとするなら
    [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>
    な感じに作る 上記はテストしてないです

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2021-07-18 (日) 02:03:31 (7d)