GuacamoleがSAML対応したのでOneloginと連携してみた


f:id:cloudfish:20200714223943p:plain
全国のGuacamoleファンの皆さん、2020/06/28にGuacamoleのバージョン1.2.0がリリースされました。バージョン1.2.0の主な特徴としてはSAML2.0がサポートがされたことが、個人的には一番嬉しい機能でした。2016年にSAML対応のissue登録されていたのでかなり対応は大変だったのかもしれません。早速検証してみたのですが、SAMLモジュールについても他の認証モジュールと同様にGuacamole特有のjarファイルのアドオン方式となっているため、少し手こずりましたが、無事動作確認ができましたので、今回はSAMLの設定方法について紹介したいと思います。

前提

以前のブログで構築したGucamole環境(Docker)をベースに設定を進めますので、基本の環境についてはこのブログを参照してください。

構成

ELB + EC2構成とします。
f:id:cloudfish:20200714224027p:plain

設定手順

SAMLモジュールの取り込み

公式で提供されているguacamole(1.2.0)のDockerイメージについては、ldapモジュールのように起動時に自動で取り込みしてくれるような設定となっていません。そのため、SAMLモジュールを取り込んだイメージを作成する必要があります。このイメージについては、こちらにも置いてありますので、直接参照してもらってもいいのですが、ここではローカルでビルドする想定で手順を記載しています。

Dockerイメージの作成

公式のイメージをベースにstart.shにsamlの起動設定を追加しました。環境変数SAML_CALLBACK_URLが設定されていればSAMLモジュールを取り込むようにしています。

以下のコマンドでgithubからDockerfile等を取得します。

git clone https://github.com/cloudfish7/guacamole-client-saml.git

イメージを作成します。

cd guacamole-client-saml
docker build -t guacamole-client-saml:1.2.0 .

Oneloginの設定

「Applications」タブを選択し、「Add App」をクリックして、「SAML Test Connector」を検索してください。一覧から「SAML Test Connector (IdP w/ attr w/ sign response)」を選択します。
Display Nameに適当な名前を入力し保存します。
f:id:cloudfish:20200714110623p:plain

保存後に右上の「More Actions」からSAML Metadataをダウンロードします。
f:id:cloudfish:20200714110712p:plain:w300

左ペインの「Configuration」を選択し、「Recipient」、「ACS (Consumer) URL Validator」、「ACS (Consumer) URL」に以下のURLを設定し、保存します。

http://[YOUR_ELB_DNS]/guacamole/api/ext/saml/callback

f:id:cloudfish:20200714110844p:plain

Usersでログイン可能なユーザーを追加しておいてください。

docker-composeの作成

 以下の通りdocker-composeファイルを作成してください。guacamoleのイメージについては、Docker Hubから取得するかlocalから取得するかによって内容を変更してください。
 SAML_IDP_URLは利用しているのIDPのURLになります。oneloginの場合、以下のようなURLとなります。

https://[YOUR_SUBDOMAIN].onelogin.com/

 SAML_ENTITY_IDについては、oneloginから取得したmetadataファイルにENTITY_IDがありますので、それを記載します。
 SAML_CALLBACK_URLについては、guacamoleのURLを記載してください。なぜこの設定が必要なのかはドキュメントを読んでもよく分かりませんでした。また、設定項目としてSAML_IDP_METADATA_URLという項目があるので、これだけ設定すればいけるかと思いましたが、うまく動作しなかったので最終的に上記の設定項目としました。

version: "3"

services:
  guacd:
    image: guacamole/guacd:1.2.0
    restart: always
    expose:
    - "4822"
    environment:
    - GUACD_LOG_LEVEL=debug
  guacamole:
    # From Docker Hub
    #image: cloudfish/guacamole-client-saml:1.2.0
    # From local
    image: guacamole-client-saml:1.2.0
    restart: always
    links:
      - guacd:guacd
    ports:
    - "8080:8080"
    environment:
    - GUACD_HOSTNAME=guacd      
    - SAML_IDP_URL=[YOUR_IDP_URL]
    - SAML_ENTITY_ID=[YOUR_ENTITY_ID]
    - SAML_CALLBACK_URL=http://ELB_DNS/guacamole
    - MYSQL_HOSTNAME=mysql
    - MYSQL_DATABASE=guacamole
    - MYSQL_USER=guacamole
    - MYSQL_PASSWORD=guacamole
  mysql:
    image: mysql/mysql-server:5.7
    restart: always
    volumes:
    - "./mysql/data:/var/lib/mysql"
    - "./mysql/init:/docker-entrypoint-initdb.d"
    expose:
    - "3306"
    ports:
    - "3306:3306"
    environment:
    - MYSQL_DATABASE=guacamole
    - MYSQL_USER=guacamole
    - MYSQL_PASSWORD=guacamole||<

** ディレクトリの作成
docker-compose.yamlファイルと同じ階層に以下のディレクトリを作成します。
>|csh|
mkdir -p mysql/data
mkdir -p mysql/init
tree -d mysql/
mysql/
├── data
└── init

初期データ作成

以下のコマンドで初期化用のスクリプトを作成します。

docker run --rm guacamole-client-saml:1.2.0 /opt/guacamole/bin/initdb.sh --mysql > mysql/init/initdb.sql

起動

docker-compose up -d

ログを確認して正常に起動しているかと、SAMLモジュールが読み込まれていることを確認しておいてください。

ログイン確認

以下のURLにアクセスするとOneloginのログイン画面にリダイレクトされます。
http://ELB_DNS/guacamole/
ポータル画面から「Guacamole」選択します。
f:id:cloudfish:20200715101256p:plain
正しく設定できていれば、Guacamoleにログインできます。
f:id:cloudfish:20200715101458p:plain

SAML設定をすると管理者ユーザー(guacadmin)でログインできなくなります。そのため、予めSAML設定を外して起動することでパスワードログインが可能になりますので、Oneloginユーザーと同名のユーザーを作成して管理者権限を付与しておく必要があります。

まとめ

これまでGuacamoleの認証については、独自管理するかIDPなどと連携させたい場合はLDAPを使うしかありませんでしたが、SAML連携が可能となったことでよりセキュアに運用できるようになったと思います。ここではOneloginとの連携方法について書きましたが、G-Suiteでも設定できたとの報告もありましたので恐らく他のIDPにおいても利用可能だと思います。ぜひ利用を検討してみてください。