LinkbalDay 25

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


はじめに

この記事は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を持つ事が当たり前になりつつありますが、皆さまどのように構築されているのか気になりますよね。

まだまだお話したいことはあるのですが、この辺りで終わりにしたいと思います。

それでは良いクリスマスを!🎄