mirror of
https://github.com/minio/minio.git
synced 2025-07-29 02:00:59 -04:00
simplify validating policy mapping (#21450)
This commit is contained in:
parent
50fcf9b670
commit
7ced9663e6
35
cmd/iam.go
35
cmd/iam.go
@ -24,6 +24,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"maps"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"path"
|
"path"
|
||||||
"sort"
|
"sort"
|
||||||
@ -366,14 +367,11 @@ func (sys *IAMSys) Init(ctx context.Context, objAPI ObjectLayer, etcdClient *etc
|
|||||||
sys.rolesMap = make(map[arn.ARN]string)
|
sys.rolesMap = make(map[arn.ARN]string)
|
||||||
|
|
||||||
// From OpenID
|
// From OpenID
|
||||||
if riMap := sys.OpenIDConfig.GetRoleInfo(); riMap != nil {
|
maps.Copy(sys.rolesMap, sys.OpenIDConfig.GetRoleInfo())
|
||||||
sys.validateAndAddRolePolicyMappings(ctx, riMap)
|
|
||||||
}
|
|
||||||
|
|
||||||
// From AuthN plugin if enabled.
|
// From AuthN plugin if enabled.
|
||||||
if authn := newGlobalAuthNPluginFn(); authn != nil {
|
if authn := newGlobalAuthNPluginFn(); authn != nil {
|
||||||
riMap := authn.GetRoleInfo()
|
maps.Copy(sys.rolesMap, authn.GetRoleInfo())
|
||||||
sys.validateAndAddRolePolicyMappings(ctx, riMap)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sys.printIAMRoles()
|
sys.printIAMRoles()
|
||||||
@ -501,33 +499,6 @@ func (sys *IAMSys) periodicRoutines(ctx context.Context, baseInterval time.Durat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sys *IAMSys) validateAndAddRolePolicyMappings(ctx context.Context, m map[arn.ARN]string) {
|
|
||||||
// Validate that policies associated with roles are defined. If
|
|
||||||
// authZ plugin is set, role policies are just claims sent to
|
|
||||||
// the plugin and they need not exist.
|
|
||||||
//
|
|
||||||
// If some mapped policies do not exist, we print some error
|
|
||||||
// messages but continue any way - they can be fixed in the
|
|
||||||
// running server by creating the policies after start up.
|
|
||||||
for arn, rolePolicies := range m {
|
|
||||||
specifiedPoliciesSet := newMappedPolicy(rolePolicies).policySet()
|
|
||||||
validPolicies, _ := sys.store.MergePolicies(rolePolicies)
|
|
||||||
knownPoliciesSet := newMappedPolicy(validPolicies).policySet()
|
|
||||||
unknownPoliciesSet := specifiedPoliciesSet.Difference(knownPoliciesSet)
|
|
||||||
if len(unknownPoliciesSet) > 0 {
|
|
||||||
authz := newGlobalAuthZPluginFn()
|
|
||||||
if authz == nil {
|
|
||||||
// Print a warning that some policies mapped to a role are not defined.
|
|
||||||
errMsg := fmt.Errorf(
|
|
||||||
"The policies \"%s\" mapped to role ARN %s are not defined - this role may not work as expected.",
|
|
||||||
unknownPoliciesSet.ToSlice(), arn.String())
|
|
||||||
authZLogIf(ctx, errMsg, logger.WarningKind)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sys.rolesMap[arn] = rolePolicies
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prints IAM role ARNs.
|
// Prints IAM role ARNs.
|
||||||
func (sys *IAMSys) printIAMRoles() {
|
func (sys *IAMSys) printIAMRoles() {
|
||||||
if len(sys.rolesMap) == 0 {
|
if len(sys.rolesMap) == 0 {
|
||||||
|
@ -545,6 +545,14 @@ func (sts *stsAPIHandlers) AssumeRoleWithSSO(w http.ResponseWriter, r *http.Requ
|
|||||||
writeSTSErrorResponse(ctx, w, ErrSTSAccessDenied, err)
|
writeSTSErrorResponse(ctx, w, ErrSTSAccessDenied, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if newGlobalAuthZPluginFn() == nil {
|
||||||
|
// if authZ is not set - we expect the policies to be present.
|
||||||
|
if globalIAMSys.CurrentPolicies(p) == "" {
|
||||||
|
writeSTSErrorResponse(ctx, w, ErrSTSInvalidParameterValue,
|
||||||
|
fmt.Errorf("None of the given policies (`%s`) are defined, credentials will not be generated", p))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !globalIAMSys.doesPolicyAllow(p, policy.Args{
|
if !globalIAMSys.doesPolicyAllow(p, policy.Args{
|
||||||
@ -1003,6 +1011,20 @@ func (sts *stsAPIHandlers) AssumeRoleWithCustomToken(w http.ResponseWriter, r *h
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, policyName, err := globalIAMSys.GetRolePolicy(roleArnStr)
|
||||||
|
if err != nil {
|
||||||
|
writeSTSErrorResponse(ctx, w, ErrSTSAccessDenied, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if newGlobalAuthZPluginFn() == nil { // if authZ is not set - we expect the policyname to be present.
|
||||||
|
if globalIAMSys.CurrentPolicies(policyName) == "" {
|
||||||
|
writeSTSErrorResponse(ctx, w, ErrSTSInvalidParameterValue,
|
||||||
|
fmt.Errorf("None of the given policies (`%s`) are defined, credentials will not be generated", policyName))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
res, err := authn.Authenticate(roleArn, token)
|
res, err := authn.Authenticate(roleArn, token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeSTSErrorResponse(ctx, w, ErrSTSInvalidParameterValue, err)
|
writeSTSErrorResponse(ctx, w, ErrSTSInvalidParameterValue, err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user