Apache GuacamoleでRed Hat OpenShift on IBM Cloudに踏み台サーバを構築する（デプロイ編）

# 目的

[Apache Guacamole](https://guacamole.apache.org/)はSSHやRDPのためのプロクシソフトウェアです。ブラウザから各環境にリモートログインすることができます。また、SSHログの取得やRDPの画面操作を録画することができますので、エンタープライズな環境できちんとアクセス監査をしたい場合にも有用です。

今回はGuacamoleをRed Hat OpenShift on IBM Cloud上にコンテナとして構築してみます。

# 構成

デフォルトであるデータベース認証の場合、Guacamoleは3つのコンポーネントから構成されます。

* guacamole: UI
* guacd: ゲートウェイサービス
* データベース: PostgreSQL、MySQLまたはSQL Server

今回はguacamoleとguacdをコンテナとして実行します。データベースはIBM Cloud Databases for PostgreSQLを使用します。

# 手順

## IBM Cloud Databases for PostgreSQLの設定

### オーダー

とりあえずは最低スペックでオーダーします。EndpointsはデフォルトでPublicですが、Bothにしておくと、構成作業は自PCからPublicを、Guacamoleからの接続はPrivateを使うことができて便利です。実運用の際はPrivateのみにするのがよいでしょう。後から変更することもできます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/ca6a7d38-54f2-b4ba-ea1a-9c08fc40a373.png)

### 管理者パスワードの設定

インスタンスの管理者のパスワードを設定します。ポータルまたはCLIで可能です。今回はCLIを使用します。

```
$ ibmcloud cdb user-password guacdb admin ${パスワード}
```
### DBスキーマの作成

PostgreSQLにDBスキーマを作成します。guacamoleのコンテナからSQLを生成することができます。

```
$ docker run --rm guacamole/guacamole:1.2.0 /opt/guacamole/bin/initdb.sh --postgres > initdb.sql
$ ls -l initdb.sql
-rw-r--r-- 1 teruq teruq 24448 Dec 21 05:00 initdb.sql
```

CLIを使用してSQLを実行します。

```
$ ibmcloud cdb deployment-connections guacdb --start
Database Password>> ${管理者パスワード}
ibmclouddb=> \i initdb.sql
CREATE TYPE
CREATE TYPE
CREATE TYPE
...
ibmclouddb=> \q
```

### DB接続ユーザーの作成

管理者とは別にDB接続用ユーザーを作成します。

```
$ ibmcloud resource service-key-create guacdb-creds-1 --instance-name guacdb
```

次の値を控えておきます。

* ホスト名
* ポート番号
* ユーザー名
* パスワード

ホスト名は、～.databases.appdomain.cloudを～.**private**.databases.appdomain.cloudに変更します。そうすることで、通信経路をプライベートネットワーク経由にすることができます。

### DB接続ユーザーに権限を付与

今作成したユーザーは先ほど管理者で作成したオブジェクトへの権限を持っていないため、権限を付与します。

```
ibmcloud cdb deployment-connections guacdb --start
Database Password>> ${管理者パスワード}
ibmclouddb=> grant all on all tables in schema public to "ibm-cloud-base-user";
GRANT
ibmclouddb=> grant all on all sequences in schema public to "ibm-cloud-base-user";
GRANT
ibmclouddb=> \q
```

## guacdのデプロイ

単に動かすだけならそのままデプロイしても動くのですが、RDP接続をする際に実行ユーザーのホームディレクトリにファイルを書き込むため、実行ユーザーはOpenShiftのランダムではなく固定にする必要があります。anyuidのサービスアカウントを作成します。

```
$ oc create sa guacd
$ oc adm policy add-scc-to-user anyuid -z guacd
```

サービスアカウントを指定してデプロイします。

```
$ oc new-app --docker-image guacamole/guacd:1.2.0 -o yaml --dry-run | sed "/containers/i\        serviceAccountName: guacd" | oc apply -f -
imagestream.image.openshift.io/guacd created
deploymentconfig.apps.openshift.io/guacd created
service/guacd created

$ oc get pods | grep guacd
guacd-1-deploy               0/1     Completed   0          59s
guacd-1-wkjw8                1/1     Running     0          58s

$ oc logs guacd-1-wkjw8
guacd[8]: INFO: Guacamole proxy daemon (guacd) version 1.2.0 started
guacd[8]: INFO: Listening on host 0.0.0.0, port 4822
```
## guacamoleのデプロイ

guacamoleのコンテナはrootで実行され、ホームディレクトリに一時ディレクトリを作成します。そのため、コンテナのサービスアカウントを新たに作り、SCCをanyuidにしてrootで実行可能にします。

```
$ oc create sa guacamole
$ oc adm policy add-scc-to-user anyuid -z guacamole
```

先ほど控えた接続情報を環境変数にセットします。

```
$ PGHOST=********.private.databases.appdomain.cloud
$ PGPORT=ポート番号
$ PGUSER=ユーザー名
$ PGPASSWORD=パスワード
```

次のようにデプロイします。

```
$ oc new-app --docker-image guacamole/guacamole:1.2.0 \
    -e GUACD_HOSTNAME=guacd \
    -e GUACD_PORT=4822 \
    -e POSTGRES_HOSTNAME=${PGHOST} \
    -e POSTGRES_PORT=${PGPORT} \
    -e POSTGRES_DATABASE=ibmclouddb \
    -e POSTGRES_USER=${PGUSER} \
    -e POSTGRES_PASSWORD=${PGPASSWORD} \
    -e POSTGRESQL_SSL_MODE=require \
    -o yaml --dry-run | sed "/containers/i\        serviceAccountName: guacamole" | oc apply -f -
imagestream.image.openshift.io/guacamole created
deploymentconfig.apps.openshift.io/guacamole created
service/guacamole created

$ oc get pods | grep guacamole
guacamole-1-deploy           0/1     Completed   0          4m3s
guacamole-1-gl5sb            1/1     Running     0          4m2s

$ oc logs guacamole-1-gl5sb
...
20-Dec-2020 21:50:29.273 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
20-Dec-2020 21:50:29.281 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
20-Dec-2020 21:50:29.285 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 4454 ms

```

SSL_MODE=requireとすることで、SSL証明書の検証を無効化しています。こうすることでCA証明書のコンテナへのマウントの手間を軽減しています。実運用ではきちんとCA証明書をマウントしてSSL_MODE=fullにすることをお勧めします。

## サービスの公開

guacamoleを公開します。

```
$ oc create route edge --service guacamole --path /guacamole
route.route.openshift.io/guacamole created
$ oc get route | grep guacamole
NAME        HOST/PORT                                                                                               PATH         SERVICES    PORT       TERMINATION   WILDCARD
guacamole   guacamole-******.jp-tok.containers.appdomain.cloud   /guacamole   guacamole   8080-tcp   edge          None
```

## Guacamoleへのログイン

RouterのURLにhttpsでアクセスします。

> https://guacamole-******.jp-tok.containers.appdomain.cloud/guacamole

ログイン画面が表示されます。管理者はguacadmin、初期パスワードはguacadminです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/eee4b86c-52bf-af16-8ace-eb40d853cac7.png)

ログインできたら初期パスワードを変更しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d7440782-78f3-d505-95a9-34b2d85328f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/04eab5ef-ce84-fff1-8e07-f5d4410e5b9c.png)

今回はここまでです。次回以降にGuacamoleを踏み台とした構成を検証していきます。