mirror of
https://github.com/minio/minio.git
synced 2025-11-07 12:52:58 -05:00
allow purge expired STS while loading credentials (#19905)
the reason for this is to avoid STS mappings to be purged without a successful load of other policies, and all the credentials only loaded successfully are properly handled. This also avoids unnecessary cache store which was implemented earlier for optimization.
This commit is contained in:
48
cmd/iam.go
48
cmd/iam.go
@@ -352,6 +352,8 @@ func (sys *IAMSys) Init(ctx context.Context, objAPI ObjectLayer, etcdClient *etc
|
||||
bootstrapTraceMsg("finishing IAM loading")
|
||||
}
|
||||
|
||||
const maxDurationSecondsForLog = 5
|
||||
|
||||
func (sys *IAMSys) periodicRoutines(ctx context.Context, baseInterval time.Duration) {
|
||||
// Watch for IAM config changes for iamStorageWatcher.
|
||||
watcher, isWatcher := sys.store.IAMStorageAPI.(iamStorageWatcher)
|
||||
@@ -384,7 +386,6 @@ func (sys *IAMSys) periodicRoutines(ctx context.Context, baseInterval time.Durat
|
||||
return baseInterval/2 + randAmt
|
||||
}
|
||||
|
||||
var maxDurationSecondsForLog float64 = 5
|
||||
timer := time.NewTimer(waitInterval())
|
||||
defer timer.Stop()
|
||||
|
||||
@@ -403,18 +404,6 @@ func (sys *IAMSys) periodicRoutines(ctx context.Context, baseInterval time.Durat
|
||||
}
|
||||
}
|
||||
|
||||
// Purge expired STS credentials.
|
||||
purgeStart := time.Now()
|
||||
if err := sys.store.PurgeExpiredSTS(ctx); err != nil {
|
||||
iamLogIf(ctx, fmt.Errorf("Failure in periodic STS purge for IAM (took %.2fs): %v", time.Since(purgeStart).Seconds(), err))
|
||||
} else {
|
||||
took := time.Since(purgeStart).Seconds()
|
||||
if took > maxDurationSecondsForLog {
|
||||
// Log if we took a lot of time to load.
|
||||
logger.Info("IAM expired STS purge took %.2fs", took)
|
||||
}
|
||||
}
|
||||
|
||||
// The following actions are performed about once in 4 times that
|
||||
// IAM is refreshed:
|
||||
if r.Intn(4) == 0 {
|
||||
@@ -1578,31 +1567,16 @@ func (sys *IAMSys) NormalizeLDAPAccessKeypairs(ctx context.Context, accessKeyMap
|
||||
|
||||
func (sys *IAMSys) getStoredLDAPPolicyMappingKeys(ctx context.Context, isGroup bool) set.StringSet {
|
||||
entityKeysInStorage := set.NewStringSet()
|
||||
if iamOS, ok := sys.store.IAMStorageAPI.(*IAMObjectStore); ok {
|
||||
// Load existing mapping keys from the cached listing for
|
||||
// `IAMObjectStore`.
|
||||
iamFilesListing := iamOS.cachedIAMListing.Load().(map[string][]string)
|
||||
listKey := policyDBSTSUsersListKey
|
||||
if isGroup {
|
||||
listKey = policyDBGroupsListKey
|
||||
}
|
||||
for _, item := range iamFilesListing[listKey] {
|
||||
stsUserName := strings.TrimSuffix(item, ".json")
|
||||
entityKeysInStorage.Add(stsUserName)
|
||||
}
|
||||
} else {
|
||||
// For non-iam object store, we copy the mapping keys from the cache.
|
||||
cache := sys.store.rlock()
|
||||
defer sys.store.runlock()
|
||||
cachedPolicyMap := cache.iamSTSPolicyMap
|
||||
if isGroup {
|
||||
cachedPolicyMap = cache.iamGroupPolicyMap
|
||||
}
|
||||
cachedPolicyMap.Range(func(k string, v MappedPolicy) bool {
|
||||
entityKeysInStorage.Add(k)
|
||||
return true
|
||||
})
|
||||
cache := sys.store.rlock()
|
||||
defer sys.store.runlock()
|
||||
cachedPolicyMap := cache.iamSTSPolicyMap
|
||||
if isGroup {
|
||||
cachedPolicyMap = cache.iamGroupPolicyMap
|
||||
}
|
||||
cachedPolicyMap.Range(func(k string, v MappedPolicy) bool {
|
||||
entityKeysInStorage.Add(k)
|
||||
return true
|
||||
})
|
||||
|
||||
return entityKeysInStorage
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user