シングルサインオンとauth-check-ssoトリガ
クライアントスクリプトとサーバスクリプト
auth-check-sso
タイプのトリガは、標準ユーザがp4 login
コマンドを実行すると起動します。それによって2つのスクリプトが実行されます。まずクライアント側スクリプトがユーザのワークステーション上で実行され、次いでその出力がHelix Coreサーバに(プレーンテキストで)渡され、そこでサーバ側スクリプトが実行されます。
クライアント側スクリプト | サーバ側スクリプト |
---|---|
ユーザのワークステーションで実行されるクライアント側スクリプトの場所は環境変数
以下に例を示します。 $ export P4LOGINSSO="/path/to/sso-client.sh %user% %serverAddress% %P4PORT%"
|
サーバ上では、クライアント側スクリプトの出力がサーバ側スクリプトに標準入力として渡されます。トリガテーブルで指定されているサーバ側スクリプトが実行されます。正常に実行されると、サーバは0の終了ステータスを返します。 プロキシまたはブローカがクライアントおよびサーバ間の媒介として動作する分散構成の場合:
この情報を使用して何を行うかはスクリプトによって決まります。 |
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対応サーバでAuthMethodがperforceに設定されているユーザが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
」という文字列の有無を確認し、文字列が存在していればユーザがログオンを許可されます。