Help us understand the problem. What is going on with this article?

oneloginのSAML認証機能を使ってSAML認証対応サービスへのログイン

More than 1 year has passed since last update.

OneloginのSAML認証を利用しサービスへのログインを行う手順です。

以下では AWS へSAML認証でログインさせるまでの手順です。

はじめに、Administrator権限を持った Onelogin アカウント、IAM権限を持った AWS アカウントを準備していることを前提としています。

また、Administrator以外にユーザでログインする場合は個別にユーザを作成しておいてください。

Onelogin / AWS の設定

SAML認証を使ったログインでは、個別のユーザに対してログインするわけではなく、Oneloginのユーザに対して付与されたAWSのRoleを持ってログインします。
設定はおおよそ以下のような流れです。

  • OneloginでAWSのコネクタ作成
  • AWSでIDプロバイダの設定
  • AWSでIAM Roleの作成
  • Oneloginで作成した、AWSコネクタに Parameters を設定

設定は OneLoginを利用してAWSにSAMLでログインする が参考になります。

ログイン

設定がすんだら、さっそくOneloginのSAML認証を使いAWSへログインしてみます。

Oneloginポータル画面からAWSへログイン

Oneloginへログインし、表示されるポータル画面からAWSへログインする方法です。

image.png

image.png

権限を持ったユーザであれば、ポータル画面にはAdministratorが設定したAPP一覧が表示されています。

Oneloginポータル画面

この画面からAWSのアイコンをクリックすることでAWSへログインすることができます。

Oneloginのポータル画面を手動でログイン作業を行わずに開く

例えば以下のような要件の場合

  • 社内でアカウント管理を行っている。
  • 複数のSAML認証に対応したサービスと連携している。
  • Oneloginを利用し、SSOをサービスで利用したい。
  • 但し、社内でアカウント管理をしているので、Oneloginへのログインは冗長となるので、Oneloginへのログインは省略したい。

この場合社内で以下のような手順で行えば可能です。

  • アクセストークンの発行
  • セッショントークンの発行
  • 発行したセッショントークンでログイン

はじめに、アクセストークンを発行する前に、Administraotr でログインし、OneloginでAPIのCredentialsを発行します。

  • DEVELOPERS > API Credentials > NEW CREDENTIAL
  • 名前と権限を設定

アクセストークンの発行には、この時発行された Client SecretClient ID を利用します。

アクセストークンの発行

CLIENT_ID=<Client ID>
CLIENT_SECRET=<Client Secret>

ACCESS_TOKEN=$(curl -s 'https://api.us.onelogin.com/auth/oauth2/token' \
  -X POST \
  -H "Authorization: client_id:${CLIENT_ID}, client_secret:${CLIENT_SECRET}" \
  -H "Content-Type: application/json" \
  -d '{ "grant_type":"client_credentials" }' | jq -r '.data[].access_token')
echo ${ACCESS_TOKEN}
  #

セッショントークンの発行

LOGIN_USER=<Onlogin User>
LOGIN_PASSWORD=<Onlogin Password>
export LOGIN_SUBDOMAIN=<Onlogin SubDomain>

export SESSION_TOKEN=$(curl -s 'https://api.us.onelogin.com/api/1/login/auth' \
  -X POST \
  -H "Authorization: bearer: ${ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d "{ \"username_or_email\":\"${LOGIN_USER}\", \"password\":\"${LOGIN_PASSWORD}\", \"subdomain\":\"${LOGIN_SUBDOMAIN}\" }" | jq -r '.data[].session_token')
echo ${SESSION_TOKEN}
  #

セッショントークンをPOSTしてブラウザ経由で開く

cat << 'EOT' | envsubst > onelogin-demo.html
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <p>Auth API Test</p>
        <form action=
         "https://${LOGIN_SUBDOMAIN}.onelogin.com/session_via_api_token" method="POST">
            <input type="hidden" name="session_token" value="${SESSION_TOKEN}">
            <input type="submit" placeholder="GO">
            <input id="auth_token" type="hidden">
        </form>
    </body>
</html>
EOT

これで生成されたhtmlファイルをブラウザで表示し、送信 をクリックすることでOneloginのポータル画面を開けます。

ユーザがAWSへ直接ログイン

Oneloginを使っていることをユーザに意識させずにシームレスにSAML認証に対応したサービス(AWS)にログインした場合

  • アクセストークンの発行
  • SAMLアサーションを取得
  • 取得したSAMLアサーションログイン

アクセストークンの発行

アクセストークンの取得は、「Oneloginのポータル画面を手動でログイン作業を行わずに開く」に同じです。

CLIENT_ID=<Client ID>
CLIENT_SECRET=<Client Secret>

ACCESS_TOKEN=$(curl -s 'https://api.us.onelogin.com/auth/oauth2/token' \
  -X POST \
  -H "Authorization: client_id:${CLIENT_ID}, client_secret:${CLIENT_SECRET}" \
  -H "Content-Type: application/json" \
  -d '{ "grant_type":"client_credentials" }' | jq -r '.data[].access_token')
echo ${ACCESS_TOKEN}
  #

SAMLアサーションを取得

セッショントークンの取得時と同様に、Oneloginのユーザ、パスワード、サブドメインのほか、SAML認証でログインするサービスのAPP IDを使います。

APP IDは、Administraotrでログインし、APPS > Company Apps で対象のアプリを開いた場合のURLから確認できます。(https://${subdomain}.onelogin.com/apps/${APP_ID}/edit

LOGIN_USER=<Onlogin User>
LOGIN_PASSWORD=<Onlogin Password>
LOGIN_SUBDOMAIN=<Onlogin SubDomain>
APP_ID=<App ID>

export SAML_RESPONSE=$(curl -s "https://api.us.onelogin.com/api/1/saml_assertion" \
  -X POST \
  -H "Authorization: bearer: ${ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  -d "{ \"username_or_email\":\"${LOGIN_USER}\", \"password\":\"${LOGIN_PASSWORD}\", \"app_id\":\"${APP_ID}\", \"subdomain\":\"${LOGIN_SUBDOMAIN}\" }" | jq -r '.data')
echo ${SAML_RESPONSE}
  #

SAMLアサーションをPOSTしてブラウザ経由で開く

cat << 'EOT' | envsubst > onelogin-demo.html
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <p>Auth API Test</p>
        <form action="https://signin.aws.amazon.com/saml" method="POST">
            <input type="hidden" name="SAMLResponse" value="${SAML_RESPONSE}">
            <input type="submit" placeholder="GO">
            <input id="auth_token" type="hidden">
        </form>
    </body>
</html>
EOT

POST先の https://signin.aws.amazon.com/saml はAWSでOneloginユーザへ割り当てるために作成したRoleの信頼関係の条件で確認できます。

この方法でAWSへSAML認証を利用したログインをした場合、Oneloginのポータルを経由していないので、仮に他のユーザでログインしていた場合に、そのユーザのセッションを奪うことはありません。
またユーザはOneloginをまったく意識することがなくSAML認証にログインすることが可能です。


いくつかの用途にあったSAML認証を使ったログインの手順を試してみましたが、ご自身の要件によって使い分けみてください。

また、Oneloginではデモアプリも提供しています。

そちらを抜粋し、上記の手順をデモアプリ対しての検証も行ってみましたので、気になった方はご覧ください。GitHub

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした