AWS アカウントは簡単に作成でき、手軽に利用できます。しかし、初期設定ではセキュリティ設定が弱いため、第三者に悪用される危険があります。
安全に利用するために、適切な設定を実施しましょう。
ルートユーザーの権限は強力であるため、初期設定を行ったあとは可能な限り利用しないようにしましょう。
ルートユーザーでしか出来ない作業が必要になった場合のみ利用するようにしましょう。
詳しくは、以下の URL を参照してください。
https://docs.aws.amazon.com/accounts/latest/reference/root-user-tasks.html
ルートユーザーの乗っ取りを防止する意味でも アカウントを作成したらすぐにでも MFA を設定しましょう。 ただし、MFA の管理は厳重かつ、紛失に注意してください。可能であれば、2 つ以上を設定してください。(最大 8 つまで設定可能です) これを行っておけば、アカウント回復を回避できます。
AWS アカウント登録時の連絡先以外にも連絡してくれるようになります。
請求、オペレーション、セキュリティの3つに対して代替の連絡先を指定できます。必要に応じて設定しましょう。
<設定方法>
https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact-alternate.html
MFA デバイスの紛失時などに電話番号認証を行う場合、国際電話識別番号が設定していないと AWS からの国際電話が着信しません。(03-1234-5678 の場合、+81 3-1234-5678) 国際電話が着信しないと、カスタマーサポートに連絡することになり、時間外などはすぐに対応してもらえない場合があります。
<設定方法>
アカウントの乗っ取りや誤ったインスタンスタイプの起動など、予期しない請求を早期に検知できるので設定しましょう。
<設定方法>
https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-create.html
予算アラートは、設定した予算額に対してある敷居値を超えるときに通知するサービスでした。実際に超過しなければ通知されないため、異常な兆候は検出できません。
コスト異常検知は、コストを継続的にモニタリングし、機械学習モデルを利用して異常な AWS コストの発生を検出することができるサービスです。 AWS コスト異常検出を使うことで、想定外のコストが発生することを減らすことができ、アラートを受信することができます。
https://docs.aws.amazon.com/cost-management/latest/userguide/getting-started-ad.html
アカウント内で不正な操作を記録、検知するためにも有効にしましょう。 CloudTrail のログ保存先の S3 は、ライフサイクルルールも設定しましょう。 後述するログ監視を実施するために、CloudWatch Logs にも配信しましょう。CloudWatch のロググループには適切な保持期限を設定しましょう。
<設定方法>
https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html
CloudTrail のログを監視し、少なくとも以下を監視してアラートされるようにしましょう。
その他に監視しておくとよいのは以下です。
Personal Health Dashboard で随時確認し、監視してもよいですが、Amazon EventBridge コンソール でイベントパターン{"source": ["aws.health"]}を監視して自動化しよう。 通知する場合は、入力トランスフォーマーを使い、メッセージを読みやすいように整形しましょう。
<設定方法>
入力トランスフォーマーの設定例
{"eventDescription":"$.detail.eventDescription[0].latestDescription","eventTypeCode":"$.detail.eventTypeCode","region":"$.region","service":"$.detail.service","startTime":"$.detail.startTime","type":"$.detail-type"}
"AWSにてメンテナンス通知が発行されました。"
"type: <type>"
"eventStartTime: <startTime>"
"service: <service>"
"region: <region>"
"eventTypeCode: <eventTypeCode>"
"eventDescription: <eventDescription>"
"詳細は Personal Health Dashboard を確認してください。"
"https://phd.aws.amazon.com/phd/home#/dashboard/open-issues"
https://docs.aws.amazon.com/ja_jp/health/latest/ug/cloudwatch-events-health.html
デフォルトの IAM ユーザーのパスワードポリシーは脆弱です。そのため、アカウントを作成したら忘れないうちに強力なポリシーに変更しましょう。
推奨は、以下です。
- パスワードの最小長「12」以上
- 少なくとも1つの大文字が必要
- 少なくとも1つの小文字が必要
- 少なくとも1つの数字が必要
- 少なくとも1つの英数字以外の文字が必要
MFA を利用しない場合は、以下の追加も検討しましょう。
- パスワードの失効を許可「180日」
- パスワードの再利用を禁止「5回」
<設定方法>
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html
現在の設定を確認
CLI>get-account-password-policy
aws iam get-account-password-policy
設定
CLI>update-account-password-policy
aws iam update-account-password-policy \
--minimum-password-length 12 \
--require-uppercase-characters \
--require-lowercase-characters \
--require-numbers \
--require-symbols \
ルートユーザーは強力な権限を有しています。乗っ取られてしまった場合に無効化することが出来ません。 そのため、日常的な管理作業はルートユーザーではなく IAM ユーザーと IAM グループを使うことを推奨します。
作成した管理用グループに IAM ユーザーを追加します。
次に、AdministratorAccess の権限のロールとスイッチングロールを許可したポリシーを作成し、作成したグループに付与します。安全のために、ロール切り替え時には MFA が有効になっていることを条件としましょう。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
作成した IAM ユーザには MFA を設定しましょう。
この設定を行うことで、新しいボリュームを作成する際にデフォルトで暗号化が設定されるようになります。 暗号化設定を忘れてしまうことを回避でき、データの機密性の確保および、コンプライアンス要件を満たすことができます。この作業はアカウント開設直後に設定をすることを推奨します。
<設定方法>
ON
にします現在の設定を確認
CLI>get-ebs-encryption-by-default
### Get ebs encryption by default
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text |sort \
| while read region; do
default_enc=$(aws ec2 get-ebs-encryption-by-default --region ${region} --output text)
echo -e "${region}\t> ${default_enc}"
done
有効化を設定
CLI>enable-ebs-encryption-by-default
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text |sort\
| while read region; do
echo "### Enable ebs encryption by default in ${region}"
aws ec2 enable-ebs-encryption-by-default --region ${region}
done
この設定によって、S3 バケットを作成したときに誤って公開してしまうことを防止できます。ただし、アカウントレベルでパブリックアクセスを無効化してしまうと、バケットレベルで公開することができなくなります。(ここを参照)
バケットの公開が必要なユースケースによっては、アカウントレベルのブロックパブリックアクセスをオフのままにすることもできます。
<[設定方法](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/configuring-block-public-access-account.html>
バケットレベルでは、s3api
だが、アカウントレベルではs3control
になります。
現在の設定を確認
aws s3control get-public-access-block --account-id $(aws --output text sts get-caller-identity --query 'Account')
### 未設定の場合
### An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not found
設定
aws s3control put-public-access-block --account-id $(aws --output text sts get-caller-identity --query 'Account') --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
アカウント作成時には、全リージョンにデフォルト VPC というものが存在します。すぐ使うには便利なデフォルト VPC ですが、セキュリティ的にはインバウンドとアウトバウンドがすべて許可されていたりと、危ういです。
というわけで、基本的にはデフォルト VPC は削除してしまって、必要に応じて作成することを推奨します。
Amazon VPC 内で、デフォルト VPC を作成、削除、または復元する場合、どのような方法がありますか?
現在の存在確認
aws --output text ec2 describe-regions --query "Regions[].[RegionName]" |sort \
| while read region; do
aws --output text --region ${region} ec2 describe-vpcs --query "Vpcs[?IsDefault].[VpcId]" | while read vpc; do
echo -e "# ${region}\tdefault vpc: ${vpc}"
done
done
削除実行
依存関係が存在すると消せませんので順番に削除していきます。 下記コマンドの中の--dry-run
は実行時には削除してください。
aws --output text ec2 describe-regions --query "Regions[].[RegionName]" |sort \
| while read region; do
aws --output text --region ${region} ec2 describe-vpcs --query "Vpcs[?IsDefault].[VpcId]" | while read vpc; do
### InternetGateWay
aws --region ${region} --output text \
ec2 describe-internet-gateways --filters Name=attachment.vpc-id,Values=${vpc} \
--query "InternetGateways[].[InternetGatewayId]" \
| while read igw; do
echo "## deleting InternetGateWay: ${igw} in ${vpc}, ${region}"
echo "--> detatching"
aws --region ${region} --output json \
ec2 detach-internet-gateway --internet-gateway-id ${igw} --vpc-id ${vpc} --dry-run
echo "--> deleteing"
aws --region ${region} --output json \
ec2 delete-internet-gateway --internet-gateway-id ${igw} --dry-run
done
### Subnet
aws --region ${region} --output text \
ec2 describe-subnets --filters Name=vpc-id,Values=${vpc} \
--query "Subnets[].[SubnetId]" \
| while read subnet; do
echo "## deleting subnet: ${subnet} in ${vpc}, ${region}"
aws --region ${region} --output json \
ec2 delete-subnet --subnet-id ${subnet} --dry-run
done
### VPC
echo "## deleting vpc: ${vpc} in ${region}"
aws --region ${region} --output json \
ec2 delete-vpc --vpc-id ${vpc} --dry-run
done
done
aws --output text ec2 describe-regions --query "Regions[].[RegionName]" |sort \
| while read region; do
echo "creating default VPC in ${region}"
aws --region ${region} ec2 create-default-vpc --dry-run
done
IAM Access Analyzer は、外部公開できるサービスが不要に外部に公開されていないかモニタリングできるサービスです。
追加料金なしで利用でき、自力で調査する必要もなく、継続的にモニタリングしてくれるため、有効にしておきましょう。
ただし、リージョンサービスなので、全リージョンでは AWS CLI を使うことを推奨します。
analyzer_name="my-access-analyzer"
aws --output text ec2 describe-regions --query "Regions[].[RegionName]" |sort \
| while read region; do
echo "# create IAM Access Analyzer in ${region}"
aws accessanalyzer create-analyzer --analyzer-name ${analyzer_name} --type 'ACCOUNT' --region ${region}
done
analyzer_name="my-access-analyzer"
aws --output text ec2 describe-regions --query "Regions[].[RegionName]" |sort \
| while read region; do
echo "# IAM Access Analyzer in ${region}"
aws accessanalyzer get-analyzer --analyzer-name ${analyzer_name} --region ${region} --query "analyzer.[name,createdAt]" --output text
done
Amazon GuardDuty は、AWS アカウントや AWS 環境に対する脅威を検知する、セキュリティモニタリングサービスです。
対応している各種ログを継続的に取得し、機械学習によって不正なアクションなどを検知してくれます。簡単にセキュリティを強化できるため有効化しておくことを推奨します。
AWS Configは、AWS 上で稼働するリソースの状態を監視し、変更履歴を追跡するためのサービスです。
これによって、リソースの構成や状態の変更に関する詳細な情報を把握することができます。
次に示す、SecurityHub を有効化する場合には Config の有効化は必須となっておりますので、有効化しておくことを推奨します。
変更頻度が高いリソースがある場合は記録設定を日次記録
にすることも検討する。これによりコストを大幅に削減できる可能性があります。
例
※ 2022 年 2 月以降に作成した AWS アカウントでは、最初から「日本準拠法」になっているので本手順は不要になりました。
AWS アカウントの開設直後に設定されている準拠法は米国ワシントン州法となっています。ワシントン州法への準拠および英語での法務対応が困難な場合は、準拠法を日本法、紛争に関する第一審裁判所を東京地方裁判所に変更しましょう。
AWS アカウントはセキュリティチャレンジ質問の使用を中止します
ルートユーザーの多要素認証の解除など、カスタマーサービスに問い合わせを行うときに AWS アカウントの所有者であることを確認するために使うことができ、本人確認をする手間が楽になります。 ただし、一度設定すると変更は可能ですが削除することはできません。
秘密の質問は、設定した本人が忘れることが多いので、安易に設定するのはお勧めしません。設定する場合はよく検討しましょう。(参考記事: https://japan.zdnet.com/article/35065000/)
<設定方法>
https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-security-challenge.html