LoginSignup
6
1

More than 5 years have passed since last update.

リンクバルの共通認証基盤について

Posted at

はじめに

この記事はLinkbal Advent Calendar 2018の25日目の記事です。技術部の船寄が担当させて頂きます。

🎄🔔聖夜の更新となりました。皆さまいかがお過ごしでしょうか。🤶🎄
今回は、今年の年始にリリースを行った共通認証基盤(リンクバル ID)についてご紹介したいと思います。

共通認証基盤(リンクバル ID)とは

OpenID Connectを利用した、共通認証基盤です。よく、ほげほげ IDというフレーズを目にすることがあると思いますが、それですね。
1つのIDで複数サービスを利用できるようにするものです。
現在リンクバルでは、machiconJAPANCoupLinkKOIGAKUの3サービスで利用されております。

主な機能について

主に下記の機能を実装しています。

  • OpenID Provider(OP)としての機能
    • Authorization Endpoint
    • Token Endpoint
  • UserInfo Endpoint
  • ユーザ情報の変更(一部)
  • パスワードのリセット機能
  • メッセージ送信(メール、SMS)
  • システム管理者用管理画面

OpenID ProviderのOSS利用

OpenID Providerに関してはこちらのOSSを使わせていただきました。ory/hydra
OpenID Provider(OP)としての機能を提供してくれるものです。ただし、Authorization Endpointの認証についての機能や、ユーザ情報の保持については自分で実装する必要があります。
もう少し具体的には、下記につて自前で実装する必要がありました。(実装しました。)

  • ログイン機能
  • 新規登録機能
  • プロフィール登録機能

※もちろんUserInfo Endpointもhydraには含まれておらず、自前で実装しました。

アプリケーションの分割

実装する機能から、マイクロサービス風に、下記のようにアプリケーションを分割して構築することにしました。

  • OP
    • hydraそのもの
  • IDP
    • 新規登録、ログイン、パスワード再発行、ユーザ情報更新などの機能を提供するアプリケーションです。
  • UserInfo
    • Userinfoエンドポイント
  • Message
    • メール、SMS送信
  • Admin
    • 管理画面(CS対応用)

開発言語/ライブラリなど

  • golang(go1.9.1)
    • gin-gonic/gin
    • go-xorm/xorm
    • gorilla/securecookie
    • gorilla/sessions
    • validator.v9
    • gorilla/csrf
    • gorilla/schema
    • spf13/viper
    • ory/hydra
    • GoogleCloudPlatform/cloudsql-proxy

golangを当社で初めて導入しました。hydra以外に、特に珍しいパッケージなどは利用しておりません。

インフラについて

Google Cloud Platformを利用しております。今回はGoogle Kubernetes Engineを採用し、コンテナでの運用に挑戦しました。
Ingressを利用し、ルーティングルールを設定することにより、単一のロードバランサとパブリックIPアドレスで、複数のアプリケーションを運用しております。

イメージ.png

データベースはCloudSQL(MySQL5.7)を利用しています。全てのアプリケーションから単一のデータベースを利用する設計としております。
また、Stackdriver Loggingに全てのログを出力しています。

dockerイメージのビルドとデプロイ

ビルド

Cloud Buildを利用し、dockerイメージをビルドしています。Cloud Buildのトリガーにgithubリポジトリへの タグへの push をトリガーとして登録しております。
プッシュされたタグをリリースする運用です。
ビルドする際に複数のアプリケーションを1つのイメージの中にまとめています。

デプロイ

kubectlをでデプロイしています。具体的には下記のようなイメージです。

deploy.sh
RELEASE_TAG=$1
sed -e "s/<TAG>/$RELEASE_TAG/g" ./application.yml | kubectl apply -f -
application.yml
# application.ymlの一部
spec:
  containers:
  - name: userinfo
    image: hoge.gcr.io/linkbal/id:<TAG>

モニタリング

Datadogを利用してモニタリングを行っております。
また、アプリケーションエラーの検知に関してはStackDriver Loggingに出力されたerrorログを検知し、Slackへ通知する仕組みとなっています。

開発環境

docker-composeを利用して環境を構築するようにしています。
複数サービスで利用される基盤であることから、開発者がなるべく簡単に環境を再現できるようにしております。
リポジトリをcloneし、docker-compose up を叩くだけで初期マスタの投入を含めて環境構築をしてくれます。

運用後のトラブル

hydraの中で適切にindexが貼られておらず、データベースに深刻な負荷を与える事案が発生しました。
slowqeryを確認すると、token周りのテーブルで適切にindexが貼られていないことが判明しました。
その他は、特に大きな問題なく運用を続けることができています。

おわりに

各社で共通IDを持つ事が当たり前になりつつありますが、皆さまどのように構築されているのか気になりますよね。
まだまだお話したいことはあるのですが、この辺りで終わりにしたいと思います。
それでは良いクリスマスを!🎄

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1