投稿機能でS3に画像をアップロード機能(設定)

##投稿機能の動作確認
今回は以下のことができるアプリとします。先に全ての投稿がうまく行くことを確認しましょう。もし不具合があるときの原因は「ローカルでの開発より後に行った作業」にあるので本番環境に上げる作業を確認してください。
①テキストのみの投稿
②画像のみの投稿
③テキストと画像両方の投稿
まず最初に、S3を使用する上でどうなると被害が出るのか確認します。
悪意を持ったユーザーにAWSのIDとパスワードが漏れてしまうことで被害が発生します。
AWSは従量制のサービスのため、他人がなりすましでログインして膨大な処理を行うと、それに対する支払いが発生してしまいます。
そのため以下の方法で手段で防ぎます。
AWS
①パスワードだけではログインできないようにする「二段階認証」
②ログインできたとしても機能をあまり使えなくする「IMAユーザー」
GitHub
③誤操作でIDやパスワードをpushしないように設定する「git-secrets」
があります。
##二段階認証
二段階認証は、あるサービスにログインする際に、通常パスワードに加えて、別の方法でも認証されないとログインできないようにする仕組みです。
万が一パスワードが漏れたとしても、それだけでは乗っ取られないため安全性を高めることができます。
今回は、以下のログイン時に二段階認証がされるようにします。
AWSへのルートユーザーでのログイン
AWSへのIAMユーザーでのログイン
###Authy
Authy二段階認証のためのアプリで、スマートフォン(iOS/Android)でもPCでも使うことができます。
Authyを起動するとパスワードが表示されるので、二段階認証の際にそれを入力します。パスワードは一定時間ごとに自動で変更されるます。
まず、Authyを自分のスマホにインストールしてください。
iOS版
(https://itunes.apple.com/jp/app/authy/id494168017?mt=8&uo=4&at=10lMo4)
Android版
(https://play.google.com/store/apps/details?id=com.authy.authy)
電話番号とメールアドレスを登録します。
登録後に"GET ACCOUNT VERIFICATION VIA"のメッセージが表示されるので、確認コード送付方法として「SMS」を選択します。
届いた確認コードをAuthyに入力したら、初期設定が完了です。
次に、AWSで二段階認証を行うための設定を行います。
1、AWSのヘッダー部分に表示されているアカウント名をクリックして、メニューの中から「マイセキュリティ資格情報」を選択します。
2、モーダル画面が表示されたら、「Continue to Security Credentials」をクリックします。
3、メニューの中の「多要素認証（MFA）」をクリックすると内容が展開されるので、「MFAの有効化」をクリックします。
4、モーダル画面の中から「仮想MFAデバイス」が選択し、続行をクリックします。
5、次の画面で「QRコードの表示」をクリックすると、QRコードが表示されます。
次に、スマホでAuthyを開きます。
1、AuthyにAWSアカウントを追加します。
2、Authyを開いたら、「Accounts」にある「＋」ボタンをタップします。
3、カメラが起動するので、先ほどのQRコードを読み取ります。
4、設定画面を終了すると、二段階認証用のパスワードが表示さます。
30秒経つと自動的にそのパスワードは無効になるので注意してください。
5、このパスワードをAWSで入力します。
1つ目のパスワードを上の欄に、そのパスワードの次に表示されたパスワードを下の欄に入力します。
最後に「MFA」の割り当てをクリックして設定は完了です。
AWSのログイン時に追加でパスワードを求められるようになりますので、Authyで表示されたパスワードを入力します。
##IAMユーザー
最初にAWSで作ったアカウントはルートユーザーと呼ばれ、ルートユーザーでAWSにログインすると全ての機能を使うことができます。
そのため、万が一ルートユーザーのID・パスワードが漏洩し悪用されると、第三者が全ての機能を使えてしまいます。
それを防ぐために、使える機能を制限したユーザーを作成し、通常の作業はそのユーザーでログインし行うようにします。
この機能を制限したユーザーを作成できる機能がIAMです。
1、AWSログイン後に、検索のフォームにIAMと打ち込み、出てきた検索結果からIAMのページに飛んでください。
2、遷移先のページで、「個々のIAMユーザーの制作」をクリックし、「ユーザーの管理」をクリックしてください。
3、左上の「ユーザーを追加」をクリックしてください。
4、次に、作成するユーザーの名前を登録します。「ユーザー名」を入力し、アクセスの種類の「プログラムによるアクセス」をチェックし、次のステップをクリックしてください。
5、「既存のポリシーを直接アタッチ」から検索で「amazons3」を入力し、「AmazonS3FullAccess」に設定してください。
チェックを入れたら「次のステップ タグ」をクリックします。
6、「次のステップ: 確認」をクリックしてください。
7、最後に設定の確認をして大丈夫であれば、「ユーザーの作成」をクリックしてください。
※この時「アクセス権限の境界：アクセス権限の境界が設定されていません」という表示が追加でされていることもありますが、設定に問題はありません。
これでユーザーの作成が完了しました。
※忘れずに認証情報(csv)をダウンロードしておきましょう！
###IAMユーザーのパスワードを設定します。
1、IAMのメニューからヘッダーにある作成したIAMユーザーをクリックします。「認証情報」のタブをクリックし、「コンソールのパスワード」欄の「管理」をクリックします。
2、コンソールへのアクセス「有効化」、パスワードの設定「自動生成パスワード」をクリックします。
3、認証情報はダウンロードしておきます(csvファイルとしてダウンロードできます)。
作成したIAMユーザーでログインできることを確認します。
1、まずIAMのメニューからヘッダーにある作成したIAMユーザーをクリックし、ルートアカウントのサインアウトを行います。
2、先ほどダウンロードしたcredentialの情報を使ってログインします。一番右のURLにダウンロードしたcredentialの情報を貼り、User nameとPasswordを入力します。
ログインできれば成功です。
###IAMユーザーも二段階認証にしましす。
1、改めてログアウトし、ルートユーザーでログインしなおします。※二段階認証になっていることに注意してください。
2、再びIAMのユーザー選択画面から先ほど作成したユーザー名を選択し遷移したページ先で、「MFAデバイスの割当」の「管理」をクリックします。
3、あとは、ルートユーザーの時と同じように二段階認証の設定をします。
##git-secrets
誤操作でパスワードをGitHubにpushしてしまうと誰でも見られる状態になってしまいます。
git-secretsは、そのような誤操作を防いでくれるツールです。pushしようとしたコードをチェックし、パスワードだと推定されるような文字列が含まれている場合は、そこで処理が中断される仕組みです。
ターミナルから、Homebrewを経由してgit-secretsを導入します。
ターミナル

```
$ cd ~/
$ brew install git-secrets
```
git-secretsが導入できたら、設定を適用したいリポジトリに移動して、git-secretsを有効化します。
ターミナル

```
$ cd chatspace
$ git secrets --install
```
これで、有効化を行なったリポジトリでgit-secretsを使用する準備ができました。
次に、「どのようなコードのコミットを防ぐのか」を設定していきます。
下記のコマンドを実行することで、secret_key, access_keyなど、アップロードしたくないAWS関連の秘密情報を一括で設定することができます。
ターミナル

```
$ git secrets --register-aws --global
```
ちなみに、現在のgit-secretsの設定は、下記のコマンドで確認することができます。
ターミナル

```
$ git secrets --list
```
今後作成する全てのリポジトリにgit-secretsが適用されるようにします。
ここまでの設定では、今後作成するリポジトリにはgit-secretsが適用されません。
ターミナル

```
$ git secrets --install ~/.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'
```
GitHub Desktop経由でgit secretsを利用できるようにする場合は、追加の設定をします。
この時、FinderのアプリケーションフォルダのなかにGithub Desktopが入っているか確認してください。
入っていなければ適宜移動しましょう。
引き続きGitHub Desktopを利用する場合は、以下を実行します。
ターミナル

```
$ sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/app/git/bin/git-secrets
```
※上記コマンドでNo such file or directoryのエラーがでる場合
GitHub Desktopのバージョンが古い場合、上記のコマンドではなく、以下のコマンドでないと設定ができないことがあります。
ターミナル

```
$ sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/git/bin/git-secrets
```
これで、事前に行うセキュリティ対策の作業は終了です。
##S3で保存先を用意
S3でファイルがアップロードされる領域を準備します。
###バケット
S3で、実際にデータが格納される場所のことをバケットと呼びます。バケットの名前はアクセスするときのURLとして使用されるため、まだ誰も付けたことがない名前を使う必要があります。
1、上のメニューバーに表示されている「サービス」をクリック、ストレージ内の「S3」をクリックします。
2、左上の「バケットの作成」をクリックします。バケットは、名前とリージョンを決めるだけで作成できます。
リージョンとは、バケットが実際に存在しているサーバーの場所です。以下の操作でバケットを作成します。
3、バケットの名前は任意で決めて大丈夫ですが、他のユーザーと重複した名称は使えません。
4、リージョンは 「アジアパシフィック（東京）」を選択します。入力できたら「次へ」をクリックします。
5、次の画面では変更は必要ないので、そのまま「次へ」をクリックします。
6、次は、セキュリティの設定を行います。今回はバケットポリシーを使用してセキュリティ設定を行います。6つ項目があり、順番に一番上はチェックを外し、次の2つはチェックしないで、次の2つはチェックを入れます。
一番下の「システムのアクセス許可の管理」の設定はチェックしないでください。
デフォルトの「Amazon S3 ログ配信グループにこのバケットへの書き込みアクセス権限を付与しない」のままで進めてください。
ここの設定が誤っているとファイルのアップロードができなくなります。設定できたら「次へ」をクリックします。
7、確認画面なので、問題なければ「パケットを作成」をクリックします。
バケットポリシー
どのようなアクセスに対してS3への読み書きを許可するか決めることができる仕組みです。今回は、作成したIAMユーザーからのアクセスのみを許可するよう設定していきます。
###バケットポリシー
どのようなアクセスに対してS3への読み書きを許可するか決めることができる仕組みです。今回は、作成したIAMユーザーからのアクセスのみを許可するよう設定していきます。
1、まずは先ほど作成したIAMユーザーの設定を確認します。メニューの「サービス」をクリックします。
2、一覧から「IAM」を検索し、表示されたメニューをクリックしてください。
3、「ユーザー」を選択し、先ほど作成したユーザー名をクリックします。
4、「IAM」ユーザーの一覧から、先ほど作成したユーザーを選びます。
IAMユーザーの情報が表示されるので、後ほど使うので「ユーザーのARN」をコピーして保存しておいてください。
5、次に、バケットポリシーの設定を行います。IAMの時と同じようにサービス一覧から S3を選びます。先ほど作成したバケットをクリックします。
6、「アクセス制限」をクリックし、そのなかの「バケットポリシー」をクリックし、赤枠の欄にポリシーの入力をします。
バケットポリシー

```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "************①****************"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::************②**********"
        }
    ]
}
```
上記の①に先ほどコピーして保存しておいた「ユーザーのARN」を、②に作成した「バケット名」を記述します。
【例】バケットポリシー

```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/upload_user"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::abc-test"
        }
    ]
}
```
これでS3のバケットの設定は完了です。これによって、データを保存するための入れ物が用意できた状態になりました。