Skip to content

Commit 86714bf

Browse files
authored
feat(cloudformation): add support for logging and endpoint access for EKS (#6440)
1 parent a758392 commit 86714bf

File tree

2 files changed

+103
-33
lines changed

2 files changed

+103
-33
lines changed

pkg/iac/adapters/cloudformation/aws/eks/cluster.go

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,83 @@ func getClusters(ctx parser.FileContext) (clusters []eks.Cluster) {
1212

1313
for _, r := range clusterResources {
1414
cluster := eks.Cluster{
15-
Metadata: r.Metadata(),
16-
// Logging not supported for cloudformation https://github.com/aws/containers-roadmap/issues/242
17-
// TODO: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-logging
18-
Logging: eks.Logging{
19-
Metadata: r.Metadata(),
20-
API: iacTypes.BoolUnresolvable(r.Metadata()),
21-
Audit: iacTypes.BoolUnresolvable(r.Metadata()),
22-
Authenticator: iacTypes.BoolUnresolvable(r.Metadata()),
23-
ControllerManager: iacTypes.BoolUnresolvable(r.Metadata()),
24-
Scheduler: iacTypes.BoolUnresolvable(r.Metadata()),
25-
},
26-
Encryption: getEncryptionConfig(r),
27-
// endpoint protection not supported - https://github.com/aws/containers-roadmap/issues/242
28-
// TODO: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-resourcesvpcconfig
29-
PublicAccessEnabled: iacTypes.BoolUnresolvable(r.Metadata()),
30-
PublicAccessCIDRs: nil,
15+
Metadata: r.Metadata(),
16+
Logging: getLogging(r),
17+
Encryption: getEncryptionConfig(r),
18+
PublicAccessEnabled: r.GetBoolProperty("ResourcesVpcConfig.EndpointPublicAccess"),
19+
PublicAccessCIDRs: getPublicCIDRs(r),
3120
}
3221

3322
clusters = append(clusters, cluster)
3423
}
3524
return clusters
3625
}
3726

27+
func getPublicCIDRs(r *parser.Resource) []iacTypes.StringValue {
28+
publicAccessCidrs := r.GetProperty("ResourcesVpcConfig.PublicAccessCidrs")
29+
if publicAccessCidrs.IsNotList() {
30+
return nil
31+
}
32+
33+
var cidrs []iacTypes.StringValue
34+
for _, el := range publicAccessCidrs.AsList() {
35+
cidrs = append(cidrs, el.AsStringValue())
36+
}
37+
38+
return cidrs
39+
}
40+
3841
func getEncryptionConfig(r *parser.Resource) eks.Encryption {
3942

40-
encryption := eks.Encryption{
43+
encryptionConfigs := r.GetProperty("EncryptionConfig")
44+
if encryptionConfigs.IsNotList() {
45+
return eks.Encryption{
46+
Metadata: r.Metadata(),
47+
}
48+
}
49+
50+
for _, encryptionConfig := range encryptionConfigs.AsList() {
51+
resources := encryptionConfig.GetProperty("Resources")
52+
hasSecrets := resources.IsList() && resources.Contains("secrets")
53+
return eks.Encryption{
54+
Metadata: encryptionConfig.Metadata(),
55+
KMSKeyID: encryptionConfig.GetStringProperty("Provider.KeyArn"),
56+
Secrets: iacTypes.Bool(hasSecrets, resources.Metadata()),
57+
}
58+
}
59+
60+
return eks.Encryption{
4161
Metadata: r.Metadata(),
42-
Secrets: iacTypes.BoolDefault(false, r.Metadata()),
43-
KMSKeyID: iacTypes.StringDefault("", r.Metadata()),
44-
}
45-
46-
// TODO: EncryptionConfig is a list
47-
// https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-encryptionconfig
48-
if encProp := r.GetProperty("EncryptionConfig"); encProp.IsNotNil() {
49-
encryption.Metadata = encProp.Metadata()
50-
encryption.KMSKeyID = encProp.GetStringProperty("Provider.KeyArn")
51-
resourcesProp := encProp.GetProperty("Resources")
52-
if resourcesProp.IsList() {
53-
if resourcesProp.Contains("secrets") {
54-
encryption.Secrets = iacTypes.Bool(true, resourcesProp.Metadata())
55-
}
62+
}
63+
}
64+
65+
func getLogging(r *parser.Resource) eks.Logging {
66+
enabledTypes := r.GetProperty("Logging.ClusterLogging.EnabledTypes")
67+
if enabledTypes.IsNotList() {
68+
return eks.Logging{
69+
Metadata: r.Metadata(),
5670
}
5771
}
5872

59-
return encryption
73+
logging := eks.Logging{
74+
Metadata: enabledTypes.Metadata(),
75+
}
76+
77+
for _, typeConf := range enabledTypes.AsList() {
78+
switch typ := typeConf.GetProperty("Type"); typ.AsString() {
79+
case "api":
80+
logging.API = iacTypes.Bool(true, typ.Metadata())
81+
case "audit":
82+
logging.Audit = iacTypes.Bool(true, typ.Metadata())
83+
case "authenticator":
84+
logging.Authenticator = iacTypes.Bool(true, typ.Metadata())
85+
case "controllerManager":
86+
logging.ControllerManager = iacTypes.Bool(true, typ.Metadata())
87+
case "scheduler":
88+
logging.Scheduler = iacTypes.Bool(true, typ.Metadata())
89+
}
90+
91+
}
92+
93+
return logging
6094
}

pkg/iac/adapters/cloudformation/aws/eks/eks_test.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/aquasecurity/trivy/pkg/iac/adapters/cloudformation/testutil"
77
"github.com/aquasecurity/trivy/pkg/iac/providers/aws/eks"
8+
"github.com/aquasecurity/trivy/pkg/iac/types"
89
)
910

1011
func TestAdapt(t *testing.T) {
@@ -19,9 +20,44 @@ func TestAdapt(t *testing.T) {
1920
Resources:
2021
EKSCluster:
2122
Type: AWS::EKS::Cluster
23+
Properties:
24+
Logging:
25+
ClusterLogging:
26+
EnabledTypes:
27+
- Type: api
28+
- Type: audit
29+
- Type: authenticator
30+
- Type: controllerManager
31+
- Type: scheduler
32+
EncryptionConfig:
33+
- Provider:
34+
KeyArn: alias/mykey
35+
Resources: [secrets]
36+
ResourcesVpcConfig:
37+
EndpointPublicAccess: True
38+
PublicAccessCidrs:
39+
- 0.0.0.0/0
2240
`,
2341
expected: eks.EKS{
24-
Clusters: []eks.Cluster{{}},
42+
Clusters: []eks.Cluster{
43+
{
44+
Logging: eks.Logging{
45+
API: types.BoolTest(true),
46+
Audit: types.BoolTest(true),
47+
Authenticator: types.BoolTest(true),
48+
ControllerManager: types.BoolTest(true),
49+
Scheduler: types.BoolTest(true),
50+
},
51+
Encryption: eks.Encryption{
52+
KMSKeyID: types.StringTest("alias/mykey"),
53+
Secrets: types.BoolTest(true),
54+
},
55+
PublicAccessEnabled: types.BoolTest(true),
56+
PublicAccessCIDRs: []types.StringValue{
57+
types.StringTest("0.0.0.0/0"),
58+
},
59+
},
60+
},
2561
},
2662
},
2763
{

0 commit comments

Comments
 (0)