OneLoginのRole割り当てをyamlベースで管理するgemを作った

これはなにか

OneLoginの運用をしていると、Role割り当てをやる機会が徐々に増えてくる。特に数百人規模の従業員を抱えているコーポレートエンジニア部門は、Roleの割り当て依頼に時間を奪われる。

コーポレートエンジニア部門以外の人でも特定の職位の人はRole割り当てをする権限を有していることはある。だが、総じて高い職位の人に限られるケースが多そうに思う(Roleを割り当てるユーザにそのアプリケーション、リソースが見えて良いかの判断はそれなりの職位でないと難しいだろう)。

また、準委任契約や派遣社員などの契約、担当変更、契約終了が漏れなくRoleの割り当てに反映されるかどうかはやはり手作業に依存する(ユーザが漏れなく削除されるなら、あまり問題にはならないケースが多い)。そして、それを一覧する機能はOneLoginにもあるものの、GUIの動作はさほど機敏ではないし、やっぱり面倒くさい。

承認と認可

ユーザ情報が即座に職位、役職に紐付く仕組みが整備されているならあまり気にすることも無いのだが、実際そうもいかないケースはある。IDaaSが社内に複数ある場合、それらのプランをあげる予算がとれない場合、構築するスキルや時間が足りない場合など。原因は様々だが、私のケースではRoleの割り当てには下記のステップを踏みたいという要望があった。

  • 利用したいユーザ自身が利用したい旨を表明できること
  • 利用しても良いかどうかを、管理職などが承認したログが残ること
  • コーポレートエンジニア部門などの手作業なしに、承認されると自動的にその内容が反映されること
  • 手作業でRoleの割り当てがされている状態が放置されないこと
  • 棚卸しが容易であること

解決策

このgemを作った。

j-o-lantern0422/hotify: Onelogin role manage with yaml

使い方は簡単で

hotify dump ./role_and_users.yml

とするとOneLogin上のRoleをキーにしてユーザの配列を値に持ったyamlが出力される。そのyamlを変更して

hotify apply ./role_and_users.yml

とすると、削除したユーザはそのrole割り当てから削除されて、追加されたユーザはそのRoleが割り当てられる。このyamlをGitHubなどのリポジトリで管理して、PRで申請、approveで承認、mergeで適用される設定をtravis等で作っておくと先の課題のほとんどが解決される。そして、割り当て状態は管理されているyamlをgrepなどで見ることが出来て便利。一部のユーザの一覧も漏れなく管理されるので(何のRoleにも割り当てられていないユーザはOneLoginの仕様上存在し得ない)もし削除漏れがあっても気づける。これはRoleの管理と言うよりかは、Userの管理なのでやりたいことを全て解決するためにはアップデートが必要だと思っている。

設計

設計について気にしたことを列挙する。

  • OneLoginの仕様は Role in Users というより、 User have Roles になっているが、hotifyでは Role in Users で扱っている
    • あるRoleはある事業部やある役職に紐付くので、棚卸しをするときにその棚卸し担当者が自分の関係あるRoleについてだけ気にすることが出来る
    • Userをキーにすると、そのUserそのものの存在が忘れられていると気づけない
    • Roleをキーにしていると、少なくともそのRoleで管理しているアプリケーションについては支払いなどが発生していると考えられる(ほとんどのアプリでSAMLは有料)ので、気づくきっかけがUserよりかは多い
  • dry runを実装した
    • 削除されたRole、Userがいたらtravisなどでエラーになり、mergeをストップしたい

今後

  • 特定のRoleを無視する実装がしたい
    • DefaultのRoleは何もアプリケーションが割り当てられていなくて、各Roleの割り当てで上書きする等無視したいケースがある
  • Role毎にyamlを出力したい
    • yamlが大きくなりすぎるとやはり編集が大変
  • もっと早くしたい
    • 毎回全ユーザを列挙している関係で遅い
    • 使っているAPIラッパー onelogin/onelogin-ruby-sdk 自体にコントリビュートするのが良いかも
      • 何度かバグ修正などをcommitしているが、迅速にレビュー、マージしてくれる

コメント

タイトルとURLをコピーしました