Repository: clouditor/clouditor
Pull request #1120 (2023-05-24 11:59:58)

Update voc files


Patch:
diff --git a/service/discovery/azure/azure.go b/service/discovery/azure/azure.go
index bbe58721..c0c312a6 100644
--- a/service/discovery/azure/azure.go
+++ b/service/discovery/azure/azure.go
@@ -61,8 +61,8 @@ const (
 	DefenderStorageType        = "StorageAccounts"
 	DefenderVirtualMachineType = "VirtualMachines"
 
-	DataSourceTypeDisc           = "Microsoft.Compute/disks"
-	DataSourceTypeStorageAccount = "Microsoft.Storage/storageAccounts/blobServices"
+	DataSourceTypeDisc                 = "Microsoft.Compute/disks"
+	DataSourceTypeStorageAccountObject = "Microsoft.Storage/storageAccounts/blobServices"
 
 	Duration30Days = time.Duration(30 * time.Hour * 24)
 	Duration7Days  = time.Duration(7 * time.Hour * 24)
@@ -75,6 +75,7 @@ var (
 	ErrCouldNotGetSubscriptions = errors.New("could not get azure subscription")
 	ErrNoCredentialsConfigured  = errors.New("no credentials were configured")
 	ErrGettingNextPage          = errors.New("error getting next page")
+	ErrVaultInstanceIsEmpty     = errors.New("vault and/or instance is nil")
 )
 
 type DiscoveryOption func(a *azureDiscovery)
@@ -119,7 +120,12 @@ type azureDiscovery struct {
 	discovererComponent string
 	clients             clients
 	csID                string
-	backupMap           map[string]map[string]*voc.Backup
+	backupMap           map[string]*backup
+}
+
+type backup struct {
+	backup         map[string][]*voc.Backup
+	backupStorages []voc.IsCloudResource
 }
 
 type clients struct {
@@ -259,6 +265,7 @@ func (d *azureDiscovery) discoverBackupVaults() error {
 
 	if d.backupMap != nil && len(d.backupMap) > 0 {
 		log.Debug("Backup Vaults already discovered.")
+		return nil
 	}
 
 	if d.clients.backupVaultClient == nil || d.clients.backupInstancesClient == nil {
@@ -295,34 +302,38 @@ func (d *azureDiscovery) discoverBackupVaults() error {
 
 				// TODO(all):Maybe we should differentiate the backup retention period for different resources, e.g., disk vs blobs (Metrics)
 				retention := policy.BaseBackupPolicyResource.Properties.(*armdataprotection.BackupPolicy).PolicyRules[0].(*armdataprotection.AzureRetentionRule).Lifecycles[0].DeleteAfter.(*armdataprotection.AbsoluteDeleteOption).GetDeleteOption().Duration
+
+				resp, err := d.handleInstances(vault, instance)
+				if err != nil {
+					err := fmt.Errorf("could not handle instance")
+					return err
+				}
+
 				// Check if map entry already exists
 				_, ok := d.backupMap[dataSourceType]
 				if !ok {
-					d.backupMap[dataSourceType] = make(map[string]*voc.Backup)
+					d.backupMap[dataSourceType] = &backup{
+						backup: make(map[string][]*voc.Backup),
+					}
 				}
 
 				// Store voc.Backup in backupMap
-				d.backupMap[util.Deref(instance.Properties.DataSourceInfo.DatasourceType)][util.Deref(instance.Properties.DataSourceInfo.ResourceID)] = &voc.Backup{
-					Enabled:         true,
-					Policy:          util.Deref(instance.Properties.PolicyInfo.PolicyID),
-					RetentionPeriod: retentionDuration(util.Deref(retention)),
-					Storage:         voc.ResourceID(util.Deref(instance.ID)),
-					GeoLocation: voc.GeoLocation{
-						Region: util.Deref(vault.Location),
-					},
-					AtRestEncryption: &voc.AtRestEncryption{
-						Algorithm: constants.AES256, // https://learn.microsoft.com/en-us/azure/backup/backup-encryption (Last access: 04/27/2023)
-						Enabled:   true,             // By default, all your data is encrypted using platform-managed keys (https://learn.microsoft.com/en-us/azure/backup/backup-vault-overview#encryption-of-backup-data-using-platform-managed-keys, Last access: 04/27/2023)
-					},
-					TransportEncryption: &voc.TransportEncryption{
-						Enabled:    true,
-						Enforced:   true,
-						Algorithm:  constants.TLS,
-						TlsVersion: constants.TLS1_2, // https://learn.microsoft.com/en-us/azure/backup/transport-layer-security#why-enable-tls-12 (Last access: 04/27/2023)
+				d.backupMap[dataSourceType].backup[util.Deref(instance.Properties.DataSourceInfo.ResourceID)] = []*voc.Backup{
+					{
+						Enabled:         true,
+						RetentionPeriod: retentionDuration(util.Deref(retention)),
+						Storage:         voc.ResourceID(util.Deref(instance.ID)),
+						TransportEncryption: &voc.TransportEncryption{
+							Enabled:    true,
+							Enforced:   true,
+							Algorithm:  constants.TLS,
+							TlsVersion: constants.TLS1_2, // https://learn.microsoft.com/en-us/azure/backup/transport-layer-security#why-enable-tls-12 (Last access: 04/27/2023)
+						},
 					},
 				}
-			}
 
+				d.backupMap[dataSourceType].backupStorages = append(d.backupMap[dataSourceType].backupStorages, resp)
+			}
 			return nil
 		})
 
@@ -333,6 +344,49 @@ func (d *azureDiscovery) discoverBackupVaults() error {
 	return nil
 }
 
+func (d *azureDiscovery) handleInstances(vault *armdataprotection.BackupVaultResource, instance *armdataprotection.BackupInstanceResource) (resource voc.IsCloudResource, err error) {
+
+	if vault == nil || instance == nil {
+		return nil, ErrVaultInstanceIsEmpty
+	}
+
+	if *instance.Properties.DataSourceInfo.DatasourceType == "Microsoft.Storage/storageAccounts/blobServices" {
+		resource = &voc.ObjectStorage{
+			Storage: &voc.Storage{
+				Resource: &voc.Resource{
+					ID:           voc.ResourceID(*instance.ID),
+					Name:         *instance.Name,
+					CreationTime: 0,
+					GeoLocation: voc.GeoLocation{
+						Region: *vault.Location,
+					},
+					Labels:    nil,
+					ServiceID: d.csID,
+					Type:      voc.ObjectStorageType,
+				},
+			},
+		}
+	} else if *instance.Properties.DataSourceInfo.DatasourceType == "Microsoft.Compute/disks" {
+		resource = &voc.BlockStorage{
+			Storage: &voc.Storage{
+				Resource: &voc.Resource{
+					ID:           voc.ResourceID(*instance.ID),
+					Name:         *instance.Name,
+					ServiceID:    d.csID,
+					CreationTime: 0,
+					Type:         voc.BlockStorageType,
+					GeoLocation: voc.GeoLocation{
+						Region: *vault.Location,
+					},
+					Labels: nil,
+				},
+			},
+		}
+	}
+
+	return
+}
+
 // retentionDuration returns the rentention string as time.Duration
 func retentionDuration(retention string) time.Duration {
 	if retention == "" {
@@ -356,6 +410,7 @@ func retentionDuration(retention string) time.Duration {
 }
 
 // discoverBackupInstances retrieves the instances in a given backup vault.
+// Note: It is only possible to backup a storage account with all containers in it.
 func (d *azureDiscovery) discoverBackupInstances(resourceGroup, vaultName string) ([]*armdataprotection.BackupInstanceResource, error) {
 	var (
 		list armdataprotection.BackupInstancesClientListResponse
diff --git a/service/discovery/azure/compute.go b/service/discovery/azure/compute.go
index f7285f06..aa706cf4 100644
--- a/service/discovery/azure/compute.go
+++ b/service/discovery/azure/compute.go
@@ -54,7 +54,7 @@ func NewAzureComputeDiscovery(opts ...DiscoveryOption) discovery.Discoverer {
 		&azureDiscovery{
 			discovererComponent: ComputeComponent,
 			csID:                discovery.DefaultCloudServiceID,
-			backupMap:           make(map[string]map[string]*voc.Backup),
+			backupMap:           make(map[string]*backup),
 		},
 		make(map[string]*defenderProperties),
 	}
@@ -110,6 +110,11 @@ func (d *azureComputeDiscovery) List() (list []voc.IsCloudResource, err error) {
 	}
 	list = append(list, storage...)
 
+	// Add backup block storages
+	if d.backupMap[DataSourceTypeDisc] != nil && d.backupMap[DataSourceTypeDisc].backupStorages != nil {
+		list = append(list, d.backupMap[DataSourceTypeDisc].backupStorages...)
+	}
+
 	log.Info("Discover Azure compute resources")
 	// Discover virtual machines
 	virtualMachines, err := d.discoverVirtualMachines()
@@ -243,9 +248,11 @@ func (d *azureComputeDiscovery) discoverVirtualMachines() ([]voc.IsCloudResource
 
 func (d *azureComputeDiscovery) handleVirtualMachines(vm *armcompute.VirtualMachine) (voc.IsCompute, error) {
 	var (
-		bootLogging = []voc.ResourceID{}
-		osLogging   = []voc.ResourceID{}
-		autoUpdates *voc.AutomaticUpdates
+		bootLogging              = []voc.ResourceID{}
+		osLogging                = []voc.ResourceID{}
+		autoUpdates              *voc.AutomaticUpdates
+		monitoringLogDataEnabled bool
+		securityAlertsEnabled    bool
 	)
 
 	// If a mandatory field is empty, the whole disk is empty
@@ -259,6 +266,11 @@ func (d *azureComputeDiscovery) handleVirtualMachines(vm *armcompute.VirtualMach
 
 	autoUpdates = automaticUpdates(vm)
 
+	if d.defenderProperties[DefenderVirtualMachineType] != nil {
+		monitoringLogDataEnabled = d.defenderProperties[DefenderVirtualMachineType].monitoringLogDataEnabled
+		securityAlertsEnabled = d.defenderProperties[DefenderVirtualMachineType].securityAlertsEnabled
+	}
+
 	r := &voc.VirtualMachine{
 		Compute: &voc.Compute{
 			Resource: discovery.NewResource(d,
@@ -272,7 +284,6 @@ func (d *azureComputeDiscovery) handleVirtualMachines(vm *armcompute.VirtualMach
 				voc.VirtualMachineType,
 			),
 			NetworkInterfaces: []voc.ResourceID{},
-			ResourceLogging:   d.createResourceLogging(),
 		},
 		BlockStorage:      []voc.ResourceID{},
 		MalwareProtection: &voc.MalwareProtection{},
@@ -284,6 +295,8 @@ func (d *azureComputeDiscovery) handleVirtualMachines(vm *armcompute.VirtualMach
 				Auditing: &voc.Auditing{
 					SecurityFeature: &voc.SecurityFeature{},
 				},
+				MonitoringLogDataEnabled: monitoringLogDataEnabled,
+				SecurityAlertsEnabled:    securityAlertsEnabled,
 			},
 		},
 		OsLogging: &voc.OSLogging{
@@ -294,6 +307,8 @@ func (d *azureComputeDiscovery) handleVirtualMachines(vm *armcompute.VirtualMach
 				Auditing: &voc.Auditing{
 					SecurityFeature: &voc.SecurityFeature{},
 				},
+				MonitoringLogDataEnabled: monitoringLogDataEnabled,
+				SecurityAlertsEnabled:    monitoringLogDataEnabled,
 			},
 		},
 		AutomaticUpdates: autoUpdates,
@@ -396,14 +411,14 @@ func (d *azureComputeDiscovery) discoverBlockStorages() ([]voc.IsCloudResource,
 			return res.Value
 		},
 		func(disk *armcompute.Disk) error {
-			blockStorages, err := d.handleBlockStorage(disk)
+			blockStorage, err := d.handleBlockStorage(disk)
 			if err != nil {
 				return fmt.Errorf("could not handle block storage: %w", err)
 			}
 
-			log.Infof("Adding block storage '%s'", blockStorages.Name)
+			log.Infof("Adding block storage '%s'", blockStorage.GetName())
 
-			list = append(list, blockStorages)
+			list = append(list, blockStorage)
 			return nil
 		})
 	if err != nil {
@@ -414,6 +429,8 @@ func (d *azureComputeDiscovery) discoverBlockStorages() ([]voc.IsCloudResource,
 }
 
 func (d *azureComputeDiscovery) handleBlockStorage(disk *armcompute.Disk) (*voc.BlockStorage, error) {
+	var backups []*voc.Backup
+
 	// If a mandatory field is empty, the whole disk is empty
 	if disk == nil || disk.ID == nil {
 		return nil, fmt.Errorf("disk is nil")
@@ -424,7 +441,9 @@ func (d *azureComputeDiscovery) handleBlockStorage(disk *armcompute.Disk) (*voc.
 		return nil, fmt.Errorf("could not get block storage properties for the atRestEncryption: %w", err)
 	}
 
-	backup := d.backupMap[DataSourceTypeDisc][util.Deref(disk.ID)]
+	if d.backupMap[DataSourceTypeDisc] != nil && d.backupMap[DataSourceTypeDisc].backup[util.Deref(disk.ID)] != nil {
+		backups = d.backupMap[DataSourceTypeDisc].backup[util.Deref(disk.ID)]
+	}
 
 	return &voc.BlockStorage{
 		Storage: &voc.Storage{
@@ -439,7 +458,7 @@ func (d *azureComputeDiscovery) handleBlockStorage(disk *armcompute.Disk) (*voc.
 				voc.BlockStorageType,
 			),
 			AtRestEncryption: enc,
-			Backup:           backup,
+			Backups:          backups,
 		},
 	}, nil
 }
@@ -508,18 +527,6 @@ func (d *azureComputeDiscovery) keyURL(diskEncryptionSetID string) (string, erro
 	return util.Deref(keyURL), nil
 }
 
-// TODO(all): Update to generic function or method
-func (d *azureComputeDiscovery) createResourceLogging() (resourceLogging *voc.ResourceLogging) {
-	if d.defenderProperties[DefenderVirtualMachineType] != nil {
-		resourceLogging = &voc.ResourceLogging{
-			MonitoringLogDataEnabled: d.defenderProperties[DefenderVirtualMachineType].monitoringLogDataEnabled,
-			SecurityAlertsEnabled:    d.defenderProperties[DefenderVirtualMachineType].securityAlertsEnabled,
-		}
-	}
-
-	return
-}
-
 // initFunctionsClient creates the client if not already exists
 func (d *azureComputeDiscovery) initFunctionsClient() (err error) {
 	d.clients.functionsClient, err = initClient(d.clients.functionsClient, d.azureDiscovery, armappservice.NewWebAppsClient)
diff --git a/service/discovery/azure/network.go b/service/discovery/azure/network.go
index 08b069fb..50d8ce09 100644
--- a/service/discovery/azure/network.go
+++ b/service/discovery/azure/network.go
@@ -44,7 +44,7 @@ func NewAzureNetworkDiscovery(opts ...DiscoveryOption) discovery.Discoverer {
 		&azureDiscovery{
 			discovererComponent: NetworkComponent,
 			csID:                discovery.DefaultCloudServiceID,
-			backupMap:           make(map[string]map[string]*voc.Backup),
+			backupMap:           make(map[string]*backup),
 		},
 	}
 
@@ -221,7 +221,7 @@ func (d *azureNetworkDiscovery) handleLoadBalancer(lb *armnetwork.LoadBalancer)
 			Ports: LoadBalancerPorts(lb),
 		},
 		// TODO(all): do we need the httpEndpoint for load balancers?
-		HttpEndpoints: &[]voc.HttpEndpoint{},
+		HttpEndpoints: []*voc.HttpEndpoint{},
 	}
 }
 
diff --git a/service/discovery/azure/storage.go b/service/discovery/azure/storage.go
index 2c44be50..814fc0c9 100644
--- a/service/discovery/azure/storage.go
+++ b/service/discovery/azure/storage.go
@@ -43,6 +43,7 @@ import (
 var (
 	ErrEmptyStorageAccount        = errors.New("storage account is empty")
 	ErrMissingDiskEncryptionSetID = errors.New("no disk encryption set ID was specified")
+	ErrBackupStorageNotAvailable  = errors.New("backup storages not available")
 )
 
 type azureStorageDiscovery struct {
@@ -55,7 +56,7 @@ func NewAzureStorageDiscovery(opts ...DiscoveryOption) discovery.Discoverer {
 		&azureDiscovery{
 			discovererComponent: StorageComponent,
 			csID:                discovery.DefaultCloudServiceID,
-			backupMap:           make(map[string]map[string]*voc.Backup),
+			backupMap:           make(map[string]*backup),
 		},
 		make(map[string]*defenderProperties),
 	}
@@ -184,6 +185,11 @@ func (d *azureStorageDiscovery) discoverStorageAccounts() ([]voc.IsCloudResource
 		return nil, err
 	}
 
+	// Add backuped storage account objects
+	if d.backupMap[DataSourceTypeStorageAccountObject] != nil && d.backupMap[DataSourceTypeStorageAccountObject].backupStorages != nil {
+		storageResourcesList = append(storageResourcesList, d.backupMap[DataSourceTypeStorageAccountObject].backupStorages...)
+	}
+
 	return storageResourcesList, nil
 }
 
@@ -234,6 +240,7 @@ func (d *azureStorageDiscovery) discoverObjectStorages(account *armstorage.Accou
 			log.Infof("Adding object storage '%s'", objectStorages.Name)
 
 			list = append(list, objectStorages)
+
 		}
 	}
 
@@ -290,6 +297,11 @@ func (d *azureStorageDiscovery) handleStorageAccount(account *armstorage.Account
 }
 
 func (d *azureStorageDiscovery) handleFileStorage(account *armstorage.Account, fileshare *armstorage.FileShareItem) (*voc.FileStorage, error) {
+	var (
+		monitoringLogDataEnabled bool
+		securityAlertsEnabled    bool
+	)
+
 	if account == nil {
 		return nil, ErrEmptyStorageAccount
 	}
@@ -304,6 +316,11 @@ func (d *azureStorageDiscovery) handleFileStorage(account *armstorage.Account, f
 		return nil, fmt.Errorf("could not get file storage properties for the atRestEncryption: %w", err)
 	}
 
+	if d.defenderProperties[DefenderStorageType] != nil {
+		monitoringLogDataEnabled = d.defenderProperties[DefenderVirtualMachineType].monitoringLogDataEnabled
+		securityAlertsEnabled = d.defenderProperties[DefenderVirtualMachineType].securityAlertsEnabled
+	}
+
 	return &voc.FileStorage{
 		Storage: &voc.Storage{
 			Resource: discovery.NewResource(d,
@@ -319,13 +336,23 @@ func (d *azureStorageDiscovery) handleFileStorage(account *armstorage.Account, f
 				labels(account.Tags),
 				voc.FileStorageType,
 			),
-			ResourceLogging:  d.createResourceLogging(),
+			ResourceLogging: &voc.ResourceLogging{
+				Logging: &voc.Logging{
+					MonitoringLogDataEnabled: monitoringLogDataEnabled,
+					SecurityAlertsEnabled:    securityAlertsEnabled,
+				},
+			},
 			AtRestEncryption: enc,
 		},
 	}, nil
 }
 
 func (d *azureStorageDiscovery) handleObjectStorage(account *armstorage.Account, container *armstorage.ListContainerItem) (*voc.ObjectStorage, error) {
+	var (
+		backups                  []*voc.Backup
+		monitoringLogDataEnabled bool
+		securityAlertsEnabled    bool
+	)
 	if account == nil {
 		return nil, ErrEmptyStorageAccount
 	}
@@ -340,7 +367,14 @@ func (d *azureStorageDiscovery) handleObjectStorage(account *armstorage.Account,
 		return nil, fmt.Errorf("could not get object storage properties for the atRestEncryption: %w", err)
 	}
 
-	backup := d.backupMap[DataSourceTypeStorageAccount][util.Deref(account.ID)]
+	if d.backupMap[DataSourceTypeStorageAccountObject] != nil && d.backupMap[DataSourceTypeStorageAccountObject].backup[util.Deref(account.ID)] != nil {
+		backups = d.backupMap[DataSourceTypeStorageAccountObject].backup[util.Deref(account.ID)]
+	}
+
+	if d.defenderProperties[DefenderStorageType] != nil {
+		monitoringLogDataEnabled = d.defenderProperties[DefenderVirtualMachineType].monitoringLogDataEnabled
+		securityAlertsEnabled = d.defenderProperties[DefenderVirtualMachineType].securityAlertsEnabled
+	}
 
 	return &voc.ObjectStorage{
 		Storage: &voc.Storage{
@@ -361,8 +395,13 @@ func (d *azureStorageDiscovery) handleObjectStorage(account *armstorage.Account,
 			Immutability: &voc.Immutability{
 				Enabled: util.Deref(container.Properties.HasImmutabilityPolicy),
 			},
-			ResourceLogging: d.createResourceLogging(),
-			Backup:          backup,
+			ResourceLogging: &voc.ResourceLogging{
+				Logging: &voc.Logging{
+					MonitoringLogDataEnabled: monitoringLogDataEnabled,
+					SecurityAlertsEnabled:    securityAlertsEnabled,
+				},
+			},
+			Backups: backups,
 		},
 		PublicAccess: util.Deref(container.Properties.PublicAccess) != armstorage.PublicAccessNone,
 	}, nil
@@ -429,18 +468,6 @@ func generalizeURL(url string) string {
 	return newURL
 }
 
-// TODO(all): Update to generic function or method
-func (d *azureStorageDiscovery) createResourceLogging() (resourceLogging *voc.ResourceLogging) {
-	if d.defenderProperties[DefenderStorageType] != nil {
-		resourceLogging = &voc.ResourceLogging{
-			MonitoringLogDataEnabled: d.defenderProperties[DefenderStorageType].monitoringLogDataEnabled,
-			SecurityAlertsEnabled:    d.defenderProperties[DefenderStorageType].securityAlertsEnabled,
-		}
-	}
-
-	return
-}
-
 // initAccountsClient creates the client if not already exists
 func (d *azureStorageDiscovery) initAccountsClient() (err error) {
 	d.clients.accountsClient, err = initClient(d.clients.accountsClient, d.azureDiscovery, armstorage.NewAccountsClient)
diff --git a/service/discovery/k8s/network.go b/service/discovery/k8s/network.go
index cae023f8..36457c46 100644
--- a/service/discovery/k8s/network.go
+++ b/service/discovery/k8s/network.go
@@ -130,7 +130,7 @@ func (d *k8sNetworkDiscovery) handleIngress(ingress *v1.Ingress) voc.IsNetwork {
 			Ips:   nil, // TODO (oxisto): fill out IPs
 			Ports: []uint16{80, 443},
 		},
-		HttpEndpoints: &[]voc.HttpEndpoint{},
+		HttpEndpoints: []*voc.HttpEndpoint{},
 	}
 
 	for _, rule := range ingress.Spec.Rules {
@@ -151,12 +151,12 @@ func (d *k8sNetworkDiscovery) handleIngress(ingress *v1.Ingress) voc.IsNetwork {
 				}
 			}
 
-			http := voc.HttpEndpoint{
+			http := &voc.HttpEndpoint{
 				Url:                 url,
 				TransportEncryption: te,
 			}
 
-			*lb.HttpEndpoints = append(*lb.HttpEndpoints, http)
+			lb.HttpEndpoints = append(lb.HttpEndpoints, http)
 		}
 	}
 
diff --git a/voc/abac.go b/voc/abac.go
index cecdcfcb..148171de 100644
--- a/voc/abac.go
+++ b/voc/abac.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/access_restriction.go b/voc/access_restriction.go
index 356e7e37..51ce212e 100644
--- a/voc/access_restriction.go
+++ b/voc/access_restriction.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/account.go b/voc/account.go
index 0ffda389..8ec56690 100644
--- a/voc/account.go
+++ b/voc/account.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/activity_logging.go b/voc/activity_logging.go
index a2805565..4fc2049e 100644
--- a/voc/activity_logging.go
+++ b/voc/activity_logging.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/anomaly_detection.go b/voc/anomaly_detection.go
index d5d237cf..c3694d00 100644
--- a/voc/anomaly_detection.go
+++ b/voc/anomaly_detection.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/application.go b/voc/application.go
index 5b8f120d..9cd08fc4 100644
--- a/voc/application.go
+++ b/voc/application.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -29,7 +29,7 @@ package voc
 
 // Application is an entity in our Cloud ontology. This encapsulates the whole (source) code of an application.
 type Application struct {
-	Functionalities     *[]Functionality `json:"functionalities"`
+	Functionalities     []*Functionality `json:"functionalities"`
 	Compute             []ResourceID     `json:"compute"`
 	ProgrammingLanguage string           `json:"programmingLanguage"`
 	TranslationUnits    []string         `json:"translationUnits"`
diff --git a/voc/application_logging.go b/voc/application_logging.go
index e640ff19..f65db4b2 100644
--- a/voc/application_logging.go
+++ b/voc/application_logging.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/at_rest_encryption.go b/voc/at_rest_encryption.go
index 155cd5e0..eb28efc8 100644
--- a/voc/at_rest_encryption.go
+++ b/voc/at_rest_encryption.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/auditing.go b/voc/auditing.go
index 1b658ace..4210d732 100644
--- a/voc/auditing.go
+++ b/voc/auditing.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/authenticity.go b/voc/authenticity.go
index 18676827..5c2ab79f 100644
--- a/voc/authenticity.go
+++ b/voc/authenticity.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/authorization.go b/voc/authorization.go
index fc77059e..6c5a2135 100644
--- a/voc/authorization.go
+++ b/voc/authorization.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/automatic_updates.go b/voc/automatic_updates.go
index 59742c61..330f1eae 100644
--- a/voc/automatic_updates.go
+++ b/voc/automatic_updates.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/availability.go b/voc/availability.go
index b5deeb11..93e08b5c 100644
--- a/voc/availability.go
+++ b/voc/availability.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/backup.go b/voc/backup.go
index 8c7617f1..539e1772 100644
--- a/voc/backup.go
+++ b/voc/backup.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -29,14 +29,13 @@ package voc
 
 import "time"
 
-// Backup contains the retention period in hours
+// Backup is an entity in our Cloud ontology. RetentionPeriod in hours
 type Backup struct {
 	*Availability
-	AtRestEncryption    IsAtRestEncryption   `json:"atRestEncryption"`
-	TransportEncryption *TransportEncryption `json:"transportEncryption"`
-	RetentionPeriod     time.Duration        `json:"retentionPeriod"`
-	Enabled             bool                 `json:"enabled"`
-	Policy              string               `json:"policy"`
-	GeoLocation         GeoLocation          `json:"geoLocation"`
-	Storage             ResourceID           `json:"storage"`
+	TransportEncryption IsTransportEncryption `json:"transportEncryption"`
+	Storage             ResourceID            `json:"storage"`
+	Enabled             bool                  `json:"enabled"`
+	RetentionPeriod     time.Duration         `json:"retentionPeriod"`
+	// The interval refers to the update interval in days.
+	Interval time.Duration `json:"interval"`
 }
diff --git a/voc/block_storage.go b/voc/block_storage.go
index 6d80d304..a6e996c1 100644
--- a/voc/block_storage.go
+++ b/voc/block_storage.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/boot_logging.go b/voc/boot_logging.go
index 091b8bf4..7654ad80 100644
--- a/voc/boot_logging.go
+++ b/voc/boot_logging.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/certificate_based_authentication.go b/voc/certificate_based_authentication.go
index 181ed870..ce0ee7fe 100644
--- a/voc/certificate_based_authentication.go
+++ b/voc/certificate_based_authentication.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/cicd_service.go b/voc/cicd_service.go
index 966ea442..5e2cfd65 100644
--- a/voc/cicd_service.go
+++ b/voc/cicd_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/cloud_resource_group.go b/voc/cloud_resource_group.go
index 6141361c..c3d47e5a 100644
--- a/voc/cloud_resource_group.go
+++ b/voc/cloud_resource_group.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -28,5 +28,5 @@
 package voc
 
 type CloudResourceGroup struct {
-	Resources *[]Resource `json:"resources"`
+	Resources []*Resource `json:"resources"`
 }
diff --git a/voc/cloud_sdk.go b/voc/cloud_sdk.go
index 583d68c0..b5ce091d 100644
--- a/voc/cloud_sdk.go
+++ b/voc/cloud_sdk.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/compute.go b/voc/compute.go
index 4015722f..275db83d 100644
--- a/voc/compute.go
+++ b/voc/compute.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -33,5 +33,4 @@ type Compute struct {
 	*Resource
 	NetworkInterfaces []ResourceID     `json:"networkInterfaces"`
 	ResourceLogging   *ResourceLogging `json:"resourceLogging"`
-	Backup           *Backup            `json:"backup"`
 }
diff --git a/voc/confidentiality.go b/voc/confidentiality.go
index c4550525..d335a980 100644
--- a/voc/confidentiality.go
+++ b/voc/confidentiality.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/container.go b/voc/container.go
index 09acc223..37490762 100644
--- a/voc/container.go
+++ b/voc/container.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/container_image.go b/voc/container_image.go
index 7bff7bc8..18a52d16 100644
--- a/voc/container_image.go
+++ b/voc/container_image.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/container_orchestration.go b/voc/container_orchestration.go
index 5ecf526a..baacc14e 100644
--- a/voc/container_orchestration.go
+++ b/voc/container_orchestration.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/container_registry.go b/voc/container_registry.go
index 8c67e04a..abee5977 100644
--- a/voc/container_registry.go
+++ b/voc/container_registry.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/customer_key_encryption.go b/voc/customer_key_encryption.go
index a935d46e..91472473 100644
--- a/voc/customer_key_encryption.go
+++ b/voc/customer_key_encryption.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/d_do_s_protection.go b/voc/d_do_s_protection.go
index cd6da66c..3085271e 100644
--- a/voc/d_do_s_protection.go
+++ b/voc/d_do_s_protection.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/database_connect.go b/voc/database_connect.go
index da18ff09..81946b15 100644
--- a/voc/database_connect.go
+++ b/voc/database_connect.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/database_operation.go b/voc/database_operation.go
index 5f794ad0..aff1e8cb 100644
--- a/voc/database_operation.go
+++ b/voc/database_operation.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/database_query.go b/voc/database_query.go
index bdb741f5..bf74788e 100644
--- a/voc/database_query.go
+++ b/voc/database_query.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/database_service.go b/voc/database_service.go
index 2d26bbfd..dd31d8ea 100644
--- a/voc/database_service.go
+++ b/voc/database_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/database_storage.go b/voc/database_storage.go
index 6818994a..8d46cec9 100644
--- a/voc/database_storage.go
+++ b/voc/database_storage.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/device_provisioning_service.go b/voc/device_provisioning_service.go
index 5cabcb0e..c4265c57 100644
--- a/voc/device_provisioning_service.go
+++ b/voc/device_provisioning_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/document_database_service.go b/voc/document_database_service.go
index b00c0e87..8eae7cef 100644
--- a/voc/document_database_service.go
+++ b/voc/document_database_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/file_storage.go b/voc/file_storage.go
index a632e0b3..364c7df0 100644
--- a/voc/file_storage.go
+++ b/voc/file_storage.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,4 +31,5 @@ var FileStorageType = []string{"FileStorage", "Storage", "Resource"}
 
 type FileStorage struct {
 	*Storage
+	PublicAccess bool `json:"publicAccess"`
 }
diff --git a/voc/firewall.go b/voc/firewall.go
index 217cf2ed..e8b14092 100644
--- a/voc/firewall.go
+++ b/voc/firewall.go
@@ -30,3 +30,7 @@ package voc
 type Firewall struct {
 	*AccessRestriction
 }
+
+func (*Firewall) Type() string {
+	return "Firewall"
+}
diff --git a/voc/framework.go b/voc/framework.go
index 76baf256..d020c0dd 100644
--- a/voc/framework.go
+++ b/voc/framework.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/function.go b/voc/function.go
index 0b092a8f..c753dc86 100644
--- a/voc/function.go
+++ b/voc/function.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/functionality.go b/voc/functionality.go
index a71c3ab5..d01ef421 100644
--- a/voc/functionality.go
+++ b/voc/functionality.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/geo_location.go b/voc/geo_location.go
index 65ad21d8..003baa54 100644
--- a/voc/geo_location.go
+++ b/voc/geo_location.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/http_client_library.go b/voc/http_client_library.go
index 6497a5bd..9b1db514 100644
--- a/voc/http_client_library.go
+++ b/voc/http_client_library.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/http_endpoint.go b/voc/http_endpoint.go
index 0411c485..ea98ab98 100644
--- a/voc/http_endpoint.go
+++ b/voc/http_endpoint.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/http_request.go b/voc/http_request.go
index f36783a5..5bc45604 100644
--- a/voc/http_request.go
+++ b/voc/http_request.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/http_request_handler.go b/voc/http_request_handler.go
index 43db4f95..23f283e3 100644
--- a/voc/http_request_handler.go
+++ b/voc/http_request_handler.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -30,6 +30,6 @@ package voc
 type HttpRequestHandler struct {
 	*Functionality
 	Application   *Application    `json:"application"`
-	HttpEndpoints *[]HttpEndpoint `json:"httpEndpoints"`
+	HttpEndpoints []*HttpEndpoint `json:"httpEndpoints"`
 	Path          string          `json:"path"`
 }
diff --git a/voc/http_server.go b/voc/http_server.go
index fe6dfaa6..5370544f 100644
--- a/voc/http_server.go
+++ b/voc/http_server.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/identifiable.go b/voc/identifiable.go
index 845a4122..d16f4590 100644
--- a/voc/identifiable.go
+++ b/voc/identifiable.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/identity.go b/voc/identity.go
index 9614079e..d3efd45a 100644
--- a/voc/identity.go
+++ b/voc/identity.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/image.go b/voc/image.go
index 66ec3cde..00730ff5 100644
--- a/voc/image.go
+++ b/voc/image.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/immutability.go b/voc/immutability.go
index 1371d3e0..d4046925 100644
--- a/voc/immutability.go
+++ b/voc/immutability.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/integrity.go b/voc/integrity.go
index 10e4013c..916e746f 100644
--- a/voc/integrity.go
+++ b/voc/integrity.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/io_t.go b/voc/io_t.go
index 57b53017..136a7581 100644
--- a/voc/io_t.go
+++ b/voc/io_t.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/job.go b/voc/job.go
index 7a86fea3..69c87aff 100644
--- a/voc/job.go
+++ b/voc/job.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/key_value_database_service.go b/voc/key_value_database_service.go
index afaf4412..a575aed7 100644
--- a/voc/key_value_database_service.go
+++ b/voc/key_value_database_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/l3_firewall.go b/voc/l3_firewall.go
index 70b8c338..c9944d3c 100644
--- a/voc/l3_firewall.go
+++ b/voc/l3_firewall.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/load_balancer.go b/voc/load_balancer.go
index 635848a1..b0ed70b5 100644
--- a/voc/load_balancer.go
+++ b/voc/load_balancer.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ var LoadBalancerType = []string{"LoadBalancer", "NetworkService", "Networking",
 type LoadBalancer struct {
 	*NetworkService
 	AccessRestriction IsAccessRestriction `json:"accessRestriction"`
-	HttpEndpoints     *[]HttpEndpoint     `json:"httpEndpoints"`
+	HttpEndpoints     []*HttpEndpoint     `json:"httpEndpoints"`
 	NetworkServices   []ResourceID        `json:"networkServices"`
 	Url               string              `json:"url"`
 }
diff --git a/voc/log_operation.go b/voc/log_operation.go
index 7a026648..0a1e54c1 100644
--- a/voc/log_operation.go
+++ b/voc/log_operation.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/logger.go b/voc/logger.go
index d76135f6..d5141fe3 100644
--- a/voc/logger.go
+++ b/voc/logger.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/logging.go b/voc/logging.go
index c00d9cb7..d57786ff 100644
--- a/voc/logging.go
+++ b/voc/logging.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,7 +31,9 @@ import "time"
 
 type Logging struct {
 	*Auditing
-	LoggingService  []ResourceID  `json:"loggingService"`
-	Enabled         bool          `json:"enabled"`
-	RetentionPeriod time.Duration `json:"retentionPeriod"`
+	LoggingService           []ResourceID  `json:"loggingService"`
+	Enabled                  bool          `json:"enabled"`
+	RetentionPeriod          time.Duration `json:"retentionPeriod"`
+	MonitoringLogDataEnabled bool          `json:"monitoringLogDataEnabled"`
+	SecurityAlertsEnabled    bool          `json:"securityAlertsEnabled"`
 }
diff --git a/voc/logging_service.go b/voc/logging_service.go
index 30befa84..55257cfd 100644
--- a/voc/logging_service.go
+++ b/voc/logging_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/malware_protection.go b/voc/malware_protection.go
index caceaf93..44b97e87 100644
--- a/voc/malware_protection.go
+++ b/voc/malware_protection.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/managed_key_encryption.go b/voc/managed_key_encryption.go
index 35aa4321..4f9a40d6 100644
--- a/voc/managed_key_encryption.go
+++ b/voc/managed_key_encryption.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/messaging_hub.go b/voc/messaging_hub.go
index 297d860d..7e8254bb 100644
--- a/voc/messaging_hub.go
+++ b/voc/messaging_hub.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/network_interface.go b/voc/network_interface.go
index e57d1201..6e7affa7 100644
--- a/voc/network_interface.go
+++ b/voc/network_interface.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,6 +31,6 @@ var NetworkInterfaceType = []string{"NetworkInterface", "Networking", "Resource"
 
 type NetworkInterface struct {
 	*Networking
-	NetworkService    ResourceID          `json:"networkService"`
 	AccessRestriction IsAccessRestriction `json:"accessRestriction"`
+	NetworkService    ResourceID          `json:"networkService"`
 }
diff --git a/voc/network_security_group.go b/voc/network_security_group.go
index 413c0eba..24aef850 100644
--- a/voc/network_security_group.go
+++ b/voc/network_security_group.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/network_service.go b/voc/network_service.go
index dc940002..26a871a8 100644
--- a/voc/network_service.go
+++ b/voc/network_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/networking.go b/voc/networking.go
index 77f66d72..bc2c8f5d 100644
--- a/voc/networking.go
+++ b/voc/networking.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/no_authentication.go b/voc/no_authentication.go
index 661fa8d4..e4615543 100644
--- a/voc/no_authentication.go
+++ b/voc/no_authentication.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/object_storage.go b/voc/object_storage.go
index 7d6603e7..efb33fc1 100644
--- a/voc/object_storage.go
+++ b/voc/object_storage.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,10 +31,5 @@ var ObjectStorageType = []string{"ObjectStorage", "Storage", "Resource"}
 
 type ObjectStorage struct {
 	*Storage
-	// TODO(oxisto): This is a little bit of a hack. We actually want to use
-	// Authenticity for determining public access, but this is currently not
-	// possible since Authenticity is only on the StorageService. But in Azure,
-	// a StorageService is only created for the storage account, not the
-	// individual container.
 	PublicAccess bool `json:"publicAccess"`
 }
diff --git a/voc/object_storage_request.go b/voc/object_storage_request.go
index d0e67410..93e525f2 100644
--- a/voc/object_storage_request.go
+++ b/voc/object_storage_request.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/object_storage_service.go b/voc/object_storage_service.go
index a5b87fa7..03dcec4e 100644
--- a/voc/object_storage_service.go
+++ b/voc/object_storage_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/operation.go b/voc/operation.go
index 9ee89a09..877d080c 100644
--- a/voc/operation.go
+++ b/voc/operation.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/os_logging.go b/voc/os_logging.go
index 0bb39a26..4051575b 100644
--- a/voc/os_logging.go
+++ b/voc/os_logging.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/otp_based_authentication.go b/voc/otp_based_authentication.go
index 878e1c67..11286018 100644
--- a/voc/otp_based_authentication.go
+++ b/voc/otp_based_authentication.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/password_based_authentication.go b/voc/password_based_authentication.go
index 42269aa5..5ebc1da8 100644
--- a/voc/password_based_authentication.go
+++ b/voc/password_based_authentication.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/password_policy.go b/voc/password_policy.go
index b2344fac..564cfcd3 100644
--- a/voc/password_policy.go
+++ b/voc/password_policy.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/proxied_endpoint.go b/voc/proxied_endpoint.go
index f9583784..b8123546 100644
--- a/voc/proxied_endpoint.go
+++ b/voc/proxied_endpoint.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/rbac.go b/voc/rbac.go
index 5a14bf70..b958f853 100644
--- a/voc/rbac.go
+++ b/voc/rbac.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/relational_database_service.go b/voc/relational_database_service.go
index 51fe548e..17114b27 100644
--- a/voc/relational_database_service.go
+++ b/voc/relational_database_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/resource_logging.go b/voc/resource_logging.go
index f535c2ca..fe4441f1 100644
--- a/voc/resource_logging.go
+++ b/voc/resource_logging.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -29,7 +29,4 @@ package voc
 
 type ResourceLogging struct {
 	*Logging
-
-	MonitoringLogDataEnabled bool `json:"monitoringLogDataEnabled"`
-	SecurityAlertsEnabled    bool `json:"securityAlertsEnabled"`
 }
diff --git a/voc/role_assignment.go b/voc/role_assignment.go
index f0b28f80..98da5300 100644
--- a/voc/role_assignment.go
+++ b/voc/role_assignment.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/security_feature.go b/voc/security_feature.go
index df5a61dd..e71b2c74 100644
--- a/voc/security_feature.go
+++ b/voc/security_feature.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/single_sign_on.go b/voc/single_sign_on.go
index 6abb2c83..bf6f252d 100644
--- a/voc/single_sign_on.go
+++ b/voc/single_sign_on.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/storage.go b/voc/storage.go
index 2b6c71d0..29b75442 100644
--- a/voc/storage.go
+++ b/voc/storage.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@ var StorageType = []string{"Storage", "Resource"}
 type Storage struct {
 	*Resource
 	AtRestEncryption IsAtRestEncryption `json:"atRestEncryption"`
+	Backups          []*Backup          `json:"backups"`
 	Immutability     *Immutability      `json:"immutability"`
 	ResourceLogging  *ResourceLogging   `json:"resourceLogging"`
-	Backup           *Backup            `json:"backup"`
 }
diff --git a/voc/storage_service.go b/voc/storage_service.go
index a3224d0f..c7fbeb45 100644
--- a/voc/storage_service.go
+++ b/voc/storage_service.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/token_based_authentication.go b/voc/token_based_authentication.go
index cf9bc071..966c54d2 100644
--- a/voc/token_based_authentication.go
+++ b/voc/token_based_authentication.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -29,8 +29,8 @@ package voc
 
 type TokenBasedAuthentication struct {
 	*Authenticity
-	Enforced  bool `json:"enforced"`
-	Activated bool `json:"activated"`
+	Enforced bool `json:"enforced"`
+	Enabled  bool `json:"enabled"`
 }
 
 func (*TokenBasedAuthentication) Type() string {
diff --git a/voc/transport_encryption.go b/voc/transport_encryption.go
index 6b422770..8de4145c 100644
--- a/voc/transport_encryption.go
+++ b/voc/transport_encryption.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/virtual_machine.go b/voc/virtual_machine.go
index 9aca465c..4e6e68d3 100644
--- a/voc/virtual_machine.go
+++ b/voc/virtual_machine.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/virtual_network.go b/voc/virtual_network.go
index 46869b42..b068b4ea 100644
--- a/voc/virtual_network.go
+++ b/voc/virtual_network.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/virtual_sub_network.go b/voc/virtual_sub_network.go
index 330bb960..254c9ff5 100644
--- a/voc/virtual_sub_network.go
+++ b/voc/virtual_sub_network.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/vm_image.go b/voc/vm_image.go
index 37a7d6e0..e70dce6d 100644
--- a/voc/vm_image.go
+++ b/voc/vm_image.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/voc.go b/voc/voc.go
index 0243f208..9a25ddba 100644
--- a/voc/voc.go
+++ b/voc/voc.go
@@ -143,6 +143,17 @@ func (a *AtRestEncryption) IsEnabled() bool {
 	return a.Enabled
 }
 
+type IsTransportEncryption interface {
+	IsSecurityFeature
+	transportEncryption()
+	IsEnabled() bool
+}
+
+func (*TransportEncryption) transportEncryption() {}
+func (a *TransportEncryption) IsEnabled() bool {
+	return a.Enabled
+}
+
 type IsAuthorization interface {
 	IsSecurityFeature
 	authorization()
diff --git a/voc/web_application_firewall.go b/voc/web_application_firewall.go
index 26750591..06179cb8 100644
--- a/voc/web_application_firewall.go
+++ b/voc/web_application_firewall.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/voc/workflow.go b/voc/workflow.go
index 13e27df9..e090d93a 100644
--- a/voc/workflow.go
+++ b/voc/workflow.go
@@ -1,6 +1,6 @@
 // Auto-generated code by owl2java (https://github.com/clouditor/cloud-property-graph)
 
-// Copyright 2022 Fraunhofer AISEC
+// Copyright 2023 Fraunhofer AISEC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.


Test patch:
diff --git a/service/discovery/azure/azure_test.go b/service/discovery/azure/azure_test.go
index dcf51d4d..49917e9a 100644
--- a/service/discovery/azure/azure_test.go
+++ b/service/discovery/azure/azure_test.go
@@ -335,7 +335,7 @@ func NewMockAzureDiscovery(transport policy.Transporter, opts ...DiscoveryOption
 			},
 		},
 		csID:      testdata.MockCloudServiceID1,
-		backupMap: make(map[string]map[string]*voc.Backup),
+		backupMap: make(map[string]*backup),
 	}
 
 	// Apply options
@@ -414,25 +414,20 @@ func Test_azureDiscovery_discoverBackupVaults_Storage(t *testing.T) {
 					return false
 				}
 
-				want := &voc.Backup{
+				want := []*voc.Backup{{
 					RetentionPeriod: Duration7Days,
 					Enabled:         true,
-					GeoLocation:     voc.GeoLocation{Region: "westeurope"},
 					Storage:         voc.ResourceID("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/account1-account1-22222222-2222-2222-2222-222222222222"),
-					Policy:          "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupPolicies/backupPolicyContainer",
-					AtRestEncryption: &voc.AtRestEncryption{
-						Algorithm: "AES256",
-						Enabled:   true,
-					},
 					TransportEncryption: &voc.TransportEncryption{
 						Enforced:   true,
 						Enabled:    true,
 						TlsVersion: constants.TLS1_2,
 						Algorithm:  constants.TLS,
 					},
+				},
 				}
 
-				return assert.Equal(t, want, d.backupMap[DataSourceTypeStorageAccount]["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.Storage/storageAccounts/account1"])
+				return assert.Equal(t, want, d.backupMap[DataSourceTypeStorageAccountObject].backup["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.Storage/storageAccounts/account1"])
 
 			},
 			wantErr: assert.NoError,
@@ -528,25 +523,20 @@ func Test_azureDiscovery_discoverBackupVaults_Compute(t *testing.T) {
 					return false
 				}
 
-				want := &voc.Backup{
+				want := []*voc.Backup{{
 					RetentionPeriod: Duration30Days,
 					Enabled:         true,
-					GeoLocation:     voc.GeoLocation{Region: "westeurope"},
 					Storage:         voc.ResourceID("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/disk1-disk1-22222222-2222-2222-2222-222222222222"),
-					Policy:          "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupPolicies/backupPolicyDisk",
-					AtRestEncryption: &voc.AtRestEncryption{
-						Algorithm: "AES256",
-						Enabled:   true,
-					},
 					TransportEncryption: &voc.TransportEncryption{
 						Enforced:   true,
 						Enabled:    true,
 						TlsVersion: constants.TLS1_2,
 						Algorithm:  constants.TLS,
 					},
+				},
 				}
 
-				return assert.Equal(t, want, d.backupMap[DataSourceTypeDisc]["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.Compute/disks/disk1"])
+				return assert.Equal(t, want, d.backupMap[DataSourceTypeDisc].backup["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.Compute/disks/disk1"])
 			},
 			wantErr: assert.NoError,
 		},
@@ -796,3 +786,132 @@ func Test_azureDiscovery_discoverBackupInstances(t *testing.T) {
 		})
 	}
 }
+
+func Test_azureDiscovery_handleInstances(t *testing.T) {
+	type fields struct {
+		isAuthorized        bool
+		sub                 armsubscription.Subscription
+		cred                azcore.TokenCredential
+		rg                  *string
+		clientOptions       arm.ClientOptions
+		discovererComponent string
+		clients             clients
+		csID                string
+		backupMap           map[string]*backup
+	}
+	type args struct {
+		vault    *armdataprotection.BackupVaultResource
+		instance *armdataprotection.BackupInstanceResource
+	}
+	tests := []struct {
+		name         string
+		fields       fields
+		args         args
+		wantResource voc.IsCloudResource
+		wantErr      assert.ErrorAssertionFunc
+	}{
+		{
+			name: "Empty input",
+			wantErr: func(t assert.TestingT, err error, i ...interface{}) bool {
+				return assert.ErrorContains(t, err, ErrVaultInstanceIsEmpty.Error())
+			},
+		},
+		{
+			name: "Happy path: ObjectStorage",
+			fields: fields{
+				csID: testdata.MockCloudServiceID1,
+			},
+			args: args{
+				vault: &armdataprotection.BackupVaultResource{
+					ID:       util.Ref("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1"),
+					Name:     util.Ref("backupAccount1"),
+					Location: util.Ref("westeurope"),
+				},
+				instance: &armdataprotection.BackupInstanceResource{
+					ID:   util.Ref("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/account1-account1-22222222-2222-2222-2222-222222222222"),
+					Name: util.Ref("account1-account1-22222222-2222-2222-2222-222222222222"),
+					Properties: &armdataprotection.BackupInstance{
+						DataSourceInfo: &armdataprotection.Datasource{
+							DatasourceType: util.Ref("Microsoft.Storage/storageAccounts/blobServices"),
+						},
+					},
+				},
+			},
+			wantResource: &voc.ObjectStorage{
+				Storage: &voc.Storage{
+					Resource: &voc.Resource{
+						ID:        "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/account1-account1-22222222-2222-2222-2222-222222222222",
+						ServiceID: testdata.MockCloudServiceID1,
+						Name:      "account1-account1-22222222-2222-2222-2222-222222222222",
+						GeoLocation: voc.GeoLocation{
+							Region: "westeurope",
+						},
+						CreationTime: 0,
+						Type:         voc.ObjectStorageType,
+						Labels:       nil,
+					},
+				},
+			},
+			wantErr: assert.NoError,
+		},
+		{
+			name: "Happy path: BlockStorage",
+			fields: fields{
+				csID: testdata.MockCloudServiceID1,
+			},
+			args: args{
+				vault: &armdataprotection.BackupVaultResource{
+					ID:       util.Ref("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1"),
+					Name:     util.Ref("backupAccount1"),
+					Location: util.Ref("westeurope"),
+				},
+				instance: &armdataprotection.BackupInstanceResource{
+					ID:   util.Ref("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/disk1-disk1-22222222-2222-2222-2222-222222222222"),
+					Name: util.Ref("disk1-disk1-22222222-2222-2222-2222-222222222222"),
+					Properties: &armdataprotection.BackupInstance{
+						DataSourceInfo: &armdataprotection.Datasource{
+							DatasourceType: util.Ref("Microsoft.Compute/disks"),
+						},
+					},
+				},
+			},
+			wantResource: &voc.BlockStorage{
+				Storage: &voc.Storage{
+					Resource: &voc.Resource{
+						ID:        "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/disk1-disk1-22222222-2222-2222-2222-222222222222",
+						ServiceID: testdata.MockCloudServiceID1,
+						Name:      "disk1-disk1-22222222-2222-2222-2222-222222222222",
+						GeoLocation: voc.GeoLocation{
+							Region: "westeurope",
+						},
+						CreationTime: 0,
+						Type:         voc.BlockStorageType,
+						Labels:       nil,
+					},
+				},
+			},
+			wantErr: assert.NoError,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			d := &azureDiscovery{
+				isAuthorized:        tt.fields.isAuthorized,
+				sub:                 tt.fields.sub,
+				cred:                tt.fields.cred,
+				rg:                  tt.fields.rg,
+				clientOptions:       tt.fields.clientOptions,
+				discovererComponent: tt.fields.discovererComponent,
+				clients:             tt.fields.clients,
+				csID:                tt.fields.csID,
+				backupMap:           tt.fields.backupMap,
+			}
+			gotResource, err := d.handleInstances(tt.args.vault, tt.args.instance)
+			tt.wantErr(t, err)
+
+			if !reflect.DeepEqual(gotResource, tt.wantResource) {
+				t.Errorf("azureDiscovery.handleInstances() = %v, want %v", gotResource, tt.wantResource)
+			}
+		})
+	}
+}
diff --git a/service/discovery/azure/compute_test.go b/service/discovery/azure/compute_test.go
index 57e94887..a6d83758 100644
--- a/service/discovery/azure/compute_test.go
+++ b/service/discovery/azure/compute_test.go
@@ -367,7 +367,7 @@ func TestNewAzureComputeDiscovery(t *testing.T) {
 				&azureDiscovery{
 					discovererComponent: ComputeComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				make(map[string]*defenderProperties),
 			},
@@ -386,7 +386,7 @@ func TestNewAzureComputeDiscovery(t *testing.T) {
 					},
 					discovererComponent: ComputeComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				make(map[string]*defenderProperties),
 			},
@@ -401,7 +401,7 @@ func TestNewAzureComputeDiscovery(t *testing.T) {
 					cred:                &mockAuthorizer{},
 					discovererComponent: ComputeComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				make(map[string]*defenderProperties),
 			},
@@ -415,7 +415,7 @@ func TestNewAzureComputeDiscovery(t *testing.T) {
 				&azureDiscovery{
 					discovererComponent: ComputeComponent,
 					csID:                testdata.MockCloudServiceID1,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				make(map[string]*defenderProperties),
 			},
@@ -450,7 +450,7 @@ func TestCompute(t *testing.T) {
 
 	assert.NoError(t, err)
 	assert.NotNil(t, list)
-	assert.Equal(t, 7, len(list))
+	assert.Equal(t, 8, len(list))
 	assert.NotEmpty(t, d.Name())
 }
 
@@ -463,7 +463,7 @@ func TestDiscoverer_List(t *testing.T) {
 	list, err := d.List()
 	assert.NoError(t, err)
 
-	virtualMachine, ok := list[3].(*voc.VirtualMachine)
+	virtualMachine, ok := list[4].(*voc.VirtualMachine)
 
 	assert.True(t, ok)
 	assert.Equal(t, "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.Compute/virtualMachines/vm1", string(virtualMachine.ID))
@@ -478,11 +478,11 @@ func TestDiscoverer_List(t *testing.T) {
 	assert.Equal(t, voc.ResourceID("https://logstoragevm1.blob.core.windows.net/"), virtualMachine.BootLogging.LoggingService[0])
 	assert.Equal(t, time.Duration(0), virtualMachine.BootLogging.RetentionPeriod)
 
-	virtualMachine2, ok := list[4].(*voc.VirtualMachine)
+	virtualMachine2, ok := list[5].(*voc.VirtualMachine)
 	assert.True(t, ok)
 	assert.Equal(t, []voc.ResourceID{}, virtualMachine2.BootLogging.LoggingService)
 
-	virtualMachine3, ok := list[5].(*voc.VirtualMachine)
+	virtualMachine3, ok := list[6].(*voc.VirtualMachine)
 	assert.True(t, ok)
 	assert.Equal(t, []voc.ResourceID{}, virtualMachine3.BlockStorage)
 	assert.Equal(t, []voc.ResourceID{}, virtualMachine3.NetworkInterfaces)
@@ -499,9 +499,9 @@ func TestFunction(t *testing.T) {
 
 	assert.NoError(t, err)
 	assert.NotNil(t, list)
-	assert.Equal(t, 7, len(list))
+	assert.Equal(t, 8, len(list))
 
-	function, ok := list[6].(*voc.Function)
+	function, ok := list[7].(*voc.Function)
 
 	assert.True(t, ok)
 	assert.Equal(t, "function1", function.Name)
@@ -638,16 +638,10 @@ func Test_azureComputeDiscovery_List(t *testing.T) {
 								Enabled:   true,
 							},
 						},
-						Backup: &voc.Backup{
+						Backups: []*voc.Backup{{
 							Enabled:         true,
 							RetentionPeriod: Duration30Days,
-							GeoLocation:     voc.GeoLocation{Region: "westeurope"},
-							Policy:          "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupPolicies/backupPolicyDisk",
 							Storage:         voc.ResourceID("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/disk1-disk1-22222222-2222-2222-2222-222222222222"),
-							AtRestEncryption: &voc.AtRestEncryption{
-								Algorithm: "AES256",
-								Enabled:   true,
-							},
 							TransportEncryption: &voc.TransportEncryption{
 								Enforced:   true,
 								Enabled:    true,
@@ -655,6 +649,7 @@ func Test_azureComputeDiscovery_List(t *testing.T) {
 								Algorithm:  constants.TLS,
 							},
 						},
+						},
 					},
 				},
 				&voc.BlockStorage{
@@ -677,6 +672,7 @@ func Test_azureComputeDiscovery_List(t *testing.T) {
 							},
 							KeyUrl: "https://keyvault1.vault.azure.net/keys/customer-key/6273gdb374jz789hjm17819283748382",
 						},
+						Backups: nil,
 					},
 				},
 				&voc.BlockStorage{
@@ -692,13 +688,27 @@ func Test_azureComputeDiscovery_List(t *testing.T) {
 							Labels: map[string]string{},
 							Type:   voc.BlockStorageType,
 						},
-
 						AtRestEncryption: &voc.ManagedKeyEncryption{
 							AtRestEncryption: &voc.AtRestEncryption{
 								Algorithm: "AES256",
 								Enabled:   true,
 							},
 						},
+						Backups: nil,
+					},
+				},
+				&voc.BlockStorage{
+					Storage: &voc.Storage{
+						Resource: &voc.Resource{
+							ID:           "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/disk1-disk1-22222222-2222-2222-2222-222222222222",
+							Name:         "disk1-disk1-22222222-2222-2222-2222-222222222222",
+							ServiceID:    testdata.MockCloudServiceID1,
+							CreationTime: 0,
+							Type:         voc.BlockStorageType,
+							GeoLocation: voc.GeoLocation{
+								Region: "westeurope",
+							},
+						},
 					},
 				},
 				&voc.VirtualMachine{
@@ -871,7 +881,7 @@ func Test_azureComputeDiscovery_List(t *testing.T) {
 							Labels: map[string]string{},
 							Type:   voc.BlockStorageType,
 						},
-
+						Backups: nil,
 						AtRestEncryption: &voc.ManagedKeyEncryption{
 							AtRestEncryption: &voc.AtRestEncryption{
 								Algorithm: "AES256",
@@ -1264,7 +1274,8 @@ func Test_azureComputeDiscovery_handleVirtualMachines(t *testing.T) {
 	enabledTrue := true
 
 	type fields struct {
-		azureDiscovery *azureDiscovery
+		azureDiscovery     *azureDiscovery
+		defenderProperties map[string]*defenderProperties
 	}
 	type args struct {
 		vm *armcompute.VirtualMachine
@@ -1287,6 +1298,12 @@ func Test_azureComputeDiscovery_handleVirtualMachines(t *testing.T) {
 			name: "No error",
 			fields: fields{
 				azureDiscovery: NewMockAzureDiscovery(newMockComputeSender()),
+				defenderProperties: map[string]*defenderProperties{
+					DefenderVirtualMachineType: {
+						monitoringLogDataEnabled: true,
+						securityAlertsEnabled:    true,
+					},
+				},
 			},
 			args: args{
 				vm: &armcompute.VirtualMachine{
@@ -1336,7 +1353,9 @@ func Test_azureComputeDiscovery_handleVirtualMachines(t *testing.T) {
 						Auditing: &voc.Auditing{
 							SecurityFeature: &voc.SecurityFeature{},
 						},
-						RetentionPeriod: 0,
+						RetentionPeriod:          0,
+						MonitoringLogDataEnabled: true,
+						SecurityAlertsEnabled:    true,
 					},
 				},
 				OsLogging: &voc.OSLogging{
@@ -1347,6 +1366,8 @@ func Test_azureComputeDiscovery_handleVirtualMachines(t *testing.T) {
 						Auditing: &voc.Auditing{
 							SecurityFeature: &voc.SecurityFeature{},
 						},
+						MonitoringLogDataEnabled: true,
+						SecurityAlertsEnabled:    true,
 					},
 				},
 				AutomaticUpdates: &voc.AutomaticUpdates{
@@ -1361,7 +1382,8 @@ func Test_azureComputeDiscovery_handleVirtualMachines(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			d := &azureComputeDiscovery{
-				azureDiscovery: tt.fields.azureDiscovery,
+				azureDiscovery:     tt.fields.azureDiscovery,
+				defenderProperties: tt.fields.defenderProperties,
 			}
 			got, err := d.handleVirtualMachines(tt.args.vm)
 			if !tt.wantErr(t, err) {
@@ -1991,54 +2013,6 @@ func Test_diskEncryptionSetName(t *testing.T) {
 	}
 }
 
-func Test_azureComputeDiscovery_createResourceLogging(t *testing.T) {
-	type fields struct {
-		azureDiscovery     *azureDiscovery
-		defenderProperties map[string]*defenderProperties
-	}
-	tests := []struct {
-		name                string
-		fields              fields
-		wantResourceLogging *voc.ResourceLogging
-	}{
-		{
-			name: "Missing defenderProperties",
-			fields: fields{
-				azureDiscovery:     NewMockAzureDiscovery(newMockComputeSender()),
-				defenderProperties: make(map[string]*defenderProperties),
-			},
-			wantResourceLogging: nil,
-		},
-		{
-			name: "Happy path",
-			fields: fields{
-				azureDiscovery: NewMockAzureDiscovery(newMockComputeSender()),
-				defenderProperties: map[string]*defenderProperties{
-					DefenderVirtualMachineType: {
-						monitoringLogDataEnabled: true,
-						securityAlertsEnabled:    true,
-					},
-				},
-			},
-			wantResourceLogging: &voc.ResourceLogging{
-				MonitoringLogDataEnabled: true,
-				SecurityAlertsEnabled:    true,
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			d := &azureComputeDiscovery{
-				azureDiscovery:     tt.fields.azureDiscovery,
-				defenderProperties: tt.fields.defenderProperties,
-			}
-			if gotResourceLogging := d.createResourceLogging(); !reflect.DeepEqual(gotResourceLogging, tt.wantResourceLogging) {
-				t.Errorf("azureComputeDiscovery.createResourceLogging() = %v, want %v", gotResourceLogging, tt.wantResourceLogging)
-			}
-		})
-	}
-}
-
 func Test_runtimeInfo(t *testing.T) {
 	type args struct {
 		runtime string
diff --git a/service/discovery/azure/network_test.go b/service/discovery/azure/network_test.go
index a2c94099..489318ef 100644
--- a/service/discovery/azure/network_test.go
+++ b/service/discovery/azure/network_test.go
@@ -317,7 +317,7 @@ func Test_azureNetworkDiscovery_List(t *testing.T) {
 						Ips:   []string{"111.222.333.444"},
 						Ports: []uint16{1234, 5678},
 					},
-					HttpEndpoints: &[]voc.HttpEndpoint{},
+					HttpEndpoints: []*voc.HttpEndpoint{},
 				},
 				&voc.LoadBalancer{
 					NetworkService: &voc.NetworkService{
@@ -336,7 +336,7 @@ func Test_azureNetworkDiscovery_List(t *testing.T) {
 						Ports: []uint16{1234, 5678},
 						Ips:   []string{},
 					},
-					HttpEndpoints: &[]voc.HttpEndpoint{},
+					HttpEndpoints: []*voc.HttpEndpoint{},
 				},
 				&voc.LoadBalancer{
 					NetworkService: &voc.NetworkService{
@@ -355,7 +355,7 @@ func Test_azureNetworkDiscovery_List(t *testing.T) {
 						Ports: []uint16{1234, 5678},
 						Ips:   []string{},
 					},
-					HttpEndpoints: &[]voc.HttpEndpoint{},
+					HttpEndpoints: []*voc.HttpEndpoint{},
 				},
 				&voc.LoadBalancer{
 					NetworkService: &voc.NetworkService{
@@ -417,7 +417,7 @@ func TestNewAzureNetworkDiscovery(t *testing.T) {
 				&azureDiscovery{
 					discovererComponent: NetworkComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 			},
 		},
@@ -435,7 +435,7 @@ func TestNewAzureNetworkDiscovery(t *testing.T) {
 					},
 					discovererComponent: NetworkComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 			},
 		},
@@ -449,7 +449,7 @@ func TestNewAzureNetworkDiscovery(t *testing.T) {
 					cred:                &mockAuthorizer{},
 					discovererComponent: NetworkComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 			},
 		},
diff --git a/service/discovery/azure/storage_test.go b/service/discovery/azure/storage_test.go
index a8de8417..4501b56b 100644
--- a/service/discovery/azure/storage_test.go
+++ b/service/discovery/azure/storage_test.go
@@ -29,7 +29,6 @@ import (
 	"fmt"
 	"io"
 	"net/http"
-	"reflect"
 	"testing"
 	"time"
 
@@ -322,7 +321,7 @@ func TestNewAzureStorageDiscovery(t *testing.T) {
 				azureDiscovery: &azureDiscovery{
 					discovererComponent: StorageComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				defenderProperties: make(map[string]*defenderProperties),
 			},
@@ -341,7 +340,7 @@ func TestNewAzureStorageDiscovery(t *testing.T) {
 					},
 					discovererComponent: StorageComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				defenderProperties: make(map[string]*defenderProperties),
 			},
@@ -356,7 +355,7 @@ func TestNewAzureStorageDiscovery(t *testing.T) {
 					cred:                &mockAuthorizer{},
 					discovererComponent: StorageComponent,
 					csID:                discovery.DefaultCloudServiceID,
-					backupMap:           make(map[string]map[string]*voc.Backup),
+					backupMap:           make(map[string]*backup),
 				},
 				defenderProperties: make(map[string]*defenderProperties),
 			},
@@ -391,7 +390,7 @@ func TestStorage(t *testing.T) {
 
 	assert.NoError(t, err)
 	assert.NotNil(t, list)
-	assert.Equal(t, 8, len(list))
+	assert.Equal(t, 9, len(list))
 	assert.NotEmpty(t, d.Name())
 }
 
@@ -445,16 +444,10 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 							},
 						},
 						Immutability: &voc.Immutability{Enabled: false},
-						Backup: &voc.Backup{
+						Backups: []*voc.Backup{{
 							Enabled:         true,
 							RetentionPeriod: Duration7Days,
-							GeoLocation:     voc.GeoLocation{Region: "westeurope"},
-							Policy:          "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupPolicies/backupPolicyContainer",
 							Storage:         voc.ResourceID("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/account1-account1-22222222-2222-2222-2222-222222222222"),
-							AtRestEncryption: &voc.AtRestEncryption{
-								Algorithm: "AES256",
-								Enabled:   true,
-							},
 							TransportEncryption: &voc.TransportEncryption{
 								Enforced:   true,
 								Enabled:    true,
@@ -462,9 +455,12 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 								Algorithm:  constants.TLS,
 							},
 						},
+						},
 						ResourceLogging: &voc.ResourceLogging{
-							MonitoringLogDataEnabled: true,
-							SecurityAlertsEnabled:    true,
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: true,
+								SecurityAlertsEnabled:    true,
+							},
 						},
 					},
 					PublicAccess: true,
@@ -489,26 +485,22 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 							},
 						},
 						Immutability: &voc.Immutability{Enabled: false},
-						Backup: &voc.Backup{
+						Backups: []*voc.Backup{{
 							Enabled:         true,
 							RetentionPeriod: Duration7Days,
-							GeoLocation:     voc.GeoLocation{Region: "westeurope"},
-							Policy:          "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupPolicies/backupPolicyContainer",
 							Storage:         voc.ResourceID("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/account1-account1-22222222-2222-2222-2222-222222222222"),
-							AtRestEncryption: &voc.AtRestEncryption{
-								Algorithm: "AES256",
-								Enabled:   true,
-							},
 							TransportEncryption: &voc.TransportEncryption{
 								Enforced:   true,
 								Enabled:    true,
 								TlsVersion: constants.TLS1_2,
 								Algorithm:  constants.TLS,
 							},
-						},
+						}},
 						ResourceLogging: &voc.ResourceLogging{
-							MonitoringLogDataEnabled: true,
-							SecurityAlertsEnabled:    true,
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: true,
+								SecurityAlertsEnabled:    true,
+							},
 						},
 					},
 					PublicAccess: true,
@@ -533,8 +525,10 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 							},
 						},
 						ResourceLogging: &voc.ResourceLogging{
-							MonitoringLogDataEnabled: true,
-							SecurityAlertsEnabled:    true,
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: true,
+								SecurityAlertsEnabled:    true,
+							},
 						},
 					},
 				},
@@ -558,9 +552,12 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 							},
 						},
 						ResourceLogging: &voc.ResourceLogging{
-							MonitoringLogDataEnabled: true,
-							SecurityAlertsEnabled:    true,
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: true,
+								SecurityAlertsEnabled:    true,
+							},
 						},
+						Backups: nil,
 					},
 				},
 				&voc.ObjectStorageService{
@@ -625,9 +622,12 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 						},
 						Immutability: &voc.Immutability{Enabled: false},
 						ResourceLogging: &voc.ResourceLogging{
-							MonitoringLogDataEnabled: true,
-							SecurityAlertsEnabled:    true,
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: true,
+								SecurityAlertsEnabled:    true,
+							},
 						},
+						Backups: nil,
 					},
 					PublicAccess: false,
 				},
@@ -653,9 +653,12 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 						},
 						Immutability: &voc.Immutability{Enabled: false},
 						ResourceLogging: &voc.ResourceLogging{
-							MonitoringLogDataEnabled: true,
-							SecurityAlertsEnabled:    true,
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: true,
+								SecurityAlertsEnabled:    true,
+							},
 						},
+						Backups: nil,
 					},
 					PublicAccess: false,
 				},
@@ -697,6 +700,20 @@ func Test_azureStorageDiscovery_List(t *testing.T) {
 						},
 					},
 				},
+				&voc.ObjectStorage{
+					Storage: &voc.Storage{
+						Resource: &voc.Resource{
+							ID:           "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/res1/providers/Microsoft.DataProtection/backupVaults/backupAccount1/backupInstances/account1-account1-22222222-2222-2222-2222-222222222222",
+							Name:         "account1-account1-22222222-2222-2222-2222-222222222222",
+							ServiceID:    "11111111-1111-1111-1111-111111111111",
+							CreationTime: 0,
+							Type:         voc.ObjectStorageType,
+							GeoLocation: voc.GeoLocation{
+								Region: "westeurope",
+							},
+						},
+					},
+				},
 			},
 			wantErr: assert.NoError,
 		},
@@ -890,7 +907,7 @@ func Test_azureStorageDiscovery_discoverStorageAccounts(t *testing.T) {
 				}
 			} else {
 				assert.Nil(t, err)
-				assert.Equal(t, 8, len(got))
+				assert.Equal(t, 9, len(got))
 			}
 		})
 	}
@@ -1057,6 +1074,13 @@ func Test_handleFileStorage(t *testing.T) {
 							Enabled:   true,
 						},
 					},
+					ResourceLogging: &voc.ResourceLogging{
+						Logging: &voc.Logging{
+							Enabled:                  false,
+							MonitoringLogDataEnabled: false,
+							SecurityAlertsEnabled:    false,
+						},
+					},
 				},
 			},
 			wantErr: assert.NoError,
@@ -1313,6 +1337,12 @@ func Test_handleObjectStorage(t *testing.T) {
 						},
 					},
 					Immutability: &voc.Immutability{Enabled: false},
+					ResourceLogging: &voc.ResourceLogging{
+						Logging: &voc.Logging{
+							MonitoringLogDataEnabled: false,
+							SecurityAlertsEnabled:    false,
+						},
+					},
 				},
 				PublicAccess: false,
 			},
@@ -1409,6 +1439,12 @@ func Test_azureStorageDiscovery_discoverFileStorages(t *testing.T) {
 								Enabled:   true,
 							},
 						},
+						ResourceLogging: &voc.ResourceLogging{
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: false,
+								SecurityAlertsEnabled:    false,
+							},
+						},
 					},
 				},
 				&voc.FileStorage{
@@ -1430,6 +1466,12 @@ func Test_azureStorageDiscovery_discoverFileStorages(t *testing.T) {
 								Enabled:   true,
 							},
 						},
+						ResourceLogging: &voc.ResourceLogging{
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: false,
+								SecurityAlertsEnabled:    false,
+							},
+						},
 					},
 				},
 			},
@@ -1529,6 +1571,12 @@ func Test_azureStorageDiscovery_discoverObjectStorages(t *testing.T) {
 							},
 						},
 						Immutability: &voc.Immutability{Enabled: false},
+						ResourceLogging: &voc.ResourceLogging{
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: false,
+								SecurityAlertsEnabled:    false,
+							},
+						},
 					},
 					PublicAccess: true,
 				},
@@ -1552,6 +1600,12 @@ func Test_azureStorageDiscovery_discoverObjectStorages(t *testing.T) {
 							},
 						},
 						Immutability: &voc.Immutability{Enabled: false},
+						ResourceLogging: &voc.ResourceLogging{
+							Logging: &voc.Logging{
+								MonitoringLogDataEnabled: false,
+								SecurityAlertsEnabled:    false,
+							},
+						},
 					},
 					PublicAccess: true,
 				},
@@ -1576,51 +1630,3 @@ func Test_azureStorageDiscovery_discoverObjectStorages(t *testing.T) {
 		})
 	}
 }
-
-func Test_azureStorageDiscovery_createResourceLogging(t *testing.T) {
-	type fields struct {
-		azureDiscovery     *azureDiscovery
-		defenderProperties map[string]*defenderProperties
-	}
-	tests := []struct {
-		name                string
-		fields              fields
-		wantResourceLogging *voc.ResourceLogging
-	}{
-		{
-			name: "Missing defenderProperties",
-			fields: fields{
-				azureDiscovery:     NewMockAzureDiscovery(newMockStorageSender()),
-				defenderProperties: make(map[string]*defenderProperties),
-			},
-			wantResourceLogging: nil,
-		},
-		{
-			name: "Happy path",
-			fields: fields{
-				azureDiscovery: NewMockAzureDiscovery(newMockStorageSender()),
-				defenderProperties: map[string]*defenderProperties{
-					DefenderStorageType: {
-						monitoringLogDataEnabled: true,
-						securityAlertsEnabled:    true,
-					},
-				},
-			},
-			wantResourceLogging: &voc.ResourceLogging{
-				MonitoringLogDataEnabled: true,
-				SecurityAlertsEnabled:    true,
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			d := &azureStorageDiscovery{
-				azureDiscovery:     tt.fields.azureDiscovery,
-				defenderProperties: tt.fields.defenderProperties,
-			}
-			if gotResourceLogging := d.createResourceLogging(); !reflect.DeepEqual(gotResourceLogging, tt.wantResourceLogging) {
-				t.Errorf("azureStorageDiscovery.createResourceLogging() = %v, want %v", gotResourceLogging, tt.wantResourceLogging)
-			}
-		})
-	}
-}
diff --git a/service/discovery/k8s/network_test.go b/service/discovery/k8s/network_test.go
index 82cb1c8e..e9bd5868 100644
--- a/service/discovery/k8s/network_test.go
+++ b/service/discovery/k8s/network_test.go
@@ -108,13 +108,13 @@ func TestListIngresses(t *testing.T) {
 	assert.True(t, ok)
 	assert.Equal(t, "my-ingress", lb.Name)
 	assert.Equal(t, "/namespaces/my-namespace/ingresses/my-ingress", string(lb.ID))
-	assert.Equal(t, "http://myhost/test", string((*lb.HttpEndpoints)[0].Url))
+	assert.Equal(t, "http://myhost/test", lb.HttpEndpoints[0].Url)
 
 	lb, ok = list[2].(*voc.LoadBalancer)
 
 	assert.True(t, ok)
 	assert.Equal(t, "my-other-ingress", lb.Name)
 	assert.Equal(t, "/namespaces/my-namespace/ingresses/my-other-ingress", string(lb.ID))
-	assert.Equal(t, "https://myhost/test", string((*lb.HttpEndpoints)[0].Url))
-	assert.NotNil(t, (*lb.HttpEndpoints)[0].TransportEncryption)
+	assert.Equal(t, "https://myhost/test", lb.HttpEndpoints[0].Url)
+	assert.NotNil(t, (lb.HttpEndpoints)[0].TransportEncryption)
 }