Dockerで構築するApache Guacamole

# Apache Guacamoleとは

Apache Guacamole
https://guacamole.apache.org/

本家のサイトにも説明がありますが以下が主なポイントです。

* 無料でオープンソースのソフトウェア
* 対応しているのはVNC、RDP、SSHなどの標準プロトコル
* 必要なのはWEBブラウザだけ

AWS上に構築して、AWSのEC2インスタンスにアクセスしたり便利です。
更にWEBブラウザベースなのでHTTPS通信にてWAFを通せばかなりセキュアです。

更に更にAWS WAFを使えば、XSSやSQLインジェクションに加えて
国内のみのアクセスを許可というのもできてアタックがぐっと減ります。

尚、1.0.0から二要素認証に対応しており、
Google認証やAuthyを使って更に更に更にセキュリティが強固になります。

# どんな感じか(認証)

まずはアカウント＋パスワードによる認証。
![000003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555479/279d32dd-968b-e4c6-71b8-0994d36b770e.png)

次はGoogle認証やAuthyを使った認証です。

![000004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555479/c9fe6983-40a7-ba27-e4b0-94afb0bd9d8e.png)

また、WEBアクセスですからHTTPS経由にすればセキュアになりますし、
WAFも使えて更に強固になり、会社や自宅からアクセスすることも可能で
場所を選ばすに仕事ができます。

# Nativeで構築

Chapter 2. Installing Guacamole natively
https://guacamole.apache.org/doc/gug/installing-guacamole.html

こちらのApache Guacamoleのマニュアルに従ってNativeで構築することが可能です。
ただ、少々面倒なので、Dockerでサクッと構築しちゃいましょう。

# Dockerで構築

Chapter 3. Installing Guacamole with Docker
https://guacamole.apache.org/doc/gug/guacamole-docker.html

こちらのApache Guacamoleのマニュアルに従ってDockerで構築することもできますが
更に面倒なのでDocker-Composeで簡単に構築しちゃいます。

DockerとDocker-Composeはすでに入っている前提で以下にDocker-Composeの内容を書きます。

```dockerfile

services:
  guacd:
    image: guacamole/guacd:1.0.0
    restart: always
    volumes:
      - /usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf:/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf:ro
      - /var/log/guacamole/typescript:/var/log/guacamole/typescript
      - /var/log/guacamole/recording:/var/log/guacamole/recording
    networks:
      - guacamole_network

  guac:
    image: guacamole/guacamole:1.0.0
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /opt/docker/config/guacamole:/config
    environment:
      - "GUACD_HOSTNAME=guacd"
      - "GUACD_PORT=4822"
      - "MYSQL_HOSTNAME=MYSQLサーバ名"
      - "MYSQL_DATABASE=guacamole"
      - "MYSQL_USER=guacamole"
      - "MYSQL_PASSWORD=guacamole"
      - "LDAP_HOSTNAME=LDAPサーバ名"
      - "LDAP_PORT=389"
      - "LDAP_ENCRYPTION_METHOD=none"
      - "LDAP_USER_BASE_DN=ユーザーを検索するbaseのDN"
      - "LDAP_GROUP_BASE_DN=グループを検索するbaseのDN"
      - "LDAP_SEARCH_BIND_DN=LDAPサーバに接続する際のユーザーのDN"
      - "LDAP_SEARCH_BIND_PASSWORD=LDAPサーバに接続する際のユーザーのパスワード"
      - "LDAP_USERNAME_ATTRIBUTE=uid"
      - "GUACAMOLE_HOME=/config"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "100"
    networks:
      - guacamole_network

networks:
  guacamole_network:
    driver: bridge
```

Apache Guacamoleは大きくわけて3つのサービスで成り立っています。

* guacd ログインやユーザーからの入力を受け付けたり、実際のコンソール画面を表示します。
* guac guacdからの入力を内部的にSSHやRDP、VNCプロトコルに変換して実際のアクセス先のサーバに渡します。
* データベース ユーザー情報やホスト情報を保管する為のデータベースの管理をします。外部のサーバも利用できます。

このdocker-composeファイルをそのまま`docker-compose.yml`で保存し、
dokcer-compose startで起動すれば、動くはずです。

尚、二要素認証を利用したい場合は`docker-compose.yml`と同じ階層に
`config/guacamole/extensions`ディレクトリを作成します。

作成したディレクトリに以下のサイトの`guacamole-auth-totp-1.0.0.tar.gz`を
ダウンロード・解凍してできたjarを置きます。

Apache Guacamole 1.0.0
https://guacamole.apache.org/releases/1.0.0/

`docker-compose restart`で再起動すれば、アカウント＋パスワードで
ログインした後にGoogle認証やAuthyの認証画面が表示されます。

以上でDocker-Composeによる構築は以上です。
良いGuacamole Lifeを！！

#### 追伸

標準フォントの場合、日本語が豆腐になる可能性があります。
以下の通り、日本語に対応したフォントを入れてマウントしておきます。

```docker
- /usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf:/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf:ro
```