serverless aws構成でセキュアなspaを目指す
TRANSCRIPT
![Page 1: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/1.jpg)
Copyright © 2016. All rights reserved.
Copyright © 2017 All rights reserved.
2017/01/17ハンズラボ 株式会社Serverless Meetup Tokyo #2
Serverless AWS構成でセキュアなSPAを⽬指す!
![Page 2: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/2.jpg)
⾃⼰紹介
• 名前:加藤 雅之
• 所属:ハンズラボ株式会社
• 担当:「AWSチーム リーダー」
東急ハンズ- AWSインフラ、IT統制
ハンズラボ 外販- AWS構築運⽤⽀援
![Page 3: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/3.jpg)
Copyright © 2017 All rights reserved.3
ハンズラボ株式会社
• 情シス部⾨Ø 東急ハンズの各種システムの内製開発と運⽤保守
• 外販Ø ⾃社開発の経験を活かした受託開発、内製⽀援
東急ハンズのシステム⼦会社
![Page 4: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/4.jpg)
Copyright © 2017 All rights reserved.4
APNArchitectureoftheYear 2015受賞
• AWS Partner Networkの利用アーキテクチャが「最も先進的、または実用的、チャレンジングなもの」が選ばれる
![Page 5: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/5.jpg)
Copyright © 2017 All rights reserved.5
東急ハンズ ポイントシステム
• ミッションクリティカルなポイントシステムを、AWSクラウドネイティブにて構築
![Page 6: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/6.jpg)
Copyright © 2017 All rights reserved.6
AWSSamurai2015をCEO⻑⾕川が受賞
• AWSのユーザーコミュニティに貢献した方が選ばれる
![Page 7: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/7.jpg)
Copyright © 2017 All rights reserved.7
今⽇お話する内容
Serverless AWS構成でセキュアなSPAを⽬指す!
![Page 8: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/8.jpg)
Copyright © 2017 All rights reserved.8
今⽇お話する内容
過去に作成したSPAなServerlessシステムの知⾒をベースに、よりセキュリティを意識した、別バージョンのシステム
Serverless AWS構成でセキュアなSPAを⽬指す!
![Page 9: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/9.jpg)
Copyright © 2017 All rights reserved.9
の紹介ではなく
東急ハンズの考え⽅「ここは、ヒント・マーケット」
何を売るところですか?とたずねられたら、「それはヒントです!」と言い切りたい。
そう、ここには「できあいの答え」は、ひとつも置いてありません。
全フロアが、何かをつくりたい人、はじめたい人にとっての
「きっかけ売り場」であり、「発想の一歩目」である。
モノ・コト・ヒトのすべてが出会い、すべての新しい価値がそこから生み出される、うれしい場所へ。
東急ハンズHP 「ここは、ヒント・マーケット」とは?https://www.tokyu-hands.co.jp/saiyo/shinsotsu/about/
そんな思いを Serverless Meetup Tokyo にも
![Page 10: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/10.jpg)
Copyright © 2017 All rights reserved.10
今⽇お話する内容
Serverless AWS構成でセキュアなSPAを作成する様⼦を
順を追っていきます!
![Page 11: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/11.jpg)
Copyright © 2017 All rights reserved.11
ちなみに過去に作成した Serverless PointSystem
![Page 12: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/12.jpg)
Copyright © 2017 All rights reserved.12
それは唐突に起こった
ねぇねぇ加藤くん。ちょっといいかい?
n開発・テストも落ち着きつつある2015年 年末頃
忍び寄る大きな影
![Page 13: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/13.jpg)
Copyright © 2017 All rights reserved.13
それは唐突に起こった
ねぇねぇ加藤くん。ちょっといいかい?
このプロジェクト中止ね
n開発・テストも落ち着きつつある2015年 年末頃
![Page 14: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/14.jpg)
Copyright © 2017 All rights reserved.14
⼤⼈の事情により、使われる事がないポイントシステムが完成
![Page 15: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/15.jpg)
Copyright © 2017 All rights reserved.15
システムに罪はない
![Page 16: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/16.jpg)
Copyright © 2017 All rights reserved.16
気を取り直して
Let's cook !
Serverless AWS構成でセキュアなSPAを⽬指す!
そんなノウハウが詰まった
![Page 17: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/17.jpg)
Copyright © 2017 All rights reserved.17
まずはSPAのベースとなる静的サイト
nHTMLやJavascript、画像ファイル等をS3へ設置
nより多くのアクセスに耐えられるようにCloudfrontでCDN化。同時にS3へのアクセスはCloudfrontからしか取得出来ない様に
![Page 18: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/18.jpg)
Copyright © 2017 All rights reserved.18
ドメインの取得とSSL証明書の設置
nRoute 53を使⽤してドメインの取得とDNS登録
nAWS Certificate Managerにて証明書の作成とCloudfront への設置
![Page 19: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/19.jpg)
Copyright © 2017 All rights reserved.19
静的なServerless の完成
これも⽴派なServerless!
![Page 20: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/20.jpg)
Copyright © 2017 All rights reserved.20
次は動的な情報をJSONで返すAPIの⼊り⼝
nAPI GatewayからAPIを作成nCORS(Cross-OriginResourceSharing) 設定を忘れずに
l SPAとは異なるドメインになるのでCORSの有効化を⾏う
![Page 21: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/21.jpg)
Copyright © 2017 All rights reserved.21
動的な情報を処理するFunction
nAPI Gatewayから呼び出されるバックエンドにはみんなが⼤好きなLambda
n実⾏権限(Role)は必要最低限
![Page 22: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/22.jpg)
Copyright © 2017 All rights reserved.22
動的な情報を保持しているデータストア
nDynamoDBのテーブル作成nLambdaの実⾏RoleにDynamoDBへのRead/Write権
限を付与nDynamoDBからデータ取得するLambda、データを保
存するLambdaをそれぞれ作成。
![Page 23: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/23.jpg)
Copyright © 2017 All rights reserved.23
API Gateway 周りをちまちまと
nAPI Gateway に適切なリソースやメソッドでLambdaを紐づけl RESTful APIな思想にて
nデプロイを⾏いJavascript のSDK⽣成を⾏うl SDKはSPAのS3へ保存
nSPA側でAPI呼び出しと⾮同期処理
![Page 24: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/24.jpg)
Copyright © 2017 All rights reserved.24
XSS対策のためにAWS WAF
nAWS WAF をAPI Gateway の前に挟む※AWS WAFはAPI Gatewayに直接つかないので、
Cloudfront経由になる
![Page 25: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/25.jpg)
Copyright © 2017 All rights reserved.25
動的でセキュアなServerless SPAの完成
らしくなって参りました
![Page 26: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/26.jpg)
Copyright © 2017 All rights reserved.26
いよいよ個別ユーザー機能
nCognito で⽤意されているUser Pools(ユーザー認証基盤)を使⽤しても良いが、今回はFederated Identitiesについて
nFederated Identitiesには認証機能は付いておらず認可を⾏う。認可元はOpenIDやSAML等を選べるが、今回は⾃分で作成するCustum Provider(通称Developer authenticated identities )とする
![Page 27: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/27.jpg)
Copyright © 2017 All rights reserved.27
DeveloperAuthenticatedIdentityの仕組み
n認証フローは複数あるが拡張認証フローを使⽤する。⾃作ユーザーとCognitoのユニークなIdentityが対になっていて、ユーザーは受け取ったTokenを使⽤してAWS STS からAWSリソースに対するCredentialを受け取る。
![Page 28: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/28.jpg)
Copyright © 2017 All rights reserved.28
Cognitoの登録
nFederated identitiesよりidentity poolを作成l Authentication providersはcustumでユニークな
provider nameにするl 認証済みのRole auhenticated identitesをデフォルト
で作成
![Page 29: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/29.jpg)
Copyright © 2017 All rights reserved.29
ユーザー登録Lambda
n ID/PASSのユーザー登録Lambdaを作るl DynamoDB ユーザーTableへIDとPassを保存
![Page 30: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/30.jpg)
Copyright © 2017 All rights reserved.30
ユーザー認証Lambda
n登録ユーザーの認証を⾏うログイン処理Lambdaを作るl ID/Passの検証し、作成したCognito identity pool へ
getOpenIdTokenForDeveloperIdentityを⾏う。
![Page 31: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/31.jpg)
Copyright © 2017 All rights reserved.31
クライアント処理とセンシティブなAPIの保護
n返却されたCognito Tokenをクライアントに保存ngetCredentialsForIdentityを使⽤して、AWS STSから
Credential(accessKey / secretKey / sessionToken)の取得して、apigClient.credentialに保存
nセンシティブなAPIのメソッドに対してAWS_IAMの認証設定
nCognitoのAuthenticateRoleに上記のメソッドarmを許可設定
![Page 32: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/32.jpg)
Copyright © 2017 All rights reserved.32
ユーザー認証付きのセキュアなServerless
しかし問題が。。。
![Page 33: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/33.jpg)
Copyright © 2017 All rights reserved.33
有効期限に注意
nSTSのCredential有効期限は最⼤1時間l Cognito Tokenで再取得
nCognito Tokenの有効期限は最⼤24時間l ID と パスワードを送れば再取得可能だが、クライアン
トに保管するわけにはいかない
nログインをそれ以上維持させたい場合l 独⾃認証部分の永続の為にToken化
![Page 34: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/34.jpg)
Copyright © 2017 All rights reserved.34
ならば Json Web Token
nHeaderとPayloadとSignatureという3つのセグメントから構成される Token
1 Header署名アルゴリズムなどを含むJSON
2 Payload実際に送信したいJSONデータそのもの
3 SignatureHeaderとPayloadをBase64エンコードしたのちに、“.” で連結した文字列に対して、
Headerに指定されたアルゴリズムで署名
![Page 35: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/35.jpg)
Copyright © 2017 All rights reserved.35
JWTの何が良いのか?
nセッションや単なるTokenとの⼤きな違いは、 Payloadにクライアントに渡しても良いデータ(ユーザーID等)を記載するので、疎結合となっているServerlessにとってはデータ使い回しの勝⼿が良い。
nクライアントとAPI側でTokenのやり取りがあるが、もし悪意あるユーザーが書き換えを⾏なっても、 Signature部分にてチェックを⾏える。- 復号できなければ不正なTokenとなる
nCognitoのTokenもJWTで構成されているl クライアント側でのTokenの取り回しが共通化
![Page 36: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/36.jpg)
Copyright © 2017 All rights reserved.36
実際のJWT(Cognito)
![Page 37: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/37.jpg)
Copyright © 2017 All rights reserved.37
独⾃ Json Web Tokenの準備
nPayloadはユーザーに渡しても良い使い回す情報を⾃由(JSON形式)に記載
nHeaderはtyp:JWTのalg:HS512( SHA-512 hash )
nSignatureに使うキーは可能であれば別々にしたいl 漏れた場合に別のユーザーになり済ませてしまう- KMS(Key Management Service)を使⽤
![Page 38: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/38.jpg)
Copyright © 2017 All rights reserved.38
Key Management Service
nマスターキーとデータキーがあるl 実際のデータを暗号/復号化するのはデータキーだが、
データキー⾃体の⽣成と復号化をできるのはマスターキーとなっている。マスターキーの⽣データは取得する事が出来ない。
nマスターキーはIDしか無いので、暗号/復号化するLambdaのRoleだけにデータキー操作の権限を付与すれば、マスターキーIDがあっても開発者でさえ復号化する事が出来ない。- データキーをJWTのsignatureで使⽤するハッシュ
キーとする
![Page 39: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/39.jpg)
Copyright © 2017 All rights reserved.39
暗号化:ログイン処理LambdaにJWT作成追加
nマスターキーIDを元にgenerateDataKeyで、⽣データキーと暗号化データキーを取得する。
n準備していたJWTのHeaderとPayloadを、それぞれBase64エンコードしてピリオドでつなぎ、取得した⽣データキーをsha2ハッシュ値としてして暗号化したものがsignatureとなり独⾃JWTが完成
n該当Lambda RoleにKMSの実⾏権限を付与
n最終的にCognito Tokenと独⾃JWTが返却となる。独⾃JWTの有効期限についてはAPI側とクライアント側で⾃由に合わせる。
n⽣データキーは即時に削除し、暗号化データキーをユーザーと紐付けてDynamoDBに保存する
![Page 40: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/40.jpg)
Copyright © 2017 All rights reserved.40
復号化:独⾃JWTの検証Lambdaの作成
n独⾃JWTの正当性を検証する為に、KMSへの復号化権限を持ったRoleがついたLambdaを作成
nTokenの有効期限内であれば、マスターキーIDとユーザーに紐付いている暗号化データーキーを元にkms.decryptを⾏い、⽣データキーを取得する。
nJWTの HeaderとPayloadを、それぞれBase64エンコードしてピリオドでつなぎ、取得した⽣データキーをハッシュ値としてして暗号化したものが、signatureと⼀致すれば正当なTokenとなる
![Page 41: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/41.jpg)
Copyright © 2017 All rights reserved.41
認証を⾏いたいAPIへ実装
nAPI GatewayにてオーソライザーとしてLambdaを登録し、検証を⾏いたいメソッドにて認証として選択
n認証が必要なAPIを呼び出す際には、クライアントで保管している独⾃JWTをヘッダーに組み込んでコールする
![Page 42: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/42.jpg)
Copyright © 2017 All rights reserved.42
セキュアなSPA で 良い感じなServerless
![Page 43: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/43.jpg)
Copyright © 2017 All rights reserved.43
Cognitoでこんなセキュアな事も
n⾃分のデータにはアクセス出来るが、他の⼈のデータへはアクセス出来ない
nS3プレフィックスやDynamoDB ファイングレインアクセスにて、${cognito-identity.amazonaws.com:sub}変数が可能になる
![Page 44: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/44.jpg)
Copyright © 2017 All rights reserved.44
ありがとうござました
何かのきっかけやヒントになればうれしいです
![Page 45: Serverless AWS構成でセキュアなSPAを目指す](https://reader034.vdocuments.mx/reader034/viewer/2022042907/58873f7b1a28ab5a628b46bf/html5/thumbnails/45.jpg)
Copyright © 2017 All rights reserved.45
エンジニア募集中!
求むエンジニア!
ハンズラボは積極的に技術者採用中です。