Skip to content

Commit f0e5919

Browse files
authored
Merge pull request #14 from Ekene95/feat/k8s-infra-hardening
feat: add K8s infrastructure hardening module
2 parents a5dc0de + 52f197a commit f0e5919

10 files changed

Lines changed: 925 additions & 0 deletions

File tree

deploy/k8s-infra-hardening/README.md

Lines changed: 536 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Self-signed ClusterIssuer — bootstraps the internal lab CA.
2+
# cert-manager must be installed before applying this file.
3+
# Install: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.0/cert-manager.yaml
4+
5+
apiVersion: cert-manager.io/v1
6+
kind: ClusterIssuer
7+
metadata:
8+
name: selfsigned-issuer
9+
spec:
10+
selfSigned: {}
11+
---
12+
apiVersion: cert-manager.io/v1
13+
kind: Certificate
14+
metadata:
15+
name: lab-ca
16+
namespace: cert-manager
17+
spec:
18+
isCA: true
19+
commonName: lab-ca
20+
secretName: lab-ca-secret
21+
privateKey:
22+
algorithm: ECDSA
23+
size: 256
24+
issuerRef:
25+
name: selfsigned-issuer
26+
kind: ClusterIssuer
27+
group: cert-manager.io
28+
---
29+
apiVersion: cert-manager.io/v1
30+
kind: ClusterIssuer
31+
metadata:
32+
name: lab-ca-issuer
33+
spec:
34+
ca:
35+
secretName: lab-ca-secret
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
_format_version: "3.0"
2+
3+
services:
4+
- name: vuln-bank-service
5+
url: http://vuln-bank-svc.vuln-bank.svc.cluster.local:5000
6+
connect_timeout: 10000
7+
read_timeout: 30000
8+
write_timeout: 30000
9+
10+
routes:
11+
- name: allow-all-route
12+
paths: ["/"]
13+
strip_path: false
14+
plugins:
15+
- name: request-size-limiting
16+
config:
17+
allowed_payload_size: 1
18+
19+
- name: api-public-route
20+
paths: ["/api/v1/auth", "/api/v1/register", "/api/v3/forgot-password", "/api/v3/reset-password"]
21+
strip_path: false
22+
plugins:
23+
- name: rate-limiting
24+
config:
25+
minute: 20
26+
policy: local
27+
28+
- name: blocked-internal-route
29+
paths: ["/internal", "/api/admin", "/api/docs", "/static/openapi.json"]
30+
strip_path: false
31+
plugins:
32+
- name: request-termination
33+
config:
34+
status_code: 404
35+
message: "Not found"
36+
37+
plugins:
38+
- name: response-transformer
39+
config:
40+
add:
41+
headers:
42+
- "X-Content-Type-Options:nosniff"
43+
- "X-Frame-Options:DENY"
44+
- "Referrer-Policy:no-referrer"
45+
- "X-Kong-Upstream:vuln-bank"
46+
remove:
47+
headers:
48+
- "Server"
49+
- "X-Powered-By"
50+
- "X-Kong-Version"
51+
- "Via"
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
controller:
2+
enabled: false
3+
4+
gateway:
5+
image:
6+
repository: kong
7+
tag: "3.6"
8+
9+
env:
10+
database: "off"
11+
declarative_config: /kong_dbless/kong.yaml
12+
proxy_access_log: /dev/stdout
13+
proxy_error_log: /dev/stderr
14+
admin_access_log: /dev/stdout
15+
admin_error_log: /dev/stderr
16+
log_level: notice
17+
18+
headers: "off"
19+
server_tokens: "off"
20+
21+
dblessConfig:
22+
configMap: kong-config
23+
24+
ingressController:
25+
enabled: false
26+
27+
proxy:
28+
type: NodePort
29+
externalTrafficPolicy: Local
30+
http:
31+
enabled: true
32+
nodePort: 30080
33+
tls:
34+
enabled: true
35+
nodePort: 30443
36+
37+
admin:
38+
enabled: true
39+
type: ClusterIP
40+
41+
resources:
42+
limits:
43+
memory: 256Mi
44+
cpu: 500m
45+
requests:
46+
memory: 128Mi
47+
cpu: 100m
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: vuln-bank
5+
labels:
6+
name: vuln-bank
7+
---
8+
apiVersion: v1
9+
kind: Namespace
10+
metadata:
11+
name: vuln-bank-db
12+
labels:
13+
name: vuln-bank-db
14+
---
15+
apiVersion: v1
16+
kind: Namespace
17+
metadata:
18+
name: kong
19+
labels:
20+
name: kong
21+
---
22+
apiVersion: v1
23+
kind: Namespace
24+
metadata:
25+
name: cert-manager
26+
labels:
27+
name: cert-manager
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: NetworkPolicy
3+
metadata:
4+
name: postgres-netpol
5+
namespace: vuln-bank-db
6+
spec:
7+
podSelector:
8+
matchLabels:
9+
app: postgres
10+
policyTypes:
11+
- Ingress
12+
- Egress
13+
ingress:
14+
- from:
15+
- namespaceSelector:
16+
matchLabels:
17+
name: vuln-bank
18+
podSelector:
19+
matchLabels:
20+
app: vuln-bank
21+
ports:
22+
- port: 5432
23+
egress:
24+
- to:
25+
- namespaceSelector: {}
26+
ports:
27+
- port: 53
28+
protocol: UDP
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: NetworkPolicy
3+
metadata:
4+
name: vuln-bank-netpol
5+
namespace: vuln-bank
6+
spec:
7+
podSelector:
8+
matchLabels:
9+
app: vuln-bank
10+
policyTypes:
11+
- Ingress
12+
- Egress
13+
ingress:
14+
- from:
15+
- namespaceSelector:
16+
matchLabels:
17+
name: kong
18+
ports:
19+
- port: 5000
20+
egress:
21+
- to:
22+
- namespaceSelector: {}
23+
ports:
24+
- port: 53
25+
protocol: UDP
26+
- to:
27+
- namespaceSelector:
28+
matchLabels:
29+
name: vuln-bank-db
30+
podSelector:
31+
matchLabels:
32+
app: postgres
33+
ports:
34+
- port: 5432
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
apiVersion: v1
2+
kind: PersistentVolumeClaim
3+
metadata:
4+
name: postgres-pvc
5+
namespace: vuln-bank-db
6+
spec:
7+
accessModes: [ReadWriteOnce]
8+
resources:
9+
requests:
10+
storage: 5Gi
11+
---
12+
apiVersion: apps/v1
13+
kind: Deployment
14+
metadata:
15+
name: postgres
16+
namespace: vuln-bank-db
17+
spec:
18+
replicas: 1
19+
selector:
20+
matchLabels:
21+
app: postgres
22+
template:
23+
metadata:
24+
labels:
25+
app: postgres
26+
spec:
27+
automountServiceAccountToken: false
28+
containers:
29+
- name: postgres
30+
image: postgres:15-alpine
31+
env:
32+
- name: POSTGRES_DB
33+
value: vulnerable_bank
34+
- name: POSTGRES_USER
35+
valueFrom:
36+
secretKeyRef:
37+
name: postgres-secret
38+
key: username
39+
- name: POSTGRES_PASSWORD
40+
valueFrom:
41+
secretKeyRef:
42+
name: postgres-secret
43+
key: password
44+
ports:
45+
- containerPort: 5432
46+
volumeMounts:
47+
- name: postgres-storage
48+
mountPath: /var/lib/postgresql/data
49+
resources:
50+
limits:
51+
memory: 512Mi
52+
cpu: 500m
53+
ephemeral-storage: 1Gi
54+
requests:
55+
memory: 256Mi
56+
cpu: 100m
57+
ephemeral-storage: 256Mi
58+
volumes:
59+
- name: postgres-storage
60+
persistentVolumeClaim:
61+
claimName: postgres-pvc
62+
---
63+
apiVersion: v1
64+
kind: Service
65+
metadata:
66+
name: postgres-svc
67+
namespace: vuln-bank-db
68+
spec:
69+
selector:
70+
app: postgres
71+
ports:
72+
- port: 5432
73+
targetPort: 5432
74+
clusterIP: None
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
apiVersion: cert-manager.io/v1
2+
kind: Certificate
3+
metadata:
4+
name: kong-proxy-tls
5+
namespace: kong
6+
spec:
7+
secretName: kong-proxy-tls-secret
8+
issuerRef:
9+
name: lab-ca-issuer
10+
kind: ClusterIssuer
11+
dnsNames:
12+
- vuln-bank.local
13+
- "*.vuln-bank.local"
14+
- localhost
15+
ipAddresses:
16+
- 127.0.0.1
17+
# Uncomment and set your node IP if testing from an external machine:
18+
# - 192.168.x.x
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: vuln-bank
5+
namespace: vuln-bank
6+
labels:
7+
app: vuln-bank
8+
tier: application
9+
spec:
10+
replicas: 1
11+
selector:
12+
matchLabels:
13+
app: vuln-bank
14+
template:
15+
metadata:
16+
labels:
17+
app: vuln-bank
18+
tier: application
19+
spec:
20+
automountServiceAccountToken: false
21+
containers:
22+
- name: vuln-bank
23+
# Build the image locally and import it into your cluster:
24+
# docker build -t vuln-bank:v1.0 .
25+
# docker save vuln-bank:v1.0 | sudo ctr -n k8s.io images import - # k3s/containerd
26+
# docker save vuln-bank:v1.0 | sudo crio import - # CRI-O
27+
image: vuln-bank:v1.0
28+
imagePullPolicy: Never
29+
ports:
30+
- containerPort: 5000
31+
env:
32+
- name: DB_HOST
33+
value: postgres-svc.vuln-bank-db.svc.cluster.local
34+
- name: DB_PORT
35+
value: "5432"
36+
- name: DB_NAME
37+
value: vulnerable_bank
38+
- name: DB_USER
39+
valueFrom:
40+
secretKeyRef:
41+
name: vuln-bank-db-secret
42+
key: username
43+
- name: DB_PASSWORD
44+
valueFrom:
45+
secretKeyRef:
46+
name: vuln-bank-db-secret
47+
key: password
48+
resources:
49+
limits:
50+
memory: 256Mi
51+
cpu: 500m
52+
ephemeral-storage: 512Mi
53+
requests:
54+
memory: 128Mi
55+
cpu: 100m
56+
ephemeral-storage: 128Mi
57+
livenessProbe:
58+
httpGet:
59+
path: /login
60+
port: 5000
61+
initialDelaySeconds: 30
62+
periodSeconds: 15
63+
---
64+
apiVersion: v1
65+
kind: Service
66+
metadata:
67+
name: vuln-bank-svc
68+
namespace: vuln-bank
69+
spec:
70+
selector:
71+
app: vuln-bank
72+
ports:
73+
- port: 5000
74+
targetPort: 5000
75+
type: ClusterIP

0 commit comments

Comments
 (0)