S3を使った画像をアップロード
投稿機能の動作確認
ローカル開発環境でChatSpaceを起動して、以下の全ての投稿がうまく行くことを確認する。
①テキストのみの投稿
②画像のみの投稿
③テキストと画像両方の投稿
ここできちんと確認しておけば、例えばデプロイ後に画像アップロードがうまくいかなかったとしても、ローカルではうまくいっていたと確証を持つことができる。
それによって、不具合の原因は「ローカルでの開発より後に行った作業」にある、とあたりをつけることができる。
セキュリティ対策を行う
まず最初に、S3を使用する上でどうなると被害が出るのか確認する。
悪意を持ったユーザーにAWSのIDとパスワードが漏れてしまうことで被害が発生する。
AWSは従量制のサービスのため、他人がなりすましでログインして膨大な処理を行うと、それに対する支払いが発生してしまう。
では、それをどのような手段で防ぐのか。
下記の3つの手段を取る。
セキュリティ対策① 二段階認証
二段階認証は、あるサービスにログインする際に、通常パスワードに加えて、別の方法でも認証されないとログインできないようにする仕組み。
万が一パスワードが漏れたとしても、それだけでは乗っ取られないため安全性を高めることができる。
このレッスンでは、以下のログイン時に二段階認証がされるようにする。
- AWSへのルートユーザーでのログイン
- AWSへのIAMユーザーでのログイン
このIAMユーザーについては、次に確認する。
Authyを使う準備をしよう
Authy二段階認証のためのアプリで、スマートフォン(iOS/Android)でもPCでも使うことができる。
Authyを起動するとパスワードが表示されるので、二段階認証の際にそれを入力する。パスワードは一定時間ごとに自動で変更されるため、漏洩のリスクが低くなっている。
Authyのインストール
Authyを自分のスマホにインストールする。自分が利用するスマホの種別に応じたものを導入する。
-
iOS版
https://apps.apple.com/jp/app/authy/id494168017?ign-mpt=uo%3D4 -
Android版
https://play.google.com/store/apps/details?id=com.authy.authy
初期設定を行う
初めてアプリを起動すると「電話番号」と「メールアドレス」を聞かれるので登録。
電話番号は、ここで登録した番号にSMSで確認コードが来るので、自分のスマホの電話番号を登録する。
- codeは+81 (Japan)
- 最初の0を抜いた自分のスマホの電話番号
登録後に"GET ACCOUNT VERIFICATION VIA"のメッセージが表示されるので、確認コード送付方法として「SMS」を選択する。
届いた確認コードをAuthyに入力したら、初期設定が完了。
AWSでの二段階認証設定を行う
ヘッダー部分に表示されているアカウント名をクリックして、メニューの中から「マイセキュリティ資格情報」を選択する。
モーダル画面が表示されたら、「Continue to Security Credentials」をクリック。
メニューの中の「多要素認証(MFA)」をクリックすると内容が展開されるので、「MFAの有効化」をクリック。
モーダル画面の中から「仮想MFAデバイス」が選択されているのを確認して、続行をクリック。
次の画面で「QRコードの表示」をクリックすると、QRコードが表示される。
ここまでできたら、スマホでAuthyを開く。
AuthyにAWSアカウントを追加する
Authyを開いたら、「Accounts」にある「+」ボタンをタップする。
カメラが起動するので、先ほどのQRコードを読み取る。
設定画面を終了すると、二段階認証用のパスワードが表示される。
ワンタイムパスワードと呼ばれるもので、30秒経つと自動的にそのパスワードは無効になる。
このパスワードをAWSで入力する。
1つ目のパスワードを上の欄に、そのパスワードの次に表示されたパスワードを下の欄に入力。
最後に「MFA」の割り当てをクリックして設定は完了。
AWSのログイン時に追加でパスワードを求められるようになるので、Authyで表示されたパスワードを入力する。
セキュリティ対策② IAMユーザーの利用
IAMユーザーは、AWSのサービスの1つ。
最初にAWSで作ったアカウントはルートユーザーと呼ばれ、ルートユーザーでAWSにログインすると全ての機能を使うことができる。
そのため、万が一ルートユーザーのID・パスワードが漏洩し悪用されると、第三者が全ての機能を使えてしまう。
それを防ぐために、使える機能を制限したユーザーを作成し、通常の作業はそのユーザーでログインし行うようにする。
この機能を制限したユーザーを作成できる機能がIAM。
IAMユーザーを作成する
ログイン後の以下のページの、検索のフォームにIAMと打ち込み、出てきた検索結果からIAMのページに飛ぶ。
遷移先のページで、以下をクリック。
左上の「ユーザーを追加」を選択。
作成するユーザーの名前を登録。
記入したら、「次のステップ」に進む。
次はアクセス権限を設定する。
「既存のポリシーを直接アタッチ」から「AmazonS3FullAccess」に設定する。
チェックを入れたら「次のステップ タグ」と書かれたボタンをクリック。
次は何もせずに、「次のステップ: 確認」を押す。
最後に設定の確認をして、画像と同じ設定になっていればOK。「ユーザーの作成」をクリック。
この時「アクセス権限の境界:アクセス権限の境界が設定されていません」という表示が追加でされていることもあるが、設定に問題はない。
これでユーザーの作成が完了。
※忘れずに認証情報をダウンロードしておく!
IAMユーザーのパスワードを設定
IAMのメニューから作成したIAMユーザーをクリック。「認証情報」のタブをクリックすると以下のページに遷移するので「コンソールのパスワード」欄の管理 をクリックする。
そのまま下の画像のように「有効化」「自動生成パスワード」をクリック。
ルートユーザーの時と同じく、認証情報はダウンロードしておく(ここではcsvファイルとしてダウンロードできる)。
作成したIAMユーザーでログインする
作成したIAMユーザーでログインできることを確認。
まずルートアカウントのサインアウトを行う。
続いて、先ほどダウンロードしたcredentialの情報を使ってログインする。
正常にログインできれば成功。
IAMユーザーも二段階認証に設定する
改めてログアウトし、ルートユーザーでログインしなおす。二段階認証になっていることに注意。
続いて、再びIAMのユーザー選択画面から先ほど作成したユーザー名を選択し遷移したページ先で、以下の「MFAデバイスの割当」をクリック。
あとは、ルートユーザーの時と同じように二段階認証の設定を行う。
セキュリティ対策③ git-secrets
ChatSpaceは、GitHubのpublicリポジトリにソースコードをアップロードしている。
そのため、誤操作でパスワードをGitHubにpushしてしまうと誰でも見られる状態になってしまう。
git-secretsは、そのような誤操作を防いでくれるツール。pushしようとしたコードをチェックし、パスワードだと推定されるような文字列が含まれている場合は、そこで処理が中断される仕組み。
git-secretsをインストール
ターミナルから、Homebrewを経由してgit-secretsを導入する。
1 2 |
$ cd ~/
$ brew install git-secrets
|
git-secretsが導入できたら、設定を適用したいリポジトリに移動して、git-secretsを有効化する。
1 2 |
$ cd chatspace
$ git secrets --install
|
これで、有効化を行なったリポジトリでgit-secretsを使用する準備が完了。
続いて、「どのようなコードのコミットを防ぐのか」を設定していく。この後の作業はChatSpaceのディレクトリで実行する。
git-secretsの条件を設定
下記のコマンドを実行することで、secret_key, access_keyなど、アップロードしたくないAWS関連の秘密情報を一括で設定することができる。
1 |
$ git secrets --register-aws --global
|
現在のgit-secretsの設定は、下記のコマンドで確認することができる。
1 2 3 4 5 6 7 8 |
$ git secrets --list
secrets.providers git secrets --aws-provider
secrets.patterns [A-Z0-9]{20}
secrets.patterns ("|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)("|')?\s*(:|=>|=)\s*("|')?[A-Za-z0-9/\+=]{40}("|')?
secrets.patterns ("|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?("|')?\s*(:|=>|=)\s*("|')?[0-9]{4}\-?[0-9]{4}\-?[0-9]{4}("|')?
secrets.allowed AKIAIOSFODNN7EXAMPLE
secrets.allowed wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
これで、git secrets --install
を行なったリポジトリでは、コミット時にAWSの秘密情報を含んだコードがないかチェックされるようになった。
「うっかりパスワードをGithubに載せてしまった」という事態を防ぐことができるので、必ず
設定を行う。
今後作成する全てのリポジトリにgit-secretsが適用されるようにする
ここまでの設定では、今後作成するリポジトリにはgit-secretsが適用されない。
特段の理由がなければ、以下のコマンドを実行して自動で適用されるようにする。
1 2 |
$ git secrets --install ~/.git-templates/git-secrets
$ git config --global init.templatedir '~/.git-templates/git-secrets'
|
GitHub Desktopからgit secretsを利用できるようにする
GitHub Desktop経由でgit secretsを利用する場合は、追加の設定をする。
この時、Github Desktopがapplicationフォルダに存在している必要がある。
適宜移動しておく。
引き続きGitHub Desktopを利用するため、以下を実行。
1 |
$ 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のバージョンが古い場合、上記のコマンドではなく、以下のコマンドでないと設定ができないことがあるため。
1 |
$ sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/git/bin/git-secrets
|
ここまでで、事前に行うセキュリティ対策の作業は終了。
S3で保存先を用意する
S3でファイルがアップロードされる領域を準備する。
バケットとは
S3で、実際にデータが格納される場所のことをバケットと呼ぶ。バケットの名前はアクセスするときのURLとして使用されるため、まだ誰も付けたことがない名前を使う必要がある。
S3を利用してバケットを作成する
上のメニューバーに表示されている「サービス」をクリック、以下の「S3」をクリックする。
すると以下のページに遷移するので、左上の「バケットの作成」をクリック。
バケットは、名前とリージョンを決めるだけで簡単に作成できる。
リージョンとは
バケットが実際に存在しているサーバーの場所。以下の操作でバケットを作成する。
バケットの名前は任意で決めて大丈夫だが、他のユーザーと重複した名称は使えない。
なかなかユニークな名前を取得できない場合は、「付けたい名前 + 数値」例えば「ChatSpace2019」などを試してみるのがおすすめ。数値部分を変えることで重複を避けることがしやすくなる。
リージョンは 「アジアパシフィック(東京)」を選択する。入力できたら「次へ」をクリック。
次の画面では変更は必要ないので、そのまま「次へ」をクリック。
続いてセキュリティの設定を行う。今回はバケットポリシーを使用してセキュリティ設定を行うので、下の2つにチェックを入れる。ここの設定が過っているとファイルのアップロードができなくなるので注意。正しく設定できたら「次へ」をクリック。
「システムのアクセス許可の管理」の設定
画面の一番下に、「システムのアクセス許可の管理」という設定項目が追加になっている。
デフォルトの「Amazon S3 ログ配信グループにこのバケットへの書き込みアクセス権限を付与しない」のままで進める。
バケットポリシー
どのようなアクセスに対してS3への読み書きを許可するか決めることができる仕組み。今回は、作成したIAMユーザーからのアクセスのみを許可するよう設定していく。
ここは確認画面なので、問題なければそのまま次に進む。
これからバケットポリシーの設定を行う。まずは先ほど作成したIAMユーザーの設定を確認。メニューの「サービス」をクリック。
一覧から「IAM」を検索。
「ユーザー」を選択。
「IAM」ユーザーの一覧から、先ほど作成したユーザーを選ぶ。
IAMユーザーの情報が表示されるので、必要な情報を取得する。後ほど 「ユーザーのARN」が必要になるので、一度エディタなどに保存しておく。
次に、バケットポリシーの設定を行う。IAMの時と同じようにサービス一覧から S3を選ぶ。先ほど作成したバケットをクリックする。
「バケットポリシー」をクリックし、赤枠の欄にポリシーの入力をする。内容は下記を参照。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
上記の①に先ほどメモしておいた「ユーザーのARN」を、②に作成した「バケット名」を記述する。
以下のように記述になっていることを確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
これでS3のバケットの設定は完了。これによって、データを保存するための入れ物が用意できた状態になった。