OneloginとGuacamoleでSSO設定


f:id:cloudfish:20200417102427p:plain:w200
最近社内のユーザー認証周りの整理を実施しており、その一環でIDPの導入を検討しています。現在Oneloginの動作検証を行っており、Guacamoleのユーザー認証をOneloginと連携してSSOできるか検証を行いました。
Gucamoleについて詳しく知りたい方は、以前書いたブログを参照してみてください。Guacamoleの現在のバージョン(v1.1.0)では、残念ながらSAML連携はできません。(実装は進められているようです。)そのため、OneloginのVirtual LDAPを使ってSSO連携させたいと思います。

前提

以前のブログで構築したGucamole環境をベースに設定を進めます。

OneloginでVLDAPを設定する

以下のようにVLDAPサービスを有効化します。
f:id:cloudfish:20200613143623p:plain:w400

stunnelコンテナの構築

OneloginのVLDAPにはLDAPS(SSLまたはTLSを使用してLDAP通信する)での接続となります。Guacamoleから直接LDAPSで接続するのは少し大変そうなのでstunnelにプロキシさせることとしました。そのためGuacamoleからはstunnelにLDAP接続します。
まずはstunnelコンテナを作ります。前回立てたサーバーにssh接続を行い、適当なディレクトリで以下の2つのファイルを作成します。

Dockerfileの作成

FROM ubuntu
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install stunnel4

COPY docker-entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
CMD ["/entrypoint.sh"]

docker-entrypoint.shの作成

#! /bin/sh

# Create configulation
cat <<EOF > /etc/stunnel/ldap.conf
foreground = yes
[ldap]
client = yes
accept = $ACCEPT_IP_ADDR:$ACCEPT_PORT
connect = $LDAP_CONNECT_URL:$LDAP_CONNECT_PORT
EOF

# enable stunnel
echo ENABLED=1 >> /etc/default/stunnel4

# start stunnel4
echo "Start stunnel4"
/usr/bin/stunnel4 /etc/stunnel/ldap.conf

イメージのビルド

以下のコマンドでイメージをビルドします。正常に作成できていればstunnel_oneloginという名前でイメージが作成されるはずです。

docker build -t stunnel_onelogin .

docker-composeの作成

${your_domain}には自身のOneloginのサブドメインを設定してください。
stunnelコンテナは、ポート1636でguacamoleコンテナから接続を待ち受けを行い、接続があればOneloginのVLDAPのエンドポイント(ldap.us.onelogin.com)のポート636に接続します。

version: "3"

services:
  guacd:
    image: guacamole/guacd:latest
    restart: always
    expose:
    - "4822"
    environment:
    - GUACD_LOG_LEVEL=debug
  guacamole:
    image: guacamole_latest
    restart: always
    links:
      - guacd:guacd
    ports:
    - "8080:8080"
    environment:
    - GUACD_HOSTNAME=guacd
    - GUACD_LOG_LEVEL=debug
    - LDAP_HOSTNAME=stunnel
    - LDAP_PORT=1636
    - LDAP_ENCRYPTION_METHOD=none
    - LDAP_USER_BASE_DN=cn=email,ou=users,dc=${your_domain},dc=onelogin,dc=com
    - LDAP_USERNAME_ATTRIBUTE=cn
    - LDAP_CONFIG_BASE_DN=ou=users,dc=${your_domain},dc=onelogin,dc=com
    #- TOTP_ENABLED=true
    - 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

  stunnel:
    image: stunnel_onelogin
    restart: always
    ports:
    - "1636:1636"
    environment:
    - ACCEPT_IP_ADDR=0.0.0.0
    - ACCEPT_PORT=1636
    - LDAP_CONNECT_PORT=636
    - LDAP_CONNECT_URL=ldap.us.onelogin.com

起動

以下のコマンドで起動します。

docker-compose up -d

ログイン確認

ユーザー名はOneloginで登録しているメールアドレスになります。パスワードもOneloginで登録したものになります。
f:id:cloudfish:20200420190016p:plain:w300

ログインできない場合は、ログの内容を確認して対処してください。

まとめ

Guacamoleは現状SAML連携ができないため、SSOを行うにはLDAPを使うしかありませんが、IDPによってはLDAP接続を提供しているものもあるため検討の余地はあると思います。
また、MFAについては、Onelogin側で設定も可能となっています。Guacamole側でMFA設定も可能ですが、端末を紛失した際の初期化対応が少し手間なので、MFA設定が必要であればOneloginで設定するのもありだと思います。また、VLDAPのエンドポイントに対して接続元のIP制限もかけれるため、よりセキュアにすることも可能です。
Gucamoleのユーザー認証の方法の一つとしてこういったIDPを検討してもいいのではないでしょうか。