Skip to content

Commit 316743c

Browse files
committed
check folder privileges
1 parent bf81799 commit 316743c

File tree

4 files changed

+69
-18
lines changed

4 files changed

+69
-18
lines changed

README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,15 @@ vSphere object: vSphere vCenter Datacenter
3838
Resource.AssignVMToPool, VApp.Import, VirtualMachine.Config.AddExistingDisk, VirtualMachine.Config.AddNewDisk, VirtualMachine.Config.AddRemoveDevice, VirtualMachine.Config.AdvancedConfig, VirtualMachine.Config.Annotation, VirtualMachine.Config.CPUCount, VirtualMachine.Config.DiskExtend, VirtualMachine.Config.DiskLease, VirtualMachine.Config.EditDevice, VirtualMachine.Config.Memory, VirtualMachine.Config.RemoveDisk, VirtualMachine.Config.Rename, VirtualMachine.Config.ResetGuestInfo, VirtualMachine.Config.Resource, VirtualMachine.Config.Settings, VirtualMachine.Config.UpgradeVirtualHardware, VirtualMachine.Interact.GuestControl, VirtualMachine.Interact.PowerOff, VirtualMachine.Interact.PowerOn, VirtualMachine.Interact.Reset, VirtualMachine.Inventory.Create, VirtualMachine.Inventory.CreateFromExisting, VirtualMachine.Inventory.Delete, VirtualMachine.Provisioning.Clone, Folder.Create, Folder.Delete
3939
~~~
4040

41-
## Missing Checks
41+
### Checking Folder Permissions
42+
43+
Checking user privileges on a folder can be a bit tough as privileges can't be validated until the folder is created. Additionally, privileges to create a folder are provided by the [vSphere vCenter Datacenter](https://docs.openshift.com/container-platform/latest/installing/installing_vsphere/installing-vsphere-installer-provisioned.html#installation-vsphere-installer-infra-requirements-account_installing-vsphere-installer-provisioned).
4244

45+
If a preexisting folder is being checked(i.e. installing in to an existing folder, creating a UPI machineset which creates machines in a specific folder), the folder can be checked by running:
46+
47+
~~~
48+
./bin/vsphere-priv-check --check-folder=vcentertest-24lrs
49+
~~~
50+
51+
## Missing Checks
4352
- Privilege Propagation
44-
- Virtual Machine Folder

cmd/vsphere-priv-check/vsphere-priv-check.go

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,33 @@ package main
33
import (
44
"context"
55
"fmt"
6-
util "github.com/rvanderp/vsphere-perm-check/pkg/util"
6+
"github.com/rvanderp/vsphere-perm-check/pkg/util"
7+
"github.com/spf13/cobra"
78
"log"
9+
"os"
10+
"path/filepath"
811
)
912

10-
func main() {
11-
fmt.Printf("OpenShift vSphere Pre-Flight Permissions Validator\n\n")
13+
var (
14+
rootOpts struct {
15+
checkFolder string
16+
}
17+
)
18+
19+
func newRootCmd() *cobra.Command {
20+
cmd := &cobra.Command{
21+
Use: filepath.Base(os.Args[0]),
22+
Short: "Verifies vCenter user account privileges",
23+
Long: "",
24+
Run: runRootCmd,
25+
SilenceErrors: true,
26+
SilenceUsage: true,
27+
}
28+
cmd.Flags().StringVar(&rootOpts.checkFolder, "check-folder", "", "verify privileges for folder")
29+
return cmd
30+
}
31+
32+
func runRootCmd(cmd *cobra.Command, args []string) {
1233
installConfig, err := util.LoadConfig()
1334
if err != nil {
1435
log.Fatal(err)
@@ -20,13 +41,19 @@ func main() {
2041
log.Fatal(err)
2142
return
2243
}
23-
44+
log.Printf("folder: %s", rootOpts.checkFolder)
2445
log.Printf("checking permissions for user %s\n\n", installConfig.Username)
25-
err = util.ValidatePrivileges(ssn, installConfig)
46+
err = util.ValidatePrivileges(ssn, installConfig, rootOpts.checkFolder)
2647

2748
if err != nil {
2849
log.Printf("error while validating required privileges:\n\n%s", err.Error())
2950
} else {
3051
log.Printf("no missing privileges found for user")
3152
}
3253
}
54+
55+
func main() {
56+
fmt.Printf("OpenShift vSphere Pre-Flight Permissions Validator\n\n")
57+
rootCmd := newRootCmd()
58+
rootCmd.Execute()
59+
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.15
55
require (
66
github.com/davecgh/go-spew v1.1.1
77
github.com/mitchellh/mapstructure v1.4.1
8+
github.com/spf13/cobra v1.2.1
89
github.com/vmware/govmomi v0.26.0
910
k8s.io/apimachinery v0.22.0 // indirect
1011
sigs.k8s.io/yaml v1.2.0

pkg/util/privileges.go

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ func ComparePrivileges(derived []types.UserPrivilegeResult, required []string) e
3535
return nil
3636
}
3737

38-
func ValidatePrivileges(ssn *Session, p *pctypes.Platform) error {
38+
func ValidatePrivileges(ssn *Session, p *pctypes.Platform, folder string) error {
3939
ctx := context.TODO()
40+
var missingPrivileges = ""
4041
authManager := object.NewAuthorizationManager(ssn.Vim25Client)
4142

4243
finder := find.NewFinder(ssn.Vim25Client)
@@ -52,8 +53,7 @@ func ValidatePrivileges(ssn *Session, p *pctypes.Platform) error {
5253
}
5354
err = ComparePrivileges(res, val.Privileges)
5455
if err != nil {
55-
out := fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n", val.Name, err.Error())
56-
return errors.New(out)
56+
missingPrivileges = missingPrivileges + fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n\n", val.Name, err.Error())
5757
}
5858
}
5959

@@ -75,8 +75,7 @@ func ValidatePrivileges(ssn *Session, p *pctypes.Platform) error {
7575
}
7676
err = ComparePrivileges(res, val.Privileges)
7777
if err != nil {
78-
out := fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n", val.Name, err.Error())
79-
return errors.New(out)
78+
missingPrivileges = missingPrivileges + fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n\n", val.Name, err.Error())
8079
}
8180
}
8281

@@ -91,8 +90,7 @@ func ValidatePrivileges(ssn *Session, p *pctypes.Platform) error {
9190
}
9291
err = ComparePrivileges(res, val.Privileges)
9392
if err != nil {
94-
out := fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n", val.Name, err.Error())
95-
return errors.New(out)
93+
missingPrivileges = missingPrivileges + fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n\n", val.Name, err.Error())
9694
}
9795
}
9896

@@ -107,8 +105,7 @@ func ValidatePrivileges(ssn *Session, p *pctypes.Platform) error {
107105
}
108106
err = ComparePrivileges(res, val.Privileges)
109107
if err != nil {
110-
out := fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n", val.Name, err.Error())
111-
return errors.New(out)
108+
missingPrivileges = missingPrivileges + fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n\n", val.Name, err.Error())
112109
}
113110
}
114111
if val, ok := permissions.RequiredPermissions["vCenter"]; ok {
@@ -119,9 +116,27 @@ func ValidatePrivileges(ssn *Session, p *pctypes.Platform) error {
119116
}
120117
err = ComparePrivileges(res, val.Privileges)
121118
if err != nil {
122-
out := fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n", val.Name, err.Error())
123-
return errors.New(out)
119+
missingPrivileges = missingPrivileges + fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n\n", val.Name, err.Error())
120+
}
121+
}
122+
if folder != "" {
123+
if val, ok := permissions.RequiredPermissions["Folder"]; ok {
124+
folderObj, err := finder.Folder(ctx, folder)
125+
if err != nil {
126+
return err
127+
}
128+
res, err := authManager.FetchUserPrivilegeOnEntities(ctx, []types.ManagedObjectReference{folderObj.Reference()}, p.Username)
129+
if err != nil {
130+
return err
131+
}
132+
err = ComparePrivileges(res, val.Privileges)
133+
if err != nil {
134+
missingPrivileges = missingPrivileges + fmt.Sprintf("*** Missing Privileges ***\nvSphere object: %s\n%s\n\n", val.Name, err.Error())
135+
}
124136
}
125137
}
138+
if missingPrivileges != "" {
139+
return errors.New(missingPrivileges)
140+
}
126141
return nil
127142
}

0 commit comments

Comments
 (0)