感想
- ブラウザだけあればリモートアクセスが出来そう(利用者がうれしい)
- 操作ログや画面操作を動画で残すことが出来そう(管理者がうれしい)
- docker版だとTomcatとか諸々のライブラリのインストールを考えなくて良くて構築が楽っぽい(自分がうれしい)
Apache Guacamoleとは
OSSのリモートアクセスゲートウェイソフトで、クライアントはHTML5対応のWEBブラウザだけで利用できる。使える接続プロトコルはVNC,RDP,SSH,TELNETがあり、Apache License、Version 2.0が適用されたOSS。またTOTPによるMFA(個人的に最近気に入っている)もできる。詳細はこちら公式にて。
構成イメージ
※画像は公式より。
きっかけ
仕事で使っているリモートアクセス環境が、Windows Server 2008サポート終了のあおりを受けて更新しないといけなくなった。この際なのでセキュリティレベルを確保しつつ、コストを抑えた構成を考えようと思いついた。Windows OSからLinuxへ、有償シンクラソフトからOSSのApache Guacamoleへ。あわせてWEBブラウザだけでクライアント側に専用ソフトが不要なので、今まで温めていたアイデアが実現出来そうと言う淡い期待があった。今回はその際に実施した検証メモ。
前提
・環境
検証用環境
・OS
Ubuntu 18.04
・その他
Docker and Docker-Compose はインストール済み。
適当にdocker-compose.ymlを作る
公式ドキュメントの手順を読むと、3種類のコンテナイメージを起動する必要がありそうなので、docker-composeで構築することにした。※以下のコンテナの役割は公式をGoogle翻訳。
guacamole/guacd
リリースされたguacamole-serverソースから構築されたguacdデーモンを提供し、VNC、RDP、SSH、およびtelnetをサポートします。
guacamole/guacamole
Tomcat 8内で実行されているGuacamole WebアプリケーションにWebSocketのサポートを提供します。guaker、MySQL、PostgreSQL、LDAPなどに接続するために必要な構成は、Dockerリンクまたは環境変数に基づいてイメージが開始されるときに自動的に生成されます。
mysql または postgresql
Guacamoleが接続構成データの認証と保存に使用するデータベースを提供します。
docker-compose.ymlの中身
本番環境はもうちょっと考える必要がある。
nginxはとりあえず的な感じで。
version: "3"
services:
postgres:
image: postgres:latest
restart: unless-stopped
environment:
PGDATA: /var/lib/postgresql/data/guacamole
POSTGRES_DB: guacamole_db
POSTGRES_PASSWORD: guacamole1234567890
POSTGRES_USER: guacamole_user
volumes:
- ./pginit:/docker-entrypoint-initdb.d
- ./pgdata:/var/lib/postgresql/data
guacd:
image: guacamole/guacd:latest
restart: unless-stopped
guacamole:
image: guacamole/guacamole:latest
restart: unless-stopped
ports:
- "8080:8080"
environment:
GUACD_HOSTNAME: guacd
POSTGRES_DATABASE: guacamole_db
POSTGRES_HOSTNAME: postgres
POSTGRES_PASSWORD: guacamole1234567890
POSTGRES_USER: guacamole_user
depends_on:
- postgres
- guacd
nginx:
image: nginx:latest
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
default.confの中身
ディレクトリを作って、そこに置く。
# mkdir -p ./nginx/conf.d
server {
listen 80;
server_name localhost;
location /guacamole/ {
proxy_pass http://guacamole:8080/guacamole/;
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
初期化用のSQL作成
PostgreSQLは公式Dockerイメージの初期化機能を使います。初期化スクリプト(.sql or .shとか?)が/docker-entrypoint-initdb.dディレクトリ内で見つかった場合に1度だけ実行されるらしいので、そこに作成しておく。
# mkdir ./pginit
# chmod -R +x ./pginit
# docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgres > ./pginit/initdb.sql
起動
# docker-compose up -d
# docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
gucamole_guacamole_1 /opt/guacamole/bin/start.sh Up 0.0.0.0:8080->8080/tcp
gucamole_guacd_1 /bin/sh -c /usr/local/guac ... Up 4822/tcp
gucamole_nginx_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp
gucamole_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
# docker-compose logs -f
動作確認
http://<IPアドレス or ホスト名>/guacamole/
ユーザー名:guacadmin
パスワード:guacadmin
でログイン。
TOTPの設定
公式(ver1.0.0の場合)からTOTP用 jarファイルをダウンロードししてくる。その後、${GUACAMOLE_HOME}/extensions ディレクトリに置いて起動させる必要がある。なのでdocker-compose.ymlファイルをちょっと編集し3行追加。
guacamole:
image: guacamole/guacamole:latest
restart: unless-stopped
ports:
- "8080:8080"
environment:
GUACD_HOSTNAME: guacd
POSTGRES_DATABASE: guacamole_db
POSTGRES_HOSTNAME: postgres
POSTGRES_PASSWORD: guacamole1234567890
POSTGRES_USER: guacamole_user
GUACAMOLE_HOME: /etc/guacamole ⬅️①
volumes: ⬅️②
- ./guacamole:/etc/guacamole ⬅️③
depends_on:
- postgres
- guacd
ディレクトリを作る。
# mkdir -p ./gucamole/extensions
ダウンロード&解凍したTOTP用jarファイルをコピー。
# cp ~/Downloads/guacamole-auth-totp-1.0.0/guacamole-auth-totp-1.0.0.jar ./guacamole/extensions
再起動
docker-compose down
docker-compose up
初回 or 次回の認証後、登録画面が表示されます。あとは「Google Authenticator」や「IIJ SmartKey」で登録しておくと、次回以降は6桁のコード入力を求められます。
ちょっとハマったとこ
ユーザにパスワード変更権限を付与しておかないとこのTOTPが有効にならないようです。