[素朴な手順]CognitoでIdentityID別にS3バケットへのアクセス許可をつけてみます
ベルリンのはんせです。
はじめに
モバイルアプリでS3バケット内のオブジェクトに対して利用者ごとに制限をかけたいというお問い合わせがありましたので、手元での動作確認手順をまとめてみました。
お問い合わせを受けて、google→developers.io→テストで45分くらいで確認が完了しています。
クラスメソッドという会社はすごいですね。
Identity Poolの準備
Poolの作成手順は、前述の参考記事と同じです。Federated Identitiesを選択して作成をします。
RoleはPool作成と同時に新規作成。
IAM Roleの設定
今回はUnauthrized Accessでのテストですので、Pool作成時に作成したIAM Role"Unauth"の方に、以下のポリシーを入れます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::20180419-testhanse"], "Condition": {"StringLike": {"s3:prefix": ["cognito/testhanse/"]}} }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::20180419-testhanse/cognito/testhanse/${cognito-identity.amazonaws.com:sub}", "arn:aws:s3:::20180419-testhanse/cognito/testhanse/${cognito-identity.amazonaws.com:sub}/*" ] } ] }
S3バケットのフォルダs3://20180419-testhanse/cognito/testhanse/
に対して、CognitoのIdentityIDでの認証ユーザーにしかActionを許可しない、というポリシーです。
確認用Identity IDの発行
2つ発行します。
% aws cognito-identity get-id --identity-pool-id eu-central-1:428ea22b-c47d-48a1-8a13-43b5563e5b10 --account-id 1234546789012 --region eu-central-1 --output text eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5
% aws cognito-identity get-id --identity-pool-id eu-central-1:428ea22b-c47d-48a1-8a13-43b5563e5b10 --account-id 123456789012 --region eu-central-1 --output text eu-central-1:a4492f03-4e15-4c32-adaa-a24d8ba368bb
Identity browserで作成されていることを確認
確認用バケットを用意
します
s3://20180419-testhanse/cognito/testhanse/eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5
と
s3://20180419-testhanse/cognito/testhanse/eu-central-1:a4492f03-4e15-4c32-adaa-a24d8ba368bb
を準備
それぞれtext.txtを配置しておきます。
実際の確認
AWS CLIで確認します。IdentityIDeu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5
の方で、tokenを発行し、そのtokenでs3//20180419-testhanse/cognito/testhanse/eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5/text.txt
をダウンロードできること、eu-central-1:a4492f03-4e15-4c32-adaa-a24d8ba368bb/text.txt
はダウンロードができないことを確認します。
token取得
% aws cognito-identity get-credentials-for-identity --identity-id eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5 --region eu-central-1 --output json { "Credentials": { "SecretKey": "OYKT2eICzbr7Mv6ZjE+oQF7Fg0808EB6ZaEj6JL8", "SessionToken": "AgoGb3JpZ2luEKb//////////wEaDGV1LWNlbnRyYWwtMSKAAhH7fFhb4ul0rp7vokQ5WWRkmxHFGAE7awNYOKMgaN4zk1kDkao3dR8dhAqjOtVk1kijpX12NjTj5JXxuWtOMDxvD2laGmc6YXPI266FHy3qe6sglfHKh7Ndf/9QO3UFDf+PT6yP4Kcc3Mf/3LmMCFG+gOGDm9y/1QoK2kCyRARKdf3a9621KU0BvC5jWbI5wNTGxFstlLSBCsLDbe2qw5fxsohXlr3ldVtTvGm4/+o4k6oNd2Hm1eMTgPotkFihn3FjWCs3ERUvK3SGT0lUFOcD31lvl063mklwVsmM38lFAJmXVikHxkQ1JPe+0Fy+4jahSxbXKacRZlddTmkr7UgqiQYI2///////////ARAAGgwzMjE4MDk4OTY3MTgiDLL/YtB5x3QT67KR+CrdBQ38Js7OHnVn96GJDq7ywfT0ERoHK8vTldg1ozl/5ym+WmN+dJBQx0wMeJK3+9YLOTRY8EmA/OY8yZXc00adhqJthGzzPYV/FHImV6VBCZqBi98HiqjG6dXLO+PLXcDNxzAh/taMi1Gb+DK0t9xKlhysNz3SxxroZ6ogKgFUrzK6OXyG8RYmPSUNNpoVzvMx6pPhc+aDsGBG0/RgaTIv3Bkpxn72bueEv9VK271AKFR5TSVZ7fBrV3e5mf3nCVWfv1cLC9VzSKjAcCtmr6WSG+vhsaA+TFOhgwSkf3x0W7Y8jJcHx3AVkZUEJ/YjSBkOlfYUepF1KYIegx66Q8ZMzsDLpHKpXO5Y+Jmvxzuica4DBpe+QmBzpZa3VT5S413i5b779mTEklB2Z7x0PbCjOspXVG4fBYlaOsR9JWMVmVvMprJ6vMjvoQvbxpc83Vp2rTH6iQ0V7QMJcg1dO5Bl/YMd/sY/VSaMsRT6321UasOgz+JHoHpwf+srRIA+L+5F0/KSQ5JPeFNwAI7FHsXCrBTsLyyihxuBwXwhSvu9+Ld8LLI0lDoiqSdM8DE/QUJbX/WYzYJzGxWQIMXq5fEDCBMmPfGVg8EEpaKN+kDI8dH3GQbX1VvTpGih8sS+xKon1EQeD75Ct0DN5jtv7hYFv9hPk/5JqxM1+5XULNnEMoJOwHFfz4x0tCbTuTEaTYbmwO+qYJjrc3B/e6Nlbk25FoX+QWuOwDUbxvQ1z40zXShfVPkZKZrNvZLKxqTlqNu8o2EjA2a/gnY7OAmv8dmffBQ29w6Ou4Is5LsJ106fa8Wdq8dgzMpNh+FZOMiBXGAn1rIdGFVBbhCX2KZUWxZKh5dd+uKaaLYc+E8P+SmH/hWPd6CQcg27s2VinVFBVu/et0sYK8CD0sWwf+hkuLfKUmft/l2ZPV1toW1pdnD3foEULgtAKYpkN357G+rGccbYY/qgRNsJlWl0x7ZGOi0w1rjj1gU=", "Expiration": 1524165222.0, "AccessKeyId": "ASIAJOQRRFXXUF7ZFMIQ" }, "IdentityId": "eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5" }
環境変数にセット
% export AWS_ACCESS_KEY_ID=ASIAJOQRRFXXUF7ZFMIQ % export AWS_SECRET_ACCESS_KEY=OYKT2eICzbr7Mv6ZjE+oQF7Fg0808EB6ZaEj6JL8 % export AWS_SECURITY_TOKEN=AgoGb3JpZ2luEKb//////////wEaDGV1LWNlbnRyYWwtMSKAAhH7fFhb4ul0rp7vokQ5WWRkmxHFGAE7awNYOKMgaN4zk1kDkao3dR8dhAqjOtVk1kijpX12NjTj5JXxuWtOMDxvD2laGmc6YXPI266FHy3qe6sglfHKh7Ndf/9QO3UFDf+PT6yP4Kcc3Mf/3LmMCFG+gOGDm9y/1QoK2kCyRARKdf3a9621KU0BvC5jWbI5wNTGxFstlLSBCsLDbe2qw5fxsohXlr3ldVtTvGm4/+o4k6oNd2Hm1eMTgPotkFihn3FjWCs3ERUvK3SGT0lUFOcD31lvl063mklwVsmM38lFAJmXVikHxkQ1JPe+0Fy+4jahSxbXKacRZlddTmkr7UgqiQYI2///////////ARAAGgwzMjE4MDk4OTY3MTgiDLL/YtB5x3QT67KR+CrdBQ38Js7OHnVn96GJDq7ywfT0ERoHK8vTldg1ozl/5ym+WmN+dJBQx0wMeJK3+9YLOTRY8EmA/OY8yZXc00adhqJthGzzPYV/FHImV6VBCZqBi98HiqjG6dXLO+PLXcDNxzAh/taMi1Gb+DK0t9xKlhysNz3SxxroZ6ogKgFUrzK6OXyG8RYmPSUNNpoVzvMx6pPhc+aDsGBG0/RgaTIv3Bkpxn72bueEv9VK271AKFR5TSVZ7fBrV3e5mf3nCVWfv1cLC9VzSKjAcCtmr6WSG+vhsaA+TFOhgwSkf3x0W7Y8jJcHx3AVkZUEJ/YjSBkOlfYUepF1KYIegx66Q8ZMzsDLpHKpXO5Y+Jmvxzuica4DBpe+QmBzpZa3VT5S413i5b779mTEklB2Z7x0PbCjOspXVG4fBYlaOsR9JWMVmVvMprJ6vMjvoQvbxpc83Vp2rTH6iQ0V7QMJcg1dO5Bl/YMd/sY/VSaMsRT6321UasOgz+JHoHpwf+srRIA+L+5F0/KSQ5JPeFNwAI7FHsXCrBTsLyyihxuBwXwhSvu9+Ld8LLI0lDoiqSdM8DE/QUJbX/WYzYJzGxWQIMXq5fEDCBMmPfGVg8EEpaKN+kDI8dH3GQbX1VvTpGih8sS+xKon1EQeD75Ct0DN5jtv7hYFv9hPk/5JqxM1+5XULNnEMoJOwHFfz4x0tCbTuTEaTYbmwO+qYJjrc3B/e6Nlbk25FoX+QWuOwDUbxvQ1z40zXShfVPkZKZrNvZLKxqTlqNu8o2EjA2a/gnY7OAmv8dmffBQ29w6Ou4Is5LsJ106fa8Wdq8dgzMpNh+FZOMiBXGAn1rIdGFVBbhCX2KZUWxZKh5dd+uKaaLYc+E8P+SmH/hWPd6CQcg27s2VinVFBVu/et0sYK8CD0sWwf+hkuLfKUmft/l2ZPV1toW1pdnD3foEULgtAKYpkN357G+rGccbYY/qgRNsJlWl0x7ZGOi0w1rjj1gU=
テスト
% aws s3 cp --region eu-central-1 s3://20180419-testhanse/cognito/testhanse/eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5/test.txt ./ download: s3://20180419-testhanse/cognito/testhanse/eu-central-1:64aaa4db-981b-4581-b8c2-41e18a0354d5/test.txt to ./test.txt % aws s3 cp --region eu-central-1 s3://20180419-testhanse/cognito/testhanse/eu-central-1:a4492f03-4e15-4c32-adaa-a24d8ba368bb/test.txt ./ fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
確認ができました。
さいごに
Amazon Cognitoの基本的な使い方を確認しました。
以下を参考にしました。
- Amazon S3: Amazon Cognito ユーザーにバケット内のオブジェクトへのアクセスを許可する | AWS Identity and Access Management
- IAM JSON ポリシーエレメントのリファレンス | AWS Identity and Access Management
- IAM ポリシーエレメント: 変数 | AWS Identity and Access Management
- 認証のフロー | Amazon Cognito
- Amazon Cognito | Developers.IO
それではー。