やりたいこと
サーバーレスシステムでの個人情報保護について考えてみます。
システムで管理するべき個人情報は、できるだけクラウド内にとどめ、クライアントとやりとりしないということにできれば、通信路上での漏えいを防ぐことができます。
また、個人情報の管理を、限定することができれば、システムの大部分は、個人情報の漏洩について意識することなくシステム開発を行うことができます。
このような要求のシステムの場合、AWSでは、次のようになります。
- Cognito Identity Poolでユーザー管理をする。
- クライアント⇔AWS間の通信路上はアクセストークンと処理結果のみの受け渡しする。
- AWS内ではLambdaがアクセストークンを受け取りCognitoのユーザー情報をもとに処理を行う。
アクセストークンを受け取ったLambdaにアクセストークンに対応するユーザー情報へのアクセス権限が委譲され、LambdaはCognitoのユーザー情報を取得し処理できるようになります。よって、Lambdaは、アクセストークンを受け取れるようにする必要はありますが、ユーザー情報にアクセスするためのロールを付与する必要がなくなります。
参考までに、LambdaからCognitoにHTTPS通信する際に、どのような情報をやりとりするとアクセストークンと引き換えにユーザー情報を取得できるのか、cURL, Postman, AWS CLIを使って調べたのでまとめておきます。
結論
必要な情報は以下でした。
- Cognito Identity Service Providerが発行したアクセストークン
- Cognito Identity Poolのリージョン
- 各種おきまりのヘッダー(Content-Type、X-Amz-Target)
※ 各種おきまりのヘッダーをつけないと以下のエラーが返ってきます。
{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}
cURL
$ curl 'https://cognito-idp.<リージョン>.amazonaws.com/' -H 'Content-Type: application/x-amz-json-1.1' -H 'X-Amz-Target: AWSCognitoIdentityProviderService.GetUser' --data-binary '{"AccessToken":"<アクセストークン>"}'
Postman
- メソッド
- POST
- Url
- Authorization
- Type: No Auth
- Headers
- Content-Type: application/x-amz-json-1.1
- X-Amz-Target: AWSCognitoIdentityProviderService.GetUser
- Body
- {"AccessToken":"<アクセストークン>"}
AWS CLI
$ aws cognito-idp get-user --access-token <アクセストークン>
(備考)
-
<リージョン>
は、東京だったら「ap-northeast-1」です。 - このシステムでは、HTTPS通信が必須です。
- AWSのサービス間のセキュリティ(ex. Lambda ⇔ Cognito)の信頼性は、別途、考慮が必要です。