Auth0第一歩 ~複数のAWSアカウントにSAML認証でシングルサインオン~

おうちプロジェクトでSlack,Trello,AWS,Githubなんかを使っているのですが、メンバーが数人にも関わらずアカウント管理がめんどくさくなってしまいました。経験がある人も多いかと思います。せっかくなんでシングルサインオン(SSO)試してみるか と思い、最近グイグイきているAuth0を試すことにしました。

Auth0

Auth0はWebサービス、モバイルアプリ、IoT、社内アプリケーションの為のソリューションです

弊社のパートナーで、導入のサポートなども行っております。興味のある方は下記をご参照ください。

クラスメソッド > パートナー > 次世代認証基盤サービス「Auth0」

シングルサインオン(SSO)ログイン

単一の資格情報を使ってアプリケーションにログインすることで、様々なアプリケーションに自動的にサインインします。

使用しているサービスやアプリケーションごとに資格情報を管理しなくてよくなります。

試してみた

今回試したのはAWS Management ConsoleへのSSOログインです。 IAMは、OpenID Connect または SAML 2.0 (Security Assertion Markup Language 2.0) と互換性のある IdP をサポートしています。

Slack,Trelloも試したかったのですが、フリープランではSSO設定ができないので今回は断念しました。。。

せっかくなので、複数のAWSアカウントにシングルサインオンすることを試したいと思います。

前提条件

  • Auth0のアカウントを登録ずみ(無償トライアルを使用します)
  • AWSでIAMの設定ができる権限があるユーザー

手順は、Auth0のドキュメント Configure Single Sign-On with the AWS Console があるので、これを参考にします。

1. Applicationの作成(Auth0側)

Management Dashboardにログインし、Applicationを作成します。

名前を入力し、 Native を選択し、作成します。

2. Applicationの設定(Auth0側)

作成したApplicationの Addons を開き、SAML2 Web Appを選択します

設定画面が起動するので、入力していきます。

Application Callback URL、 Settings に以下の内容を入力し、設定画面の下部にある ENABLEを押して完了させます。

  • Application Callback URL

    https://signin.aws.amazon.com/saml

  • Settings

{
  "audience": "https://signin.aws.amazon.com/saml",
  "mappings": {
    "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
    "name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
  },
  "createUpnClaim": false,
  "passthroughClaimsWithNoMapping": false,
  "mapUnknownClaimsAsIs": false,
  "mapIdentities": false,
  "nameIdentifierFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
  "nameIdentifierProbes": [
    "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
  ]
}

Usageタブをクリックすると、AWSでAuth0をIdPにする設定について記載されていますね。

Identity Provider Metadata. の Downloadリンクから、必要な情報を含むXMLファイルを取得できるのでダウンロードします。

3. IAMでIdP設定(AWS)

AWSマネージメントコンソールにログインし、IAMコンソールへ遷移します。

左側のナビゲーションメニューを使用して、[IDプロバイダー]を選択します。プロバイダーの作成をクリックします。

プロバイダの設定
  • プロバイダーのタイプ

SAML

  • プロバイダ名

Auth0

  • メタデータドキュメント

先ほどダウンロードしたXMLファイルを選択します

次のステップボタンを押して検証画面に遷移し、作成ボタンを押します。作成されると以下のように表示されます。

4. IAMでRoleの作成(AWS)

作成したプロバイダーを使用するには、ロールの信頼ポリシーでプロバイダーを使用してIAMロールを作成する必要があります。 ロールの設定画面に遷移し、ロールを作成します。

※ 今回は2つのアカウントにログインできるようにするので、2回繰り返すことになります。アタッチするポリシーは変更します。

  • 信頼されたエンティティの種類

SAML 2.0 フェデレーション

  • SAML プロバイダー

先ほど登録したプロバイダー名を選択

追加するロールは、 プログラムによるアクセスと AWS マネジメントコンソールによるアクセスを許可する としました。 属性、値は自動で入力されます。条件は今回は入力しません。

次のステップで新しいロールにアタッチするポリシーを選択します。

一つはAdministratorAccess を選択し、もう一つのアカウントはAmazonS3ReadOnlyAccess にしてみます。

確認画面まで行き、OKなら作成しましょう。

5. IAMロールをユーザーにマッピングする(Auth0)

Auth0のダッシュボードに戻り、先ほど作ったロールをAuth0のユーザーと紐付けを行います。

左ナビゲーションのRulesをクリックし、設定画面にある CREATE RULE を押します

テンプレートを選択する画面になりますが、書き換える必要がでてきます。

とりあえず SAML Attributes mapping を選択してみます。

5-1. Userの設定

左ナビゲーションの Users & Roles を開き、Usersをクリックします。

ユーザー一覧画面に行くので、今回SSOする対象ユーザーを選択します。

Detailsタブのapp_metadataに以下の内容を貼り付けます。

※ 自身の環境に合わせて書き換えてください。

{
  "aws_account_groups": {
    "[YOUR_ACCOUNT_NAME_HERE]": "[YOUR_ARN_HERE]",
    "[YOUR_ACCOUNT_NAME_HERE]": "[YOUR_ARN_HERE]"
  }
}
  • YOUR_ACCOUNT_NAME_HERE ログインするアカウントを識別するための名前 を入力する。

    次のルールスクリプトで利用するので, aws_ から始める名前にする

  • YOUR_ARN_HERE   ログインするアカウントのroleとIDプロバイダのarn を入力する

5-2. ルールのスクリプトを作成

Name,Scriptを入力する必要があります。

  • Name

任意の名前を入力します。

  • Script

以下の内容を貼り付けます.

※ 自身の環境に合わせて書き換えてください。

function (user, context, callback) {
  if(context.clientID !== '[YOUR_CLIENT_ID_HERE]'){
    return callback(null, user, context);
  }

  // ユーザーのapp_metadataを参照する
  var userGroups = user.app_metadata.aws_account_groups;

  // SAML認証でログインするアカウントを識別するため
  function awsFilter(group) {
    return group.startsWith('aws_');
  }

  function mapGroupToRole(awsGroup) {
    return userGroups[awsGroup];
  }

  user.awsRole = Object.keys(userGroups).filter(awsFilter).map(mapGroupToRole);
  user.awsRoleSession = user.email;
  user.time = 43200; // time until expiration in seconds

  context.samlConfiguration.mappings = {
    'https://aws.amazon.com/SAML/Attributes/Role': 'awsRole',
    'https://aws.amazon.com/SAML/Attributes/RoleSessionName': 'awsRoleSession',
    'https://aws.amazon.com/SAML/Attributes/SessionDuration': 'time'   
  };

  callback(null, user, context);
}

  • YOUR_CLIENT_ID_HERE

    アプリケーションのClientIDを入力

入力後、保存します。これで設定は完了です

6. サインインの確認

Identity Provider Login URLは、ダッシュボードで見つけることができます。アプリケーションを開いてSAML2 Addonを開き、Usageタブをクリックします。

Identity Provider Login URLに書かれているURLをクリックすると、AWSのSAMLサインイン画面に遷移します。

2つのアカウントにログインできる設定を行ったので、ロールが選択できるようになっています。ログインしてみます。

きちんと選択したロールでサインインできました。

まとめ

Auth0を利用して2つのアカウントのAWSのマネージメントコンソールにログインしてみました。以下手順で行いました。

  • 1.Applicationの作成(Auth0側)
  • 2.Applicationの設定(Auth0側)
  • 3.IAMでIdP設定(AWS)
  • 4.IAMでRoleの作成(AWS)
  • 5.IAMロールをユーザーにマッピングする(Auth0)
  • 6.サインインの確認

5. IAMロールをユーザーにマッピングする(Auth0) の設定が少し難しいですね。もっといい方法があるよと言う方、ぜひコメントください!

SSOのメリットは言わずもがなですが、マスター・アカウント情報が流出や漏えいすればなりすまして不正利用されることも考慮しなければなりません。利用者の利便性は落ちますが、MFAを利用しセキュリティを強化することも検討しましょう。また、全てをSSOで管理すると、元のシステム(今回ならAuth0)が落ちてしまうと全てのサービスにログイン出来なくなってしまいます。サービス固有でログインする手段も残し、万が一に備えた方が良いのではないでしょうか。

今回はSSOでしたが、まだまだAuth0には色々な機能があります。随時紹介していければと思います。

では

参考