Skip to content

Commit acd283b

Browse files
committed
2024 update: sync with internal repo
1 parent 195ee03 commit acd283b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1679
-5154
lines changed

README.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,40 @@ per-team challenge assignment for web challenges. Inspired by [kCTF](https://git
1515
./scripts/cluster-configure
1616
```
1717

18-
3. Install the cluster resources.
19-
```sh
20-
./scripts/cluster-install
21-
```
22-
23-
4. Create config/values.yaml and populate it with values.
18+
3. Create config/values.yaml and populate it with values.
2419
```yaml
2520
domain:
2621
challenges: <root domain where challenges are hosted> # challenges will be a subdomain of this
2722

2823
replicas:
2924
challenge-manager: 2
3025

26+
containerRegistry: gcr.io/example # don't include the slash at the end
27+
3128
cert:
3229
email: <contact email> # required for letsencrypt
3330
cfDNSToken: <cloudflare dns token> # used to configure dns-01 certificate validation
34-
35-
36-
googleProject: <project ID of the Google Project>
3731
```
3832
3933
4. Deploy the helm stack.
4034
```sh
4135
helm install kubectf -f config/values.yaml chart/
4236
```
4337

44-
5. Upload the sample whoami challenge for testing.
38+
5. Upload the sample whoami challenge
4539
```sh
46-
kubectl apply -f templates/whoami/kube-isolated.yaml
40+
GOOGLE_APPLICATION_CREDENTIALS=<sevice account json> ./scripts/process-isolated-challenges
4741
```
4842

49-
## How to Deploy Isolated Challenges
50-
See the README at [services/challenge-manager](services/challenge-manager)
43+
## How to Write Isolated Challenges
44+
TODO
45+
46+
## TODO
47+
- `./scripts/process-isolated-challenges` already exists to process the challenge templates and upload them
48+
to Google Cloud Datastore. We should integrate this with GitHub actions in order to do automatic deployments
49+
on push.
50+
- Interface this with CTFd
51+
- TLS termination for challenges, which can be done by adding cert-manager.
5152

5253
## Authors
5354
- [BlueAlder](https://github.com/BlueAlder)

chart/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ type: application
1515
# This is the chart version. This version number should be incremented each time you make changes
1616
# to the chart and its templates, including the app version.
1717
# Versions are expected to follow Semantic Versioning (https://semver.org/)
18-
version: 0.2.0
18+
version: 0.1.0
1919

2020
# This is the version number of the application being deployed. This version number should be
2121
# incremented each time you make changes to the application. Versions are not expected to
2222
# follow Semantic Versioning. They should reflect the version the application is using.
2323
# It is recommended to use it with quotes.
24-
appVersion: "1.17.0"
24+
appVersion: "1.16.0"

chart/crds/isolated-challenge.yaml

Lines changed: 0 additions & 32 deletions
This file was deleted.

chart/templates/cert-certificate-management.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ apiVersion: cert-manager.io/v1
33
kind: Certificate
44
metadata:
55
name: {{ .Release.Name }}-cert-management
6-
namespace: {{ .Release.Name }}-management
6+
namespace: {{ .Release.Name }}-admin
77
labels:
88
app.kubernetes.io/name: kube-ctf
99
app.kubernetes.io/instance: {{ .Release.Name }}

chart/templates/cert-issuer.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ spec:
77
server: https://acme-v02.api.letsencrypt.org/directory
88
email: {{ .Values.cert.email }}
99
privateKeySecretRef:
10-
name: {{ .Release.Name }}-letsencrypt-prod
10+
name: letsencrypt-prod
1111
solvers:
1212
- dns01:
1313
cloudflare:

chart/templates/challenge-manager.yaml

Lines changed: 10 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: apps/v1
22
kind: Deployment
33
metadata:
44
name: challenge-manager
5-
namespace: {{ .Release.Name }}-management
5+
namespace: {{ .Release.Name }}-admin
66
labels:
77
kube-ctf.downunderctf.com/service: challenge-manager
88
spec:
@@ -18,19 +18,7 @@ spec:
1818
serviceAccountName: challenge-manager
1919
containers:
2020
- name: challenge-manager
21-
image: {{ .Values.googleRegion }}-docker.pkg.dev/{{ .Values.googleProject }}/{{ .Values.googleRepositoryName }}/services/challenge-manager:latest
22-
readinessProbe:
23-
httpGet:
24-
port: 3000
25-
path: /healthz
26-
initialDelaySeconds: 10
27-
periodSeconds: 10
28-
livenessProbe:
29-
httpGet:
30-
port: 3000
31-
path: /healthz
32-
initialDelaySeconds: 30
33-
periodSeconds: 10
21+
image: gcr.io/{{ .Values.googleProject }}/services/challenge-manager:latest
3422
env:
3523
- name: KUBECTF_BASE_DOMAIN
3624
value: {{ .Values.domain.challenges }}
@@ -40,8 +28,6 @@ spec:
4028
value: {{ .Release.Name }}-challenges-isolated
4129
- name: KUBECTF_MAX_OWNER_DEPLOYMENTS
4230
value: "4"
43-
- name: KUBECTF_REGISTRY_PREFIX
44-
value: {{ (index .Values "challenge-manager").registryPrefix }}
4531
- name: KUBECTF_AUTH_SECRET
4632
valueFrom:
4733
secretKeyRef:
@@ -61,7 +47,7 @@ apiVersion: v1
6147
kind: Service
6248
metadata:
6349
name: challenge-manager
64-
namespace: {{ .Release.Name }}-management
50+
namespace: {{ .Release.Name }}-admin
6551
labels:
6652
kube-ctf.downunderctf.com/service: challenge-manager
6753
spec:
@@ -74,7 +60,7 @@ apiVersion: traefik.containo.us/v1alpha1
7460
kind: IngressRoute
7561
metadata:
7662
name: challenge-manager
77-
namespace: {{ .Release.Name }}-management
63+
namespace: {{ .Release.Name }}-admin
7864
labels:
7965
kube-ctf.downunderctf.com/service: challenge-manager
8066
spec:
@@ -97,7 +83,9 @@ apiVersion: v1
9783
kind: ServiceAccount
9884
metadata:
9985
name: challenge-manager
100-
namespace: {{ .Release.Name }}-management
86+
namespace: {{ .Release.Name }}-admin
87+
annotations:
88+
iam.gke.io/gcp-service-account: gke-challenge-manager@{{ .Values.googleProject }}.iam.gserviceaccount.com
10189
---
10290
apiVersion: rbac.authorization.k8s.io/v1
10391
kind: Role
@@ -110,13 +98,10 @@ rules:
11098
resources:
11199
- ingresses
112100
- ingressroutes
113-
- ingressroutetcps
114101
- pods
115102
- deployments
116103
- services
117104
- namespaces
118-
- secrets
119-
- networkpolicies
120105
verbs:
121106
- create
122107
- delete
@@ -127,19 +112,6 @@ rules:
127112
- watch
128113
---
129114
apiVersion: rbac.authorization.k8s.io/v1
130-
kind: ClusterRole
131-
metadata:
132-
name: {{ .Release.Name }}-read-isolated-challenges
133-
rules:
134-
- apiGroups:
135-
- kube-ctf.downunderctf.com
136-
resources:
137-
- isolated-challenges
138-
verbs:
139-
- get
140-
- list
141-
---
142-
apiVersion: rbac.authorization.k8s.io/v1
143115
kind: RoleBinding
144116
metadata:
145117
name: challenge-manager
@@ -151,26 +123,13 @@ roleRef:
151123
subjects:
152124
- kind: ServiceAccount
153125
name: challenge-manager
154-
namespace: {{ .Release.Name }}-management
155-
---
156-
apiVersion: rbac.authorization.k8s.io/v1
157-
kind: ClusterRoleBinding
158-
metadata:
159-
name: {{ .Release.Name }}-challenge-manager-read-isolated-challenges
160-
roleRef:
161-
apiGroup: rbac.authorization.k8s.io
162-
kind: ClusterRole
163-
name: {{ .Release.Name }}-read-isolated-challenges
164-
subjects:
165-
- kind: ServiceAccount
166-
name: challenge-manager
167-
namespace: {{ .Release.Name }}-management
126+
namespace: {{ .Release.Name }}-admin
168127
---
169128
apiVersion: v1
170129
kind: Secret
171130
metadata:
172131
name: challenge-manager
173-
namespace: {{ .Release.Name }}-management
132+
namespace: {{ .Release.Name }}-admin
174133
data:
175134
auth: "{{ b64enc (index .Values "challenge-manager").authSecret }}"
176-
container: "{{ b64enc (index .Values "challenge-manager").containerSecret }}"
135+
container: "{{ b64enc (index .Values "challenge-manager").containerSecret }}"

chart/templates/kube-janitor.yaml

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: v1
22
kind: ConfigMap
33
metadata:
44
name: kube-janitor
5-
namespace: {{ .Release.Name }}-management
5+
namespace: {{ .Release.Name }}-admin
66
data:
77
rules.yaml: |
88
rules:
@@ -11,7 +11,6 @@ data:
1111
resources:
1212
- deployments
1313
- ingressroutes
14-
- ingressroutetcps
1514
- services
1615
- ingresses
1716
jmespath: "metadata.namespace == '{{ .Release.Name }}-challenges-isolated'"
@@ -24,7 +23,7 @@ metadata:
2423
application: kube-janitor
2524
version: v20.10.0
2625
name: kube-janitor
27-
namespace: {{ .Release.Name }}-management
26+
namespace: {{ .Release.Name }}-admin
2827
spec:
2928
replicas: 1
3029
selector:
@@ -63,7 +62,7 @@ apiVersion: v1
6362
kind: ServiceAccount
6463
metadata:
6564
name: kube-janitor
66-
namespace: {{ .Release.Name }}-management
65+
namespace: {{ .Release.Name }}-admin
6766
---
6867
apiVersion: rbac.authorization.k8s.io/v1
6968
kind: ClusterRole
@@ -87,15 +86,14 @@ rules:
8786
- delete
8887
---
8988
apiVersion: rbac.authorization.k8s.io/v1
90-
kind: RoleBinding
89+
kind: ClusterRoleBinding
9190
metadata:
9291
name: {{ .Release.Name }}-kube-janitor
93-
namespace: {{ .Release.Name }}-challenges-isolated
9492
roleRef:
9593
apiGroup: rbac.authorization.k8s.io
9694
kind: ClusterRole
97-
name: {{ .Release.Name }}-kube-janitor
95+
name: kube-janitor
9896
subjects:
9997
- kind: ServiceAccount
10098
name: kube-janitor
101-
namespace: {{ .Release.Name }}-management
99+
namespace: {{ .Release.Name }}-admin

chart/templates/landing.yaml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ metadata:
77
labels:
88
role: landing
99
spec:
10-
replicas: {{ (index .Values "landing").replicas }}
10+
replicas: 1
1111
selector:
1212
matchLabels:
1313
role: landing
@@ -19,12 +19,15 @@ spec:
1919
enableServiceLinks: false
2020
automountServiceAccountToken: false
2121
containers:
22-
- name: web
23-
image: {{ .Values.googleRegion }}-docker.pkg.dev/{{ .Values.googleProject }}/{{ .Values.googleRepositoryName }}/services/landing:latest
22+
- name: nginx
23+
image: gcr.io/{{ .Values.googleProject }}/services/landing:latest
2424
resources:
25-
{{ toYaml (index .Values "landing").quota | indent 10 }}
26-
ports:
27-
- containerPort: 80
25+
limits:
26+
cpu: 100m
27+
memory: 256Mi
28+
requests:
29+
cpu: 10m
30+
memory: 64Mi
2831
---
2932
apiVersion: v1
3033
kind: Service
@@ -55,7 +58,7 @@ spec:
5558
routes:
5659
- match: HostRegexp(`{{ .Values.domain.challenges }}`, `{subdomain:[\w-]+}.{{ .Values.domain.challenges }}`)
5760
kind: Rule
58-
priority: 1
61+
priority: 1000
5962
middlewares:
6063
- name: hsts
6164
services:

chart/templates/namespaces.yaml

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apiVersion: v1
22
kind: Namespace
33
metadata:
4-
name: {{ .Release.Name }}-management
4+
name: {{ .Release.Name }}-admin
55
labels:
66
app.kubernetes.io/name: kube-ctf
77
app.kubernetes.io/instance: {{ .Release.Name }}
@@ -18,15 +18,4 @@ metadata:
1818
app.kubernetes.io/instance: {{ $relname }}
1919
app.kubernetes.io/component: {{ . }}
2020
---
21-
apiVersion: traefik.containo.us/v1alpha1
22-
kind: Middleware
23-
metadata:
24-
name: secure-headers
25-
namespace: {{ $relname }}-{{ . }}
26-
spec:
27-
headers:
28-
stsSeconds: 15552000
29-
forceSTSHeader: true
30-
stsIncludeSubdomains: true
31-
---
3221
{{- end }}

chart/templates/traefik.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ apiVersion: traefik.containo.us/v1alpha1
1616
kind: Middleware
1717
metadata:
1818
name: hsts
19-
namespace: {{ .Release.Name }}-management
19+
namespace: {{ .Release.Name }}-admin
2020
spec:
2121
headers:
2222
stsSeconds: 15552000

0 commit comments

Comments
 (0)