2020/05/22
AWSアカウントで2段階認証を強制する
概要
AWSアカウントのログインユーザーの作成をしました。
セキュリティ的にAWSのアカウントへは2段階認証(MFA)でのログインを必須にするようにしています。
これをIAMのポリシーを使って実現できるので、そちらを対応しました。
基本的には、チュートリアル: ユーザーが自分の認証情報および MFA を設定できるようにする - AWS Identity and Access Management の内容を踏襲しました。
実施事項
Policyの追加
“Force_MFA” というロールを作成しました。
以下のJSONを使って作成しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:GetAccountSummary",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowManageOwnPasswords",
"Effect": "Allow",
"Action": [
"iam:ChangePassword",
"iam:GetUser"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnAccessKeys",
"Effect": "Allow",
"Action": [
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:ListAccessKeys",
"iam:UpdateAccessKey"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSigningCertificates",
"Effect": "Allow",
"Action": [
"iam:DeleteSigningCertificate",
"iam:ListSigningCertificates",
"iam:UpdateSigningCertificate",
"iam:UploadSigningCertificate"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnSSHPublicKeys",
"Effect": "Allow",
"Action": [
"iam:DeleteSSHPublicKey",
"iam:GetSSHPublicKey",
"iam:ListSSHPublicKeys",
"iam:UpdateSSHPublicKey",
"iam:UploadSSHPublicKey"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnGitCredentials",
"Effect": "Allow",
"Action": [
"iam:CreateServiceSpecificCredential",
"iam:DeleteServiceSpecificCredential",
"iam:ListServiceSpecificCredentials",
"iam:ResetServiceSpecificCredential",
"iam:UpdateServiceSpecificCredential"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/${aws:username}"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
},
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
ポイントは一番したの、 “DenyAllExceptListedIfNoMFA” というところで、MFAが設定されていない場合は、全てのActionを禁止にするけれど、"CreateVirtualMFADevice"や"EnableMFADevice"などのMFAを設定する権限は禁止から除外(=使える)ようにしている点です。
Groupの追加
今回追加したいユーザーのGroupを作成します。
作成するときに、先ほど作った、"Force_MFA"のポリシーを付与しておきます。
他にも付与したいポリシーがあれば付与します。(EC2へのアクセスなど)
Userの追加
今回追加したいユーザーを作成し、先ほど作ったGroupに所属させます。
以上になります。
関連する記事
EKSのロードバランサーでIPアドレスのアクセス制限を設定する
EKSで構築しているネットワークロードバランサータイプのServiceにIP Whitelistを設定しました。
EKSのバージョンをアップグレードする
開発に利用しているEKSのバージョンをアップグレードしました
[EKS]NLB+NginxでClientのIPアドレスを取得する
EKS上にdeployしたnginxをNetwork Load Balancerを使って外部公開した時に接続元のIPアドレスを取得する対応をしました
EKSでServiceAccount毎にIAMロールを作成してpod毎に権限を変更する
IAMのリソースをterraformで作成し、service accountに紐付けることによってpodのAWSリソースのアクセス権を細かく定義できるようにしました