アプリも安全第一! AWSにアクセスするための認証情報を保護
スマホフレーフレー言語応援アプリの仕様から想像すると、プレイが始まれば、多数のスマホから大量の加速度センサーデータが送信されてきます。また、大量のデータを高速に読み書きできるデータベースも必要になるでしょう。前者の用途にはAmazon Kinesis、後者の用途にはAmazon DynamoDBというAWSサービスを使用するつもりです。これらについては、あとで説明します。
アプリでは、スマホとAmazon KinesisやAmazon DynamoDBにアクセスしてデータをやり取りするわけですが、このとき、認証情報として「AWS Access Key ID」と「AWS Secret Access Key」が必要になります。でも、それをアプリのJavaScriptコードに直接書いてしまっては、誰にでも見えてしまいますよね。
それは怖いです。認証情報が漏れると、自分のアカウントが不正に利用されてしまう可能性もありますし。
AWS Access Key IDとAWS Secret Access Keyは、アプリ内に直接書くべきではありません。
ではどうするかというと、認証情報をハードコーディングせずにJavaScriptのコードから権限の制限された一時的な認証情報を要求し、それを使ってAWSのサービスにアクセスします。この仕組みを提供するAWSサービスがAmazon Cognitoです。
Amazon CognitoはAWSを用いたスマホのアプリ開発をより簡単にするためのアイデンティティの管理やデバイス間のデータ同期をクロスプラットフォームで簡単に実現するためのサービスです。Amazon、Facebook、Googleといったパブリックログインプロバイダを使用してユーザーに一意なアイデンティティを作成できますが、ここでは、それらは使わずにAmazon Cognitoのゲストアクセスの機能を用います。
モバイル端末向けのクライアントアプリからAWSのサービスを直接利用する場合には、基本的にAmazon Cognitoを使うとよいでしょう。
Amazon Cognitoのアイデンティティプールを作成する
では、Amazon Cognitoの設定を行いましょうか。マネージメントコンソールで「Mobile Services」の「Amazon Cognito」を選択し、[Get started]をクリックします。
[Getting started wizard]が表示されました。
最初にアイデンティティプールを作成します。アイデンティティプールは、ユーザーごとにテンポラリの認証情報を払い出すためのプールです。[Identity pool name]に任意のプール名を入力します。
続いて、[Unauthenticated identities]を開いて[Enable access to unauthenticated identities]にチェックを入れてください。
これって何ですか?
Amazon Cognitoでは、Facebookなどのアカウント情報で認証済みのユーザーと、認証されていないユーザー、つまりゲストユーザーで別々の権限を設定することができます。たとえば、「認証済みのユーザーには読み取りと書き込みを許可し、ゲストユーザーには読み取りのみを許可する」といった設定ができるんです。
今回は、ゲストユーザーに対し、Amazon KinesisへのデータのPUTと、Amazon DynamoDBからデータをGETする許可を与えるため、[Unauthenticated identities]を有効化して設定します。
IAMロールを作成し割り当てる
続いて、AWSリソースへのアクセス制御を設定するためにAWS Identity and Access Management(IAM)というサービスで提供されるIAMロール[4]を2つ作成し、認証済みユーザーとゲストユーザーにそれぞれを割り当てます。ここではAmazon CognitoのコンソールからIAMロールの作成と割り当てを行います。
[Assign role to authenticated identities]および[Assign role to unauthenticated identities]の[IAM role]で、「Create a new IAM role」を選択します。[Role name]の名前を覚えておいてくださいね。
[Update roles]をクリックします。
はい。
ゲストユーザーに割り当てられたIAMロールに必要な権限を設定しますが、これはIAMのコンソールから行います。
マネージメントコンソールで「Administration & Security」の「Identity & Access Management」を選択し、[IAM Resources]の「Roles」というリンクをクリックすると、先ほど作成したロールが表示されます。ロールを選択してください。
[Create Role Policy]をクリックし、[Policy Generator]を選択して[Select]をクリックします。
クリックしました。
[Edit Permissions]で、どのリソースにどのようなアクションを許可するかを設定していきます。
まず、Amazon Kinesisです。
- [Effect]では[Allow]
- [AWS Service]では「Amazon Kinesis」
- [Actions]では「PutRecords」
を選択します。
Amazon Kinesisでは、データを流し込む“ホース”のような役割を担う「ストリーム」と、そのデータを受け取る“バケツ”のような役割を担う「シャード」というオブジェクトを利用します。今回はそのストリームにデータをPUTする許可のみ与えています。
[Amazon Resource Name(ARN)]にはストリーム名をARN形式(arn:aws:kinesis:<リージョン名>:<アカウントID>:stream/<ストリーム名>)で指定します。ここで指定した名前で後ほどAmazon KinesisのストリームをN.Virginiaリージョンに作成します。
[Add Statement]をクリックして、[Next Step]をクリックします。
[Apply Policy]をクリックすると、ポリシーが適用されます。
続いて、Amazon DynamoDBに対する権限の設定です。先ほどと同様に、[Create Role Policy]→[Policy Generator]→[Select]をクリックします。それから、
- [AWS Service]では「Amazon DynamoDB」
- [Actions]では「GetItem」「Query」「Scan」
を選択します。
[Amazon Resouce Name(ARN)]はテーブル名を指定します。
[Add Statement]をクリックして、[Next Step]をクリックですね。カチカチっと。
最後に[Apply Policy]をクリック。同様の手順で、認証済みユーザーのロールにもパーミッションを設定してください。
はーい。
[4] IAMロールとは、AWSリソースへのリクエストを行う権限を定義するAWS Identity and Access Management(IAM)エンティティです。IAMロールは特定のユーザーまたはグループに関連付けられません。Amazon EC2や今回のAmazon CognitoのようなAWSサービスなどの信頼されたエンティティに適用されます。
参加したい方、ご興味のある方はデベロッパーカンファレンスのWebサイトへ!