Framework/Configurations/SVT/Services/Storage.json

{
  "FeatureName": "Storage",
  "Reference": "aka.ms/azsdkosstcp/storage",
  "IsManintenanceMode": false,
  "Controls": [
    {
      "ControlID": "Azure_Storage_AuthN_Dont_Allow_Anonymous",
      "Description": "The Access Type for containers must NOT allow public access with anonymous authentication",
      "Id": "AzureStorage110",
                         "ControlSeverity": "High",
      "Automated": "Yes",
      "MethodName": "CheckStorageContainerPublicAccessTurnOff",
      "Recommendation": "Run command 'Set-AzureStorageContainerAcl -Name '<ContainerName>' -Permission 'Off' -Context '<StorageContext>''. Run 'Get-Help Set-AzureStorageContainerAcl -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Automated",
        "AuthN",
        "OwnerAccess"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_Audit_Issue_Alert_AuthN_Req",
      "Description": "Alerts must be issued for authentication request data",
      "Id": "AzureStorage120",
                         "ControlSeverity": "High",
      "Automated": "Yes",
      "MethodName": "CheckStorageMetricAlert",
      "Recommendation": "Run command 'Add-AzureRmMetricAlertRule -MetricName 'AnonymousSuccess' -Operator 'GreaterThan' -Threshold '0' -TimeAggregationOperator 'Total' -WindowSize '01:00:00' -Actions '<New-AzureRmAlertRuleEmail -SendToServiceOwners>' -Name '<AlertName>' -ResourceGroup '<RGName>' -TargetResourceId '<TargetResourceId>' -Location '<Location>''. Run 'Get-Help Add-AzureRmMetricAlertRule -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Automated",
        "Audit"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_Deploy_Use_Geo_Redundant",
      "Description": "Use geo-redundant storage accounts",
      "Id": "AzureStorage130",
                         "ControlSeverity": "High",
      "Automated": "Yes",
      "MethodName": "CheckStorageGeoRedundantReplication",
      "Recommendation": "Run command 'Set-AzureRmStorageAccount -Name '<StorageAccountName>' -ResourceGroupName '<RGName>' -SkuName '<Standard_GRS/Standard_RAGRS>''. Run 'Get-Help Set-AzureRmStorageAccount -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Automated",
        "Deploy"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_DP_Encrypt_At_Rest_Blob",
      "Description": "Sensitive data in Storage Blob must be encrypted at rest",
      "Id": "AzureStorage140",
                         "ControlSeverity": "High",
      "Automated": "Yes",
      "MethodName": "CheckStorageBlobEncryptionEnabled",
      "Recommendation": "Run command 'Set-AzureRmStorageAccount -Name '<StorageAccountName>' -ResourceGroupName '<RGName>' -EnableEncryptionService 'Blob''. Run 'Get-Help Set-AzureRmStorageAccount -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Automated",
        "DP"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_Audit_AuthN_Requests",
      "Description": "Storage Account must be configured to log and monitor authentication request data",
      "Id": "AzureStorage150",
                         "ControlSeverity": "Medium",
      "Automated": "Yes",
      "MethodName": "CheckStorageEnableDiagnosticsLog",
      "Recommendation": "Run command 'Set-AzureStorageServiceLoggingProperty -ServiceType '<Blob/Queue/Table>' -LoggingOperations 'All' -Context '<StorageContext>' -RetentionDays '365' -PassThru'. Run 'Get-Help Set-AzureStorageServiceLoggingProperty -full' to get the complete details about this command. Set-AzureStorageServiceMetricsProperty -MetricsType 'Hour' -ServiceType '<Blob/Queue/Table/File>' -Context '<StorageContext>' -MetricsLevel 'ServiceAndApi' -RetentionDays '365' -PassThru. Run 'Get-Help Set-AzureStorageServiceMetricsProperty -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Automated",
        "Audit",
        "OwnerAccess"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_DP_Encrypt_In_Transit",
      "Description": "HTTPS protocol must be used for accessing Storage Account resources",
      "Id": "AzureStorage160",
                         "ControlSeverity": "High",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "Connection to Storage Account can be established using either SAS token or connection string. Refer https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1 to connect to Storage Account using HTTPS configured SAS token. Refer https://docs.microsoft.com/en-us/azure/storage/storage-configure-connection-string to connect to Storage Account using HTTPS configured connection string.",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "DP"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_AuthZ_Use_IP_ACL",
      "Description": "Storage Account must be ACL'd to only permit access from intended IP addresses",
      "Id": "AzureStorage180",
                         "ControlSeverity": "Medium",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "IP address restriction can be configured on the SAS token used to connect to Storage Account. Refer https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1 for more details.",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "AuthZ"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_AuthZ_Clients_Use_SAS",
      "Description": "Client / End user apps should always access Storage Account through SAS token only",
      "Id": "AzureStorage190",
                         "ControlSeverity": "High",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "SAS token provides limited access to the clients accessing Storage Account, without exposing the account key. Refer https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1 for details on creating SAS token.",
      "Tags": [
        "SDL",
        "Best Practice",
        "Manual",
        "AuthZ"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_DP_Rotate_Keys",
      "Description": "Storage Account keys must be rotated periodically",
      "Id": "AzureStorage200",
                         "ControlSeverity": "Medium",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "Run command 'New-AzureRmStorageAccountKey -KeyName '<key1/key2>' -Name '<StorageAccountName>' -ResourceGroupName '<RGName>' to regenerate the account keys. Run 'Get-Help New-AzureRmStorageAccountKey -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "DP"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_AuthZ_Allow_Limited_Access_to_Services",
      "Description": "Service-level Shared Access Signatures (SAS) with Stored Access Policies must be used to grant limited access to services in the Storage Account.",
      "Id": "AzureStorage210",
                         "ControlSeverity": "High",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "Refer https://docs.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-1#controlling-a-sas-with-a-stored-access-policy for details on creating SAS token with Stored Access Policy",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "AuthZ"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_DP_Encrypt_At_Rest_Table",
      "Description": "Sensitive data in Storage Table must be encrypted at rest",
      "Id": "AzureStorage220",
                         "ControlSeverity": "High",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "Refer https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption for details on encrypting Storage Table content.",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "DP"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_DP_Encrypt_At_Rest_Queue",
      "Description": "Sensitive data in Storage Queue must be encrypted at rest",
      "Id": "AzureStorage230",
                         "ControlSeverity": "High",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "Refer https://docs.microsoft.com/en-us/azure/storage/storage-client-side-encryption for details on encrypting Storage Queue content.",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "DP"
      ],
      "Enabled": true
    },
    {
      "ControlID": "Azure_Storage_DP_Encrypt_At_Rest_File",
      "Description": "Sensitive data in Storage File must be encrypted at rest",
      "Id": "AzureStorage240",
                         "ControlSeverity": "High",
      "Automated": "No",
      "MethodName": "",
      "Recommendation": "Run command 'Set-AzureRmStorageAccount -Name '<StorageAccountName>' -ResourceGroupName '<RGName>' -EnableEncryptionService 'File''. Run 'Get-Help Set-AzureRmStorageAccount -full' to get the complete details about this command.",
      "Tags": [
        "SDL",
        "TCP",
        "Manual",
        "DP"
      ],
      "Enabled": true
    }
  ]
}