Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat (detectExecuteScan) include side car conditions and use CPE from build steps to run docker scans #4804

Closed
wants to merge 34 commits into from
Closed
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
628084f
side car test
anilkeshav27 Jan 26, 2024
765ddf2
including distros for test only will be removed later on
anilkeshav27 Jan 26, 2024
cbbbd87
remove default value
anilkeshav27 Jan 26, 2024
8858abe
removing default
anilkeshav27 Jan 26, 2024
29d6df3
making the value string
anilkeshav27 Jan 26, 2024
004dec4
side car default change
anilkeshav27 Jan 26, 2024
0793070
changing string value
anilkeshav27 Jan 26, 2024
0764abf
removing default side car values
anilkeshav27 Jan 28, 2024
b193af4
removing name from conditions
anilkeshav27 Jan 28, 2024
cb08236
go generate
anilkeshav27 Jan 28, 2024
464277e
testig with general param
anilkeshav27 Jan 28, 2024
972f96d
changing variable name
anilkeshav27 Jan 29, 2024
1fd62ea
correcting the condition for distros
anilkeshav27 Jan 29, 2024
7bb7562
changing first image
anilkeshav27 Jan 29, 2024
244404a
reverting the the same conditions
anilkeshav27 Jan 29, 2024
4670876
adding correct volumne names
anilkeshav27 Jan 29, 2024
7dde167
adding correct volumne names
anilkeshav27 Jan 29, 2024
ba8ed96
Merge branch 'master' into anil/conditionalSideCar
anilkeshav27 Jan 30, 2024
cb4bf21
including detect changes as well
anilkeshav27 Jan 30, 2024
ba477c5
including downloading the correct values from the cpe
anilkeshav27 Jan 30, 2024
6003cdd
adding condition either image of artifact
anilkeshav27 Jan 30, 2024
beb578a
adding port mapping to detect step
anilkeshav27 Jan 31, 2024
f71dadf
adding port mapping to detect step
anilkeshav27 Jan 31, 2024
a017376
changing port numbers
anilkeshav27 Feb 1, 2024
1358d21
adding voume mounts name
anilkeshav27 Feb 1, 2024
17b63a3
changing file permissions
anilkeshav27 Feb 1, 2024
abe805a
changing file permissions
anilkeshav27 Feb 1, 2024
cc394fa
making 777 permission
anilkeshav27 Feb 1, 2024
8d85456
adding shared docker volume
anilkeshav27 Feb 2, 2024
3e3b7de
defaulting to one side car in case of no multiple
anilkeshav27 Feb 2, 2024
6098d5d
impro docu
anilkeshav27 Feb 2, 2024
17c3723
typo error fix
anilkeshav27 Feb 2, 2024
e7a95b3
merge conflict resolve
anilkeshav27 Feb 6, 2024
ca9d32c
correct port names for the inspector app
anilkeshav27 Feb 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 114 additions & 3 deletions cmd/detectExecuteScan.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import (
"github.com/pkg/errors"
)

const NO_VERSION_SUFFIX = ""

type detectUtils interface {
piperutils.FileUtils

Expand Down Expand Up @@ -202,7 +204,7 @@ func runDetect(ctx context.Context, config detectExecuteScanOptions, utils detec
blackduckSystem := newBlackduckSystem(config)

args := []string{"./detect.sh"}
args, err = addDetectArgs(args, config, utils, blackduckSystem)
args, err = addDetectArgs(args, config, utils, blackduckSystem, NO_VERSION_SUFFIX, NO_VERSION_SUFFIX)
if err != nil {
return err
}
Expand All @@ -214,7 +216,12 @@ func runDetect(ctx context.Context, config detectExecuteScanOptions, utils detec
utils.SetDir(".")
utils.SetEnv(envs)

err = utils.RunShell("/bin/bash", script)
if !config.ScanImages {
err = mapDetectError(utils.RunShell("/bin/bash", script), config, utils)
} else {
err = mapDetectError(runDetectImages(ctx, config, utils, blackduckSystem, influx, blackduckSystem), config, utils)
}

reportingErr := postScanChecksAndReporting(ctx, config, influx, utils, blackduckSystem)
if reportingErr != nil {
if strings.Contains(reportingErr.Error(), "License Policy Violations found") {
Expand Down Expand Up @@ -247,6 +254,67 @@ func runDetect(ctx context.Context, config detectExecuteScanOptions, utils detec
return err
}

func mapDetectError(err error, config detectExecuteScanOptions, utils detectUtils) error {
if err != nil {
// Setting error category based on exit code
mapErrorCategory(utils.GetExitCode())
if log.GetErrorCategory() == log.ErrorCompliance && !config.FailOnSevereVulnerabilities {
err = nil
log.Entry().Infof("policy violation(s) found - step will only create data but not fail due to setting failOnSevereVulnerabilities: false")
} else {
// Error code mapping with more human readable text
err = errors.Wrapf(err, exitCodeMapping(utils.GetExitCode()))
}
}
return err
}

func runDetectImages(ctx context.Context, config detectExecuteScanOptions, utils detectUtils, sys *blackduckSystem, influx *detectExecuteScanInflux, blackduckSystem *blackduckSystem) error {
// cpePath := filepath.Join(GeneralConfig.EnvRootPath, "commonPipelineEnvironment")
imagesRaw := config.ImageNameTags
if len(imagesRaw) == 0 {
log.Entry().Debugf("No images found to be scanned")
return nil
}

registryUser := config.ContainerRegistryUser
registryPassword := config.ContainerRegistryPassword
registryURL := config.ContainerRegistryURL

log.Entry().Infof("Scanning %d images", len(imagesRaw))
for _, image := range imagesRaw {
// Download image to be scanned
log.Entry().Debugf("Scanning image: %q", image)
tarName := fmt.Sprintf("%s.tar", strings.Split(image, ":")[0])

options := containerSaveImageOptions{
ContainerRegistryURL: registryURL,
ContainerImage: image,
ContainerRegistryPassword: registryPassword,
ContainerRegistryUser: registryUser,
FilePath: tarName,
ImageFormat: "legacy",
}
containerSaveImage(options, &telemetry.CustomData{})

args := []string{"./detect.sh"}
args, err := addDetectArgsImages(args, config, utils, sys, tarName)
if err != nil {
return err
}
script := strings.Join(args, " ")

err = utils.RunShell("/bin/bash", script)
err = mapDetectError(err, config, utils)

if err != nil {
return err
}
}

return nil
}

// Get proper error category
func mapErrorCategory(exitCodeKey int) {
switch exitCodeKey {
Expand Down Expand Up @@ -331,8 +399,13 @@ func getDetectScript(config detectExecuteScanOptions, utils detectUtils) error {
return nil
}

func addDetectArgs(args []string, config detectExecuteScanOptions, utils detectUtils, sys *blackduckSystem) ([]string, error) {
func addDetectArgs(args []string, config detectExecuteScanOptions, utils detectUtils, sys *blackduckSystem, versionSuffix, locationSuffix string) ([]string, error) {
detectVersionName := getVersionName(config)

if versionSuffix != NO_VERSION_SUFFIX {
detectVersionName = fmt.Sprintf("%s-%s", detectVersionName, versionSuffix)
}

// Split on spaces, the scanPropeties, so that each property is available as a single string
// instead of all properties being part of a single string
config.ScanProperties = piperutils.SplitAndTrim(config.ScanProperties, " ")
Expand Down Expand Up @@ -467,6 +540,44 @@ func addDetectArgs(args []string, config detectExecuteScanOptions, utils detectU
return args, nil
}

func addDetectArgsImages(args []string, config detectExecuteScanOptions, utils detectUtils, sys *blackduckSystem, imageTar string) ([]string, error) {
// suffix := strings.Split(imageTar, ".")[0]
// In order to preserve source scan result
config.Unmap = false
args, err := addDetectArgs(args, config, utils, sys, NO_VERSION_SUFFIX, fmt.Sprintf("image-%s", strings.Split(imageTar, ".")[0]))
if err != nil {
return []string{}, err
}

args = append(args, fmt.Sprintf("--detect.docker.tar=./%s", imageTar))
args = append(args, "--detect.target.type=IMAGE")
// https://community.synopsys.com/s/article/Docker-image-scanning-CLI-examples-and-some-Q-As
args = append(args, "--detect.tools.excluded=DETECTOR")
args = append(args, "--detect.docker.passthrough.shared.dir.path.local=/opt/blackduck/blackduck-imageinspector/shared")
args = append(args, "--detect.docker.passthrough.shared.dir.path.imageinspector=/opt/blackduck/blackduck-imageinspector/shared")
//args = append(args, "--detect.docker.passthrough.shared.dir.path.local=/home/scanner")
//args = append(args, "--detect.docker.passthrough.shared.dir.path.imageinspector=/home/scanner")
args = append(args, fmt.Sprintf("--detect.docker.passthrough.imageinspector.service.distro.default=%s", config.ContainerDistro))
args = append(args, "--detect.docker.passthrough.imageinspector.service.start=false")
args = append(args, "--detect.docker.passthrough.output.include.squashedimage=false")
//args = append(args, "--detect.docker.passthrough.cleanup.inspector.container=false")
//args = append(args, "--logging.level.com.synopsys=DEBUG")
//args = append(args, "--detect.diagnostic")

switch config.ContainerDistro {
case "ubuntu":
args = append(args, "--detect.docker.passthrough.imageinspector.service.url=http://localhost:9002")
case "centos":
args = append(args, "--detect.docker.passthrough.imageinspector.service.url=http://localhost:9001")
case "alpine":
args = append(args, "--detect.docker.passthrough.imageinspector.service.url=http://localhost:9000")
default:
return nil, fmt.Errorf("unknown container distro %q", config.ContainerDistro)
}

return args, nil
}

func getVersionName(config detectExecuteScanOptions) string {
detectVersionName := config.CustomScanVersion
if len(detectVersionName) > 0 {
Expand Down
103 changes: 103 additions & 0 deletions cmd/detectExecuteScan_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 36 additions & 5 deletions pkg/config/stepmeta.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,17 @@ func (m *StepData) GetContextParameterFilters() StepFilters {
contextFilters = append(contextFilters, parameterKeys...)
}
if len(m.Spec.Sidecars) > 0 {
parameterKeysForSideCar := []string{"containerName", "containerPortMappings", "dockerName", "sidecarEnvVars", "sidecarImage", "sidecarName", "sidecarOptions", "sidecarPullImage", "sidecarReadyCommand", "sidecarVolumeBind", "sidecarWorkspace"}
for _, sidecar := range m.Spec.Sidecars {
for _, condition := range sidecar.Conditions {
for _, dependentParam := range condition.Params {
parameterKeysForSideCar = append(parameterKeysForSideCar, dependentParam.Value)
parameterKeysForSideCar = append(parameterKeysForSideCar, dependentParam.Name)
}
}
}
//ToDo: support fallback for "dockerName" configuration property -> via aliasing?
contextFilters = append(contextFilters, []string{"containerName", "containerPortMappings", "dockerName", "sidecarEnvVars", "sidecarImage", "sidecarName", "sidecarOptions", "sidecarPullImage", "sidecarReadyCommand", "sidecarVolumeBind", "sidecarWorkspace"}...)
contextFilters = append(contextFilters, parameterKeysForSideCar...)
//ToDo: add condition param.Value and param.Name to filter as for Containers
}

Expand Down Expand Up @@ -302,11 +311,33 @@ func (m *StepData) GetContextDefaults(stepName string) (io.ReadCloser, error) {
}

if len(m.Spec.Sidecars) > 0 {
if len(m.Spec.Sidecars[0].Command) > 0 {
root["sidecarCommand"] = m.Spec.Sidecars[0].Command[0]
for _, sideCar := range m.Spec.Sidecars {
key := ""
conditionParam := ""
if len(sideCar.Conditions) > 0 {
key = sideCar.Conditions[0].Params[0].Value
conditionParam = sideCar.Conditions[0].Params[0].Name
}
p := map[string]interface{}{}
if key != "" {
root[key] = p
//add default for condition parameter if available
for _, inputParam := range m.Spec.Inputs.Parameters {
if inputParam.Name == conditionParam {
root[conditionParam] = inputParam.Default
}
}
} else {
p = root
}
if len(sideCar.Command) > 0 {
root["sidecarCommand"] = sideCar.Command[0]
}

putStringIfNotEmpty(root, "sidecarReadyCommand", sideCar.ReadyCommand)
sideCar.commonConfiguration("sidecar", &p)

}
m.Spec.Sidecars[0].commonConfiguration("sidecar", &root)
putStringIfNotEmpty(root, "sidecarReadyCommand", m.Spec.Sidecars[0].ReadyCommand)

// not filled for now since this is not relevant in Kubernetes case
//putStringIfNotEmpty(root, "containerPortMappings", m.Spec.Sidecars[0].)
Expand Down
Loading
Loading