G SuiteのSSOでPrivateなgitbook

Posted by joeartsea on 2018-04-10

gitbookをG SuiteのSAMLで認証したい

gitbookが便利なので会社のドキュメントをgitbookにしたいけどpublicにするわけにはいかない。gitbook.comのbeta?では有償プランでSSOやってるっぽいのだけど何故かアカウントが作成できません(2018/04/05現在)そこでNode.js + expressでG SuiteをIdpとしたSAML認証を実現してみました。

gitbook自体の使い方は 最低限の知識で gitbook を利用する に譲りまして、これで作成した静的ファイルを以下で説明するExpressアプリの public ディレクトリに配置する前提です。

ExpressでG SuiteとSSO

Node.jsのExpressフレームワークを使ってG SuiteのSAMLリクエストを受け付けるWebサーバを構築します。

認証基盤なので express-session, cookie-parser, passport など認証・セッション管理に必要なモジュールを使用します。また、今回はG SuiteのSAML認証に対応するため passport-saml ライブラリを使います。

ソースコードは以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
'use strict'
const express = require('express')
const session = require('express-session')
const cookieParser = require('cookie-parser')
const bodyParser = require('body-parser')
const passport = require('passport')
const SamlStrategy = require('passport-saml').Strategy
const app = express()
// SAML認証で取得するユーザ情報をシリアライズしてセッションに書き込む
passport.serializeUser(function (user, done) {
done(null, user);
})
// SAMLリクエストにあるユーザ情報をデシリアライズ
passport.deserializeUser(function (user, done) {
done(null, user);
})
// passport-samlの設定
// entryPoint: SSOログイン時にアクセスするIdPのURL
// issuer: IdPに提供される本アプリケーション(SP)の識別子
// path: IdPでのSSOログインが行われた場合にコールバックされるURL
// cert: SP initiated SSO(SP起点のSSO)に必要なSAML証明書情報
passport.use(new SamlStrategy({
entryPoint: process.env.ENTRYPOINT,
issuer: process.env.ISSUER,
path: '/auth/saml/callback',
protocol: 'https://',
cert: process.env.CERT
}, function (profile, done) {
return done(null, {
email: profile.email
})
})
)
// Expressでセッションを使用するための設定
app.use(cookieParser())
app.use(session({
secret: process.env.SECRET,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 30 * 60 * 1000
}
}))
// passportを使用するための設定
app.use(bodyParser.urlencoded({ extended: true }))
app.use(passport.initialize())
app.use(passport.session())
// 認証が通れば `/` にリダイレクト
// 認証NGの場合は `/login` にリダイレクト
app.get('/login', passport.authenticate('saml', {
successRedirect: '/',
failureRedirect: '/login'
}))
// IdPでのSSOログイン後コールバックされるURL
app.post('/auth/saml/callback', passport.authenticate('saml', {
successRedirect: '/',
failureFlash: true
}), function(req, res) {
res.redirect('/login')
})
// すべてのリクエストにSAML認証をかける(設定順序注意)
app.all('*', function (req, res, next) {
console.log(req.isAuthenticated())
if (req.isAuthenticated() || req.path == '/login') {
next()
} else {
res.redirect('/login')
}
})
// SAML認証されれば `public` ディレクトリの静的サイトを表示(設定順序注意)
app.use(express.static('public'))
app.listen(process.env.PORT || 3000)
module.exports = app

注意点として app.allapp.use(express.static('public')) は、この順序で設定しないとSAMLリクエストとかコールバックが動かないです。もっと良い方法があるのかもしれませんが、とりあえず動いたので… もっと良い方法あったら教えてください!

とりあえずコレをHerokuにデプロイします。あとは、G Suiteの設定をしてHerokuアプリの環境変数を設定すればOKです。

G Suiteの設定

当然ながらG Suiteは管理者権限が必要です。 https://admin.google.com/<DOMAIN>.com にアクセスします。

G Suite 管理コンソール

次に、[セキュリティ] -> [シングルサインオン (SSO) の設定] と進みます。

シングルサインオン (SSO) の設定

続いて、[証明書をダウンロード] ボタンを押し、証明書をダウンロードしておきます。また [IDP メタデータをダウンロード] ボタンを押し、メタデータ XML もダウンロードしておきます。

次に、管理コンソールのトップへ戻り、[アプリ] を選びます。

アプリの設定

続いて、[SAML アプリ] を選びます。

G SAML アプリ

さらに、[サービスやアプリをドメインに追加] を選択、または右下の + ボタン押します。

SAML アプリケーションで SSO を有効にする

次に、[カスタムアプリをセットアップ] を選ぶと、SSO の URLエンティティID など、[シングルサインオン (SSO) の設定] と同じ情報が表示されるので、確認して [次へ] を選びます。

続いて、アプリケーション名に gitbook を設定して [次へ] を選びます。

最後に、以下を入力し、他の項目はデフォルトのまま [次へ] を選ぶとウィザードは完了ですが、まだ有効化されていません。ここではひとまず [OK] を押します。

項目
ACSのURL https://<Heroku App ID>.herokuapp.com/auth/saml/callback
エンティティID https://<Heroku App ID>.herokuapp.com/sp
gitbook の SSO 設定

[gitbook の設定] ペインの右上にあるメニューアイコンを押し、 [オン (すべてのユーザー)] を選びます。なお、組織が複数あって、個別に有効化したいときは、[一部の組織に対してオンにする] が利用できます。

Herokuアプリの環境変数設定

Herokuアプリの環境変数を以下のように設定します。

変数
CERT IDP メタデータ XML の [X509Certificate](改行削除)
ENTRYPOINT [シングルサインオン (SSO) の設定] の [SSO の URL]
ISSUER https://<Heroku App ID>.herokuapp.com/sp
SECRET 任意の文字列

これで、https://<Heroku App ID>.herokuapp.com にアクセスするとG Suiteの認証画面が表示されて、ログインするとgitbookで作成した静的サイトが表示されます。

また、G Suiteの以下にもSAMLアプリのアイコンが表示されます。こちらをクリックしても同様にSSO可能です。

G Suite の SAMLアプリ の アイコン

Octotree is enabled on this page. Click this button or press cmd shift s (or ctrl shift s) to show it.