第六回 AWS上的十二因素应用与Django(AWS上的初始设置-续)
目录
-
- 第1回 The Twelve-Factor App on AWS & Django(The Twelve-Factor Appとは)
-
- 第2回 The Twelve-Factor App on AWS & Django(バックエンドAPIを作ろう)
-
- 第3回 The Twelve-Factor App on AWS & Django(フロントエンドSPAを作ろう)
-
- 第4回 The Twelve-Factor App on AWS & Django(AWSのアカウントを作成しよう)
-
- 第5回 The Twelve-Factor App on AWS & Django(AWSで初期設定をしようー前編)
- 第6回 The Twelve-Factor App on AWS & Django(AWSで初期設定をしようー後編) ← 今回
首先/一开始
在上一篇文章中,我们进行了账户和支付方面的设置,并设置了防止账户被滥用的安全措施。
本次作为AWS初始设置的后半部分,让我们启用一些与安全相关的服务,并实施安全防护措施。您可以通过AWS管理控制台进行设置,但为了尽可能保留AWS设置为代码,以便更容易管理,我想使用Terraform进行设置。
我在IAM用户上生成凭证。
首先,我们需要创建一组AWS访问密钥,以便能够通过Terraform操作AWS。使用上一篇文章中创建的管理员IAM用户(admin),我们登录到AWS管理控制台。
如果成功登录,可以点击右上角的菜单,选择“安全凭证”选项。
因为要转到「我的安全凭证」页面,所以请点击「CLI、SDK和API访问的访问密钥」下的「创建访问密钥」按钮。
您已成功生成访问密钥和秘密访问密钥。请点击「下载 .csv 文件」按钮,下载包含访问密钥和秘密访问密钥的CSV文件。请务必严格保管,确保不丢失或泄漏。
使用AWS CLI进行安装,并通过命名的配置文件来识别并方便地设置访问密钥和秘密访问密钥。
# AWS CLIをインストール
$ brew install awscli
# 名前付きプロファイルでアクセスキーとシークレットアクセスキーを設定
$ aws configure --profile [profile name]
AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
# エラーなく実行できればインストール&設定完了
$ aws s3 ls --profile [profile name]
我們現在可以從電腦上訪問AWS了。
安装Terraform
安装Terraform。
# HashiCorpのHomeBrewパッケージを全て集めたリポジトリであるhashicorp/tapをインストール
$ brew tap hashicorp/tap
# Terraformをインストール
$ brew install hashicorp/tap/terraform
# バージョンを確認
$ terraform -v
Terraform v1.0.11
on darwin_amd64
如果能够显示Terraform的版本,那么安装就完成了。
创建一个用于存放Terraform的tfstate文件的S3存储桶。
Terraform目前通过tfstate文件来保存当前AWS资源的状态,默认情况下在本地环境生成tfstate文件。但在团队开发中,为了能与团队共享,需要将其配置到远程。AWS提供了S3和DynamoDB作为选择。本次决定将其配置到S3,并创建一个用于配置的S3存储桶。
请将以下内容改写为您自己的设定。
[profile name]:アクセスキーとシークレットアクセスキーを指定した際のプロファイルの名前
[account id]:AWSのアカウントID
[bacuket name]:Terraformのtfstateファイルを配置するS3バケットの名前
使用AWS CLI从S3桶中根据自己的设置创建一个桶。
# 意図しないS3バケットの公開を防ぐために、アカウントのパブリックアクセスをブロックします
$ aws s3control put-public-access-block --profile [profile name] --account-id [account id] --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
# バケットを作成します
$ aws s3api create-bucket --profile [profile name] --region ap-northeast-1 --bucket [bacuket name] --create-bucket-configuration LocationConstraint=ap-northeast-1
# バケットの暗号化を有効にします
$ aws s3api put-bucket-encryption --profile [profile name] --region ap-northeast-1 --bucket [bacuket name] --server-side-encryption-configuration "{\"Rules\": [{\"ApplyServerSideEncryptionByDefault\":{\"SSEAlgorithm\": \"AES256\"}}]}"
# バケットのバージョン管理を有効にします
$ aws s3api put-bucket-versioning --profile [profile name] --region ap-northeast-1 --bucket [bacuket name] --versioning-configuration Status=Enabled
以上是创建S3存储桶并准备执行Terraform的准备工作。
使用Terraform激活AWS的安全服务。
使用Terraform来启用AWS的安全服务。
Terraform的文件夹和文件结构最终如下所示。实际源代码已上传至Github。
基本上,我認為AWS資源通常會以相似的配置來構建每個環境,因此將AWS資源的定義放在infrastructure/aws/terraform/modules下的每個資源專用文件夾中,以便可以進行重複使用。然後,為每個環境在infrastructure/aws/terraform/environments下創建專用文件夾,並在每個環境中定義要使用的資源,並呼叫modules文件夾進行重複使用。
sample-ecs-todo-app
├── backend
├── frontend
└── infrastructure
└── aws
└── terraform
├── environments
│ ├── global
│ │ ├── accessanalyzer-main.tf
│ │ ├── config-main.tf
│ │ ├── detective-main.tf
│ │ ├── guardduty-main.tf
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ ├── securityhub-main.tf
│ │ ├── terraform.log
│ │ ├── terraform.tfvars
│ │ └── variables.tf
│ ├── dev
│ │ └── main.tf
│ │ └── variables.tf
│ ├── stg
│ │ └── main.tf
│ │ └── variables.tf
│ └── prod
│ └── main.tf
│ └── variables.tf
└── modules
├── accessanalyzer
│ ├── main.tf
│ └── variables.tf
├── cloudtrail
│ ├── main.tf
│ └── variables.tf
├── config
│ ├── main.tf
│ └── variables.tf
├── detective
│ ├── main.tf
│ └── variables.tf
├── guardduty
│ ├── main.tf
│ └── variables.tf
└── s3
├── bucket_policy.json
├── main.tf
├── outputs.tf
└── variables.tf
以下是使用Terraform来启用的AWS安全服务,我想简单解释一下。
亚马逊云跟踪服务 (AWS CloudTrail)
在AWS的审计服务中,可以获取到对AWS API的操作日志。如果在90天内,即使没有进行设置,也可以获取创建、修改和删除的操作日志。但是,如果想要保存超过90天的日志,可以通过创建”证迹”来保存所有的操作日志,所以基本上应该进行设置。
并且,由于攻击者通常在账户持有者平时不使用的地区启动服务器,所以请在所有地区进行设置。
亚马逊守护神
在AWS的异常检测服务中,通过持续监视CloudTrail的API调用日志和VPC流量日志等通信日志,自动检测到不正操作。具体来说,可以检测到以下情况,例如:
-
- コインマイニング
-
- IAM Userの不正ログイン
- ポートスキャン
30天内可免费使用,并提供费用估计功能,因此可以先激活,若费用过高则可作废。
AWS Config –
AWS 配置
在一个用于跟踪和审计AWS资源配置更改的配置管理服务中,您可以保存目标AWS资源的更改历史。
同時に,通过使用Config规则,可以持续监视AWS资源是否符合设置的规则。例如,以下规则。
-
- AWSアカウントでAWS CloudTrailが有効になっている
-
- 使用中のセキュリティグループが、制限のないSSHトラフィックの着信を拒否している
- Amazon Elastic Block Store (EBS) の暗号化がデフォルトで有効になっている
通过结合Config规则和修复动作功能,您可以配置通知或自动修复。我认为在创建帐户后,只需启用Config即可。但是,如果需要更严格的操作,您还可以考虑使用Config规则和修复动作功能。
我是访问分析器
检查与AWS资源相关联的策略(IAM策略和存储桶策略),并分析其中是否存在可以从外部访问的策略。以下是被支持的AWS资源。
-
- Amazon Simple Storage Service バケット
-
- AWS Identity and Access Management ロール
-
- AWS Key Management Service キー
-
- AWS Lambda の関数とレイヤー
-
- Amazon Simple Queue Service キュー
- AWS Secrets Manager シークレット
持续监控新制定或更新的政策,并在约30分钟内进行分析并提供分析结果。由于使用费用免费,因此需要针对每个区域进行设置,但请积极使用。
亚马逊侦探
这项服务可以更高效地对检测到的可疑活动进行分析和调查,并对以下日志进行解析。
-
- (Amazon VPC) Flow Logs
-
- AWS CloudTrail ログ
-
- Amazon GuardDuty
- Amazon Elastic Kubernetes Service (Amazon EKS) 監査ログ
由于检测到可疑活动后进行实际调查,日志数量繁多,因此在找到根本原因之前往往需要花费很多时间。
然而,您可以使用Amazon Detective来查看整体概况,并通过钻取方式查看详细信息。此外,还提供了30天免费试用和费用估算功能,因此如果在您的可承受范围内,建议您试用并加以利用。
AWS安全中心
通过执行安全最佳实践的检查,服务跨部门地集中管理安全警报,并能够查看其重要性和推荐的解决方法。与单独管理多个服务发出的安全警报相比,一体化管理可以大大提高工作效率。
由于需要从有效的AWS服务中获取安全警报,因此首先需要启用AWS Config、Amazon GuardDuty和IAM Access Analyzer。
上述的安全服务与之类似,还有一个为期30天的免费试用和报价功能,所以可以试用一下,如果没有问题,就可以大胆地使用。
执行Terraform
如果从上面的Github上复制了Terraform的文件,则要更改tfstate文件的配置位置设置。
terraform {
backend "s3" {
bucket = "[上記で作成したS3バケット名]"
key = "[S3バケットにおけるtfstateファイルのパス]"
region = "ap-northeast-1"
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.75.1"
}
}
}
请参照以上内容进行准备。请执行以下命令以启用上述AWS安全服务。
# ワークスペースの初期化(Terraformの必要なモジュールをダウンロードなど)
$ terraform init
# Terraformによる実行計画を参照
$ terraform plan
# tfファイルからAWSリソースを作成
$ terraform apply
我已经完成了AWS的初始设置和安全设置。下一步,我想要建立应用程序运营的基础架构。