社内PCからRDP接続するために中継サーバ(Guacamole)をdockerコンテナで立ててみた


昨今の「社内PC」は管理者権限が与えられておらず、「ブラウザ」、「メール」、「Office」の3つだけという環境が標準だったりします。ダディ伯爵の貸与されている社内PCも同様で、プロキシサーバによるサイト閲覧制限のおまけつき。
そのような制限が厳しくなった「社内PC」からでも、お手軽にRDP接続、VNC接続、SSH接続が出来る方法を簡単に作ることが出来ましたのでご紹介いたします。

注意まず初めに、誤解のないように書いておきますが、勤務時間中に業務外のことをするのが目的ではなく、インフラエンジニアとしての技術検証、コマンド確認、設定確認などをするのが目的です。 社内PCから業務外のことをして懲戒解雇されることのないよう、くれぐれもご注意ください。懲戒解雇されても、ダディ伯爵は一切の責任を負いませんので、悪しからず。 以下の記事を社内PCから実践する場合は、ご自身の責任の下で実施ください。

1.社内PCからRDP接続、VNC接続、SSH接続するための構成

ブラウザだけでリモート接続できるソフトとして「noVNC」や「ThinPC」等がありますが、いずれも接続したいサーバ側へインストールが必要となります。
ダディ伯爵が紹介する構成は、接続したいサーバ側へは何もインストールせずに「社内PC」と「接続したいサーバ」の間に「中継サーバ」を立てる構成となります。
簡単に書くと以下の通りです。

社内PC
 ↓
社内プロキシサーバー
 ↓
インターネット
 ↓
Guacamoleサーバ★
 ↓
接続したいサーバ★

ダディ伯爵は、★の2台を「Google Cloud Platform」の「Google Compute Engine」で構築することで実現しました。
以下に手順メモを残します。

2.Guacamoleサーバの構築手順

Apache Guacamole用のサーバを作ります。ダディ伯爵はdockerの勉強も兼ねてGCPの「Container-Optimized OS」を使ってみました。
CentOS等にパッケージインストールして構築される場合は、https://blog.intracker.net/archives/1163の記事が参考になるかと思います。
ダディ伯爵の一から構築する手順を途中まで頑張ってみましたが、Apache Guacamoleを動かすのに必要なパッケージが多く時間もかかるので断念しました。
後述の手順にある「コンテナ」を組み合わせるのが楽だと思います。

2-1.GCPのComputeEngineでVMインスタンスを作成する

「Google Cloud Platform」にログインし「Compute Engine」→「VMインスタンス」を開き「Guacamoleサーバ」のためのdocker環境の箱を作ります。

インスタンス名    instance-1(任意)
リージョン     asia-northeast2(大阪)※
ゾーン     asia-northeast2-a
マシンタイプ     vCPU×1、メモリ3.75GB
ブートディスク    Container-Optimized OS 74-11895.86.0 stable
           標準の永続ディスク10GB

その他はデフォルト

※早速、GCP大阪リージョンを使ってみました。

2-2.dockerイメージをダウンロードする

「Google Cloud Platform」から「Compute Engine」→「VMインスタンス」を開き、先ほど作成した「instance-1」にブラウザからSSH接続(※)します。
※この時点で「ブラウザからSSH接続」は実現出来てしまうのです。。はい。

dockerコマンドが使える環境が立ち上がるので、以下のコマンドを順に実行し4個のイメージがダウンロード出来たことを確認します。

docker images

docker pull guacamole/guacd
docker pull guacamole/guacamole
docker pull mysql
docker pull nginx

docker images

2-3.docker-compose初期設定

先ほどダウンロードした4個のイメージをまとめて起動するための「docker-compose」の初期設定を行います。
参考URL:https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os

docker run docker/compose:1.24.0 version

echo alias docker-compose="'"'docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:$PWD" \
    -w="$PWD" \
    docker/compose:1.24.0'"'" >> ~/.bashrc

source ~/.bashrc

2-4.docker-compose.yml作成

「docker-compose」の設定ファイルを作成します。
参考URL:https://nyacom.net/?p=443

version: '2'
services:
  mysql:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "gehogeho"
      MYSQL_DATABASE: "guacamole_db"
      MYSQL_USER: "guacamole_user"
      MYSQL_PASSWORD: "hogehoge"
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
      - ./mysql:/var/lib/mysql
    networks:
      - guac

  guacd:
    image: guacamole/guacd
    restart: always
    networks:
      - guac

  guac:
    image: guacamole/guacamole
    restart: always
    ports:
      - "8080:8080"
    environment:
      GUACD_HOSTNAME: guacd
      GUACD_PORT: 4822
      MYSQL_HOSTNAME: mysql
      MYSQL_DATABASE: "guacamole_db"
      MYSQL_USER: "guacamole_user"
      MYSQL_PASSWORD: "hogehoge"
    networks:
      - guac
    depends_on:
      - mysql
      - guacd

  nginx:
    image: nginx-custom(※)
    restart: always
    ports:
     - "443:443"
    networks:
      - guac
    depends_on:
      - guac

networks:
  guac:
    driver: bridge

※後述の手順で作成したnginxコンテナを「docker commit」してイメージ化したものを使います。

2-5.MYSQL初期設定

Guacamoleマニュアル通り、以下のコマンドでSQLファイル「initdb.sql」を作成します。
出力先ファイルは、SQLディレクトリにしています。

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

2-6.オレオレ証明書作成

nginxコンテナにログインして/opt/nginx/certsディレクトリを作成後、オレオレ証明書をnginxコンテナへコピーします。

docker start nginx
docker exec -ti nginx /bin/bash
mkdir -p /opt/nginx/certs
exit

openssl genrsa -out server.key 4096
openssl req -new -batch -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

sudo docker cp ./server.key nginx:/opt/nginx/certs/
sudo docker cp ./server.crt nginx:/opt/nginx/certs/

2-7.NGINX初期設定

①nginxにてhttps(443)からhttp(8080)へリバプロするための設定ファイルを作成します。

server {
listen 443;
ssl_certificate /opt/nginx/certs/server.crt;
ssl_certificate_key /opt/nginx/certs/server.key;

ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";

location /guacamole/ {
proxy_pass http://XXX.XXX.XXX.XXX:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
access_log off;
}
}

②設定ファイルをnginxコンテナへコピーします。

sudo docker cp ./default.conf /etc/nginx/conf.d/default.conf

2-8.GCP firewall設定

GCPコンソールにて、インターネットからGuacamoleサーバへtcp8080,tcp443を通すように設定を追加しておきます。

2-9.サービス起動

「docker-compose up -d」でサービス起動します。

docker-compose up -d

サービス停止は「docker-compose down」で行います。「docker-compose ps」で4個のコンテナがUPしていたら設定完了です。もし起動していないコンテナがあれば「docker-compose logs」を確認しトラブルシューティングを行います。
もし「Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘guacamole_db.guacamole_user’ doesn’t exist」というエラーが出ている場合は「initdb.sql」が実行されていません。「initdb.sql」が「sqlディレクトリ」に作成されているか確認しましょう。

2-10.ログイン、パスワード変更

http://XXX.XXX.XXX.XXX:8080/guacamole/」か「https://XXX.XXX.XXX.XXX/guacamole/」へアクセスします。
HTTP(8080)でアクセス出来ない場合は、guacamoleの設定が出来ていませんのでトラブルシューティングしましょう。
HTTPS(443)でアクセス出来ない場合は、nginxの設定が出来ていませんのでトラブルシューティングしましょう。
めでたくログイン画面が表示されたら「guacadmin/guacadmin」でログインしパスワード変更しましょう。

3.Guacamoleサーバ経由でRDP接続

Apache Guacamoleサーバの構築が終わったら、いよいよ本題のブラウザからRDP接続です。
動作確認のため、GCPでVMインスタンス(Windows2016)を作成、起動している前提です。

3-1.RDP接続設定

guacamoleサーバ「https://XXX.XXX.XXX.XXX/guacamole/」にログイン後「Settings」→「Connections」から

EDIT CONNECTION
    Name:XXXX ★ココ
    Protocol:RDP ★ココ
CONCURRENCY LIMITS
    Maximum number of connections:2(※1)
    Maximum number of connections per user:2(※1)
PARAMETERS
    Network
        Hostname:XXX.XXX.XXX.XXX ★ココ
    Authentication
        Username:XXXX ★ココ
        Password:XXXX ★ココ
        Security mode:NLA(Network Level Authentication) ★ココ(※2)
        Ignore server certificate:On ★ココ
    Basic Settings
        Keyboard layout:Japanese(Qwerty)
        Administrator console:on
    Performance
        Enable wallpaper:on

の項目を設定します。

★7個は必須です。

※1 デフォルトは「1」のような動作をするので、CONCURRENCY LIMITSは「2」に増やしておいたほうが無難です。
 社内プロキシ経由の場合、RDP接続1回目が成功しアイドルタイムアウトし再接続するときにデフォルトの「1」だと前のセッションが邪魔して接続ができなくなってしまいます。

※2 Security modeを指定しない場合「Error: protocol security negotiation or connection failure」が出てRDP接続できませんでした。
  Security modeは「NLA(Network Level Authentication)」もしくは「Any」とすれば、エラーが出ることなくRDP接続できました。

3-2.RDP接続確認

HOMEに戻りRDP接続を試します。無事にログイン出来たら終了です。お疲れさまでした。

今回は、RDP接続しか試しませんでしたが「Apache Guacamole」にはVNC接続やSSH接続も中継してくれる機能があります。時間があれば、試した記録を残したいと思います。乞うご期待。

GAE無料枠を利用して個人ブログを始める手順について、以下の参考記事にまとめていますので試してみたい方はご確認ください。


 Previous
GAEの「無料ドメイン」と「無料SSL証明書」がとても便利♪ GAEの「無料ドメイン」と「無料SSL証明書」がとても便利♪
Google Cloud Platform(GCP)のPaaSであるGoogle App Engine(GAE)の「無料ドメイン」と「無料SSL証明書」について紹介します。 カテゴリ:GCP入門合わせて読みたい GCPのAlways
2019年06月02日
Next 
Google Domains 日本で独自ドメインを取得するメリット Google Domains 日本で独自ドメインを取得するメリット
ダディ伯爵がGCPで独自ドメインSSL対応ブログを無料で簡単に立ち上げた方法を分かりやすく解説します。本記事では「Google Domains 日本で独自ドメインを取得するメリット」について記載します。 カテゴリ:Googleサービス合わ
2019年05月21日
  TOC