Apache Guacamole 1.4.0 インストール

Guacamoleの1.4.0がリリースされたので、早速入れてみました！
Windows11にRDP接続してみたいと思います。

## 1. 環境

- OS: CentOS 7.9 (3.10.0-1160.49.1) 
- Maven: 3.8.4
- Tomcat: 9.0.56
- Nginx: 1.20.1
- CPU: 4CPU（11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz）
- Mem: 4GB 


## 2. 事前設定

OS最新化  

```bash
yum update -y
reboot
```
パッケージインストール/firewalld変更/ipv6無効化

```bash
yum install -y git vim wget policycoreutils-python

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

vim /etc/sysctl.d/disable_ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
:wq

sysctl -p /etc/sysctl.d/disable_ipv6.conf
```

## 3. tomcat関連作業

最新のtomcatとmavenをダウンロードします。

```bash
cd /opt
wget https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
tar zxvf apache-maven-3.8.4-bin.tar.gz
mv apache-maven-3.8.4 maven
rm -rf apache-maven-3.8.4-bin.tar.gz


wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.tar.gz
tar zxvf apache-tomcat-9.0.56.tar.gz
mv apache-tomcat-9.0.56 tomcat
rm -rf apache-tomcat-9.0.56.tar.gz
```

java（1.8.0）をインストールします。（なぜか11ではmvn packageが通りませんでした。。）

```bash
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
```

tomcatユーザを作成してダウンロードしたファイルをしかるべき場所に配置します。

```bash
groupadd -g 2000 tomcat
useradd -g 2000 -u 2000 -d /usr/share/tomcat -s /sbin/nologin tomcat
chown -R tomcat:tomcat /opt/tomcat


cd /opt/tomcat
cp -pr conf /etc/tomcat
chmod 750 /etc/tomcat
cp -pr bin /usr/libexec/tomcat
cp -pr logs /var/log/tomcat
mkdir /var/cache/tomcat
chown tomcat:tomcat /var/cache/tomcat
cp -pr work /var/cache/tomcat/work
cp -pr temp /var/cache/tomcat/temp

mkdir /var/lib/tomcat
chown tomcat:tomcat /var/lib/tomcat
cp -pr webapps /var/lib/tomcat/
cp -pr lib /usr/share/java/tomcat

cd /usr/share/tomcat
ln -s /usr/libexec/tomcat bin
ln -s /etc/tomcat conf
ln -s /var/log/tomcat logs
ln -s /usr/share/java/tomcat lib
ln -s /var/cache/tomcat/work work
ln -s /var/lib/tomcat/webapps webapps
ln -s /var/cache/tomcat/temp temp
```

mavenのPATHを通しておきます。

```bash
vim ~/.bash_profile

PATH=$PATH:$HOME/bin
↓
PATH=$PATH:$HOME/bin:/opt/maven/bin
:wq

source ~/.bash_profile
```

## 4. guacamole-server（guacd）インストール

RDP接続に利用するguacdをインストールします。

```bash
# パッケージインストール
yum -y groupinstall "Development Tools"
yum -y install epel-release

cd /opt
wget https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
rpm -ivh rpmfusion-free-release-7.noarch.rpm

# guacamoleに必要なパッケージインストール
yum install ffmpeg ffmpeg-devel openssl openssl-devel vim \
libxkbfile-devel libX11-devel libXrandr-devel libXi-devel libXrender-devel \
libXext-devel libXinerama-devel libXfixes-devel libXcursor-devel libXv-devel \
libXdamage-devel libXtst-devel cups-devel cairo-devel pcsc-lite-devel \
uuid-devel libxml2-devel zlib-devel krb5-devel libtiff-devel libtiff-devel \
libjpeg-turbo-devel.x86_64 giflib-devel.x86_64 wget cmake libusbx-devel.x86_64 \
pulseaudio-libs-devel docbook-style-xsl.noarch pango-devel.x86_64 libvorbis-devel.x86_64 \
libwebsockets-devel.x86_64 libssh2-devel.x86_64 libwebp libwebp-devel freerdp freerdp-devel

# guacamole-server インストール
wget https://github.com/apache/guacamole-server/archive/refs/tags/1.4.0.tar.gz
tar zxvf 1.4.0.tar.gz
mv guacamole-server-1.4.0 guacamole-server
rm -rf 1.4.0.tar.gz

cd guacamole-server
autoreconf -fi
./configure --with-systemd-dir=/usr/lib/systemd/system
make
make install
ldconfig
```

## 5. guacamole-clientインストール

guacamole-1.4.0.warファイル生成します。

```bash
cd ..
wget https://github.com/apache/guacamole-client/archive/refs/tags/1.4.0.tar.gz
tar zxvf 1.4.0.tar.gz
mv guacamole-client-1.4.0 guacamole-client
rm -rf 1.4.0.tar.gz

cd guacamole-client

mvn package

cd ..
```

tomcatのconfファイルと起動スクリプトを作成します。 

```bash
vim /etc/tomcat/tomcat.conf
TOMCAT_CFG_LOADED="1"
TOMCAT_BASE="/var/lib/tomcats"
JAVA_HOME="/usr/lib/jvm/jre"
CATALINA_HOME="/usr/share/tomcat"
CATALINA_TMPDIR="/var/cache/tomcat/temp"
:wq

vim /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/tomcat/tomcat.conf
ExecStart=/usr/libexec/tomcat/startup.sh
ExecStop=/usr/libexec/tomcat/shutdown.sh

[Install]
WantedBy=multi-user.target
:wq

chmod 755 /etc/systemd/system/tomcat.service
systemctl enable tomcat
```

## 6. Nginxインストール

Nginxをパッケージからインストールします。

```bash
yum -y install nginx
```

## 7. Mariadbインストール

ワカモレで利用するDBとしてMariaDBをインストールします。

```bash
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
yum -y install MariaDB-server
```

## 8. mysql-connecotr-javaダウンロードおよび各種設定

ワカモレ～DB間で利用するコネクターをダウンロードします。

```bash
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.23.tar.gz
tar zxvf mysql-connector-java-8.0.23.tar.gz
rm -rf mysql-connector-java-8.0.23.tar.gz
cd /opt/mysql-connector-java-8.0.23
```

Guacamole関連ファイルを格納するディレクトリを作成しファイルをコピーします。

```bash
mkdir -p /var/lib/guacamole/{lib,extensions}

cp mysql-connector-java-8.0.23.jar /var/lib/guacamole/lib/
cp /opt/guacamole-client/guacamole/target/guacamole-1.4.0.war /var/lib/guacamole/guacamole-1.4.0.war

cp /opt/guacamole-client/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/target/guacamole-auth-jdbc-mysql-1.4.0.jar /var/lib/guacamole/extensions/
```

## 9. SeLinux/権限変更

SeLinuxおよび権限を変更します。

```bash
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_relay 1
setsebool -P httpd_can_network_connect_db 1

semanage fcontext -a -t tomcat_exec_t /var/lib/guacamole/guacamole-1.4.0.war
restorecon -v /var/lib/guacamole/guacamole-1.4.0.war

semanage fcontext -a -t tomcat_exec_t /var/lib/guacamole/lib/mysql-connector-java-8.0.23.jar
restorecon -v /var/lib/guacamole/lib/mysql-connector-java-8.0.23.jar

semanage fcontext -a -t tomcat_exec_t /var/lib/guacamole/extensions/guacamole-auth-jdbc-mysql-1.4.0.jar
restorecon -v /var/lib/guacamole/extensions/guacamole-auth-jdbc-mysql-1.4.0.jar

# 権限変更
chown tomcat:tomcat /var/lib/guacamole/guacamole-1.4.0.war
chown -R tomcat:tomcat /var/lib/guacamole/extensions
chown -R tomcat:tomcat /var/lib/guacamole/lib
```

## 10. ワカモレ用設定

```bash
# ディレクトリ作成 & リンク作成
mkdir /etc/guacamole
cd /etc/guacamole

ln -s /var/lib/guacamole/lib lib
ln -s /var/lib/guacamole/extensions extensions

# warファイル配置
cd /usr/share/tomcat/webapps/
ln -s /var/lib/guacamole/guacamole-1.4.0.war guacamole.war
rm -rf ROOT docs examples manager host-manager

# MariaDB起動
systemctl enable mariadb
systemctl start mariadb
systemctl status mariadb

# パスワード設定
mysql -u root
set password for root@localhost = password('XXXXXXXX');

# DB作成
create database guacamole;
grant select,insert,update,delete on guacamole.* to 'guacamole'@'localhost' identified by 'abcd1234';
flush privileges;

# sql実行
cd /opt/guacamole-client/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql
cat schema/*.sql | mysql -u root -p guacamole

# guacamole.propertiesファイル作成
vi /etc/guacamole/guacamole.properties
guacd-hostname: localhost
guacd-port:     4822

mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole
mysql-username: guacamole
mysql-password: abcd1234
:wq

chown tomcat:tomcat /etc/guacamole/guacamole.properties
```

## 11. ワカモレ起動

```bash
systemctl start tomcat
systemctl start guacd
systemctl enable guacd
```

## 12. Nginx設定変更

```bash
vim /etc/nginx/nginx.conf

        location / {
        root   html;
        index  index.html index.htm;
        proxy_pass http://localhost:8080/guacamole/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        }
:wq

nginx -t
systemctl restart nginx
```

## 13. Nginx 自己証明書設定

Chromeなどでマイクを利用する場合はhttpだとブロックされてしまうので、こちらは必要に応じて。

```bash
mkdir /etc/nginx/ssl
openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key

chown nginx:nginx -R /etc/nginx/ssl/
chmod 600 /etc/nginx/ssl/*
chmod 700 /etc/nginx/ssl

vim /etc/nginx/nginx.conf
server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  _;
        root         /usr/share/nginx/html;
        ssl_certificate /etc/nginx/ssl/nginx.pem;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;
            location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://localhost:8080/guacamole/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            }
        }
:wq
```

## 14. ワカモレアクセス

ブラウザからワカモレにアクセスします。
https://*ipaddress*/ 

管理ユーザのguacadminでログインします。（パスワードもguacadmin）
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/7a5cb0d4-aaad-9e79-454e-f8b282ac1d5a.png">


接続設定の項目などは増えていましたが、UIはあまり変更なしですね。下記画面はすでにWindows11に接続設定を保存した状態です。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/0ca10023-1eb7-21d7-bb5f-985e5dc537d1.png">

なぜかWindows11ではNLAでの認証が成功しなかったため、TLSに変更しています。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/8ffc0199-1a88-f59e-68a8-4595b92907b1.png">


無事ログインできました！
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/67d32ed8-ca98-3ba5-2c2f-66504da02d1b.png">


## 15. その他

体感でしかありませんが、1.2.0まではZoomなど音声のやり取りは実用に耐えがたいものがありましたが、かなり改善されています。Zoomでの利用でしたが全くストレスを感じませんでした。下記リリースノートに修正点の記載がある通りといった感じですかね。

https://guacamole.apache.org/releases/1.4.0/
##### ※ Major fixes to RDP audio input support 　

また、1.2.0でもありましたが初回アクセス時に/usr/sbinへの書き込み権がないとRDP接続ができないため、一時的書き込み権限を付与する必要があります。※２回目以降は必要になりませんので、もとに戻しておくことをお忘れなく。

## 1/4 追記 
年末に騒ぎになったLog4jですが、ワカモレはMybatis3を利用しており、そのなかでLog4jを利用していますが2.17.1が利用されるよう修正さているようです。

```xml
guacamole-client-1.4.0/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base
<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>

mybatis-3/pom.xml
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.17.1</version>
  <optional>true</optional>
</dependency>
```