この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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_metadata
に role
をセットします。
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.role
に engineering
が付与されています。
CostCenter
に engineering
が設定されているリソース以外は操作できません。
次に suwa.yuki@example.com
でログインします。
Auth0では app_metadata.role
に marketing
が付与されています。
CostCenter
に marketing
が設定されているリソース以外は操作できません。
上手く動きました。
まとめ
メールアドレスのドメインで判定してメタデータを変更し、Session TagのRBACに利用する方法をご紹介しました。
Ruleのスクリプトによっては、メールアドレス以外のユーザー情報をベースとした条件を作ることもできます。ぜひお試しください。