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) → 設定 → ユーザ設定 → パスワード変更 から変更できる。