【AWSのセキュリティ対策】導入しやすい対策をまとめました。

- AWSのセキュリティ対策で簡単に導入できて効果が大きいものをまとめました。
- 完璧ではないけど、一通りのリスクに対応することを目指しています。
- 管理者用のweb(管理画面)の対策は、awsに関係がない対策も書いています。

# awsアカウント, iamユーザーの権限、アクセス制限

### awsアカウントの2段階認証を有効化する。
- [AWS での多要素認証 (MFA) の使用](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html)
- [【AWS】 MFA（2段階認証）の有効化](https://qiita.com/s_Pure/items/76011e67e9a10c7c195c)

### 各awsアカウントには最小限の権限を付与する。
- [最小権限実現への4ステップアプローチ 前編](https://aws.amazon.com/jp/blogs/news/systematic-approach-for-least-privileges-jp/)

### iamユーザーで利用されていないものは削除する。

# sshによるec2サーバーへの接続
### sshを使わず、AWS Systems Manager Session Manager 経由でec2にアクセスする。
- マネージメントコンソールからのアクセスに限定する場合、セキュリティグループからsshのアクセス許可を削除できる。
- ssh用の鍵ファイルを配布しなくていい。
- 参考記事： [【初心者】AWS Systems Manager Session Manager を使ってみる](https://qiita.com/mksamba/items/6d7a0b84894578feafa8)

### sshでec2にアクセスする場合、セキュリティグループでipを制限する。
- 全てのipからsshでアクセスできるようにしない。

# httpリクエスト経由での不正なアクセスを防ぐ。

### DDoSの対応: AWS Shield
- 無料版のAWS Shield Standardはデフォルトで有効化されている。基本的な対策はAWSの利用者であれば適用されている。
- 有料版のAWS Shield Advancedだと高度な機能が利用できるが月額の利用料が3,000.00USD。予算的に厳しければ、問題があってから有効化する。
- 無料版と有料版の違いは[AWS Shield の特徴](https://aws.amazon.com/jp/shield/features/)を参照してください。

### SQLインジェクション等の不正なリクエストを防ぐ。: aws wafの導入
#### 「AWSManagedRulesCommonRuleSet」について
- このルールで一般的な攻撃手法を網羅している。
    - [マネージドルールCommonRuleSetによるブロックと例外登録を行う](https://dev.classmethod.jp/articles/waf-commonruleset/)
    - [コアルールセット (CRS) マネージドルールグループ](https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-baseline.html#aws-managed-rule-groups-baseline-crs)

- 「AWSManagedRulesCommonRuleSet」の注意点: 意図しないリクエストをブロックする可能性もある。
    - [大きなJSONをPOSTするAPIが403になる原因がAWS WAFだった](https://www.blog.danishi.net/2021/11/14/post-5480/)
    - [Tips AWS WAF を紐付けた API Gateway で 10KB を超えるリクエストを送信できない](https://qiita.com/nikaera/items/9c8f347622ab9e797ac7)

- 本番環境にルールを適用する前にカウントモードで意図しないリクエストのブロックがないか調査する。
    - [AWS WAF導入時にはまず「カウントモード」を使おう！](https://tech.motex.co.jp/entry/2022/01/18/134104)
    - [AWS WAF を本適用の前にカウントモードで試用したい](https://blog.denet.co.jp/aws-waf-count/)

# 管理者向けのWeb(管理画面)からの情報流出を防ぐ。
### 認証、アクセス制限
- パスワード認証の場合、ブルートフォース攻撃で突破されるリスクがある。
    - パスワード認証に一定回数以上、連続して失敗した場合は、対象のアカウントはロックして、ログイン処理を実行しない。
- 特定のネットワーク、ipアドレスからしかアクセスできないようにする。

### 画像、テキストファイルの流出を防ぐ
#### CSV等のダウンロード機能がある場合、ファイルをサーバー内に保持しない。
- 対応案1: サーバー内にファイルを一時保存せず、streamでダウンロードさせる方法で実装する。
- 対応案2: ファイルを一時保存する場合はダウンロードが完了したタイミングで削除する。もしくは、定期的に削除する。

#### s3内に保持している画像、書類の表示には、cloud frontの署名付きURL経由で表示する。
- 有効期限を数分に設定して、有効期限を超えたら表示できないようにできる。
- URLが流出しても有効期限を超えている場合はファイルを取得できない。

- 参考記事
    - [署名付き URL の使用](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html)
    - [CloudFront+S3で署名付きURLでプライベートコンテンツを配信する](https://dev.classmethod.jp/articles/cf-s3-deliveries-use-signurl/)

#### 身分証画像のように流出すると影響が大きいものは不要になったら削除する。
- 例えば、年齢の判定のために身分証画像を利用している場合、判定処理が終わったら削除する。

# サーバーに不正なアクセスで接続されてしまった場合に機密情報を守る。
### dbの接続情報などをconfigファイルに記載せず、aws secrets managerを利用してAPI経由で取得する。

- [AWS Secrets Managerを使おう！](https://qiita.com/mm-Genqiita/items/f93285a6058c64b39f23)
- [AWS Secrets Manager](https://aws.amazon.com/jp/secrets-manager/)

# awsの操作ログの記録
### AWS CloudTrail
- awsの操作ログを記録する。
- 無料利用枠：直近、90日間のイベント履歴を保存。
- [AWS CloudTrail](https://aws.amazon.com/jp/cloudtrail/)

# 不正な操作、外部からのアクセスの検知
### AWS Config：セキュリティグループの変更の記録、slackのチャンネルへの通知。

- [AWS Configはとりあえず有効にしよう](https://dev.classmethod.jp/articles/aws-config-start/)
- [Configでコンプライアンス変更通知をSlackに配信する](https://blog.denet.co.jp/config-chatbot/)

### AWS GuardDutyの導入: 不正なアクセスを検知して、slackに通知する。
#### AWS GuardDutyについて
- [GuardDuty の使用開始](https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_settingup.html)
- [【全員必須】GuardDutyがコスパ最強の脅威検知サービスであることを証明してみた](https://dev.classmethod.jp/articles/guardduty-si-strongest-thread-detection/)

#### AWS GuardDutyから通知をslackで受け取る。
- [新しくリリースされたAWS Chatbotを使ってGuardDutyのSlack通知をするといいよって話](https://dev.classmethod.jp/articles/notify-guardduty-findings-with-chatbot/)
- [ついに来た！　AWS Chatbot が一般公開(GA)になりました！　Slack連携が捗ります！](https://dev.classmethod.jp/articles/aws-chatbot-generally-available/)