Skip to content

Commit

Permalink
add flag to allow skipping upload to transparency log (#2089)
Browse files Browse the repository at this point in the history
* add flag to allow skipping upload to transparency log

we use cosign extensively with a private registry, and would like to
streamline the signing process to bypass the prompt to skip uploading to
a the transparency log with a private registry.

Signed-off-by: Kenny Leung <[email protected]>

* make docgen

Signed-off-by: Kenny Leung <[email protected]>

* fix e2e

Signed-off-by: Kenny Leung <[email protected]>

* add e2e test

Signed-off-by: Kenny Leung <[email protected]>

* rename flag to no_tlog_upload

Signed-off-by: Kenny Leung <[email protected]>

* dash instead of underscore in flag name.

Signed-off-by: Kenny Leung <[email protected]>

* make docgen

Signed-off-by: Kenny Leung <[email protected]>
  • Loading branch information
k4leung4 authored Jul 25, 2022
1 parent 75c597a commit 74c01fe
Show file tree
Hide file tree
Showing 10 changed files with 93 additions and 34 deletions.
2 changes: 1 addition & 1 deletion cmd/cosign/cli/attest.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func Attest() *cobra.Command {
}
for _, img := range args {
if err := attest.AttestCmd(cmd.Context(), ko, o.Registry, img, o.Cert, o.CertChain, o.NoUpload,
o.Predicate.Path, o.Force, o.Predicate.Type, o.Replace, ro.Timeout); err != nil {
o.Predicate.Path, o.Force, o.Predicate.Type, o.Replace, ro.Timeout, o.NoTlogUpload); err != nil {
return fmt.Errorf("signing %s: %w", img, err)
}
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/cosign/cli/attest/attest.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func uploadToTlog(ctx context.Context, sv *sign.SignerVerifier, rekorURL string,

//nolint
func AttestCmd(ctx context.Context, ko options.KeyOpts, regOpts options.RegistryOptions, imageRef string, certPath string, certChainPath string,
noUpload bool, predicatePath string, force bool, predicateType string, replace bool, timeout time.Duration) error {
noUpload bool, predicatePath string, force bool, predicateType string, replace bool, timeout time.Duration, noTlogUpload bool) error {
// A key file or token is required unless we're in experimental mode!
if options.EnableExperimental() {
if options.NOf(ko.KeyRef, ko.Sk) > 1 {
Expand Down Expand Up @@ -161,7 +161,7 @@ func AttestCmd(ctx context.Context, ko options.KeyOpts, regOpts options.Registry
}

// Check whether we should be uploading to the transparency log
if sign.ShouldUploadToTlog(ctx, digest, force, ko.RekorURL) {
if sign.ShouldUploadToTlog(ctx, digest, force, noTlogUpload, ko.RekorURL) {
bundle, err := uploadToTlog(ctx, sv, ko.RekorURL, func(r *client.Rekor, b []byte) (*models.LogEntryAnon, error) {
return cosign.TLogUploadInTotoAttestation(ctx, r, signedPayload, b)
})
Expand Down
4 changes: 4 additions & 0 deletions cmd/cosign/cli/options/attest.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ type AttestOptions struct {
Recursive bool
Replace bool
SkipConfirmation bool
NoTlogUpload bool

Rekor RekorOptions
Fulcio FulcioOptions
Expand Down Expand Up @@ -75,4 +76,7 @@ func (o *AttestOptions) AddFlags(cmd *cobra.Command) {

cmd.Flags().BoolVarP(&o.SkipConfirmation, "yes", "y", false,
"skip confirmation prompts for non-destructive operations")

cmd.Flags().BoolVar(&o.NoTlogUpload, "no-tlog-upload", false,
"whether to not upload the transparency log")
}
4 changes: 4 additions & 0 deletions cmd/cosign/cli/options/sign.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ type SignOptions struct {
Recursive bool
Attachment string
SkipConfirmation bool
NoTlogUpload bool

Rekor RekorOptions
Fulcio FulcioOptions
Expand Down Expand Up @@ -88,4 +89,7 @@ func (o *SignOptions) AddFlags(cmd *cobra.Command) {

cmd.Flags().BoolVarP(&o.SkipConfirmation, "yes", "y", false,
"skip confirmation prompts for non-destructive operations")

cmd.Flags().BoolVar(&o.NoTlogUpload, "no-tlog-upload", false,
"whether to not upload the transparency log")
}
8 changes: 6 additions & 2 deletions cmd/cosign/cli/sign.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,11 @@ func Sign() *cobra.Command {
cosign sign --key cosign.key --cert cosign.crt --cert-chain chain.crt <IMAGE>
# sign a container in a registry which does not fully support OCI media types
COSIGN_DOCKER_MEDIA_TYPES=1 cosign sign --key cosign.key legacy-registry.example.com/my/image`,
COSIGN_DOCKER_MEDIA_TYPES=1 cosign sign --key cosign.key legacy-registry.example.com/my/image
# sign a container image and not upload transparency log
cosign sign --key cosign.key --no-tlog-upload=true <IMAGE>`,

Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
switch o.Attachment {
Expand Down Expand Up @@ -104,7 +108,7 @@ func Sign() *cobra.Command {
return err
}
if err := sign.SignCmd(ro, ko, o.Registry, annotationsMap.Annotations, args, o.Cert, o.CertChain, o.Upload,
o.OutputSignature, o.OutputCertificate, o.PayloadPath, o.Force, o.Recursive, o.Attachment); err != nil {
o.OutputSignature, o.OutputCertificate, o.PayloadPath, o.Force, o.Recursive, o.Attachment, o.NoTlogUpload); err != nil {
if o.Attachment == "" {
return fmt.Errorf("signing %v: %w", args, err)
}
Expand Down
16 changes: 10 additions & 6 deletions cmd/cosign/cli/sign/sign.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ import (
_ "github.com/sigstore/cosign/pkg/providers/all"
)

func ShouldUploadToTlog(ctx context.Context, ref name.Reference, force bool, url string) bool {
func ShouldUploadToTlog(ctx context.Context, ref name.Reference, force bool, noTlogUpload bool, url string) bool {
// Check whether experimental is on!
if !options.EnableExperimental() {
return false
Expand All @@ -66,6 +66,10 @@ func ShouldUploadToTlog(ctx context.Context, ref name.Reference, force bool, url
if force {
return true
}
// Check whether to not upload Tlog.
if noTlogUpload {
return false
}

// Check if the image is public (no auth in Get)
if _, err := remote.Get(ref, remote.WithContext(ctx)); err != nil {
Expand Down Expand Up @@ -97,7 +101,7 @@ func GetAttachedImageRef(ref name.Reference, attachment string, opts ...ociremot
// nolint
func SignCmd(ro *options.RootOptions, ko options.KeyOpts, regOpts options.RegistryOptions, annotations map[string]interface{},
imgs []string, certPath string, certChainPath string, upload bool, outputSignature, outputCertificate string,
payloadPath string, force bool, recursive bool, attachment string) error {
payloadPath string, force bool, recursive bool, attachment string, noTlogUpload bool) error {
if options.EnableExperimental() {
if options.NOf(ko.KeyRef, ko.Sk) > 1 {
return &options.KeyParseError{}
Expand Down Expand Up @@ -152,7 +156,7 @@ func SignCmd(ro *options.RootOptions, ko options.KeyOpts, regOpts options.Regist
if err != nil {
return fmt.Errorf("accessing image: %w", err)
}
err = signDigest(ctx, digest, staticPayload, ko, regOpts, annotations, upload, outputSignature, outputCertificate, force, recursive, dd, sv, se)
err = signDigest(ctx, digest, staticPayload, ko, regOpts, annotations, upload, outputSignature, outputCertificate, force, recursive, noTlogUpload, dd, sv, se)
if err != nil {
return fmt.Errorf("signing digest: %w", err)
}
Expand All @@ -172,7 +176,7 @@ func SignCmd(ro *options.RootOptions, ko options.KeyOpts, regOpts options.Regist
}
digest := ref.Context().Digest(d.String())

err = signDigest(ctx, digest, staticPayload, ko, regOpts, annotations, upload, outputSignature, outputCertificate, force, recursive, dd, sv, se)
err = signDigest(ctx, digest, staticPayload, ko, regOpts, annotations, upload, outputSignature, outputCertificate, force, recursive, noTlogUpload, dd, sv, se)
if err != nil {
return fmt.Errorf("signing digest: %w", err)
}
Expand All @@ -186,7 +190,7 @@ func SignCmd(ro *options.RootOptions, ko options.KeyOpts, regOpts options.Regist
}

func signDigest(ctx context.Context, digest name.Digest, payload []byte, ko options.KeyOpts,
regOpts options.RegistryOptions, annotations map[string]interface{}, upload bool, outputSignature, outputCertificate string, force bool, recursive bool,
regOpts options.RegistryOptions, annotations map[string]interface{}, upload bool, outputSignature, outputCertificate string, force bool, recursive bool, noTlogUpload bool,
dd mutate.DupeDetector, sv *SignerVerifier, se oci.SignedEntity) error {
var err error
// The payload can be passed to skip generation.
Expand All @@ -205,7 +209,7 @@ func signDigest(ctx context.Context, digest name.Digest, payload []byte, ko opti
if sv.Cert != nil {
s = ifulcio.NewSigner(s, sv.Cert, sv.Chain)
}
if ShouldUploadToTlog(ctx, digest, force, ko.RekorURL) {
if ShouldUploadToTlog(ctx, digest, force, noTlogUpload, ko.RekorURL) {
rClient, err := rekor.NewClient(ko.RekorURL)
if err != nil {
return err
Expand Down
2 changes: 1 addition & 1 deletion cmd/cosign/cli/sign/sign_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ func TestSignCmdLocalKeyAndSk(t *testing.T) {
Sk: true,
},
} {
err := SignCmd(ro, ko, options.RegistryOptions{}, nil, nil, "", "", false, "", "", "", false, false, "")
err := SignCmd(ro, ko, options.RegistryOptions{}, nil, nil, "", "", false, "", "", "", false, false, "", false)
if (errors.Is(err, &options.KeyParseError{}) == false) {
t.Fatal("expected KeyParseError")
}
Expand Down
1 change: 1 addition & 0 deletions doc/cosign_attest.md

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

4 changes: 4 additions & 0 deletions doc/cosign_sign.md

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

Loading

0 comments on commit 74c01fe

Please sign in to comment.