mirror of
https://github.com/goharbor/harbor.git
synced 2025-02-20 14:01:40 +01:00
fix(preheat):leverage project settings
- use content trust settings of project configurations - use vulnerability severity settings of project configurations Signed-off-by: Steven Zou <szou@vmware.com>
This commit is contained in:
parent
0ae8133a60
commit
d7bb6dac17
@ -213,7 +213,7 @@ func (de *defaultEnforcer) EnforcePolicy(ctx context.Context, policyID int64) (i
|
|||||||
// Override security settings if necessary
|
// Override security settings if necessary
|
||||||
ov := overrideSecuritySettings(pl, pro)
|
ov := overrideSecuritySettings(pl, pro)
|
||||||
for _, ss := range ov {
|
for _, ss := range ov {
|
||||||
log.Infof("Policy %s.%s's criteria '%s' is override from value '%s' to '%s'", ss...)
|
log.Infof("Policy %s.%s's criteria '%s' uses value '%s' from project configurations", ss...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do filters
|
// Do filters
|
||||||
@ -277,7 +277,7 @@ func (de *defaultEnforcer) PreheatArtifact(ctx context.Context, art *artifact.Ar
|
|||||||
// Override security settings if necessary
|
// Override security settings if necessary
|
||||||
ov := overrideSecuritySettings(pl, p)
|
ov := overrideSecuritySettings(pl, p)
|
||||||
for _, ss := range ov {
|
for _, ss := range ov {
|
||||||
log.Infof("Policy %s.%s's criteria '%s' is override from value '%s' to '%s'", ss...)
|
log.Infof("Policy %s.%s's criteria '%s' uses value '%s' from project configurations", ss...)
|
||||||
}
|
}
|
||||||
|
|
||||||
filtered, err := policy.NewFilter().BuildFrom(pl).Filter(candidates)
|
filtered, err := policy.NewFilter().BuildFrom(pl).Filter(candidates)
|
||||||
@ -294,6 +294,14 @@ func (de *defaultEnforcer) PreheatArtifact(ctx context.Context, art *artifact.Ar
|
|||||||
}
|
}
|
||||||
|
|
||||||
ids := make([]int64, 0)
|
ids := make([]int64, 0)
|
||||||
|
// No policy matched
|
||||||
|
if len(matched) == 0 {
|
||||||
|
// Log it
|
||||||
|
log.Debugf("No preheat policy matched for the artifact %s@%s", art.RepositoryName, art.Digest)
|
||||||
|
// Do nothing
|
||||||
|
return ids, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Launch preheat executions for all the matched policies.
|
// Launch preheat executions for all the matched policies.
|
||||||
// Check the health of the instance bound with the policy at this moment.
|
// Check the health of the instance bound with the policy at this moment.
|
||||||
for _, mp := range matched {
|
for _, mp := range matched {
|
||||||
@ -588,52 +596,49 @@ func checkProviderHealthy(inst *provider.Instance) error {
|
|||||||
|
|
||||||
// Check the project security settings and override the related settings in the policy if necessary.
|
// Check the project security settings and override the related settings in the policy if necessary.
|
||||||
// NOTES: if the security settings (relevant with signature and vulnerability) are set at the project configuration,
|
// NOTES: if the security settings (relevant with signature and vulnerability) are set at the project configuration,
|
||||||
// they will have the highest priority and override the related settings of the preheat policy.
|
// the corresponding filters of P2P preheat policy will be set using the relevant settings of project configurations.
|
||||||
// e.g (use signature as an example, similar case to vulnerability severity part):
|
|
||||||
// if policy.signature = false and project.config.signature = true; then policy.signature = true
|
|
||||||
// if policy.signature = true and project.config.signature = true; then policy.signature = true
|
|
||||||
// if policy.signature = true and project.config.signature = false; then policy.signature = true
|
|
||||||
// if policy.signature = false and project.config.signature = false; then policy.signature = false
|
|
||||||
//
|
|
||||||
// If override happened, then return the override setting list
|
|
||||||
func overrideSecuritySettings(p *pol.Schema, pro *models.Project) [][]interface{} {
|
func overrideSecuritySettings(p *pol.Schema, pro *models.Project) [][]interface{} {
|
||||||
if p == nil || pro == nil {
|
if p == nil || pro == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
override := make([][]interface{}, 0)
|
override := make([][]interface{}, 0)
|
||||||
|
filters := make([]*pol.Filter, 0)
|
||||||
for _, fl := range p.Filters {
|
for _, fl := range p.Filters {
|
||||||
switch fl.Type {
|
if fl.Type != pol.FilterTypeSignature && fl.Type != pol.FilterTypeVulnerability {
|
||||||
case pol.FilterTypeSignature:
|
filters = append(filters, fl)
|
||||||
if ct, ok := pro.Metadata[proMetaKeyContentTrust]; ok && ct == "true" {
|
|
||||||
if sig, ok := fl.Value.(bool); !ok || (ok && !sig) {
|
|
||||||
// Record this is a override case
|
|
||||||
r1 := []interface{}{pro.Name, p.Name, fl.Type, fmt.Sprintf("%v", sig), ct}
|
|
||||||
override = append(override, r1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Override: must be set align with project configuration setting
|
|
||||||
fl.Value = true
|
|
||||||
}
|
|
||||||
case pol.FilterTypeVulnerability:
|
|
||||||
if v, ok := pro.Metadata[proMetaKeyVulnerability]; ok && v == "true" {
|
|
||||||
if se, ok := pro.Metadata[proMetaKeySeverity]; ok && len(se) > 0 {
|
|
||||||
se = strings.Title(strings.ToLower(se))
|
|
||||||
code := vuln.Severity(se).Code()
|
|
||||||
|
|
||||||
if sev, ok := fl.Value.(int); !ok || (ok && sev < code) {
|
|
||||||
// Record this is a override case
|
|
||||||
r2 := []interface{}{pro.Name, p.Name, fl.Type, fmt.Sprintf("%v:%d", fl.Value, sev), fmt.Sprintf("%s:%d", se, code)}
|
|
||||||
override = append(override, r2)
|
|
||||||
|
|
||||||
// Override: must be set align with project configuration setting
|
|
||||||
fl.Value = code
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Append signature filter if content trust config is set at project configurations
|
||||||
|
if ct, ok := pro.Metadata[proMetaKeyContentTrust]; ok && ct == "true" {
|
||||||
|
filters = append(filters, &pol.Filter{
|
||||||
|
Type: pol.FilterTypeSignature,
|
||||||
|
Value: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Record this is a override case
|
||||||
|
r1 := []interface{}{pro.Name, p.Name, pol.FilterTypeSignature, fmt.Sprintf("%v", true)}
|
||||||
|
override = append(override, r1)
|
||||||
|
}
|
||||||
|
// Append vulnerability filter if vulnerability severity config is set at project configurations
|
||||||
|
if v, ok := pro.Metadata[proMetaKeyVulnerability]; ok && v == "true" {
|
||||||
|
if se, ok := pro.Metadata[proMetaKeySeverity]; ok && len(se) > 0 {
|
||||||
|
se = strings.Title(strings.ToLower(se))
|
||||||
|
code := vuln.Severity(se).Code()
|
||||||
|
filters = append(filters, &pol.Filter{
|
||||||
|
Type: pol.FilterTypeVulnerability,
|
||||||
|
Value: code,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Record this is a override case
|
||||||
|
r2 := []interface{}{pro.Name, p.Name, pol.FilterTypeVulnerability, fmt.Sprintf("%v:%d", se, code)}
|
||||||
|
override = append(override, r2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override
|
||||||
|
p.Filters = filters
|
||||||
|
|
||||||
return override
|
return override
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ func (suite *EnforcerTestSuite) SetupSuite() {
|
|||||||
Metadata: map[string]string{
|
Metadata: map[string]string{
|
||||||
proMetaKeyContentTrust: "true",
|
proMetaKeyContentTrust: "true",
|
||||||
proMetaKeyVulnerability: "true",
|
proMetaKeyVulnerability: "true",
|
||||||
proMetaKeySeverity: "low",
|
proMetaKeySeverity: "high",
|
||||||
},
|
},
|
||||||
}, nil)
|
}, nil)
|
||||||
|
|
||||||
@ -202,14 +202,6 @@ func mockPolicies() []*po.Schema {
|
|||||||
Type: po.FilterTypeLabel,
|
Type: po.FilterTypeLabel,
|
||||||
Value: "approved,ready",
|
Value: "approved,ready",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Type: po.FilterTypeSignature,
|
|
||||||
Value: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Type: po.FilterTypeVulnerability,
|
|
||||||
Value: 3, // medium
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Trigger: &po.Trigger{
|
Trigger: &po.Trigger{
|
||||||
Type: po.TriggerTypeManual,
|
Type: po.TriggerTypeManual,
|
||||||
@ -297,7 +289,7 @@ func mockArtifacts() []*car.Artifact {
|
|||||||
Tag: ta.Tag{
|
Tag: ta.Tag{
|
||||||
Name: "stage",
|
Name: "stage",
|
||||||
},
|
},
|
||||||
Signed: false,
|
Signed: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Labels: []*models.Label{
|
Labels: []*models.Label{
|
||||||
|
Loading…
Reference in New Issue
Block a user