iam: Do not create service accounts for non existant IAM users (#12236)

When running MinIO server without LDAP/OpenID, we should error out when
the code tries to create a service account for a non existant regular
user.

Bonus: refactor the check code to be show all cases more clearly

Signed-off-by: Anis Elleuch <anis@min.io>

Co-authored-by: Anis Elleuch <anis@min.io>
This commit is contained in:
Anis Elleuch 2021-05-06 00:04:50 +01:00 committed by GitHub
parent 0eeb0a4e04
commit af1b6e3458
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1114,31 +1114,35 @@ func (sys *IAMSys) NewServiceAccount(ctx context.Context, parentUser string, gro
sys.store.lock() sys.store.lock()
defer sys.store.unlock() defer sys.store.unlock()
cr, ok := sys.iamUsersMap[parentUser] cr, found := sys.iamUsersMap[parentUser]
if !ok { switch {
// User found
case found:
// Disallow service accounts to further create more service accounts.
if cr.IsServiceAccount() {
return auth.Credentials{}, errIAMActionNotAllowed
}
// Allow creating service accounts for root user
case parentUser == globalActiveCred.AccessKey:
// For LDAP/OpenID users we would need this fallback // For LDAP/OpenID users we would need this fallback
if sys.usersSysType != MinIOUsersSysType && parentUser != globalActiveCred.ParentUser { case sys.usersSysType != MinIOUsersSysType:
_, ok = sys.iamUserPolicyMap[parentUser] _, ok := sys.iamUserPolicyMap[parentUser]
if !ok { if !ok {
var found bool var groupHasPolicy bool
for _, group := range groups { for _, group := range groups {
_, ok = sys.iamGroupPolicyMap[group] _, ok = sys.iamGroupPolicyMap[group]
if !ok { if !ok {
continue continue
} }
found = true groupHasPolicy = true
break break
} }
if !found { if !groupHasPolicy {
return auth.Credentials{}, errNoSuchUser return auth.Credentials{}, errNoSuchUser
} }
} }
} default:
} return auth.Credentials{}, errNoSuchUser
// Disallow service accounts to further create more service accounts.
if cr.IsServiceAccount() {
return auth.Credentials{}, errIAMActionNotAllowed
} }
m := make(map[string]interface{}) m := make(map[string]interface{})