Capture The Flag vorbereitung
Dockerfile
Als ersten Schritt forken wir das Repository, das uns als Aufgabe gestellt wurde:
Anschließend erstellen wir ein Dockerfile, welches einen ausführbaren Docker-Container generiert (Testen in einer VM oder im WSL, wenn auf Sicherheit geachtet werden soll). Nachfolgend sehen Sie ein beispielhaften Code:
FROM maven:3-openjdk-11-slim as builder
COPY src /src
COPY pom.xml /
RUN mvn -f pom.xml clean package
FROM adoptopenjdk/openjdk11:alpine-jre
COPY --from=builder /target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
FROM maven:3.6.1-jdk-13-alpine as builder
COPY src /src
COPY pom.xml /
RUN mvn -f pom.xml clean package
FROM adoptopenjdk/openjdk13:alpine-jre
COPY --from=builder /target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
FROM maven:3.8.5-openjdk-17-slim as builder
COPY src /src
COPY pom.xml /
RUN mvn -f pom.xml clean package
FROM eclipse-temurin:17-jre-alpine
COPY --from=builder /target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Repository erstellen
Nachdem das Dockerfile erstellt wurde, starten wir das Learner-Lab, navigieren zum Service ECR und erstellen ein neues privates Repository.
GitLab-Variablen
Um geheime Informationen für CI/CD nicht für jeden zugänglich zu machen, müssen wir Secret Variables erstellen. Die ersten drei finden wir im Learner Lab, wenn wir auf AWS-Details und dann auf AWS CLI klicken. Die Variablen heißen: "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY" und "AWS_SESSION_TOKEN".
Die weiteren drei Variablen finden wir im neu erstellten Repository. Die Variablen und ihre Werte sind: "AWS_DEFAULT_REGION" = "us-east-1", "CI_AWS_ECR_REGISTRY" = "910977011815.dkr.ecr.us-east-1.amazonaws.com" und "CI_AWS_ECR_REPOSITORY_NAME" = "refcard-03".
.gitlab-ci.yml erstellen
Im Folgenden wird ein .gitlab-ci.yml vorgestellt, das dazu dient, ein Docker-Image zu generieren und es in ein AWS-Repository hochzuladen.
image: docker:23.0.4
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
services:
- docker:23.0.4-dind
package:
stage: build
before_script:
- apk add --no-cache py3-pip
- pip install awscli
- aws --version
- aws ecr get-login-password | docker login --username AWS --password-stdin $CI_AWS_ECR_REGISTRY
script:
- docker build --cache-from $CI_AWS_ECR_REGISTRY/$CI_AWS_ECR_REPOSITORY_NAME:latest -t $CI_AWS_ECR_REGISTRY/$CI_AWS_ECR_REPOSITORY_NAME:latest .
- docker push $CI_AWS_ECR_REGISTRY/$CI_AWS_ECR_REPOSITORY_NAME:latest
Sobald diese Datei erstellt wurde, sollte automatisch ein Runner gestartet werden, vorausgesetzt ein solcher ist konfiguriert. Dies kann man unter Settings - CI/CD - Runners überprüfen.
Erstellen eines ECS Clusters
Anschließend beginnen wir mit der Erstellung eines ECS Clusters. Der Name spielt hierbei keine Rolle, wichtig ist nur, den Namespace zu entfernen, damit das Cluster im Learner Lab erstellt werden kann.
Datenbank erstellen (optional)
Für refcard03 war es notwendig, eine Datenbank zu verbinden, daher habe ich ein RDS erstellt. Für die Capture The Flag Aufgabe ist dies jedoch nicht erforderlich.
Erstellung einer Task Definition
Nun erstellen wir eine Taskdefinition mit der Image-URL des Repositories (am Ende sollte :latest stehen). Der Port ist vom Image abhängig und die Environment-Variablen werden nur mit der RDS-Datenbank benötigt.
Für Task-Rolle und Task-Ausführungsrolle sollten wir "LabRole" auswählen.
Änderung der Security Group
Aus Gründen der Schnelligkeit kann man in der Default Security Group festlegen, dass jeder eingehende Traffic zugelassen wird.
Erstellung eines Services im ECS Cluster
Folgen Sie den untenstehenden Konfigurationen (je nach Docker-Image können Änderungen erforderlich sein).
Testen des Loadbalancers
Um den Loadbalancer zu testen, können wir zu EC2 gehen und dort auf Loadbalancer klicken. Anschließend kopieren wir den DNS-Namen.
Diesen Loadbalancer-Namen geben wir dann in den Browser ein und nach einiger Zeit sollten wir die Webanwendung sehen.