Skip to content

Commit 463a4db

Browse files
authored
Fixed Azure.Storage.SecureTransfer Azure#2414 (Azure#2416)
1 parent 9a1297b commit 463a4db

File tree

6 files changed

+83
-57
lines changed

6 files changed

+83
-57
lines changed

docs/CHANGELOG-v1.md

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ What's changed since pre-release v1.30.0-B0047:
2929
- Engineering:
3030
- Bump Microsoft.NET.Test.Sdk to v17.7.2.
3131
[#2407](https://github.com/Azure/PSRule.Rules.Azure/pull/2407)
32+
- Bug fixes:
33+
- Fixed false positive with `Azure.Storage.SecureTransfer` on new API versions by @BernieWhite.
34+
[#2414](https://github.com/Azure/PSRule.Rules.Azure/issues/2414)
3235

3336
## v1.30.0-B0047 (pre-release)
3437

+41-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
---
2+
reviewed: 2023-09-02
23
severity: Important
34
pillar: Security
45
category: Encryption
@@ -23,6 +24,9 @@ To do this set the _Secure transfer required_ option.
2324
When _secure transfer required_ is enabled,
2425
attempts to connect to storage using HTTP or unencrypted SMB connections are rejected.
2526

27+
Storage Accounts that are deployed with a newer API version will have this option enabled by default.
28+
However, this does not prevent the option from being disabled.
29+
2630
## RECOMMENDATION
2731

2832
Storage accounts should only accept secure traffic.
@@ -35,59 +39,72 @@ Also consider using Azure Policy to audit or enforce this configuration.
3539

3640
To deploy Storage Accounts that pass this rule:
3741

38-
- Set the `properties.supportsHttpsTrafficOnly` property to `true`.
42+
- For API versions older then _2019-04-01_, set the `properties.supportsHttpsTrafficOnly` property to `true`.
43+
- For API versions _2019-04-01_ and newer:
44+
- Omit the `properties.supportsHttpsTrafficOnly` property OR
45+
- Explicitly set the `properties.supportsHttpsTrafficOnly` property to `true`.
3946

4047
For example:
4148

4249
```json
4350
{
44-
"comments": "Storage Account",
45-
"type": "Microsoft.Storage/storageAccounts",
46-
"apiVersion": "2019-06-01",
47-
"name": "st0000001",
48-
"location": "[parameters('location')]",
49-
"sku": {
50-
"name": "Standard_GRS",
51-
"tier": "Standard"
52-
},
53-
"kind": "StorageV2",
54-
"properties": {
55-
"supportsHttpsTrafficOnly": true,
56-
"minimumTlsVersion": "TLS1_2",
57-
"allowBlobPublicAccess": false,
58-
"accessTier": "Hot"
51+
"type": "Microsoft.Storage/storageAccounts",
52+
"apiVersion": "2023-01-01",
53+
"name": "[parameters('name')]",
54+
"location": "[parameters('location')]",
55+
"sku": {
56+
"name": "Standard_GRS"
57+
},
58+
"kind": "StorageV2",
59+
"properties": {
60+
"allowBlobPublicAccess": false,
61+
"supportsHttpsTrafficOnly": true,
62+
"minimumTlsVersion": "TLS1_2",
63+
"accessTier": "Hot",
64+
"allowSharedKeyAccess": false,
65+
"networkAcls": {
66+
"defaultAction": "Deny"
5967
}
68+
}
6069
}
6170
```
6271

6372
### Configure with Bicep
6473

6574
To deploy Storage Accounts that pass this rule:
6675

67-
- Set the `properties.supportsHttpsTrafficOnly` property to `true`.
76+
- For API versions older then _2019-04-01_, set the `properties.supportsHttpsTrafficOnly` property to `true`.
77+
- For API versions _2019-04-01_ and newer:
78+
- Omit the `properties.supportsHttpsTrafficOnly` property OR
79+
- Explicitly set the `properties.supportsHttpsTrafficOnly` property to `true`.
6880

6981
For example:
7082

7183
```bicep
72-
resource st0000001 'Microsoft.Storage/storageAccounts@2021-04-01' = {
73-
name: 'st0000001'
84+
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
85+
name: name
7486
location: location
7587
sku: {
7688
name: 'Standard_GRS'
7789
}
7890
kind: 'StorageV2'
7991
properties: {
80-
supportsHttpsTrafficOnly: true
81-
accessTier: 'Hot'
8292
allowBlobPublicAccess: false
93+
supportsHttpsTrafficOnly: true
8394
minimumTlsVersion: 'TLS1_2'
95+
accessTier: 'Hot'
96+
allowSharedKeyAccess: false
97+
networkAcls: {
98+
defaultAction: 'Deny'
99+
}
84100
}
85101
}
86102
```
87103

88104
## LINKS
89105

90106
- [Data encryption in Azure](https://learn.microsoft.com/azure/architecture/framework/security/design-storage-encryption#data-in-transit)
91-
- [Require secure transfer in Azure Storage](https://docs.microsoft.com/azure/storage/common/storage-require-secure-transfer)
92-
- [Sample policy for ensuring https traffic](https://docs.microsoft.com/azure/governance/policy/samples/ensure-https-stor-acct)
93-
- [Azure deployment reference](https://docs.microsoft.com/azure/templates/microsoft.storage/storageaccounts)
107+
- [Require secure transfer in Azure Storage](https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer)
108+
- [DP-3: Encrypt sensitive data in transit](https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline#dp-3-encrypt-sensitive-data-in-transit)
109+
- [Sample policy for ensuring https traffic](https://learn.microsoft.com/azure/governance/policy/samples/built-in-policies#storage)
110+
- [Azure deployment reference](https://learn.microsoft.com/azure/templates/microsoft.storage/storageaccounts)

docs/examples-storage.bicep

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var containerName = 'data'
1616
var shareName = 'group'
1717

1818
// An example Storage Account
19-
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
19+
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
2020
name: name
2121
location: location
2222
sku: {
@@ -36,7 +36,7 @@ resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
3636
}
3737

3838
// Configure blob services
39-
resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2021-06-01' = {
39+
resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2023-01-01' = {
4040
parent: storageAccount
4141
name: 'default'
4242
properties: {
@@ -52,7 +52,7 @@ resource blobService 'Microsoft.Storage/storageAccounts/blobServices@2021-06-01'
5252
}
5353

5454
// An example container
55-
resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-06-01' = {
55+
resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {
5656
parent: blobService
5757
name: containerName
5858
properties: {
@@ -61,7 +61,7 @@ resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@20
6161
}
6262

6363
// Configure file services
64-
resource fileServices 'Microsoft.Storage/storageAccounts/fileServices@2021-06-01' = {
64+
resource fileServices 'Microsoft.Storage/storageAccounts/fileServices@2023-01-01' = {
6565
parent: storageAccount
6666
name: 'default'
6767
properties: {
@@ -72,7 +72,7 @@ resource fileServices 'Microsoft.Storage/storageAccounts/fileServices@2021-06-01
7272
}
7373
}
7474

75-
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2021-06-01' = {
75+
resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {
7676
parent: fileServices
7777
name: shareName
7878
properties: {

docs/examples-storage.json

+20-20
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
{
22
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
3+
"languageVersion": "1.10-experimental",
34
"contentVersion": "1.0.0.0",
45
"metadata": {
6+
"_EXPERIMENTAL_WARNING": "Symbolic name support in ARM is experimental, and should be enabled for testing purposes only. Do not enable this setting for any production usage, or you may be unexpectedly broken at any time!",
57
"_generator": {
68
"name": "bicep",
7-
"version": "0.4.1124.51302",
8-
"templateHash": "4901265845278602446"
9+
"version": "0.20.4.51522",
10+
"templateHash": "6814134128727565933"
911
}
1012
},
1113
"parameters": {
@@ -27,10 +29,10 @@
2729
"containerName": "data",
2830
"shareName": "group"
2931
},
30-
"resources": [
31-
{
32+
"resources": {
33+
"storageAccount": {
3234
"type": "Microsoft.Storage/storageAccounts",
33-
"apiVersion": "2021-06-01",
35+
"apiVersion": "2023-01-01",
3436
"name": "[parameters('name')]",
3537
"location": "[parameters('location')]",
3638
"sku": {
@@ -48,9 +50,9 @@
4850
}
4951
}
5052
},
51-
{
53+
"blobService": {
5254
"type": "Microsoft.Storage/storageAccounts/blobServices",
53-
"apiVersion": "2021-06-01",
55+
"apiVersion": "2023-01-01",
5456
"name": "[format('{0}/{1}', parameters('name'), 'default')]",
5557
"properties": {
5658
"deleteRetentionPolicy": {
@@ -63,24 +65,23 @@
6365
}
6466
},
6567
"dependsOn": [
66-
"[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
68+
"storageAccount"
6769
]
6870
},
69-
{
71+
"container": {
7072
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
71-
"apiVersion": "2021-06-01",
73+
"apiVersion": "2023-01-01",
7274
"name": "[format('{0}/{1}/{2}', parameters('name'), 'default', variables('containerName'))]",
7375
"properties": {
7476
"publicAccess": "None"
7577
},
7678
"dependsOn": [
77-
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('name'), 'default')]",
78-
"[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
79+
"blobService"
7980
]
8081
},
81-
{
82+
"fileServices": {
8283
"type": "Microsoft.Storage/storageAccounts/fileServices",
83-
"apiVersion": "2021-06-01",
84+
"apiVersion": "2023-01-01",
8485
"name": "[format('{0}/{1}', parameters('name'), 'default')]",
8586
"properties": {
8687
"shareDeleteRetentionPolicy": {
@@ -89,20 +90,19 @@
8990
}
9091
},
9192
"dependsOn": [
92-
"[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
93+
"storageAccount"
9394
]
9495
},
95-
{
96+
"share": {
9697
"type": "Microsoft.Storage/storageAccounts/fileServices/shares",
97-
"apiVersion": "2021-06-01",
98+
"apiVersion": "2023-01-01",
9899
"name": "[format('{0}/{1}/{2}', parameters('name'), 'default', variables('shareName'))]",
99100
"properties": {
100101
"accessTier": "TransactionOptimized"
101102
},
102103
"dependsOn": [
103-
"[resourceId('Microsoft.Storage/storageAccounts/fileServices', parameters('name'), 'default')]",
104-
"[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
104+
"fileServices"
105105
]
106106
}
107-
]
107+
}
108108
}

src/PSRule.Rules.Azure/rules/Azure.Storage.Rule.yaml

+13-6
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,24 @@ metadata:
5454
name: Azure.Storage.SecureTransfer
5555
ref: AZR-000196
5656
tags:
57-
release: 'GA'
58-
ruleSet: '2020_06'
59-
Azure.WAF/pillar: 'Security'
57+
release: GA
58+
ruleSet: 2020_06
59+
Azure.WAF/pillar: Security
6060
labels:
61-
Azure.MCSB.v1/control: 'DP-3'
61+
Azure.MCSB.v1/control: DP-3
6262
spec:
6363
type:
6464
- Microsoft.Storage/storageAccounts
6565
condition:
66-
field: properties.supportsHttpsTrafficOnly
67-
equals: true
66+
anyOf:
67+
- allOf:
68+
- field: apiVersion
69+
apiVersion: '>=2019-04-01'
70+
- field: properties.supportsHttpsTrafficOnly
71+
hasDefault: true
72+
- allOf:
73+
- field: properties.supportsHttpsTrafficOnly
74+
equals: true
6875

6976
---
7077
# Synopsis: Disallow blob containers with public access types.

tests/PSRule.Rules.Azure.Tests/Resources.Storage.Template.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@
9999
{
100100
"comments": "Storage Account",
101101
"type": "Microsoft.Storage/storageAccounts",
102-
"apiVersion": "2019-06-01",
102+
"apiVersion": "2022-09-01",
103103
"name": "[parameters('storageAccountName')]",
104104
"location": "[parameters('location')]",
105105
"sku": {
@@ -116,7 +116,6 @@
116116
],
117117
"defaultAction": "Deny"
118118
},
119-
"supportsHttpsTrafficOnly": true,
120119
"encryption": {
121120
"services": {
122121
"file": {

0 commit comments

Comments
 (0)