AWSを比較的安全に使用するには
管理コンソールとか cli によるアクセスとかで、どうやって安全にアクセスするかという課題。
以下の2通りあるが、IdentityCenterを使用するほうを勧める。公式も勧めている。
AWS Identity Center と AWS Organization を使用する。
AWS IAM ユーザーに MFA を強制させる
AWS Identity Center でユーザーを作成
複数人・複数アカウントで使用する予定なら強く勧める。
管理が楽、請求などを含めた複数アカウントの管理が Organization で楽、永続的な Credentials を使わせないことが可能
手順
IdentityCenterの有効化
ユーザーの登録
MFAデバイスの登録
aws sso login --profile {profile_name}
ユーザー名・パスワード・MFAコードを入力してログイン
コマンド実行結果でアクセスポータルにアクセスするためのURLが出力されるのでアクセス
その画面から管理コンソールにアクセスするも良し、一時的に払いだされているAccessKeyも取得できるのでそれを使うも良し
この方法では永続的な Credentials を必要としない。
面倒ではあるが、毎回 ユーザー名・パスワード・MFA でログインさせる。
cli によるアクセスは、そこで払いだされる 一時的な Credentials を使用して行う。
(もしかしたら aws-vault を使用してもっと楽にできるかも?)
永続的な Credentials はローテーションすることで回避可能だが、そんなことをしてくれると信用してはいけない。
AWS IAM ユーザーに MFA を強制させる
1人1アカウントで運用するならこれでいいんじゃない?
IAMアカウントを作成
IAMアカウントの Credentials を発行
aws-vault add {profile_name}
発行した Credentials を入力
code: .aws/config
region=ap-northeast-1
output=json
mfa_serial={mfa_serial}
コマンド実行するには以下のようにする。
aws-vault exec {profile_name} -- aws s3 ls
以下の policy を対象のユーザーにアタッチして、MFAを突破していないアクセスを特定の操作を覗いて拒否しておく。
code: enforce_mfa.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ChangePassword"
],
"Resource": [
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy"
],
"Resource": "*"
},
{
"Sid": "AllowIndividualUserToManageTheirOwnMFA",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:ListMFADevices"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:ListMFADevices",
"iam:ChangePassword",
"iam:GetAccountPasswordPolicy",
"iam:ListVirtualMFADevices"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
定期的に以下を実行して Credentials をローテーションする。
aws-vault rotate {profile_name}
aws-vault のおかげで 平文での Credentials の保持をしなくていいので、まぁ耐えてる運用方法。
aws-vault exec で実行すれば一時的な Credentials を発行してくれて、それを使用するので、漏洩による悪影響は少ない。
1人なら間違いなく漏洩することがないので安心、なんなら terraform などの実行では IdentityCenter 案より楽に使える。
でも他人に永続的な Credentials が発行されるのは不安しかないので......うーん......
何か問題が起きるときはだいたい人間のせい