Apache GuacamoleでVPC内のWindowsにブラウザからRDP接続してみた(前編)

2017.12.22

はじめに

こんにちは、最近は真冬日続きで肩こりが辛い佐々木です。

今回は前から気になっていたApache Guacamoleに触ってみました。

Apache Guacamoleとは

Apache Guacamoleはブラウザベースのリモートデスクトップクライアントです。 HTML5対応のブラウザからリモートのコンピューターにRDP、VNC、SSHなどのプロトコルで接続し操作することができます。

アーキテクチャ

Guacamoleは下記のようなアーキテクチャになっています。(図は公式サイトより引用)

  • servlet container : ブラウザからのアクセスを受け付けてguacdを経由してリモートデスクトップセッションを作成します
  • guacd: リモートのコンピューターとのRDPやVNCのセッションを担当するプロセスです
  • (mysql or postgresql): 図中にはないのですが、接続情報や、認証情報などを保存するために使用します

AWS上で使うならこんな感じ

Guacamoleのことを知った時すぐに下記のようなアーキテクチャが思いつきました。

ELB経由でGuacamole Serverにアクセスすることで、次のメリットがあります。

  • リモートデスクトップ先のインスタンスをプライベートなサブネットに配置できる
  • RDP GatewayやSSHトンネリングが必要ない、一度設定してしまえばブラウザからアクセスできる
  • Certificate ManagerのSSL証明書を使えば安全にアクセスできる

メンテナンス対象のWindowsサーバが多いけれどインターネットアクセスはさせたくない、しかしRDPゲートウェイを構築するのは面倒という場合にマッチするのではないでしょうか。

環境構築

ではこの構成で環境構築してみます。下記の手順の一部についてざっくり説明していきます。 (なお接続先としてWindows Server 2012 R2インスタンスが構築済みの前提です)

  • ec2インスタンス(Amazon Linux)上のdockerサーバとdocker-composeをインストールする
  • Guacamole Serverを起動する
  • ALBを構成する

docker/docker-composeのインストール

公式ドキュメントや他のwebサイトで紹介されている手順で問題なくインストールできます。 今回使用したコマンドを掲載しておきます。

# dockerをインストール
sudo yum -y update
sudo yum -y install docker
sudo chkconfig docker on
sudo service docker start
# ec2-userでもdockerコマンドを実行可能にする
sudo usermod -a -G docker ec2-user
# docker-composeをインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Guacamole Serverを起動する

Guacamole ServerはDocker Composeを使って起動します。下記のファイルを作成します 使用している各イメージの詳細はGuacamoleのドキュメントおよびmysqlのドキュメントを参照してください

docker-compose.yml
.env
mysql/data # mysqlのデータファイル保存ディレクトリ
mysql/init/initdb.sql #データベース初期化スクリプト

docker-compose.yml

version: "3"
services:
  guacd:
  image: guacamole/guacd:latest
  expose:
  - "4822"
  guacamole:
  image: guacamole/guacamole:latest
  ports:
  - "8080:8080"
  environment:
  - MYSQL_HOSTNAME=mysql
  - GUACD_HOSTNAME=guacd
  env_file: .env

  mysql:
  image: mysql/mysql-server:5.7
  volumes:
  - "./mysql/data:/var/lib/mysql"
  - "./mysql/init:/docker-entrypoint-initdb.d"
  expose:
  - "3306"
  ports:
  - "3306:3306"
  env_file: .env

.env

MYSQL_DATABASE=guachamole
MYSQL_USER=guachamole
MYSQL_PASSWORD=guachamole

envファイル内のDB、ユーザー名、パスワードは任意のものに変更してください。

initdb.sql

initdb.sqlファイルは下記のコマンドで生成できます(生成済みのものもgistに貼っておきました)

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

起動する

ファイルが揃ったら一旦guacamoleを起動してみましょう。起動後にdocker-compose psで状態を確認します。StateがUpになっていれば起動中です。 ちなみにdocker-compose logsで各コンテナのメッセージ出力を表示できるので問題があるときに参照しましょう。

docker-compose up -d
docker-compose ps
  Name Command State Ports
---------------------------------------------------------------------------------------------------
guachamole_guacamole_1 /opt/guacamole/bin/start.sh Up 0.0.0.0:8080->8080/tcp
guachamole_guacd_1 /usr/local/sbin/guacd -b 0 ... Up 4822/tcp
guachamole_mysql_1 /entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp

ALBを構成する

下記の設定でALBを構成します。ターゲットとしてGuacamole Serverを指定します。

ターゲットグループ

プロトコル: HTTP
ポート: 8080
維持設定(sticky session): 有効
ヘルスチェックプロトコル: HTTP
ヘルスチェックポート: トラフィックポート
ヘルスチェックパス: /guacamole

ロードバランサー

リスナー: HTTPS:443 -> 上記のターゲットグループ(8080)

動作確認

ここまで済んだらブラウザからGuacamoleにアクセスしてみましょう。 ALBのDNS名に下記のようにguacamoleというパスを加えます。

https://XXXXXXX.ap-northeast-1.elb.amazonaws.com/guacamole

図のようなログイン画面が表示され、下記のアカウントでログインできれば動作確認は完了です。

ユーザー名: guacadmin
パスワード: guacadmin

長くなってきたので今回はここまでにします。 次回はRDPでWindowsインスタンスに接続してみます。