Apache Guacamole: ウェブブラウザからリモートデスクトップ接続するための踏み台
はじめに
個人的に愛用しているApache Guacamoleの導入メモを記します (今後の自分が再構築する時用のメモでもある)。Apache Guacamole (以下、Guacamoleと表記) とは、ウェブブラウザを介してリモートデスクトップ接続 (RDP), VNC接続, SSH接続などを行えるようにしてくれる便利なソフトウェアです。マシン操作や管理のための接続環境を一カ所にまとめておくことができますし、どの接続方法を用いるにしても操作する側に必要なのはウェブブラウザのみとなります。
Guacamole導入の方針としては、gihyo.jpの次の記事 (公開日: 2020-04-01) を基本的に参考にして最小構成を用意しつつ、Guacamoleの動作に用いるDockerはRootless modeでセットアップする、というアレンジを加えることにします。
なお、Guacamole上のユーザ管理を行ったり、リバースプロキシを別途用意してGuacamoleへHTTPS接続できるようにすると、より実用性が高まりますが今回は省略します。
Guacamole導入手順
Apache Guacamoleを導入するサーバとして、今回はUbuntu Server 22.04.3 LTS (Jammy Jellyfish) を想定します。また、以降の手順で導入されるDocker EngineとApache Guacamoleのバージョンは記事執筆時点で次の表のようになります。
ソフトウェア | バージョン | 備考 |
---|---|---|
Docker Engine | 24.0.6 | 2023-10-22時点 |
Apache Guacamole | 1.5.3 | 2023-10-22時点 |
Step-1. Dockerの導入
- Ubuntu Serverを1台セットアップします
- Install Docker Engine on Ubuntu | Docker Docs > Install using the convenience script を参考に、Dockerをインストールします
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh ./get-docker.sh --dry-run $ sudo sh ./get-docker.sh
- 上記get-docker.sh実行完了後に表示される https://docs.docker.com/go/rootless/ のリダイレクト先 Run the Docker daemon as a non-root user (Rootless mode) | Docker Docs を参考に、Rootless modeの設定を行います
- Prerequisitesの確認
$ id -u 1000 $ whoami testuser $ grep ^$(whoami): /etc/subuid testuser:100000:65536 $ grep ^$(whoami): /etc/subgid testuser:100000:65536
- Distribution-specific hintの実施 > Ubuntu
$ sudo apt-get install -y dbus-user-session # →今回の環境にはすでに導入済みだった
- Installの実行
$ which dockerd-rootless-setuptool.sh /usr/bin/dockerd-rootless-setuptool.sh $ dockerd-rootless-setuptool.sh install # →uidmapが導入されていない旨が表示された $ sudo apt-get install -y uidmap $ dockerd-rootless-setuptool.sh install (省略) [INFO] Make sure the following environment variable(s) are set (or add them to ~/.bashrc): export PATH=/usr/bin:$PATH [INFO] Some applications may require the following environment variable too: export DOCKER_HOST=unix:///run/user/1000/docker.sock
- Prerequisitesの確認
- 上記の出力メッセージにしたがって
~/.bashrc
の末尾に「export 〜
」を2行追加します$ vim ~/.bashrc $ tail -n 3 ~/.bashrc # CUSTOM export PATH=/usr/bin:$PATH export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
Step-2. Dockerの追加設定
上記手順でDockerをRootless modeで導入してそのままのデフォルト状態ですと、当該ユーザのセッションが存在している間のみDockerが実行される状態です (例: 当該ユーザがSSHログインしている間)。
今回の用途のように当該ユーザのセッション状態に関係なく、Guacamoleを常時サービスするためには、systemd/User - ArchWiki > Automatic start-up of systemd user instances を参考に、次の1の追加設定が必要です。
- systemdのユーザインスタンスの自動起動を設定します
$ loginctl enable-linger
- サーバを再起動します
- サーバ起動後、しばらくしてから最初に次のコマンドを実行し、「Active:」行の時間を読み取ると、ユーザのSSHログイン関係なく、サーバ起動直後からdocker.serviceが起動していることが分かります
$ ssh -l testuser <サーバのIPアドレス> 'systemctl --user status docker.service'
Step-3. Guacamoleをdocker composeで導入
第613回 Apache Guacamoleを使ってWebブラウザからWindows 10にリモート接続する | gihyo.jp を参考にしていきます。
- サーバへ再びログインします
- Guacamoleの関連ファイルを保存するディレクトリを作成してcdします
$ mkdir -p ~/docker/guacamole/ $ cd ~/docker/guacamole/
- 参考ページの Apache Guacamoleのセットアップ に記載されている内容でdocker-compose.ymlを作成します (
MYSQL_ROOT_PASSWORD
(1箇所) とMYSQL_PASSWORD
(2箇所) の値を任意のパスワード文字列へ変更すること)$ vim docker-compose.yml
# Ref: https://gihyo.jp/admin/serial/01/ubuntu-recipe/0613#sec2 version: "3" services: guacd: container_name: my-guacd image: guacamole/guacd restart: always guacamole_db: container_name: my-guacamole-db image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: guacamole_root_password # NEED TO CHANGE MYSQL_DATABASE: guacamole_db MYSQL_USER: guacamole_user MYSQL_PASSWORD: guacamole_user_password # NEED TO CHANGE volumes: - ./dbdata:/var/lib/mysql - ./dbinit:/docker-entrypoint-initdb.d guacamole: container_name: my-guacamole image: guacamole/guacamole restart: always environment: GUACD_HOSTNAME: my-guacd MYSQL_HOSTNAME: my-guacamole-db MYSQL_DATABASE: guacamole_db MYSQL_USER: guacamole_user MYSQL_PASSWORD: guacamole_user_password # NEED TO CHANGE GUACAMOLE_HOME: /guacamole-home volumes: - ./home:/guacamole-home depends_on: - guacamole_db - guacd ports: - "8080:8080"
- 必要なディレクトリを作成し、データベースの初期化スクリプトを準備します
$ mkdir -p dbdata dbinit home/extensions $ docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > ./dbinit/initdb.sql
- 次のコマンドを実行すると、docker-compose.ymlの内容にしたがってGuacamoleが起動してきます
$ docker compose up -d (省略) ✔ Network guacamole_default Created ✔ Container my-guacamole-db Started ✔ Container my-guacd Started ✔ Container my-guacamole Started
Step-4. GuacamoleでRDPアクセス
- お手元のウェブブラウザで http://サーバのIPアドレス:8080/guacamole/ を開いてログインします
- Guacamole管理者のユーザ名は「guacadmin」で、初期パスワードは「guacadmin」です
- たとえばリモートデスクトップ接続可能なWindows 10 ProマシンへRDP接続する設定を行う場合、ページ右上の [guacadmin ▼] > [設定] > [接続] > [接続の追加] で次の接続情報を入力し、最後にページ最下部にある [保存] ボタンを押します
- 接続の編集
- 名前 = たとえば「Win10」
- プロトコル = 「RDP」
- パラメータ
- ネットワーク > ホスト名 = 「WindowsマシンのIPアドレス」
- 認証 > ユーザ名 = 「Windowsのユーザ名」, パスワード: 「当該ユーザのパスワード」
- サーバ証明書を無視する = チェックする
- (個人的な推奨) ディスプレイ > サイズ変更方法 = 「“ディスプレイアップデート” 仮想チャンネル (RDP 8.1+)」
- (個人的な推奨) パフォーマンス > クリアタイプフォントの有効化 = チェックする
- 接続の編集
- 「Win10」へ接続するために、ページ右上の [guacadmin ▼] > [ホーム] > [Win10] をクリックします
- ウェブブラウザを介してWindows 10のデスクトップを操作できます (全画面表示も可能)
- Ctrl+Alt+Shift (Macだと Control+Option+Shift) を押すことでGuacamoleのメニューを表示でき、接続の切断等が行えます
Step-5. (おまけ) GuacamoleでSSHアクセス
- RDP接続と同様に、SSH接続をひとつ作成します
- 作成したSSH接続を実施すると、ウェブブラウザ画面をターミナルとして接続先へアクセスできます
感想
今回の導入手順のメモの分量からも分かるように、Dockerの導入手順はまあまあの量がありますが、Dockerを用いたApache Guacamoleの導入自体は少ない手順で行うことができました。複数のマシンが色々と存在する一般のご家庭や業務の場に、接続環境を一元化できるGuacamoleをひとつセットアップしておくと便利に使えるのではないでしょうか。踏み台として用途に合うならとてもおすすめです。ちなみにGuacamoleでは、操作ログの保存 (スクリーンレコーディング) や、認証方法として二要素認証を取り込むこともできるようです。
- Viewing session recordings in-browser — Apache Guacamole Manual v1.5.3
- TOTP two-factor authentication — Apache Guacamole Manual v1.5.3
そして最後に重要なことを書きます。今回の記事執筆時に初めて気づいたこととして、guacamoleは「ワカモレ」と読むのだそうです。私は何年間も職場などでGuacamoleの布教に勤しんできたのに発音を間違って読んでいたらしい……。orz