Ubuntu Weekly Recipe

第613回Apache Guacamoleを使ってWebブラウザからWindows 10にリモート接続する

新型コロナウイルスの広がりにより、自宅勤務となる人が増えています。

さらに事態が悪化すれば、他国のように緊急事態宣言が出されるかもしれず、そうなれば多くの人が職場に向かうことも難しくなるでしょう。そうなる前に、職場の各PCに外部からアクセスできるようにしておきたいという人も多いのではないでしょうか。

そこで、今回は「Webブラウザーからリモートデスクトップを使う」ためのソフトウェアApache GuacamoleをUbuntuサーバーにセットアップする手順を紹介します。Apache Guacamoleは、Windowsのリモートデスクトッププロトコル(RDP)およびVNCに対応しています。また、GUIだけでなくSSHおよびTelnetサーバーへのアクセスを中継する機能も持ちます。

図1 Apache Guacamoleのドキュメントより
画像

Apache Guacamoleのメリットの1つは、アクセス元およびアクセス先の端末に特別なソフトをインストールする必要がないことです。すでにLAN内の各PCがリモートデスクトップ接続できるなら、何も変更する必要はありません。同じLANにApache Guacamoleをセットアップしたサーバーを用意し、外部からアクセスできるようにするだけで、インターネット経由でリモート操作できるようになります。また、Webブラウザーさえあればアクセスできるので、アクセス元となるPCやスマートフォンにも特別なアプリのインストールや設定の変更は不要です。

それだけでなく、LDAP認証への対応、動画ファイルへの操作の記録、TOTP(タイムベースワンタイムパスワード)認証など、企業向けの機能も備えており、リモートワークシステムにも採用されていることも大きな特徴です。個人から大企業まで、用途に応じてさまざまな活用法が考えられるソフトだと言えるでしょう。

Apache GuacamoleのDockerイメージと日本語対応

Apache Guacamoleのサーバー部は、グラフィックや動画、音声などを扱う多くのライブラリを必要とします。また、Webアプリ部分を動かすApache Tomcatや、ユーザー情報や設定を保存するMySQLなどのデータベースも必要です。そのため、自分で1からセットアップするのは大変ですが、公式のDockerイメージを使えば、簡単にインストールできます。

ただし、本記事執筆時点での最新リリースバージョンは1.1.0で、Webアプリ部分が日本語に対応していません。株式会社デージーネットさんが日本語訳をコミットされているのですが、反映されるのは1.2.0以降となるようです。

そこで、筆者のほうで日本語パッチを適用したDockerイメージをDocker Hubに用意しましたので、そちらを使ってセットアップする方法を紹介します。1.2.0がリリースされた後は、公式のDockerイメージに切り替えていただければと思います。

「日本語に対応したApache Guacamole 1.2.0がリリースされましたので、内容を修正しました(2020年10月4日⁠⁠。

Apache Guacamoleのセットアップ

では、Dockerを使ったセットアップ方法を紹介します。まず、Dockerがインストールされていなければ、インストールしておきます。Ubuntuへのインストール方法は、公式のドキュメントに記載されています。最新版を入れるなら、以下のスクリプトをダウンロードして実行する方法が簡単で良いでしょう。ただし、実行する前にget-docker.shの内容を確認するようにしてください。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

一般ユーザーで作業するなら、以下のコマンドでdockerグループに加えておきます。

$ sudo usermod -aG docker $USER

実行後、ログインしなおしましょう。

この記事ではdocker-composeも用います。公式のドキュメントに記載されている通り、以下のコマンドでインストールできます。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

なお、筆者はUbuntuサーバーを使用していますが、Dockerが動きさえすれば他の環境でも同じようにセットアップできると思われます。Windowsしかない環境であれば、既存のPCにDocker Desktop for Windowsをインストールして動かせば、サーバーをセットアップする手間を省けるでしょう。

では、Apache Guacamoleを配置するディレクトリを作成します。ここでは、作業するユーザーのホームディレクトリに「guacamole」ディレクトリを作成することにします。

$ mkdir guacamole
$ cd guacamole/

以下の内容で、⁠docker-compose.yml」を作成します。⁠guacamole_root_password」「guacamole_user_password」は、適切なパスワードに置き換えてください。

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

MySQLの初期化スクリプトを出力します。初回実行時は、イメージを取得するために時間がかかります。

$ docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > ./dbinit/initdb.sql

「docker-compose up -d」を実行すると、Apache Guacamoleが動き出します。

$ docker-compose up -d
Creating network "guacamole_default" with the default driver
Creating my-guacamole-db ... done
Creating my-guacd        ... done
Creating my-guacamole    ... done

Apache Guacamole経由でリモートデスクトップ接続

別のPCから「http://Ubuntuサーバーのアドレス:8080/guacamole/」にアクセスしてみましょう。以下のような画面が表示されます。エラーが表示された場合は、起動が完了していないかもしれません。しばらく待ってからリロードしてください。

図2 Apache Guacamoleのログイン画面
画像

管理者アカウントとパスワードの初期値は、いずれも「guacadmin」です。

ログイン後、メニューから「設定」を選び、guacadminのパスワードを変更しておきましょう。また、普段使用するユーザーのアカウントを登録しましょう。

「設定⁠⁠→⁠接続⁠⁠→⁠接続の追加」を開いて、各プロトコルでの接続先を登録できます。ここでは、Windows 10へのリモートデスクトップを登録してみましょう。

分かりやすい名前を入力し、パラメーター部分に以下の例ように入力してください。Windows側でデフォルトの自己発行証明書を使用している場合、⁠サーバー証明書を無視する」にチェックが必要です。

図3 接続先の追加画面(一部)
画像

メニューから「ホーム」に戻り、追加した接続をクリックすると、ログインが実行されWebブラウザー内にWindows 10の画面が表示されます。

図4 Webブラウザ(Google Chrome)からApache Guacamole経由で別のWindows 10 Proにログインしたところ
画像

Ctrl+Shift+Altを押すと左サイドにパネルが開きます。切断する時は、このパネルからメニューを開いて「切断」を選択してください。

なお、UbuntuなどのLinuxデスクトップにxrdpを導入し、同じように接続することもできます。

図5 Webブラウザ(Google Chrome)からApache Guacamole経由でUbuntuにログインしたところ
画像

VNCにも対応していますが、本記事執筆時点において、Ubuntuデスクトップに標準で搭載されているvinoに接続しても、数秒で切れてしまうという問題があります。x11vncなら接続できますが、クリップボードの日本語が文字化けするという問題があるため、あまりお勧めはできません。

インターネット経由で接続する場合は、他のWebアプリと同様、HTTPSに対応させるべきでしょう。既に稼働しているHTTPS対応リバースプロキシがあれば、そちらからアクセスを割り振るのが簡単です。Apache Guacamoleが稼働しているサーバーをそのまま公開する場合は、nginx-proxyのDockerコンテナを、docker-compose.ymlに追加設定するのがお勧めです。

あるいは、少人数の開発者や管理者だけが使うなら、SSHによるポートフォワーディングやVPNを用いるという方法も考えられるでしょう。

おすすめ記事

記事・ニュース一覧