Skip to content

Commit 55e3cb4

Browse files
verifier: Add public key verification of release image digests
Use the existing Atomic image signing protocol to read detached signatures for images by digest from a remote location so that release images can be verified before they are executed. Add a Verifier interface to the CVO that abstracts checking for verified updates. On start, check the payload for a config map with the annotation release.openshift.io/verification-config-map set (value is ignored) and load the set of all public keys that must be verified along with the http or file store locations for detached signatures. Every key must be verified to accept the payload. A subsequent commit will leverage the Verifier to block downloading a new release image.
1 parent 57bc227 commit 55e3cb4

File tree

10 files changed

+968
-1
lines changed

10 files changed

+968
-1
lines changed

hack/test-integration.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ set -euo pipefail
55
base=$( dirname "${BASH_SOURCE[0]}")
66

77
go run "${base}/test-prerequisites.go"
8-
TEST_INTEGRATION=1 go test ./... -test.run=^TestIntegration -args -alsologtostderr -v=5
8+
TEST_INTEGRATION=1 go test ./... -test.run=^TestIntegration

pkg/cvo/cvo.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import (
77
"sync"
88
"time"
99

10+
"github.com/openshift/cluster-version-operator/pkg/verify"
11+
1012
"github.com/blang/semver"
1113
"github.com/golang/glog"
1214
"github.com/google/uuid"
15+
1316
corev1 "k8s.io/api/core/v1"
1417
apierrors "k8s.io/apimachinery/pkg/api/errors"
1518
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -109,6 +112,10 @@ type Operator struct {
109112
statusLock sync.Mutex
110113
availableUpdates *availableUpdates
111114

115+
// verifier, if provided, will be used to check an update before it is executed.
116+
// Any error will prevent an update payload from being accessed.
117+
verifier verify.Interface
118+
112119
configSync ConfigSyncWorker
113120
// statusInterval is how often the configSync worker is allowed to retrigger
114121
// the main sync status loop.
@@ -197,6 +204,20 @@ func (optr *Operator) InitializeFromPayload() error {
197204

198205
optr.releaseCreated = update.ImageRef.CreationTimestamp.Time
199206
optr.releaseVersion = update.ImageRef.Name
207+
208+
// attempt to load a verifier as defined in the payload
209+
verifier, err := verify.LoadFromPayload(update)
210+
if err != nil {
211+
return err
212+
}
213+
if verifier != nil {
214+
glog.Infof("Verifying release authenticity: %v", verifier)
215+
} else {
216+
glog.Warningf("WARNING: No release authenticity verification is configured, all releases are considered unverified")
217+
verifier = verify.Reject
218+
}
219+
optr.verifier = verifier
220+
200221
return nil
201222
}
202223

pkg/start/start_integration_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package start
33
import (
44
"context"
55
"encoding/json"
6+
"flag"
67
"fmt"
78
"io/ioutil"
89
"net/http"
@@ -17,6 +18,7 @@ import (
1718
"time"
1819

1920
"github.com/google/uuid"
21+
2022
v1 "k8s.io/api/core/v1"
2123
"k8s.io/apimachinery/pkg/api/errors"
2224
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -25,6 +27,7 @@ import (
2527
randutil "k8s.io/apimachinery/pkg/util/rand"
2628
"k8s.io/apimachinery/pkg/util/wait"
2729
"k8s.io/client-go/kubernetes"
30+
"k8s.io/klog"
2831

2932
configv1 "github.com/openshift/api/config/v1"
3033
clientset "github.com/openshift/client-go/config/clientset/versioned"
@@ -33,6 +36,12 @@ import (
3336
"github.com/openshift/cluster-version-operator/pkg/cvo"
3437
)
3538

39+
func init() {
40+
klog.InitFlags(flag.CommandLine)
41+
flag.CommandLine.Lookup("v").Value.Set("5")
42+
flag.CommandLine.Lookup("alsologtostderr").Value.Set("true")
43+
}
44+
3645
var (
3746
version_0_0_1 = map[string]interface{}{
3847
"release-manifests": map[string]interface{}{
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
pub 4096R/FD431D51 2009-10-22
2+
Key fingerprint = 567E 347A D004 4ADE 55BA 8A5F 199E 2F91 FD43 1D51
3+
uid Red Hat, Inc. (release key 2) <security@redhat.com>
4+
5+
-----BEGIN PGP PUBLIC KEY BLOCK-----
6+
Version: GnuPG v1.4.5 (GNU/Linux)
7+
8+
mQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF
9+
0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF
10+
0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c
11+
u7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh
12+
XGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H
13+
5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW
14+
9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj
15+
/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1
16+
PcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY
17+
HVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF
18+
buhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB
19+
tDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0
20+
LmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK
21+
CRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC
22+
2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf
23+
C/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5
24+
un3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E
25+
0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE
26+
IGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh
27+
8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL
28+
Ght5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki
29+
JUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25
30+
OFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq
31+
dzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==
32+
=zbHE
33+
-----END PGP PUBLIC KEY BLOCK-----
34+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
-----BEGIN PGP PUBLIC KEY BLOCK-----
2+
3+
mQENBFy9Q6sBCAD1MvcwX9f1Vu/M/dh+SJYbuAP4urtZZ7YoZOlzo6lw/xDF9z0E
4+
ef8BXAtO7YMStfbxn5Rqb3kPnA20CRXraW4PqA5mB37ubDGThxb8catCTeWpd/5o
5+
mrbjLMrKCpg0ODfTgNZYj9gRDyDTKPjlW2xjX9Cmj/lmmGPYDG4qdrNpeicmMjpY
6+
XyYDVxFTRFMdifxTjHQRT5R9Pdq8WDFLrd3ZZWo4fN5Rb+ByWh8MusHj+FyHxA4J
7+
fD/G6VHyn19T7xT/g53JfPobKLdaoXKdSaorCYKWuyGaGyLStAn1MXgchswcBZcU
8+
92EegcoZY8K3cYhRbw7rQUUkx3p0yviS1DrPABEBAAG0DG9wZW5zaGlmdC1jaYkB
9+
VAQTAQgAPhYhBNBHYbEWIDsMCFm2Fii3bgW5I4iOBQJcvUOrAhsDBQkDwmcABQsJ
10+
CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJECi3bgW5I4iOqwUH+wTRXXZkB6PdksQ2
11+
tF/x3vT3YAp1Fvm+aBt0L3+nUyI4W4wWmCvQ9mYqkXMDSx8rgSwMtwwJe7xJBkA1
12+
fK8CoPeCqHc/omoLUS6/BjcbsXyS/ns6d5Zv0fKVHumZ23V2qVJwPpmNdpkdfBhw
13+
HFKm0HLPaCyKM38fOPhrUwEW8OceVdHfBnkkAyYXA9+9qGF3gHC3MXMLkaH6pDYY
14+
Nfx2P4+qYnMnTMSOOvKsJWY7t8Tnv1Qotag/uW8yWlIBSnvg1BQ7u1ZJs1EKSwhw
15+
QbIrYj+eS+e8ddN7qSHJToMzHstTjSYQThA1iCVU6S+KHaLFeynf1d6PqkyeH/GD
16+
bk+E+hu5AQ0EXL1DqwEIANhU5FczwquEAcjhA+kf+ni0Ul9Q2aq+rAL31dg+sGMZ
17+
awcDu5aocwolXeBIkVl235GFfJSdYRzIbk5lSqVK+Wt5Yj4yOIO+QEAk5I51dzOC
18+
5i3APTqOM0UPQ168ubcoT5LY/aWLJqnVAjgY/Sn2vXAwsYvkuJZMpeOPoNgocAWw
19+
wGxXkPEy//OA3rwyy6PER2U7xLWL5SOH8oxjnsnHA98nF4iuOQqbwPTwfyWN7xr7
20+
HAY6KiawHmD0T3ywswR1bEZ1CYn8KxpNMuHf7tbaMPONvawVEqM1xc9+4tB3ImdM
21+
UB9eIiwIspq68mdE43eyUeM9f2foNR67Kj6F7hvBwDsAEQEAAYkBNgQYAQgAIBYh
22+
BNBHYbEWIDsMCFm2Fii3bgW5I4iOBQJcvUOrAhsMAAoJECi3bgW5I4iOLCAIANNd
23+
BwFFJpTaEZhOvDEsfOmHDFE+xG2fBq+SO53A4M/4xfJ6BVnpRvAgPvEu/ED8LMIB
24+
buaMUpXjAwULIOnNEBsYem+m3IKcrZAIhfXAjI8EqzprjciUiVEx0+XR6eIbsFm2
25+
gm61vHfbviKSyQg3hpKG8/g2sFgQ9CNi5DFghIYesp+7NwCC+UOVGBu90O4SIq+I
26+
Ms2n3OTR2GIEz0LgEvC/3R7pkBNjLNTccExBNqOShJy3XnwntvYflxVwEBVsyEbK
27+
LvLU2xtlIE/IdGssKQR8UFFsgFmGiX3t1TcahFnLlr6Et+vB4J02Xr+uvZ81v/Zq
28+
1OHz7iIjrd28MslYu24=
29+
=xMCa
30+
-----END PGP PUBLIC KEY BLOCK-----

pkg/verify/testdata/signatures-2/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)