[素朴な手順]CognitoでIdentityID別にS3バケットへのアクセス許可をつけてみます

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ベルリンのはんせです。

はじめに

モバイルアプリで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-41e18a0354d5s3://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の基本的な使い方を確認しました。
以下を参考にしました。

それではー。