Skip to content

Commit 2a190d4

Browse files
authored
Updated and renamed baselines #27 (#28)
1 parent 1021649 commit 2a190d4

11 files changed

Lines changed: 51 additions & 25 deletions

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## Unreleased
44

5+
- **Breaking change**: Updated and renamed baselines make them easier to use. [#27](https://github.com/BernieWhite/PSRule.Rules.Kubernetes/issues/27)
6+
- `KubeBaseline` is now `Kubernetes`, the default baseline.
7+
- `AKSBaseline` is now `AKS`.
8+
- The `Kubernetes` baseline include common Kubernetes rules.
9+
- The `AKS` baseline include all of `Kubernetes` plus additional AKS specific rules.
10+
511
## v0.1.0-B1912003 (pre-release)
612

713
- Fixed `Kubernetes.AKS.PublicLB` handling of internal LB annotation. [#17](https://github.com/BernieWhite/PSRule.Rules.Kubernetes/issues/17)

README.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ Kubernetes.Pod.Resources Fail Resource requirements are set for
6363
Kubernetes.Pod.Secrets Pass Use Kubernetes secrets to store information such as passwords or connec…
6464
Kubernetes.Pod.Health Fail Containers should use liveness and readiness probes.
6565
Kubernetes.Pod.Replicas Fail Consider increasing replicas to two or more to provide high availabilit…
66-
Kubernetes.AKS.PublicLB Pass Consider creating services with an internal load balancer instead of a …
6766
Kubernetes.Metadata Fail Consider applying recommended labels defined by Kubernetes.…
6867
6968
TargetName: azure-vote-front
@@ -78,7 +77,6 @@ Kubernetes.Pod.Resources Fail Resource requirements are set for
7877
Kubernetes.Pod.Secrets Pass Use Kubernetes secrets to store information such as passwords or connec…
7978
Kubernetes.Pod.Health Fail Containers should use liveness and readiness probes.
8079
Kubernetes.Pod.Replicas Fail Consider increasing replicas to two or more to provide high availabilit…
81-
Kubernetes.AKS.PublicLB Fail Consider creating services with an internal load balancer instead of a …
8280
Kubernetes.Metadata Fail Consider applying recommended labels defined by Kubernetes.…
8381
```
8482

@@ -99,6 +97,23 @@ In the example above:
9997
- `-Format Yaml` - indicates that the input is YAML.
10098
- `-ObjectPath items` - indicates that the input nests objects to evaluate under the `items` property.
10199

100+
### Using baselines
101+
102+
PSRule for Kubernetes comes with the following baselines:
103+
104+
- `Kubernetes` - Includes common Kubernetes rules. This is the default.
105+
- `AKS` - Includes all the rules from `Kubernetes` plus additional Azure Kubernetes Service (AKS) specific rules.
106+
107+
To use the `AKS` baseline instead of the default use `Invoke-PSRule -Baseline AKS`.
108+
109+
For example:
110+
111+
```powershell
112+
Invoke-PSRule -f $sourceUrl -Module 'PSRule.Rules.Kubernetes' -Baseline AKS;
113+
```
114+
115+
If `-Baseline AKS` is not specified, the default baseline `Kubernetes` will be used.
116+
102117
### Additional options
103118

104119
To filter results to only failed rules, use `Invoke-PSRule -Outcome Fail`.
@@ -125,7 +140,6 @@ The output of this example is:
125140
```text
126141
RuleName Pass Fail Outcome
127142
-------- ---- ---- -------
128-
Kubernetes.AKS.PublicLB 1 1 Fail
129143
Kubernetes.API.Removal 0 2 Fail
130144
Kubernetes.Metadata 0 4 Fail
131145
Kubernetes.Pod.PrivilegeEscalation 0 2 Fail

pipeline.build.ps1

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,15 @@ task VersionModule ModuleDependencies, {
100100
$manifest = Test-ModuleManifest -Path $manifestPath;
101101
$requiredModules = $manifest.RequiredModules | ForEach-Object -Process {
102102
if ($_.Name -eq 'PSRule' -and $Configuration -eq 'Release') {
103-
@{ ModuleName = 'PSRule'; ModuleVersion = '0.11.0' }
103+
@{ ModuleName = 'PSRule'; ModuleVersion = '0.12.0' }
104104
}
105105
else {
106106
@{ ModuleName = $_.Name; ModuleVersion = $_.Version }
107107
}
108108
};
109109
Update-ModuleManifest -Path $manifestPath -RequiredModules $requiredModules;
110110
$manifestContent = Get-Content -Path $manifestPath -Raw;
111-
$manifestContent = $manifestContent -replace 'PSRule = ''System.Collections.Hashtable''', 'PSRule = @{ Baseline = ''KubeBaseline'' }';
111+
$manifestContent = $manifestContent -replace 'PSRule = ''System.Collections.Hashtable''', 'PSRule = @{ Baseline = ''Kubernetes'' }';
112112
$manifestContent | Set-Content -Path $manifestPath;
113113
}
114114

@@ -150,8 +150,8 @@ task PSScriptAnalyzer NuGet, {
150150

151151
# Synopsis: Install PSRule
152152
task PSRule NuGet, {
153-
if ($Null -eq (Get-InstalledModule -Name PSRule -MinimumVersion 0.11.0 -ErrorAction Ignore)) {
154-
Install-Module -Name PSRule -MinimumVersion 0.11.0 -Scope CurrentUser -Force;
153+
if ($Null -eq (Get-InstalledModule -Name PSRule -MinimumVersion 0.12.0 -ErrorAction Ignore)) {
154+
Install-Module -Name PSRule -MinimumVersion 0.12.0 -Scope CurrentUser -Force;
155155
}
156156
Import-Module -Name PSRule -Verbose:$False;
157157
}
@@ -238,9 +238,9 @@ task BuildHelp BuildModule, PlatyPS, {
238238
}
239239

240240
# Copy generated help into module out path
241-
# $Null = Copy-Item -Path out/docs/PSRule.Rules.Kubernetes/ -Destination out/modules/PSRule.Rules.Kubernetes/en-US/ -Recurse;
242-
# $Null = Copy-Item -Path out/docs/PSRule.Rules.Kubernetes/ -Destination out/modules/PSRule.Rules.Kubernetes/en-AU/ -Recurse;
243-
# $Null = Copy-Item -Path out/docs/PSRule.Rules.Kubernetes/ -Destination out/modules/PSRule.Rules.Kubernetes/en-GB/ -Recurse;
241+
# $Null = Copy-Item -Path out/docs/PSRule.Rules.Kubernetes/* -Destination out/modules/PSRule.Rules.Kubernetes/en-US/ -Recurse;
242+
# $Null = Copy-Item -Path out/docs/PSRule.Rules.Kubernetes/* -Destination out/modules/PSRule.Rules.Kubernetes/en-AU/ -Recurse;
243+
# $Null = Copy-Item -Path out/docs/PSRule.Rules.Kubernetes/* -Destination out/modules/PSRule.Rules.Kubernetes/en-GB/ -Recurse;
244244
$Null = Copy-Item -Path docs/rules/en-US/*.md -Destination out/modules/PSRule.Rules.Kubernetes/en-US/;
245245
$Null = Copy-Item -Path docs/rules/en-US/*.md -Destination out/modules/PSRule.Rules.Kubernetes/en-AU/;
246246
$Null = Copy-Item -Path docs/rules/en-US/*.md -Destination out/modules/PSRule.Rules.Kubernetes/en-GB/;

src/PSRule.Rules.Kubernetes/PSRule.Rules.Kubernetes.psd1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ FunctionsToExport = @()
7575
CmdletsToExport = @()
7676

7777
# Variables to export from this module
78-
VariablesToExport = '*'
78+
VariablesToExport = @()
7979

8080
# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
8181
AliasesToExport = @()
@@ -108,7 +108,7 @@ PrivateData = @{
108108
ReleaseNotes = 'https://github.com/BernieWhite/PSRule.Rules.Kubernetes/blob/master/CHANGELOG.md'
109109
} # End of PSData hashtable
110110
PSRule = @{
111-
Baseline = 'KubeBaseline'
111+
Baseline = 'Kubernetes'
112112
}
113113
} # End of PrivateData hashtable
114114

src/PSRule.Rules.Kubernetes/rules/Baseline.Rule.yaml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Synopsis: A baseline for Kubernetes.
44
kind: Baseline
55
metadata:
6-
name: KubeBaseline
6+
name: Kubernetes
77
spec:
88
binding:
99
targetName:
@@ -12,12 +12,15 @@ spec:
1212
- kind
1313
field:
1414
namespace: [ 'metadata.namespace' ]
15+
rule:
16+
tag:
17+
group: core
1518

1619
---
1720
# Synopsis: A baseline for Azure Kubernetes Service (AKS).
1821
kind: Baseline
1922
metadata:
20-
name: AKSBaseline
23+
name: AKS
2124
spec:
2225
binding:
2326
targetName:
@@ -26,3 +29,6 @@ spec:
2629
- kind
2730
field:
2831
namespace: [ 'metadata.namespace' ]
32+
rule:
33+
tag:
34+
group: [ 'core', 'AKS' ]

src/PSRule.Rules.Kubernetes/rules/Kubernetes.AKS.Rule.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44

55
# Synopsis: Services should not include a public load balancer
6-
Rule 'Kubernetes.AKS.PublicLB' -Type Service -Tag @{ category = 'Pod security' } -If { $PSRule.TargetName -ne 'addon-http-application-routing-nginx-ingress' } {
6+
Rule 'Kubernetes.AKS.PublicLB' -Type Service -If { $PSRule.TargetName -ne 'addon-http-application-routing-nginx-ingress' } -Tag @{ group = 'AKS' } {
77
if ($Assert.HasFieldValue($TargetObject, 'spec.type', 'LoadBalancer').Result) {
88
Within 'metadata.annotations.''service.beta.kubernetes.io/azure-load-balancer-internal''' 'true'
99
}

src/PSRule.Rules.Kubernetes/rules/Kubernetes.API.Rule.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44

55
# Synopsis: Avoid using legacy API endpoints
6-
Rule 'Kubernetes.API.Removal' -Type DaemonSet, Deployment, StatefulSet, ReplicaSet, NetworkPolicy, PodSecurityPolicy -Tag @{ category = 'API' } {
6+
Rule 'Kubernetes.API.Removal' -Type DaemonSet, Deployment, StatefulSet, ReplicaSet, NetworkPolicy, PodSecurityPolicy -Tag @{ group = 'core' } {
77
if ($PSRule.TargetType -in 'DaemonSet', 'Deployment', 'StatefulSet', 'ReplicaSet') {
88
$TargetObject.apiVersion -eq 'apps/v1'
99
}

src/PSRule.Rules.Kubernetes/rules/Kubernetes.Metadata.Rule.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44

55
# Synopsis: Use recommended labels
6-
Rule 'Kubernetes.Metadata' -Type 'Deployment', 'Service', 'ReplicaSet', 'Pod' -Tag @{ category = 'Resource management'; } {
6+
Rule 'Kubernetes.Metadata' -Type 'Deployment', 'Service', 'ReplicaSet', 'Pod' -Tag @{ group = 'core' } {
77
Exists 'metadata.labels.''app.kubernetes.io/name''' -Reason ($LocalizedData.RecommendLabel -f 'app.kubernetes.io/name')
88
Exists 'metadata.labels.''app.kubernetes.io/instance''' -Reason ($LocalizedData.RecommendLabel -f 'app.kubernetes.io/instance')
99
Exists 'metadata.labels.''app.kubernetes.io/version''' -Reason ($LocalizedData.RecommendLabel -f 'app.kubernetes.io/version')

src/PSRule.Rules.Kubernetes/rules/Kubernetes.Pod.Rule.ps1

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@
33
#
44

55
# Synopsis: Containers should deny privilege escalation
6-
Rule 'Kubernetes.Pod.PrivilegeEscalation' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ category = 'Pod security'; } {
6+
Rule 'Kubernetes.Pod.PrivilegeEscalation' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ group = 'core' } {
77
foreach ($container in (GetContainerSpec)) {
88
$container | Exists 'securityContext.allowPrivilegeEscalation'
99
$container.securityContext.allowPrivilegeEscalation -eq $False
1010
}
1111
}
1212

1313
# Synopsis: Containers should use specific tags instead of latest
14-
Rule 'Kubernetes.Pod.Latest' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ category = 'Pod security'; } {
14+
Rule 'Kubernetes.Pod.Latest' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ group = 'core' } {
1515
foreach ($container in (GetContainerSpec)) {
1616
$container.image -like '*:*' -and
1717
$container.image -notlike '*:latest'
1818
}
1919
}
2020

2121
# Synopsis: Resource requirements are set for each container
22-
Rule 'Kubernetes.Pod.Resources' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ category = 'Resource management'; } {
22+
Rule 'Kubernetes.Pod.Resources' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ group = 'core' } {
2323
foreach ($container in (GetContainerSpec)) {
2424
$container | Exists 'resources.requests.cpu' -Reason $LocalizedData.PodCPURequest
2525
$container | Exists 'resources.requests.memory' -Reason $LocalizedData.PodMemRequest
@@ -29,7 +29,7 @@ Rule 'Kubernetes.Pod.Resources' -Type Deployment, Pod, ReplicaSet -If { (HasCont
2929
}
3030

3131
# Synopsis: Sensitive environment variables should be secured
32-
Rule 'Kubernetes.Pod.Secrets' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ category = 'Pod security'; } {
32+
Rule 'Kubernetes.Pod.Secrets' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ group = 'core' } {
3333
foreach ($container in (GetContainerSpec)) {
3434
if ($Assert.HasField($container, 'env').Result) {
3535
foreach ($variable in $container.env) {
@@ -48,7 +48,7 @@ Rule 'Kubernetes.Pod.Secrets' -Type Deployment, Pod, ReplicaSet -If { (HasContai
4848
}
4949

5050
# Synopsis: Containers should use liveness and readiness probes
51-
Rule 'Kubernetes.Pod.Health' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ category = 'Reliability'; } {
51+
Rule 'Kubernetes.Pod.Health' -Type Deployment, Pod, ReplicaSet -If { (HasContainerSpec) } -Tag @{ group = 'core' } {
5252
foreach ($container in (GetContainerSpec)) {
5353
$container | Exists 'livenessProbe' -Reason ($LocalizedData.LivenessProbe -f $container.name)
5454
}
@@ -58,7 +58,7 @@ Rule 'Kubernetes.Pod.Health' -Type Deployment, Pod, ReplicaSet -If { (HasContain
5858
}
5959

6060
# Synopsis: Use two or more replicas
61-
Rule 'Kubernetes.Pod.Replicas' -Type Deployment, ReplicaSet, StatefulSet -Tag @{ category = 'Reliability'; } {
61+
Rule 'Kubernetes.Pod.Replicas' -Type Deployment, ReplicaSet, StatefulSet -Tag @{ group = 'core' } {
6262
Exists 'spec.replicas'
6363
$TargetObject.spec.replicas -ge 2
6464
}

tests/PSRule.Rules.Kubernetes.Tests/Kubernetes.AKS.Tests.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ $here = (Resolve-Path $PSScriptRoot).Path;
2323
Describe 'Kubernetes.AKS' {
2424
$testParams = @{
2525
Module = 'PSRule.Rules.Kubernetes'
26-
# Option = Join-Path -Path $here -ChildPath ps-rule.yaml
2726
InputPath = Join-Path -Path $here -ChildPath Resources.AKS.yaml
27+
Baseline = 'AKS'
2828
}
2929

3030
$result = Invoke-PSRule @testParams -WarningAction Ignore;

0 commit comments

Comments
 (0)