Helix Coreサーバ管理者ガイド: 基本 (2019.1)

シングルサインオンとauth-check-ssoトリガ

クライアントスクリプトとサーバスクリプト

auth-check-ssoタイプのトリガは、標準ユーザがp4 loginコマンドを実行すると起動します。それによって2つのスクリプトが実行されます。まずクライアント側スクリプトがユーザのワークステーション上で実行され、次いでその出力がHelix Coreサーバに(プレーンテキストで)渡され、そこでサーバ側スクリプトが実行されます。

クライアント側スクリプト サーバ側スクリプト

ユーザのワークステーションで実行されるクライアント側スクリプトの場所は環境変数P4LOGINSSOで指定します。実行されたスクリプトは、ユーザの資格情報か、Helixサーバによって検証できるその他の情報を取得します。P4LOGINSSOには以下が含まれています。

  • クライアント側スクリプトの名前
  • パラメータとしてスクリプトに渡される0個以上のトリガ変数:
    • %user%
    • %serverAddress%
    • %P4PORT%

以下に例を示します。

$ export P4LOGINSSO="/path/to/sso-client.sh %user% %serverAddress% %P4PORT%"

%user%Helixサーバクライアントユーザです。%serverAddress%はターゲットのHelixサーバのアドレスです。%P4PORT%はクライアントとサーバ間の仲介者です。

サーバ上では、クライアント側スクリプトの出力がサーバ側スクリプトに標準入力として渡されます。トリガテーブルで指定されているサーバ側スクリプトが実行されます。正常に実行されると、サーバは0の終了ステータスを返します。

プロキシまたはブローカがクライアントおよびサーバ間の媒介として動作する分散構成の場合:

  • %serverAddress%変数はサーバのアドレスとポートを保持します。
  • %P4PORT%変数は仲介のポートを保持します。

この情報を使用して何を行うかはスクリプトによって決まります。

Helix SAML も参照してください。

auth-check-ssoトリガを使用した場合のp4 loginの動作

以下の表は、auth-check-ssoタイプのトリガが設定されている場合のp4 loginの動作について説明しています。

構成と環境に応じて以下が行われます。

  • P4LOGINSSOクライアント側スクリプトが実行され、ユーザ介入なしのカスタマイズ可能なSSO操作が実行されます。
  • ユーザはパスワードを使用して認証を行うよう求められます。これはクライアント側にP4LOGINSSOスクリプトが構成されていない場合の動作です。
  • ユーザの環境に有効なP4LOGINSSOスクリプトが構成されるまでログイン試行が拒否されます。

バージョン2018.2にはデフォルトの動作を変更する構成可能変数が2つの導入されました。

  • auth.sso.allow.passwdは、P4LOGINSSOが構成されていない場合、パスワードがデータベース(db.user)に保存されているユーザがパスワード認証に戻れるようにします。
  • auth.sso.nonldapは、LDAP対応サーバでAuthMethodperforceに設定されているユーザがP4LOGINSSOを使用できるようにします。

P4LOGINSSOが設定されている場合:

    LDAPに対応していない LDAPに対応している
auth.sso.allow.passwd auth.sso.nonldap db.userのみ auth-checkトリガ 「perforce」とLDAPに対応している 「ldap」とLDAPに対応している
0 0 P4LOGINSSOが実行されます パスワードを要求されます P4LOGINSSOが実行されます
1 P4LOGINSSOが実行されます
1 0 パスワードを要求されます
1 P4LOGINSSOが実行されます

P4LOGINSSOが設定されていない場合:

    LDAPに対応していない LDAPに対応している
auth.sso.allow.passwd auth.sso.nonldap db.userのみ auth-checkトリガ 「perforce」とLDAPに対応している 「ldap」とLDAPに対応している
0 0 ログインが拒否されます パスワードを要求されます パスワードを要求されます パスワードを要求されます
1 ログインが拒否されます
1 0 パスワードを要求されます パスワードを要求されます パスワードを要求されます パスワードを要求されます
1

クライアント側スクリプトとサーバ側スクリプトの相互作用

注意

以下に簡単な例を示します。LinuxとWindowsの両方の実質的な例と詳細な手順の説明については、ナレッジベースの記事「シングルサインオンの設定(P4LOGINSSO)」を参照してください。

auth-check-ssoトリガは、p4 loginを実行するたびに起動します。サーバ側で実行されるべきスクリプトを指定するには、システム管理者としてトリガテーブルに以下の行を追加するとよいでしょう。

sample13  auth-check-sso  auth  "serverside.sh %user%"

そして、各エンドユーザはクライアント側で以下の環境変数を設定します。

export P4LOGINSSO=/usr/local/bin/clientside.sh %serverAddress%

ユーザがログオンを試みると、P4LOGINSSOスクリプトがユーザのワークステーション上で実行されます。

##!/bin/bash
# clientside.sh - a client-side authentication script
#
# if we use %serverAddress% in the command-line like this:
#    p4 -E P4LOGINSSO=clientside.sh %serverAddress%
# then this script receives the serverAddress as $1, and the user
# can use it for multiple connections to different Helix Servers.
#
# In this example, we simulate a client-side authentication process
# based on whether the user is connecting to the same Helix Server
# as is already configured in his or her environment.
# (We also output debugging information to a local file.)

input_saddr=$1

env_saddr=`p4 info | grep "Server address" | awk '{printf "%s", $3}'`

if test "$input_saddr" == "$env_saddr"
  then
    # User is connected to the server specified by P4PORT - pass
    echo "sso pass"; echo pass "$input_saddr" >> debug.txt; exit 0
  else
    # User is attempting to connect to another server - fail
    echo "no pass"; echo fail "$input_saddr" >> debug.txt; exit 1
fi

ユーザがP4PORTによって指定されたものと同じHelix Coreサーバに接続した場合(すなわち、サーバからこのスクリプトへ渡されたサーバアドレスが、p4 infoコマンドのプレーン出力に登場するサーバと一致する場合)、クライアント側の認証は成功します。ユーザが(例えば、異なるHelix Coreサーバに対しp4 -p host:port loginを実行することにより)他のHelix Coreサーバに接続した場合、クライアント側の認証は失敗します。

サーバ側スクリプトを以下に示します。

#!/bin/bash
#
# serverside.sh - a server-side authentication script
#

if test $# -eq 0
  then
    echo "No user name passed in.";
    exit 1;
fi

read msg </dev/stdin

if test "$msg" == ""
  then
    echo "1, no stdin"
    exit 1
fi

if test "$msg" == "sso pass"
  then
    exit 0
  else
    exit 1
fi

より現実的な例では、エンドユーザのP4LOGINSSOスクリプトがclientside.shスクリプトを参照し、それが認証サービスにアクセスして何らかのトークンを入手します。次に、クライアント側スクリプトはこのトークンをHelix Coreサーバのトリガスクリプトに渡し、serverside.shはシングルサインオンサービスを利用してそのトークンを確認します。

上記の例では、clientside.shは、単にユーザがP4PORTによって指定されているのと同じ接続を使用しているかどうかチェックします。そして、clientside.shの出力に「sso pass」という文字列の有無を確認し、文字列が存在していればユーザがログオンを許可されます。