Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TerraformでAuth0ユーザを管理する際の一意性と可読性の担保 #1346

Open
iaoiui opened this issue Jan 4, 2022 · 2 comments
Assignees
Labels
enhancement New feature or request

Comments

@iaoiui
Copy link
Contributor

iaoiui commented Jan 4, 2022

Related Issue: #812

Auth0のRoleをTerraformで管理するユースケースを検討する場合、RoleとUserの紐付けをTerraform上で管理する必要がある。
Auth0のUserは基本的にemailが一意なIDとして使用できるが、複数のConnection(Googleの認証、GitHubの認証)で同じメールアドレスを用いているユーザがAuth0にそれぞれ登録した場合?(要確認)に、emailが一意なIDとして活用できなくなる。
一方で、Auth0上では下記画像の通りUserIDは振られているため、emailの代わりにUserIDとRoleの紐付けを管理する必要が出てくる。
image

課題

本来は、emalとRoleの紐付けの想定だったため下記のように可読性の高い表現をする予定だったが、emailだけでは一意にAuth0ユーザを特的できないため別の実装を検討する必要がある。
"CNDT2021-Admin" = ["[email protected]", "[email protected]"]

UserIDの付加が必須となる場合、下記のような実装例1, 実装例2が考えられるが
UserID部分を付加した場合の可読性の低下について若干課題感が残る。

実装例2が無難だが、実装方法は上記のまま変更しない代替案も併せて検討する。

実装例1 UserIDとRoleを愚直に紐付け(この場合、可読性が低すぎるので採用見送り予定)

"CNDT2021-Admin" = ["google-oauth2|XXXXXXXXXXXXXXXXX", "[email protected]_google-oauth2|YYYYYYYYYYYYYY"]

実装例2 メールアドレス末尾にUserIDも付加(可読性と一意性の折衷案だが、ユーザ追加のタイミングでemailとUserIDの両方をAuth0で確認する必要がある)

"CNDT2021-Admin" = ["[email protected]_google-oauth2|XXXXXXXXXXXXXXXXX", "[email protected]_google-oauth2|YYYYYYYYYYYYYY"]

代替案

Auth0において、Google認証したユーザと、GitHub認証したユーザはそれぞれ個別にRole設定できる点も考慮して、同一メールアドレスで複数ユーザを持つ人にRoleを付与する場合には明示的にどちらかのユーザにのみRoleを与えるという制約を設ける。
この場合、基本的にRole付与した側の認証方法でのみRoleを使用してもらうことになるが、基本的に影響はないはず。

ただ、この代替案を代用する場合においてもTerraform管理者はAuth0 Userをterraform importする際に明示的にUserIDを指定してimportする必要があるため、Terraformの可読性が少し良くなるがUserIDを意識して実装しないといけない点は変わらないため、実装例2の方が後々の管理面では優れているか。

@iaoiui iaoiui added the enhancement New feature or request label Jan 4, 2022
@iaoiui iaoiui self-assigned this Jan 4, 2022
@jacopen
Copy link
Contributor

jacopen commented Jan 5, 2022

@iaoiui ちょっと宣言的じゃなくなってくるのが悩ましいですが、管理性考えると

  • ユーザーをlistで管理したい
  • Auth0以外(例えばGitHub)の管理もできるようにしたい

ってなってくるかもなと。

となると、こういう実装もありかもなぁと思っています

locals {
  users = [
    {
      name = "Kazuto Kusama"
      github_email = "[email protected]"
      auth0_email = "[email protected]"
      auth0_user_id = "google-oauth2|XXXXXXXXXXXXXXXXX"
      auth0_roles = ["CNDT2021-Admin", "CICD2021-Admin"]
      github_teams = ["dreamkast", "broadcast"]
    },
    {
      name = "Ryo Takaishi"
      github_email = "[email protected]"
      auth0_email = "[email protected]"
      auth0_user_id = "github|XXXXXXXXXXXXXXXXX"
      auth0_roles = ["CNDO2021-Admin", "CICD2021-Admin"]
      github_teams = ["dreamkast"]
    }
  ]
  auth0_roles = [
    "CNDO2021-Admin",
    "CICD2021-Admin",
    "CNDT2021-Admin",
  ]
}

resource "auth0_role" "roles" {
  for_each = toset(local.auth0_roles)
  name = each.key
  user_ids = tolist([ for i in local.users : i.auth0_user_id  if contains(i.auth0_roles, each.key) ])
}

@iaoiui
Copy link
Contributor Author

iaoiui commented Jan 6, 2022

確かにauth0ユーザのみの情報をimportするだけだとあまり旨味がなかったので、ユーザ関連情報をまとめる上記実装を検討してみようと思います

auth0 role側からユーザのリストを指定できるのですね
本筋の部分ではないですが、auth0 userにrolesをリストする回りくどい実装になってしまっているのでそこは見直そうと思います

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants