Skip to content

Commit 7f5ca46

Browse files
committed
C-WCOW: Unfiy data structures and reuse for C-LCOW and C-WCOW
Signed-off-by: Mahati Chamarthy <[email protected]>
1 parent bdc6744 commit 7f5ca46

File tree

9 files changed

+38
-97
lines changed

9 files changed

+38
-97
lines changed

internal/gcs-sidecar/handlers.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ func (b *Bridge) modifySettings(req *request) (err error) {
599599
log.G(ctx).Tracef("hcsschema.MappedDirectory { %v }", settings)
600600

601601
case guestresource.ResourceTypeSecurityPolicy:
602-
securityPolicyRequest := modifyGuestSettingsRequest.Settings.(*guestresource.WCOWConfidentialOptions)
602+
securityPolicyRequest := modifyGuestSettingsRequest.Settings.(*guestresource.ConfidentialOptions)
603603
log.G(ctx).Tracef("WCOWConfidentialOptions: { %v}", securityPolicyRequest)
604604
err := b.hostState.SetWCOWConfidentialUVMOptions(req.ctx, securityPolicyRequest, b.logWriter)
605605
if err != nil {
@@ -616,10 +616,9 @@ func (b *Bridge) modifySettings(req *request) (err error) {
616616
}
617617
return nil
618618
case guestresource.ResourceTypePolicyFragment:
619-
//Note: Reusing the same type LCOWSecurityPolicyFragment for CWCOW.
620-
r, ok := modifyGuestSettingsRequest.Settings.(*guestresource.LCOWSecurityPolicyFragment)
619+
r, ok := modifyGuestSettingsRequest.Settings.(*guestresource.SecurityPolicyFragment)
621620
if !ok {
622-
return errors.New("the request settings are not of type LCOWSecurityPolicyFragment")
621+
return errors.New("the request settings are not of type SecurityPolicyFragment")
623622
}
624623
return b.hostState.InjectFragment(ctx, r)
625624
case guestresource.ResourceTypeWCOWBlockCims:

internal/gcs-sidecar/host.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func NewHost(initialEnforcer securitypolicy.SecurityPolicyEnforcer) *Host {
7373
// (ie fingerprint of a non leaf cert and the subject matches the leaf cert)
7474
// 3 - Check that this issuer/feed match the requirement of the user provided
7575
// security policy (done in the regoby LoadFragment)
76-
func (h *Host) InjectFragment(ctx context.Context, fragment *guestresource.LCOWSecurityPolicyFragment) (err error) {
76+
func (h *Host) InjectFragment(ctx context.Context, fragment *guestresource.SecurityPolicyFragment) (err error) {
7777
log.G(ctx).WithField("fragment", fmt.Sprintf("%+v", fragment)).Debug("GCS Host.InjectFragment")
7878

7979
raw, err := base64.StdEncoding.DecodeString(fragment.Fragment)
@@ -133,7 +133,7 @@ func (h *Host) InjectFragment(ctx context.Context, fragment *guestresource.LCOWS
133133
return nil
134134
}
135135

136-
func (h *Host) SetWCOWConfidentialUVMOptions(ctx context.Context, securityPolicyRequest *guestresource.WCOWConfidentialOptions, logWriter io.Writer) error {
136+
func (h *Host) SetWCOWConfidentialUVMOptions(ctx context.Context, securityPolicyRequest *guestresource.ConfidentialOptions, logWriter io.Writer) error {
137137
h.policyMutex.Lock()
138138
defer h.policyMutex.Unlock()
139139

internal/gcs-sidecar/uvm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func unmarshalContainerModifySettings(req *request) (_ *prot.ContainerModifySett
9292
modifyGuestSettingsRequest.Settings = settings
9393

9494
case guestresource.ResourceTypeSecurityPolicy:
95-
securityPolicyRequest := &guestresource.WCOWConfidentialOptions{}
95+
securityPolicyRequest := &guestresource.ConfidentialOptions{}
9696
if err := commonutils.UnmarshalJSONWithHresult(rawGuestRequest, securityPolicyRequest); err != nil {
9797
return nil, fmt.Errorf("invalid ResourceTypeSecurityPolicy request: %w", err)
9898
}

internal/guest/prot/protocol.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -583,15 +583,15 @@ func UnmarshalContainerModifySettings(b []byte) (*containerModifySettings, error
583583
}
584584
msr.Settings = cc
585585
case guestresource.ResourceTypeSecurityPolicy:
586-
enforcer := &guestresource.LCOWConfidentialOptions{}
586+
enforcer := &guestresource.ConfidentialOptions{}
587587
if err := commonutils.UnmarshalJSONWithHresult(msrRawSettings, enforcer); err != nil {
588-
return &request, errors.Wrap(err, "failed to unmarshal settings as LCOWConfidentialOptions")
588+
return &request, errors.Wrap(err, "failed to unmarshal settings as ConfidentialOptions")
589589
}
590590
msr.Settings = enforcer
591591
case guestresource.ResourceTypePolicyFragment:
592-
fragment := &guestresource.LCOWSecurityPolicyFragment{}
592+
fragment := &guestresource.SecurityPolicyFragment{}
593593
if err := commonutils.UnmarshalJSONWithHresult(msrRawSettings, fragment); err != nil {
594-
return &request, errors.Wrap(err, "failed to unmarshal settings as LCOWSecurityPolicyFragment")
594+
return &request, errors.Wrap(err, "failed to unmarshal settings as SecurityPolicyFragment")
595595
}
596596
msr.Settings = fragment
597597
default:

internal/guest/runtime/hcsv2/uvm.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,13 @@ func NewHost(rtime runtime.Runtime, vsock transport.Transport, initialEnforcer s
9696
}
9797
}
9898

99-
// SetConfidentialUVMOptions takes guestresource.LCOWConfidentialOptions
99+
// SetConfidentialUVMOptions takes guestresource.ConfidentialOptions
100100
// to set up our internal data structures we use to store and enforce
101101
// security policy. The options can contain security policy enforcer type,
102102
// encoded security policy and signed UVM reference information The security
103103
// policy and uvm reference information can be further presented to workload
104104
// containers for validation and attestation purposes.
105-
func (h *Host) SetConfidentialUVMOptions(ctx context.Context, r *guestresource.LCOWConfidentialOptions) error {
105+
func (h *Host) SetConfidentialUVMOptions(ctx context.Context, r *guestresource.ConfidentialOptions) error {
106106
h.policyMutex.Lock()
107107
defer h.policyMutex.Unlock()
108108
if h.securityPolicyEnforcerSet {
@@ -164,7 +164,7 @@ func (h *Host) SetConfidentialUVMOptions(ctx context.Context, r *guestresource.L
164164
// (ie fingerprint of a non leaf cert and the subject matches the leaf cert)
165165
// 3 - Check that this issuer/feed match the requirement of the user provided
166166
// security policy (done in the regoby LoadFragment)
167-
func (h *Host) InjectFragment(ctx context.Context, fragment *guestresource.LCOWSecurityPolicyFragment) (err error) {
167+
func (h *Host) InjectFragment(ctx context.Context, fragment *guestresource.SecurityPolicyFragment) (err error) {
168168
log.G(ctx).WithField("fragment", fmt.Sprintf("%+v", fragment)).Debug("GCS Host.InjectFragment")
169169

170170
raw, err := base64.StdEncoding.DecodeString(fragment.Fragment)
@@ -638,15 +638,15 @@ func (h *Host) modifyHostSettings(ctx context.Context, containerID string, req *
638638
}
639639
return c.modifyContainerConstraints(ctx, req.RequestType, req.Settings.(*guestresource.LCOWContainerConstraints))
640640
case guestresource.ResourceTypeSecurityPolicy:
641-
r, ok := req.Settings.(*guestresource.LCOWConfidentialOptions)
641+
r, ok := req.Settings.(*guestresource.ConfidentialOptions)
642642
if !ok {
643-
return errors.New("the request's settings are not of type LCOWConfidentialOptions")
643+
return errors.New("the request's settings are not of type ConfidentialOptions")
644644
}
645645
return h.SetConfidentialUVMOptions(ctx, r)
646646
case guestresource.ResourceTypePolicyFragment:
647-
r, ok := req.Settings.(*guestresource.LCOWSecurityPolicyFragment)
647+
r, ok := req.Settings.(*guestresource.SecurityPolicyFragment)
648648
if !ok {
649-
return errors.New("the request settings are not of type LCOWSecurityPolicyFragment")
649+
return errors.New("the request settings are not of type SecurityPolicyFragment")
650650
}
651651
return h.InjectFragment(ctx, r)
652652
default:

internal/protocol/guestresource/resources.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -229,25 +229,14 @@ type SignalProcessOptionsWCOW struct {
229229
Signal guestrequest.SignalValueWCOW `json:",omitempty"`
230230
}
231231

232-
// LCOWConfidentialOptions is used to set various confidential container specific
232+
// ConfidentialOptions is used to set various confidential container specific
233233
// options.
234-
type LCOWConfidentialOptions struct {
234+
type ConfidentialOptions struct {
235235
EnforcerType string `json:"EnforcerType,omitempty"`
236236
EncodedSecurityPolicy string `json:"EncodedSecurityPolicy,omitempty"`
237237
EncodedUVMReference string `json:"EncodedUVMReference,omitempty"`
238238
}
239239

240-
type LCOWSecurityPolicyFragment struct {
240+
type SecurityPolicyFragment struct {
241241
Fragment string `json:"Fragment,omitempty"`
242242
}
243-
244-
type WCOWConfidentialOptions struct {
245-
EnforcerType string `json:"EnforcerType,omitempty"`
246-
EncodedSecurityPolicy string `json:"EncodedSecurityPolicy,omitempty"`
247-
// Optional security policy
248-
WCOWSecurityPolicy string
249-
// Set when there is a security policy to apply on actual SNP hardware, use this rathen than checking the string length
250-
WCOWSecurityPolicyEnabled bool
251-
// Set which security policy enforcer to use (open door or rego). This allows for better fallback mechanic.
252-
WCOWSecurityPolicyEnforcer string
253-
}

internal/uvm/security_policy.go

Lines changed: 11 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,69 +16,24 @@ import (
1616
"github.com/Microsoft/hcsshim/pkg/ctrdtaskapi"
1717
)
1818

19-
type ConfidentialUVMOpt func(ctx context.Context, r *guestresource.LCOWConfidentialOptions) error
19+
type ConfidentialUVMOpt func(ctx context.Context, r *guestresource.ConfidentialOptions) error
2020

2121
// WithSecurityPolicy sets the desired security policy for the resource.
2222
func WithSecurityPolicy(policy string) ConfidentialUVMOpt {
23-
return func(ctx context.Context, r *guestresource.LCOWConfidentialOptions) error {
23+
return func(ctx context.Context, r *guestresource.ConfidentialOptions) error {
2424
r.EncodedSecurityPolicy = policy
2525
return nil
2626
}
2727
}
2828

2929
// WithSecurityPolicyEnforcer sets the desired enforcer type for the resource.
3030
func WithSecurityPolicyEnforcer(enforcer string) ConfidentialUVMOpt {
31-
return func(ctx context.Context, r *guestresource.LCOWConfidentialOptions) error {
31+
return func(ctx context.Context, r *guestresource.ConfidentialOptions) error {
3232
r.EnforcerType = enforcer
3333
return nil
3434
}
3535
}
3636

37-
// TODO (Mahati): Move this block out later
38-
type WCOWConfidentialUVMOpt func(ctx context.Context, r *guestresource.WCOWConfidentialOptions) error
39-
40-
// WithSecurityPolicy sets the desired security policy for the resource.
41-
func WithWCOWSecurityPolicy(policy string) WCOWConfidentialUVMOpt {
42-
return func(ctx context.Context, r *guestresource.WCOWConfidentialOptions) error {
43-
r.EncodedSecurityPolicy = policy
44-
return nil
45-
}
46-
}
47-
48-
// WithSecurityPolicyEnforcer sets the desired enforcer type for the resource.
49-
func WithWCOWSecurityPolicyEnforcer(enforcer string) WCOWConfidentialUVMOpt {
50-
return func(ctx context.Context, r *guestresource.WCOWConfidentialOptions) error {
51-
r.EnforcerType = enforcer
52-
return nil
53-
}
54-
}
55-
56-
func (uvm *UtilityVM) SetWCOWConfidentialUVMOptions(ctx context.Context, opts ...WCOWConfidentialUVMOpt) error {
57-
if uvm.operatingSystem != "windows" {
58-
return errNotSupported
59-
}
60-
uvm.m.Lock()
61-
defer uvm.m.Unlock()
62-
confOpts := &guestresource.WCOWConfidentialOptions{}
63-
for _, o := range opts {
64-
if err := o(ctx, confOpts); err != nil {
65-
return err
66-
}
67-
}
68-
modification := &hcsschema.ModifySettingRequest{
69-
RequestType: guestrequest.RequestTypeAdd,
70-
GuestRequest: guestrequest.ModificationRequest{
71-
ResourceType: guestresource.ResourceTypeSecurityPolicy,
72-
RequestType: guestrequest.RequestTypeAdd,
73-
Settings: *confOpts,
74-
},
75-
}
76-
if err := uvm.modify(ctx, modification); err != nil {
77-
return fmt.Errorf("uvm::Policy: failed to modify utility VM configuration: %w", err)
78-
}
79-
return nil
80-
}
81-
8237
func base64EncodeFileContents(filePath string) (string, error) {
8338
if filePath == "" {
8439
return "", nil
@@ -94,7 +49,7 @@ func base64EncodeFileContents(filePath string) (string, error) {
9449
// content before setting it for the resource. This is no-op if the
9550
// `referenceName` is empty or the file doesn't exist.
9651
func WithUVMReferenceInfo(referenceRoot string, referenceName string) ConfidentialUVMOpt {
97-
return func(ctx context.Context, r *guestresource.LCOWConfidentialOptions) error {
52+
return func(ctx context.Context, r *guestresource.ConfidentialOptions) error {
9853
if referenceName == "" {
9954
return nil
10055
}
@@ -112,6 +67,11 @@ func WithUVMReferenceInfo(referenceRoot string, referenceName string) Confidenti
11267
}
11368
}
11469

70+
// defaultWCOWOSBootFilesPath returns `%ProgramFiles%\Windows Containers`.
71+
func defaultWCOWOSBootFilesPath() string {
72+
return filepath.Join(os.Getenv("ProgramFiles"), "Windows Containers")
73+
}
74+
11575
// SetConfidentialUVMOptions sends information required to run the UVM on
11676
// SNP hardware, e.g., security policy and enforcer type, signed UVM reference
11777
// information, etc.
@@ -126,7 +86,7 @@ func (uvm *UtilityVM) SetConfidentialUVMOptions(ctx context.Context, opts ...Con
12686
uvm.m.Lock()
12787
defer uvm.m.Unlock()
12888

129-
confOpts := &guestresource.LCOWConfidentialOptions{}
89+
confOpts := &guestresource.ConfidentialOptions{}
13090
for _, o := range opts {
13191
if err := o(ctx, confOpts); err != nil {
13292
return err
@@ -156,7 +116,7 @@ func (uvm *UtilityVM) InjectPolicyFragment(ctx context.Context, fragment *ctrdta
156116
GuestRequest: guestrequest.ModificationRequest{
157117
ResourceType: guestresource.ResourceTypePolicyFragment,
158118
RequestType: guestrequest.RequestTypeAdd,
159-
Settings: guestresource.LCOWSecurityPolicyFragment{
119+
Settings: guestresource.SecurityPolicyFragment{
160120
Fragment: fragment.Fragment,
161121
},
162122
},

internal/uvm/start.go

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -326,27 +326,20 @@ func (uvm *UtilityVM) Start(ctx context.Context) (err error) {
326326
}
327327
uvm.SCSIManager = mgr
328328

329-
if uvm.confidentialUVMOptions != nil && uvm.OS() == "linux" {
329+
if uvm.confidentialUVMOptions != nil || uvm.HasConfidentialPolicy() {
330+
uvmReferenceInfoFile := defaultLCOWOSBootFilesPath()
331+
if uvm.OS() == "windows" {
332+
uvmReferenceInfoFile = defaultWCOWOSBootFilesPath()
333+
}
330334
copts := []ConfidentialUVMOpt{
331335
WithSecurityPolicy(uvm.confidentialUVMOptions.SecurityPolicy),
332336
WithSecurityPolicyEnforcer(uvm.confidentialUVMOptions.SecurityPolicyEnforcer),
333-
WithUVMReferenceInfo(defaultLCOWOSBootFilesPath(), uvm.confidentialUVMOptions.UVMReferenceInfoFile),
337+
WithUVMReferenceInfo(uvmReferenceInfoFile, uvm.confidentialUVMOptions.UVMReferenceInfoFile),
334338
}
335339
if err := uvm.SetConfidentialUVMOptions(ctx, copts...); err != nil {
336340
return err
337341
}
338342
}
339-
340-
if uvm.HasConfidentialPolicy() && uvm.OS() == "windows" {
341-
copts := []WCOWConfidentialUVMOpt{
342-
WithWCOWSecurityPolicy(uvm.createOpts.(*OptionsWCOW).SecurityPolicy),
343-
WithWCOWSecurityPolicyEnforcer(uvm.createOpts.(*OptionsWCOW).SecurityPolicyEnforcer),
344-
}
345-
if err := uvm.SetWCOWConfidentialUVMOptions(ctx, copts...); err != nil {
346-
return err
347-
}
348-
}
349-
350343
return nil
351344
}
352345

test/gcs/main_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func getHostErr(rt runtime.Runtime, tp transport.Transport) (*hcsv2.Host, error)
169169
h := hcsv2.NewHost(rt, tp, &securitypolicy.OpenDoorSecurityPolicyEnforcer{}, os.Stdout)
170170
if err := h.SetConfidentialUVMOptions(
171171
context.Background(),
172-
&guestresource.LCOWConfidentialOptions{},
172+
&guestresource.ConfidentialOptions{},
173173
); err != nil {
174174
return nil, fmt.Errorf("could not set host security policy: %w", err)
175175
}

0 commit comments

Comments
 (0)