diff --git a/cmd/admin-handlers-users.go b/cmd/admin-handlers-users.go index 97a6b61f4..424945593 100644 --- a/cmd/admin-handlers-users.go +++ b/cmd/admin-handlers-users.go @@ -984,18 +984,13 @@ func (a adminAPIHandlers) AccountInfoHandler(w http.ResponseWriter, r *http.Requ // Set delimiter value for "s3:delimiter" policy conditionals. r.Header.Set("delimiter", SlashSeparator) - parentUser := cred.AccessKey - if cred.ParentUser != "" { - parentUser = cred.ParentUser - } - isAllowedAccess := func(bucketName string) (rd, wr bool) { if globalIAMSys.IsAllowed(iampolicy.Args{ - AccountName: parentUser, + AccountName: cred.AccessKey, Groups: cred.Groups, Action: iampolicy.ListBucketAction, BucketName: bucketName, - ConditionValues: getConditionValues(r, "", parentUser, claims), + ConditionValues: getConditionValues(r, "", cred.AccessKey, claims), IsOwner: owner, ObjectName: "", Claims: claims, @@ -1004,11 +999,11 @@ func (a adminAPIHandlers) AccountInfoHandler(w http.ResponseWriter, r *http.Requ } if globalIAMSys.IsAllowed(iampolicy.Args{ - AccountName: parentUser, + AccountName: cred.AccessKey, Groups: cred.Groups, Action: iampolicy.PutObjectAction, BucketName: bucketName, - ConditionValues: getConditionValues(r, "", parentUser, claims), + ConditionValues: getConditionValues(r, "", cred.AccessKey, claims), IsOwner: owner, ObjectName: "", Claims: claims, diff --git a/cmd/iam.go b/cmd/iam.go index 001c4924a..83f12ba22 100644 --- a/cmd/iam.go +++ b/cmd/iam.go @@ -2042,7 +2042,7 @@ func (sys *IAMSys) policyDBGet(name string, isGroup bool) (policies []string, er // IsAllowedServiceAccount - checks if the given service account is allowed to perform // actions. The permission of the parent user is checked first -func (sys *IAMSys) IsAllowedServiceAccount(args iampolicy.Args, parent string) bool { +func (sys *IAMSys) IsAllowedServiceAccount(args iampolicy.Args, parentUser string) bool { // Now check if we have a subject claim p, ok := args.Claims[parentClaim] if ok { @@ -2053,7 +2053,7 @@ func (sys *IAMSys) IsAllowedServiceAccount(args iampolicy.Args, parent string) b } // The parent claim in the session token should be equal // to the parent detected in the backend - if parentInClaim != parent { + if parentInClaim != parentUser { return false } } else { @@ -2064,7 +2064,7 @@ func (sys *IAMSys) IsAllowedServiceAccount(args iampolicy.Args, parent string) b } // Check policy for this service account. - svcPolicies, err := sys.PolicyDBGet(parent, false, args.Groups...) + svcPolicies, err := sys.PolicyDBGet(parentUser, false, args.Groups...) if err != nil { logger.LogIf(GlobalContext, err) return false @@ -2097,7 +2097,10 @@ func (sys *IAMSys) IsAllowedServiceAccount(args iampolicy.Args, parent string) b } parentArgs := args - parentArgs.AccountName = parent + parentArgs.AccountName = parentUser + // These are dynamic values set them appropriately. + parentArgs.ConditionValues["username"] = []string{parentUser} + parentArgs.ConditionValues["userid"] = []string{parentUser} saPolicyClaim, ok := args.Claims[iamPolicyClaimNameSA()] if !ok { @@ -2136,7 +2139,11 @@ func (sys *IAMSys) IsAllowedServiceAccount(args iampolicy.Args, parent string) b return false } - // Policy without Version string value reject it. + // This can only happen if policy was set but with an empty JSON. + if subPolicy.Version == "" && len(subPolicy.Statements) == 0 { + return combinedPolicy.IsAllowed(parentArgs) + } + if subPolicy.Version == "" { return false } @@ -2255,6 +2262,10 @@ func (sys *IAMSys) IsAllowedSTS(args iampolicy.Args, parentUser string) bool { availablePolicies[i].Statements...) } + // These are dynamic values set them appropriately. + args.ConditionValues["username"] = []string{parentUser} + args.ConditionValues["userid"] = []string{parentUser} + // Now check if we have a sessionPolicy. spolicy, ok := args.Claims[iampolicy.SessionPolicyName] if ok { diff --git a/cmd/sts-handlers.go b/cmd/sts-handlers.go index 976d6a95e..5b27f7f0b 100644 --- a/cmd/sts-handlers.go +++ b/cmd/sts-handlers.go @@ -69,8 +69,8 @@ const ( ) func parseOpenIDParentUser(parentUser string) (userID string, err error) { - if strings.HasPrefix(parentUser, "jwt:") { - tokens := strings.SplitN(strings.TrimPrefix(parentUser, "jwt:"), ":", 2) + if strings.HasPrefix(parentUser, "openid:") { + tokens := strings.SplitN(strings.TrimPrefix(parentUser, "openid:"), ":", 2) if len(tokens) == 2 { return tokens[0], nil } @@ -408,7 +408,7 @@ func (sts *stsAPIHandlers) AssumeRoleWithSSO(w http.ResponseWriter, r *http.Requ // this is to ensure that ParentUser doesn't change and we get to use // parentUser as per the requirements for service accounts for OpenID // based logins. - cred.ParentUser = "jwt:" + subFromToken + ":" + issFromToken + cred.ParentUser = "openid:" + subFromToken + ":" + issFromToken // Set the newly generated credentials. if err = globalIAMSys.SetTempUser(cred.AccessKey, cred, policyName); err != nil {