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

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

はじめに

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

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

Apache Guacamoleとは

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

アーキテクチャ

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

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

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

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

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/guachamole_on_aws-320×180.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/guachamole_on_aws-768×432.png 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/guachamole_on_aws-960×540.png 960w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/guachamole_on_aws.png 1280w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

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サイトで紹介されている手順で問題なくインストールできます。 今回使用したコマンドを掲載しておきます。

1

2

3

4

5

6

7

8

9

10

sudo yum -y update

sudo yum -y install docker

sudo chkconfig docker on

sudo service docker start

sudo usermod -a -G docker ec2-user

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のドキュメントを参照してください

1

2

3

4

docker-compose.yml

.env

mysql/data # mysqlのデータファイル保存ディレクトリ

mysql/init/initdb.sql #データベース初期化スクリプト

docker-compose.yml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

1

2

3

MYSQL_DATABASE=guachamole

MYSQL_USER=guachamole

MYSQL_PASSWORD=guachamole

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

initdb.sql

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

1

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

起動する

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

1

2

3

4

5

6

7

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というパスを加えます。

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

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

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login-320×200.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login-768×480.png 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login-960×600.png 960w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login.png 1280w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

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

はじめに

こんにちは。最近文庫本のカバーをハードカバーに付け替えるワークショップに参加してきました。 2時間ちょっとかかってなかなか大変だったのですが自分で選んだ紙や栞紐を使った本が出来上がったときにはとても嬉しかったです。

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/IMG_0362-320×427.jpg 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/IMG_0362-768×1024.jpg 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/IMG_0362-960×1280.jpg 960w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

さて前回の続きです。Guacamoleを使ってWindowsにリモートデスクトップ接続してみます。

Guacamoleにログインする

Guacamoleにログインします。ログイン画面のURLはALBのDNS名に下記のようにguacamoleというパスを加えます。

図のようなログイン画面が表示され、下記のアカウントでログインします。

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

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login-320×200.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login-768×480.png 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login-960×600.png 960w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/login.png 1280w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

コネクションの作成

ログイン後の画面の右側から「Settings」を選択し「Connections」タブを表示し、「Create Connection」から接続設定を作成します。

パラメータの設定

接続名、接続先のホスト名、ポート番号(3389)、ユーザー名、パスワードをなどを入力します。 ここで「Ignore server certificate」をチェックしないと証明書の検証エラーのため接続できませんでした。

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/02_parameters-320×228.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/02_parameters-768×546.png 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/02_parameters-960×683.png 960w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/02_parameters.png 1094w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

必要な情報を入力したら作成画面の下部にあるボタンで保存します。

保存するとリストに作成したコネクションが表示されます。

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/03_connection_created-320×191.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/03_connection_created-768×458.png 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/03_connection_created-960×573.png 960w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/03_connection_created.png 1254w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

接続してみる

コネクション作成時に使った右側のメニューに作成したコネクションが追加されています。メニューから選択するとRDPセッションが開始されます。

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/04_0_newconnection-320×320.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/04_0_newconnection-200×200.png 200w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/04_0_newconnection-400×400.png 400w” sizes=”(max-width: 458px) 100vw, 458px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/04_rdp_session-320×197.png 320w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/04_rdp_session-768×474.png 768w, cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/12/04_rdp_session-960×592.png 960w” sizes=”(max-width: 640px) 100vw, 640px” class=”” style=”max-width: 100%; margin: 0.5em auto; display: block; height: auto;”>

見慣れたデスクトップが表示されました!

はまったところ

今回実際にやってみてはまったところをまとめておきます。

  • コネクション作成時に「Ignore server certificate」をチェックしないと証明書の検証エラーが発生する
  • docker-composeでコンテナをフォアグラウンドで起動したときtmuxを使っているとログが正しく表示されない
  • 一度RDPセッションを開始した後ブラウザをリロードしたり、ログインすると設定画面ではなくRDPセッションが表示される
  • 上記の対策として設定画面を表示したい場合は/guacamole/#/settings/mysqlにアクセスする

最後に

2回に分けてApache GuacamoleをAWS上で構築する手順について紹介しました。

実際に運用するためには今回検討しなかった下記の点について考慮が必要でしょう。

  • Guacamoleのユーザー管理をAD連携で行いたい
  • Guacamoleの死活監視
  • MySQL/PostgresqlにコンテナではなくRDSを使う
  • Connectionにアカウント情報を保存せず、ユーザーに入力させる or SSOなどができないか検討する

9月ごろにApache Guacamoleのことを知ってから試してみようかなとずっと考えていたので、年内に触ることができてすっきりしました。