AWS Identity Center (formerly AWS SSO) provides centralized access to multiple AWS accounts and applications. A single compromised SSO credential grants access to every account in the organization via cached tokens.
Identity Center provides a web portal where users authenticate once and access any assigned AWS account. The portal issues temporary credentials via GetRoleCredentials, with sessions lasting up to 12 hours by default.
Permission Sets define the IAM policies applied when a user accesses an account. They create IAM roles in each target account. AdministratorAccess Permission Sets are common and grant full control over every assigned account.
Identity Center can federate with external IdPs via SAML 2.0 or OIDC. If the external IdP (Okta, Azure AD, etc.) is compromised, the attacker gains access to every AWS account in the organization through the trust chain.
Identity Center is the single point of access for all AWS accounts. Compromising one SSO credential or the external IdP grants access to every account. Cached SSO tokens on disk enable offline credential theft.
aws sso list-accounts \
--access-token <sso-access-token>aws sso list-account-roles \
--access-token <sso-access-token> \
--account-id 123456789012aws sso-admin list-permission-sets \
--instance-arn arn:aws:sso:::instance/ssoins-1234567890aws sso-admin describe-permission-set \
--instance-arn arn:aws:sso:::instance/ssoins-1234567890 \
--permission-set-arn arn:aws:sso:::permissionSet/ssoins-1234567890/ps-abc123aws sso-admin list-account-assignments \
--instance-arn arn:aws:sso:::instance/ssoins-1234567890 \
--account-id 123456789012 \
--permission-set-arn arn:aws:sso:::permissionSet/ssoins-1234567890/ps-abc123aws sso get-role-credentials \
--access-token <sso-access-token> \
--account-id 123456789012 \
--role-name AdministratorAccessaws sso-admin create-permission-set \
--instance-arn arn:aws:sso:::instance/ssoins-1234567890 \
--name "ReadOnlyAudit" \
--session-duration PT12Haws sso-admin attach-managed-policy-to-permission-set \
--instance-arn arn:aws:sso:::instance/ssoins-1234567890 \
--permission-set-arn arn:aws:sso:::permissionSet/ssoins-1234567890/ps-abc123 \
--managed-policy-arn arn:aws:iam::aws:policy/AdministratorAccessaws sso-admin create-account-assignment \
--instance-arn arn:aws:sso:::instance/ssoins-1234567890 \
--target-id 123456789012 \
--target-type AWS_ACCOUNT \
--permission-set-arn arn:aws:sso:::permissionSet/ssoins-1234567890/ps-abc123 \
--principal-type USER \
--principal-id <user-id>cat ~/.aws/sso/cache/*.json | python3 -c "
import sys,json
for line in sys.stdin:
d=json.loads(line)
if 'accessToken' in d:
print(d['accessToken'])"TOKEN=$(cat ~/.aws/sso/cache/*.json | jq -r 'select(.accessToken) | .accessToken' | head -1)
for acct in $(aws sso list-accounts --access-token $TOKEN --query 'accountList[].accountId' --output text); do
echo "=== Account: $acct ==="
aws sso list-account-roles --access-token $TOKEN --account-id $acct --query 'roleList[].roleName' --output text
done{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"sso:*",
"sso-directory:*",
"identitystore:*"
],
"Resource": "*"
}]
}Full SSO access allows creating users, permission sets, and assigning admin access to all accounts
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"sso:Describe*",
"sso:List*",
"sso:Get*",
"sso-directory:Describe*",
"sso-directory:List*"
],
"Resource": "*"
}]
}Read-only access for security auditing without ability to modify access
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"sso:CreatePermissionSet",
"sso:CreateAccountAssignment",
"sso:AttachManagedPolicyToPermissionSet"
],
"Resource": "*"
}]
}Delegated admin can create permission sets with AdministratorAccess and assign them to any account
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenySSOMod",
"Effect": "Deny",
"Action": [
"sso:CreatePermissionSet",
"sso:DeletePermissionSet",
"sso:CreateAccountAssignment",
"sso:DeleteAccountAssignment"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:PrincipalOrgMasterAccountId": "${aws:PrincipalAccount}"
}
}
}]
}SCP restricts SSO modifications to the management account only, preventing delegated admin abuse
Require MFA at the Identity Center level and at the external IdP for defense in depth.
Set session duration to 1 hour instead of the default 12 hours to limit credential exposure.
aws sso-admin update-permission-set \
--instance-arn <instance-arn> \
--permission-set-arn <ps-arn> \
--session-duration PT1HUse SCPs to prevent member accounts from modifying Identity Center configuration.
Alert on CreatePermissionSet, CreateAccountAssignment, and AttachManagedPolicyToPermissionSet events.
aws cloudwatch put-metric-alarm \
--alarm-name SSOPermissionSetChange \
--metric-name SSOModification \
--namespace CustomSSO --threshold 1Enable conditional access policies, phishing-resistant MFA (FIDO2), and anomaly detection on the IdP.
Monitor for unauthorized access to ~/.aws/sso/cache/ directory on developer workstations.
find ~/.aws/sso/cache/ -name '*.json' -mmin -60AWS Identity Center Security Card • Toc Consulting
Always obtain proper authorization before testing