Apache Guacamole on CentOS 7

Linux

Apache Guacamole(ワカモレ)は、RDP、VNC、SSH、Telnet、Kubernetesのリモートアクセスのゲートウェイとして動作するオープンソースソフトウェア。

HTML5対応ブラウザがあれば利用できるのでリモートワーク環境整備に重宝する。クリップボードやファイル共有制御もでき、セッションの録画の機能、ペアプログラミングなどに使えるリアルタイムレビュー機能もあるのでセキュリティ、ガバナンス面でもRDP/SSHをそのまま使わせるより高い気がする(要評価)。

組織のプロキシが外部へのアクセスはHTTP(80/tcp)/HTTPS(443/tcp)しか許可していないケースもあるので開発環境が外にあるとAzure Bastionを踏まないとアクセスできなかったりしたが、それも解決できそう。

Guacamole Serverをインストール

EPELリポジトリにある。

sudo yum -y install guacd libguac libguac-client-rdp libguac-client-ssh
sudo systemctl start guacd
sudo systemctl enable guacd

Tomcatをインストール

tomcat-webappsを忘れずに。

sudo yum -y install java-latest-openjdk tomcat tomcat-webapps
sudo systemctl start tomcat
sudo systemctl enable tomcat

Guacamole Client WAR(Web Application Archive)をインストール

なぜかguacdパッケージに含まれていないし、別パッケージでも見つけられなかったのでプロジェクトサイトからダウンロードする。自動更新できないのでセキュリティ更新に注意

sudo mkdir -p /etc/guacamole/{lib,extensions}
curl -L https://apache.org/dyn/closer.lua/guacamole/1.3.0/binary/guacamole-1.3.0.war?action=download -o guacamole-1.3.0.war
sudo cp guacamole-1.3.0.war /var/lib/tomcat/webapps/guacamole.war

MariaDBをインストール

Guacamoleの認証に利用する。

sudo yum -y install mariadb-server
sudo cp -a /etc/my.cnf /etc/my.cnf.$(date '+%Y%m%d%H%M%S')
sudo \cp -f /usr/share/mysql/my-innodb-heavy-4G.cnf /etc/my.cnf
sudo cp -a /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf.$(date '+%Y%m%d%H%M%S')
sudo sed -i -e '/\[mysqld\]/acharacter-set-server = utf8\ncollation-server     = utf8_bin\nskip-character-set-client-handshake\ninnodb_file_per_table' /etc/my.cnf.d/server.cnf
sudo systemctl start mariadb
sudo systemctl enable mariadb
sudo /usr/bin/mysql_secure_installation
# Enter current password for root (enter for none): (BLANK)
# Set root password? [Y/n] y
# New password: (RootPassword)
# Re-enter new password: (RootPassword)
# Remove anonymous users? [Y/n] y
# Disallow root login remotely? [Y/n] y
# Remove test database and access to it? [Y/n] y
# Reload privilege tables now? [Y/n] y

MySQL認証拡張をインストール

GuacamoleからMariaDBに接続するためのGuacamoleのMySQL認証拡張、MySQL用JDBCドライバをインストールする。CentOS 7付属のmysql-connector-javaでは動かなかったまた、データベース情報の設定。どちらも自動更新できないのでセキュリティ更新に注意

curl -L https://apache.org/dyn/closer.lua/guacamole/1.3.0/binary/guacamole-auth-jdbc-1.3.0.tar.gz?action=download -o guacamole-auth-jdbc-1.3.0.tar.gz
tar zxf guacamole-auth-jdbc-1.3.0.tar.gz 
sudo cp guacamole-auth-jdbc-1.3.0/mysql/guacamole-auth-jdbc-mysql-1.3.0.jar /etc/guacamole/extensions/
curl -LO https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.25.tar.gz
tar zxf mysql-connector-java-8.0.25.tar.gz
sudo cp mysql-connector-java-8.0.25/mysql-connector-java-8.0.25.jar /etc/guacamole/lib/

認証データベースの作成と設定

guacamole_password=$(mkpasswd -l 24 -s 0)
echo "${guacamole_password}"  # guacamole_passwordパスワードを表示
mysql -u root -p << EOF
create database guacamole_db character set utf8 collate utf8_bin;
grant all on guacamole_db.* to 'guacamole_user'@'localhost' identified by '${guacamole_password}';
EOF
# Enter password: (RootPassword)
cat guacamole-auth-jdbc-1.3.0/mysql/schema/001-create-schema.sql | mysql -u guacamole_user -p"${guacamole_password}" guacamole_db
cat guacamole-auth-jdbc-1.3.0/mysql/schema/002-create-admin-user.sql | mysql -u guacamole_user -p"${guacamole_password}" guacamole_db
sudo tee /etc/guacamole/guacamole.properties << EOF
guacd-hostname: localhost
guacd-port: 4822
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: ${guacamole_password}
EOF

ワンタイムパスワード拡張をインストール

Google Authenticatorなどを使った二要素認証を使えるようにする。

curl -L https://apache.org/dyn/closer.lua/guacamole/1.3.0/binary/guacamole-auth-totp-1.3.0.tar.gz?action=download -o guacamole-auth-totp-1.3.0.tar.gz
tar zxf guacamole-auth-totp-1.3.0.tar.gz
sudo cp guacamole-auth-totp-1.3.0/guacamole-auth-totp-1.3.0.jar /etc/guacamole/extensions/

Tomcatを再起動

Guacamoleの設定を変更したり、拡張を追加したりした場合はTomcatの再起動が必要。

sudo systemctl restart tomcat

Apache(httpd)をインストール

Tomcatは8080/tcpでHTTPとしてリッスンしている。443/tcpでHTTPSでリッスンするために、使い慣れたApacheをリバースプロキシとして利用する。

サーバ証明書の取得と設定はこの手順では行っていないのが、Let’s Encryptなどからサーバ証明書を取得することを推奨。この手順でChromeからアクセスすると「thisisunsafe」のチートコードが必要になる。

sudo yum -y install httpd mod_ssl
sudo cp -a /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date '+%Y%m%d%H%M%S')
sudo sed -i \
  -e '/^Listen 80$/s/^/#/' \
  -e 's/^ServerAdmin root@localhost$/ServerAdmin SBMGRP-digitize@g.softbank.co.jp/' \
  -e '/ScriptAlias \/cgi-bin\/ "\/var\/www\/cgi-bin\/"$/s/^/#/' \
  -e '/^<Directory "\/var\/www\/cgi-bin">$/,/^<\/Directory>$/s/^/#/' \
  /etc/httpd/conf/httpd.conf
# バージョン隠し
sudo tee -a /etc/httpd/conf/httpd.conf << 'EOF'

ServerTokens Prod
ServerSignature Off
TraceEnable Off
EOF
# デフォルト設定を無効化
sudo cp -a /etc/httpd/conf.modules.d/00-base.conf /etc/httpd/conf.modules.d/00-base.conf.$(date '+%Y%m%d%H%M%S')
sudo sed -i \
  -e '/^LoadModule /s/^/#/' \
  -e '/LoadModule alias_module /s/^#//' \
  -e '/LoadModule auth_basic_module /s/^#//' \
  -e '/LoadModule authn_core_module /s/^#//' \
  -e '/LoadModule authn_file_module /s/^#//' \
  -e '/LoadModule authz_core_module /s/^#//' \
  -e '/LoadModule authz_host_module /s/^#//' \
  -e '/LoadModule authz_user_module /s/^#//' \
  -e '/LoadModule autoindex_module /s/^#//' \
  -e '/LoadModule deflate_module /s/^#//' \
  -e '/LoadModule dir_module /s/^#//' \
  -e '/LoadModule filter_module /s/^#//' \
  -e '/LoadModule headers_module /s/^#//' \
  -e '/LoadModule log_config_module /s/^#//' \
  -e '/LoadModule mime_module /s/^#//' \
  -e '/LoadModule negotiation_module /s/^#//' \
  -e '/LoadModule rewrite_module /s/^#//' \
  -e '/LoadModule setenvif_module /s/^#//' \
  -e '/LoadModule socache_shmcb_module /s/^#//' \
  -e '/LoadModule substitute_module /s/^#//' \
  -e '/LoadModule unixd_module /s/^#//' \
  -e '/LoadModule access_compat_module /s/^#//' \
  -e '/LoadModule slotmem_shm_module /s/^#//' \
  /etc/httpd/conf.modules.d/00-base.conf

# Orderにaccess_combatが必要
# ProxyPassにslotmem_shm_moduleが必要
sudo cp -a /etc/httpd/conf.modules.d/00-dav.conf /etc/httpd/conf.modules.d/00-dav.conf.$(date '+%Y%m%d%H%M%S')
echo | sudo tee /etc/httpd/conf.modules.d/00-dav.conf
sudo cp -a /etc/httpd/conf.modules.d/00-lua.conf /etc/httpd/conf.modules.d/00-lua.conf.$(date '+%Y%m%d%H%M%S')
echo | sudo tee /etc/httpd/conf.modules.d/00-lua.conf
sudo cp -a /etc/httpd/conf.modules.d/01-cgi.conf /etc/httpd/conf.modules.d/01-cgi.conf.$(date '+%Y%m%d%H%M%S')
echo | sudo tee /etc/httpd/conf.modules.d/01-cgi.conf
sudo cp -a /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/autoindex.conf.$(date '+%Y%m%d%H%M%S')
echo | sudo tee /etc/httpd/conf.d/autoindex.conf
sudo cp -a /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/userdir.conf.$(date '+%Y%m%d%H%M%S')
echo | sudo tee /etc/httpd/conf.d/userdir.conf
sudo cp -a /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.$(date '+%Y%m%d%H%M%S')
echo | sudo tee /etc/httpd/conf.d/welcome.conf
sudo mv /var/www/cgi-bin /var/www/cgi-bin.orig
# 圧縮通信の設定
sudo tee /etc/httpd/conf.d/deflate.conf << 'EOF'
<Location />
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/x-js text/css
</Location>
EOF
sudo tee /etc/httpd/conf.d/guacamole.conf << 'EOF'
<Location /guacamole/>
    Order allow,deny
    Allow from all
    ProxyPass http://localhost:8080/guacamole/ flushpackets=on
    ProxyPassReverse http://localhost:8080/guacamole/
</Location>
<Location /guacamole/websocket-tunnel>
    Order allow,deny
    Allow from all
    ProxyPass ws://localhost:8080/guacamole/websocket-tunnel
    ProxyPassReverse ws://localhost:8080/guacamole/websocket-tunnel
</Location>
EOF
sudo systemctl start httpd
sudo systemctl enable httpd

ファイアウォール(iptables)の設定

HTTPS 443/tcpから入ってこれるようにするのと、SSH 22/tcp、RDP 443/tcpから出ていけるようにする。ポート番号を変更している場合は変更または追加すること。

sudo cp -a /etc/sysconfig/iptables
 /etc/sysconfig/iptables
.$(date '+%Y%m%d%H%M%S')
sudo vi /etc/sysconfig/iptables
+:IN-HTTP - [0:0]
+:OUT-GUAC - [0:0]
+-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j IN-HTTP
+-A OUTPUT -m state --state NEW -m tcp -p tcp --dport 22 -j OUT-GUAC
+-A OUTPUT -m state --state NEW -m tcp -p tcp --dport 3389 -j OUT-GUAC
+### IN-HTTP
+-A IN-HTTP -s (接続元IPアドレス) -j ACCEPT
+-A IN-HTTP -j DROP
+### OUT-GUAC
+-A OUT-GUAC -d 192.168.0.0/24 -j ACCEPT
+-A OUT-GUAC -j RESET

日本語フォントのインストール

SSHコンソールで日本語を表示するためには日本語の等幅フォントが必要。インストール後にTomcatのインストールが必要。

curl -L https://github.com/edihbrandon/RictyDiminished/archive/refs/heads/master.zip -o RictyDiminished.zip
mkdir RictyDiminished
unzip RictyDiminished.zip -d RictyDiminished
sudo mkdir /usr/share/fonts/RictyDiminished
sudo cp RictyDiminished/RictyDiminished-master/*.ttf /usr/share/fonts/RictyDiminished/
sudo fc-cache -f
sudo systemctl restart tomcat

Guacamoleに接続

https://(IPアドレス)/guacamole/ から接続できる。初期ユーザ名 guacadmin 、初期パスワード guacadmin で入れる。ユーザ名とパスワードが認証できると、ワンタイムパスワードの設定になるのでGoogle Authenticatorなどで設定する。

デフォルトパスワードは必ず変更すること。右上アカウント名(guacadmin) → 設定 → ユーザ設定 → パスワード変更 から変更できる。

タイトルとURLをコピーしました