テストサーバを社内からのアクセスに制限したい

f:id:n06utk:20190308165040p:plain

はじめに

GLUGの小林です。 テストサーバなどで、社内からのアクセスに制限したいときってよくありますよね。

あたりがよくありますが

  • IPアドレス制限
    • 社屋からアクセスするとは限らない
    • とはいえVPNサーバ立てるのも面倒
  • Basic認証
    • ユーザ管理したくない

というところで難点が。 そこで署名付きCookieと、弊社ではGoogle G Sutieを使っているので、Google認証を組み合わせて制限をかけます。

仕組み

  1. 認証用のエンドポイントへアクセス
  2. Googleの認証画面へリダイレクト
  3. Googleでの認証
  4. 認証完了後のcallback
  5. tokenを使ってGoogleのユーザー情報取得
  6. 署名付きCookieを発行

1と5のURLにはアクセス制限をかけないようにしてください。

事前準備

  1. リンク先を確認してCloudFrontで制限をかけます
  2. 1.で取得したprivate keyをKMSでエンコードし、結果の文字列を保存
  3. GoogleOAuth2認証の設定を行います。

認証用のURLは http(s)://{hostname}/oauth/login CallbackのURLは http(s)://{hostname}//oauth/callback です。

デプロイ

ソースはGitHubにあります。 Goがインストール済みである必要があります。

ツールの入手

$ git clone git@github.com:n06uk06a/oid_connect.git
$ cd oid_connect

ビルド

GOOS=linux go build -o build/oidc

環境変数の設定

名前 内容
KMSPrincipal KMSマスターキーのARN
KMSAliasParameter KMSマスターキーを格納しているパラメータのAlias
OAuthClientID GoogleのOAuth2のClient ID
OAuthClientSecret GoogleのOAuth2のClientシークレット
CFKeyID CloudFrontに設定したキーペアのキーのID
CFKey CloudFrontに設定したキーペアのキー
URLPattern Cookieに設定する許可するURLのパターン
JWSKey 仕組みの2でJWSを発行し、5で確認するためのキー(適当なもので)
HostedDomain G Suiteのドメイン

デプロイ

$ aws cloudformation package \
    --template-file template.yaml \
    --s3-bucket ${BUCKET_NAME} \
    --output-template-file package.yaml
$ aws cloudformation deploy \
    --template-file package.yaml \
    --stack-name OIDConnect \
    --capabilities CAPABILITY_IAM \
    --parameter-overrides \
        KMSPrincipal=${KMS_KEY_ADMIN_ARN} \
        KMSAliasParameter=${KMS_ALIAS} \
        OAuthClientID=${OAUTH2_CLIENT_ID} \
        OAuthClientSecret=${OAuthClientSecret} \
        CFKeyID=${CLOUDFROMT_KEY_ID} \
        CFKey=${CFKey} \
        URLPattern=${URL_PATTERN} \
        JWSKey=${JWSKey} \
        HostedDomain=${GOOGLE_HOSTED_DOMAIN}

注意点

とりあえず有効期限を1時間にしていたり、ドメイン1個だけ許可していたり、認証要求やCallbackのパスとかが固定だったりするので、その辺はカスタマイズしてください。あとCookie使うので、同じDistribution(同じドメイン)に入れておかないとハマります(ハマりました)