AWS Session Tag + Auth0 Ruleを使ってメールアドレスでABACする #reinvent #Auth0JP

2019.12.05

AWS Session Tagとは?

AWS Session Tagはre:Invent 2019期間中に新しく発表されたIdentity Federationのための新機能です。概要は臼田の記事を参考にしてください。

[UPDATE]フェデレーションでタグを渡せるSTSの新機能Session Tagがリリースされました #reinvent

先日、Auth0をSAML IdPとした場合のシングルサインオンで試した記事を公開しました。

【新機能】Auth0でAWSリソースをRBAC!AWS Session TagとAuth0を組み合わせてみた #reinvent #Auth0JP

今回はステップアップし、もう少し実用的な例に落とし込んでいきたいと思います。

メールアドレスでABAC

こちら の例ではあくまでどのユーザーも一律に同じRoleしか付与できない形となっていました。

Ruleにハードコードしているためです。

user.CostCenter = 'marketing';

この部分を、今回はAuth0のRoleを使って動的に設定されるようにしてみたいと思います。

Rule① ドメインによるRoleの判定、自動付与

まず新規Ruleを作ります。Ruleの名前は「Set role to a user」としました。

function (user, context, callback) {

  if (!user.email) {
    return callback(null, user, context);
  }

  user.app_metadata = user.app_metadata || {};
  
  const addRoleToUser = function (user) {
    const endsWith = '@classmethod.jp';
    if (user.email && (user.email.substring(user.email.length - endsWith.length, user.email.length) === endsWith)) {
      return 'engineering';
    }
    return 'marketing';
  };

  const role = addRoleToUser(user);
  user.app_metadata.role = role;
  auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
    .then(function () {
      callback(null, user, context);
    })
    .catch(function (err) {
      callback(err);
    });
}

メールアドレスが @classmethod.jp となっている場合は app_metadatarole をセットします。

Rule② SAMLアサーションへのRoleの付与

次にSAMLアサーションへのRoleの付与を行います。

function(user, context, callback) {
  var awsAccount = '【AWSアカウントIDを設定】';
  var rolePrefix = `arn:aws:iam::` + awsAccount; 
  var samlIdP = rolePrefix + `:saml-provider/auth0SamlProvider`;

  user.awsRole = rolePrefix + `:role/AccessByCostCenter,` + samlIdP;
  user.awsRoleSession = user.email;
  user.awsTagKeys = ['CostCenter', 'Project'];
  user.CostCenter = user.app_metadata.role;
  user.Project = 'website';

  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/PrincipalTag:CostCenter': 'CostCenter',
    'https://aws.amazon.com/SAML/Attributes/PrincipalTag:Project': 'Project'
  };

  callback(null, user, context);
}

これで完成です!

試してみる

それでは試してみましょう。まずは suwa.yuki@classmethod.jp でログインします。

Auth0では app_metadata.roleengineering が付与されています。

CostCenterengineering が設定されているリソース以外は操作できません。

次に suwa.yuki@example.com でログインします。

Auth0では app_metadata.rolemarketing が付与されています。

CostCentermarketing が設定されているリソース以外は操作できません。

上手く動きました。

まとめ

メールアドレスのドメインで判定してメタデータを変更し、Session TagのRBACに利用する方法をご紹介しました。

Ruleのスクリプトによっては、メールアドレス以外のユーザー情報をベースとした条件を作ることもできます。ぜひお試しください。