From 9cb4e6ba5cc64a3c915bbb5a9c53797d58f1b677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giovani=20N=C3=B3brega?= Date: Sat, 18 Nov 2023 17:15:15 -0500 Subject: [PATCH 1/8] Create README.md --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..1bb8e168 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# LINUXtips-giropops-senhas. From 90bb107d09d521dd55f169755d33a15f0bcb419b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Giovani=20N=C3=B3brega?= Date: Sat, 18 Nov 2023 17:15:52 -0500 Subject: [PATCH 2/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1bb8e168..a2ffcfec 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# LINUXtips-giropops-senhas. +# LINUXtips-giropops-senhas From 0e68c67ee8ffc3e3f146a57618ae6a49bb8725ae Mon Sep 17 00:00:00 2001 From: GiovaniGitHub Date: Sat, 18 Nov 2023 18:31:07 -0500 Subject: [PATCH 3/8] Reestraturacao do projeto e adicao do Dockerfile --- Dockerfile | 20 ++++++++++++++++++ app.py => giropops-senhas/app.py | 0 .../requirements.txt | 0 .../static}/css/output.css | 0 .../static}/css/styles.css | 0 {static => giropops-senhas/static}/js/main.js | 0 .../static}/linuxtips-logo.png | Bin .../tailwind.config.js | 0 .../templates}/index.html | 0 .../templates}/lista_senhas.html | 0 10 files changed, 20 insertions(+) create mode 100644 Dockerfile rename app.py => giropops-senhas/app.py (100%) rename requirements.txt => giropops-senhas/requirements.txt (100%) rename {static => giropops-senhas/static}/css/output.css (100%) rename {static => giropops-senhas/static}/css/styles.css (100%) rename {static => giropops-senhas/static}/js/main.js (100%) rename {static => giropops-senhas/static}/linuxtips-logo.png (100%) rename tailwind.config.js => giropops-senhas/tailwind.config.js (100%) rename {templates => giropops-senhas/templates}/index.html (100%) rename {templates => giropops-senhas/templates}/lista_senhas.html (100%) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..65af6f24 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +FROM cgr.dev/chainguard/python:latest-dev as builder + +WORKDIR /app + +COPY ./giropops-senhas/requirements.txt . +RUN pip install --upgrade setuptools +RUN pip install -r requirements.txt --user + +FROM cgr.dev/chainguard/python:latest + +COPY --from=builder /home/nonroot/.local/lib/python3.11/site-packages /home/nonroot/.local/lib/python3.11/site-packages + +COPY ./giropops-senhas/ . + +ENV REDIS_HOST=redisdb +ENV FLASK_APP=app.py +# Expose the port +EXPOSE 5000 + +ENTRYPOINT ["python", "-m", "flask", "run", "--host=0.0.0.0"] diff --git a/app.py b/giropops-senhas/app.py similarity index 100% rename from app.py rename to giropops-senhas/app.py diff --git a/requirements.txt b/giropops-senhas/requirements.txt similarity index 100% rename from requirements.txt rename to giropops-senhas/requirements.txt diff --git a/static/css/output.css b/giropops-senhas/static/css/output.css similarity index 100% rename from static/css/output.css rename to giropops-senhas/static/css/output.css diff --git a/static/css/styles.css b/giropops-senhas/static/css/styles.css similarity index 100% rename from static/css/styles.css rename to giropops-senhas/static/css/styles.css diff --git a/static/js/main.js b/giropops-senhas/static/js/main.js similarity index 100% rename from static/js/main.js rename to giropops-senhas/static/js/main.js diff --git a/static/linuxtips-logo.png b/giropops-senhas/static/linuxtips-logo.png similarity index 100% rename from static/linuxtips-logo.png rename to giropops-senhas/static/linuxtips-logo.png diff --git a/tailwind.config.js b/giropops-senhas/tailwind.config.js similarity index 100% rename from tailwind.config.js rename to giropops-senhas/tailwind.config.js diff --git a/templates/index.html b/giropops-senhas/templates/index.html similarity index 100% rename from templates/index.html rename to giropops-senhas/templates/index.html diff --git a/templates/lista_senhas.html b/giropops-senhas/templates/lista_senhas.html similarity index 100% rename from templates/lista_senhas.html rename to giropops-senhas/templates/lista_senhas.html From 8baea91f835a1545f5b2aac3c1f41dc6b1c8b4ac Mon Sep 17 00:00:00 2001 From: GiovaniGitHub Date: Sun, 19 Nov 2023 22:51:33 -0500 Subject: [PATCH 4/8] Primeira estruturacao do projeto Adicao de um docke compose yaml Adicao do print com o report de testes de vulnerabilidade utilizando trivy Edicao do primeiro README.md --- .imgs/trivy.png | Bin 0 -> 36309 bytes README.md | 29 +++++++++++++++++++++++++++++ Dockerfile => docker/Dockerfile | 5 +++-- docker/docker-compose.yaml | 31 +++++++++++++++++++++++++++++++ giropops-senhas/requirements.txt | 4 ++-- 5 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 .imgs/trivy.png rename Dockerfile => docker/Dockerfile (64%) create mode 100644 docker/docker-compose.yaml diff --git a/.imgs/trivy.png b/.imgs/trivy.png new file mode 100644 index 0000000000000000000000000000000000000000..1586afa367f4331edc11fddeb07d1e6c7d1da442 GIT binary patch literal 36309 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index a2ffcfec..c41ff754 100644 --- a/README.md +++ b/README.md @@ -1 +1,30 @@ # LINUXtips-giropops-senhas +Projeto referente ao **Desenvolvimento e Otimização Segura de Aplicações Kubernetes** do **Programa Intensivo em Containers e Kubernetes (PICK)** oferecido pela plataforma https://www.linuxtips.io/ + +## Sobre o projeto +### Aplicação + +A aplicação Giropos Senhas consiste em uma aplicação web que permite ao usuário gerar senhas aleatórias com base em parâmetros como tamanho da senha, incluindo ou não algarismos e/ou caracteres especiais. Ela permite o armazenamento das senhas em memória. + +#### Tecnologias utilizadas: + - Python: https://www.python.org/ + - Flask: https://flask.palletsprojects.com/en/3.0.x/ + - Redis: https://redis.io/ + - Tailwind: https://tailwindui.com/?ref=top + +#### Implantação + As tecnologias utilizadas para a implantação do projeto foram: + - Docker: https://www.docker.com/ + - kind: https://kind.sigs.k8s.io/ + - kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/ + + +#### Sobre a imagem +Para a imagem base foi utilizada uma image distroless da chainguard ([link](https://edu.chainguard.dev/chainguard/chainguard-images/reference/python/)) o que garante uma maior segurança. +![Relatório de Análise de Riscos usando o Trivy](.imgs/trivy.png) + +### Executar a Aplicação usando Docker Compose + +```bash +docker compose -f docker/docker-compose.yaml up -d --force-recreate +``` \ No newline at end of file diff --git a/Dockerfile b/docker/Dockerfile similarity index 64% rename from Dockerfile rename to docker/Dockerfile index 65af6f24..46a1d4b4 100644 --- a/Dockerfile +++ b/docker/Dockerfile @@ -3,12 +3,13 @@ FROM cgr.dev/chainguard/python:latest-dev as builder WORKDIR /app COPY ./giropops-senhas/requirements.txt . + RUN pip install --upgrade setuptools RUN pip install -r requirements.txt --user FROM cgr.dev/chainguard/python:latest -COPY --from=builder /home/nonroot/.local/lib/python3.11/site-packages /home/nonroot/.local/lib/python3.11/site-packages +COPY --from=builder /home/nonroot/.local/lib/python3.12/site-packages /home/nonroot/.local/lib/python3.12/site-packages COPY ./giropops-senhas/ . @@ -17,4 +18,4 @@ ENV FLASK_APP=app.py # Expose the port EXPOSE 5000 -ENTRYPOINT ["python", "-m", "flask", "run", "--host=0.0.0.0"] +ENTRYPOINT ["python3", "-m", "flask", "run", "--host=0.0.0.0"] diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml new file mode 100644 index 00000000..3d810ee5 --- /dev/null +++ b/docker/docker-compose.yaml @@ -0,0 +1,31 @@ +version: '3' +services: + giropops-senhas: + build: + context: .. + dockerfile: docker/Dockerfile + ports: + - "5000:5000" + networks: + - giropops + volumes: + - strigus:/strigus + + environment: + REDIS_HOST: redisdb + + redisdb: + image: cgr.dev/chainguard/redis:latest + + networks: + - giropops + + volumes: + - strigus:/strigus + +networks: + giropops: + driver: bridge + +volumes: + strigus: diff --git a/giropops-senhas/requirements.txt b/giropops-senhas/requirements.txt index 5f3d5549..74c73a8c 100644 --- a/giropops-senhas/requirements.txt +++ b/giropops-senhas/requirements.txt @@ -1,3 +1,3 @@ -Flask==2.1.1 -redis==4.5.2 +Flask==2.2.5 +redis==4.5.4 prometheus-client==0.16.0 \ No newline at end of file From db2328fc11c3a6df02a07eaae9448dd14bc406b7 Mon Sep 17 00:00:00 2001 From: GiovaniGitHub Date: Mon, 20 Nov 2023 23:13:42 -0500 Subject: [PATCH 5/8] criacao dos arquivos para kubernetes --- kubernetes/app-deployment.yaml | 46 ++++++++++++++++++++++++++++++++ kubernetes/app-service.yaml | 15 +++++++++++ kubernetes/redis-deployment.yaml | 32 ++++++++++++++++++++++ kubernetes/redis-service.yaml | 12 +++++++++ 4 files changed, 105 insertions(+) create mode 100644 kubernetes/app-deployment.yaml create mode 100644 kubernetes/app-service.yaml create mode 100644 kubernetes/redis-deployment.yaml create mode 100644 kubernetes/redis-service.yaml diff --git a/kubernetes/app-deployment.yaml b/kubernetes/app-deployment.yaml new file mode 100644 index 00000000..9beb62ce --- /dev/null +++ b/kubernetes/app-deployment.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: giropops-senhas + name: giropops-senhas +spec: + replicas: 2 + selector: + matchLabels: + app: giropops-senhas + template: + metadata: + labels: + app: giropops-senhas + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - giropops-senhas + topologyKey: kubernetes.io/hostname + containers: + - image: giovani0308/giropops-senhas:v2 + name: giropops-senhas + securityContext: + readOnlyRootFilesystem: true + runAsUser: 1000 + runAsNonRoot: true + resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" + env: + - name: REDIS_HOST + value: redisdb + ports: + - containerPort: 5000 + imagePullPolicy: Always diff --git a/kubernetes/app-service.yaml b/kubernetes/app-service.yaml new file mode 100644 index 00000000..3a5fe9b7 --- /dev/null +++ b/kubernetes/app-service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: giropops-senhas + labels: + app: giropops-senhas +spec: + selector: + app: giropops-senhas + ports: + - protocol: TCP + port: 5000 + targetPort: 5000 + name: tcp-app + type: ClusterIP diff --git a/kubernetes/redis-deployment.yaml b/kubernetes/redis-deployment.yaml new file mode 100644 index 00000000..f5ffbe13 --- /dev/null +++ b/kubernetes/redis-deployment.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: redis + name: redis-deployment +spec: + replicas: 1 + selector: + matchLabels: + app: redis + template: + metadata: + labels: + app: redis + spec: + containers: + - image: cgr.dev/chainguard/redis:latest + name: redis + securityContext: + readOnlyRootFilesystem: true + runAsUser: 1000 + runAsNonRoot: true + ports: + - containerPort: 6379 + resources: + limits: + memory: "256Mi" + cpu: "500m" + requests: + memory: "128Mi" + cpu: "250m" diff --git a/kubernetes/redis-service.yaml b/kubernetes/redis-service.yaml new file mode 100644 index 00000000..9a2b4304 --- /dev/null +++ b/kubernetes/redis-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: redis-service +spec: + selector: + app: redis + ports: + - protocol: TCP + port: 6379 + targetPort: 6379 + type: ClusterIP From eaa2afd2b8e3554da4e850e4e857fdc78b11b031 Mon Sep 17 00:00:00 2001 From: GiovaniGitHub Date: Thu, 30 Nov 2023 11:43:36 -0500 Subject: [PATCH 6/8] Adicionar GitHub Actions para instalar o Cosign --- docker/.github/workflows/install-cosign.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docker/.github/workflows/install-cosign.yml diff --git a/docker/.github/workflows/install-cosign.yml b/docker/.github/workflows/install-cosign.yml new file mode 100644 index 00000000..02e53618 --- /dev/null +++ b/docker/.github/workflows/install-cosign.yml @@ -0,0 +1,17 @@ +name: Install Cosign + +on: + workflow_dispatch: # Esta configuração permite acionar manualmente o workflow + +jobs: + example: + runs-on: ubuntu-latest + permissions: {} + + steps: + - name: Install Cosign + uses: sigstore/cosign-installer@v3.1.1 + + - name: Check install! + run: cosign version + From d90ab6249b23a41153459d712b9932dd4eedb404 Mon Sep 17 00:00:00 2001 From: GiovaniGitHub Date: Thu, 30 Nov 2023 12:00:46 -0500 Subject: [PATCH 7/8] Fix teste github actions --- .../install-cosign.yml => .github/workflows/main.yml | 0 kubernetes/redis-deployment.yaml | 4 ---- 2 files changed, 4 deletions(-) rename docker/.github/workflows/install-cosign.yml => .github/workflows/main.yml (100%) diff --git a/docker/.github/workflows/install-cosign.yml b/.github/workflows/main.yml similarity index 100% rename from docker/.github/workflows/install-cosign.yml rename to .github/workflows/main.yml diff --git a/kubernetes/redis-deployment.yaml b/kubernetes/redis-deployment.yaml index f5ffbe13..fc67deac 100644 --- a/kubernetes/redis-deployment.yaml +++ b/kubernetes/redis-deployment.yaml @@ -17,10 +17,6 @@ spec: containers: - image: cgr.dev/chainguard/redis:latest name: redis - securityContext: - readOnlyRootFilesystem: true - runAsUser: 1000 - runAsNonRoot: true ports: - containerPort: 6379 resources: From 2b4db7154fcc75f0db19df72b0c27f3509fd81c9 Mon Sep 17 00:00:00 2001 From: GiovaniGitHub Date: Mon, 4 Dec 2023 07:33:00 -0500 Subject: [PATCH 8/8] Prometheus --- README.md | 2 +- {.imgs => docs/images}/trivy.png | Bin {kubernetes => k8s}/app-deployment.yaml | 13 +++++++ {kubernetes => k8s}/app-service.yaml | 1 + k8s/prometheus-service-account.yaml | 42 ++++++++++++++++++++++ k8s/prometheus-service-monitor.yaml | 13 +++++++ k8s/prometheus-service.yaml | 14 ++++++++ k8s/prometheus.yaml | 21 +++++++++++ {kubernetes => k8s}/redis-deployment.yaml | 1 + {kubernetes => k8s}/redis-service.yaml | 1 + 10 files changed, 107 insertions(+), 1 deletion(-) rename {.imgs => docs/images}/trivy.png (100%) rename {kubernetes => k8s}/app-deployment.yaml (77%) rename {kubernetes => k8s}/app-service.yaml (98%) create mode 100644 k8s/prometheus-service-account.yaml create mode 100644 k8s/prometheus-service-monitor.yaml create mode 100644 k8s/prometheus-service.yaml create mode 100644 k8s/prometheus.yaml rename {kubernetes => k8s}/redis-deployment.yaml (99%) rename {kubernetes => k8s}/redis-service.yaml (97%) diff --git a/README.md b/README.md index c41ff754..c443a941 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ A aplicação Giropos Senhas consiste em uma aplicação web que permite ao usu #### Sobre a imagem Para a imagem base foi utilizada uma image distroless da chainguard ([link](https://edu.chainguard.dev/chainguard/chainguard-images/reference/python/)) o que garante uma maior segurança. -![Relatório de Análise de Riscos usando o Trivy](.imgs/trivy.png) +![Relatório de Análise de Riscos usando o Trivy](docs/images/trivy.png) ### Executar a Aplicação usando Docker Compose diff --git a/.imgs/trivy.png b/docs/images/trivy.png similarity index 100% rename from .imgs/trivy.png rename to docs/images/trivy.png diff --git a/kubernetes/app-deployment.yaml b/k8s/app-deployment.yaml similarity index 77% rename from kubernetes/app-deployment.yaml rename to k8s/app-deployment.yaml index 9beb62ce..b3374a63 100644 --- a/kubernetes/app-deployment.yaml +++ b/k8s/app-deployment.yaml @@ -1,3 +1,4 @@ +--- apiVersion: apps/v1 kind: Deployment metadata: @@ -44,3 +45,15 @@ spec: ports: - containerPort: 5000 imagePullPolicy: Always + livenessProbe: + httpGet: + path: /healthz + port: 5000 + initialDelaySeconds: 3 + periodSeconds: 3 + readinessProbe: + httpGet: + path: /readiness + port: 5000 + initialDelaySeconds: 5 + periodSeconds: 5 diff --git a/kubernetes/app-service.yaml b/k8s/app-service.yaml similarity index 98% rename from kubernetes/app-service.yaml rename to k8s/app-service.yaml index 3a5fe9b7..73060651 100644 --- a/kubernetes/app-service.yaml +++ b/k8s/app-service.yaml @@ -1,3 +1,4 @@ +--- apiVersion: v1 kind: Service metadata: diff --git a/k8s/prometheus-service-account.yaml b/k8s/prometheus-service-account.yaml new file mode 100644 index 00000000..91988a18 --- /dev/null +++ b/k8s/prometheus-service-account.yaml @@ -0,0 +1,42 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: prometheus +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRole +metadata: + name: prometheus +rules: + - apiGroups: [""] + resources: + - nodes + - nodes/metrics + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: + - configmaps + verbs: ["get"] + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: ["get", "list", "watch"] + - nonResourceURLs: ["/metrics"] + verbs: ["get"] +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: prometheus +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: prometheus +subjects: + - kind: ServiceAccount + name: prometheus + namespace: default diff --git a/k8s/prometheus-service-monitor.yaml b/k8s/prometheus-service-monitor.yaml new file mode 100644 index 00000000..a22f67fe --- /dev/null +++ b/k8s/prometheus-service-monitor.yaml @@ -0,0 +1,13 @@ +ServiceMonitorapiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: prometheus-self + labels: + app: prometheus +spec: + endpoints: + - interval: 30s + port: web + selector: + matchLabels: + app: prometheus diff --git a/k8s/prometheus-service.yaml b/k8s/prometheus-service.yaml new file mode 100644 index 00000000..a7796fa3 --- /dev/null +++ b/k8s/prometheus-service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: prometheus + labels: + app: prometheus +spec: + ports: + - name: web + port: 9090 + targetPort: web + selector: + app.kubernetes.io/name: prometheus + sessionAffinity: ClientIP diff --git a/k8s/prometheus.yaml b/k8s/prometheus.yaml new file mode 100644 index 00000000..3fd75238 --- /dev/null +++ b/k8s/prometheus.yaml @@ -0,0 +1,21 @@ +apiVersion: monitoring.coreos.com/v1 +kind: Prometheus +metadata: + name: prometheus + labels: + app: prometheus +spec: + image: quay.io/prometheus/prometheus:v2.22.1 + nodeSelector: + kubernetes.io/os: linux + replicas: 2 + resources: + requests: + memory: 400Mi + securityContext: + fsGroup: 2000 + runAsNonRoot: true + runAsUser: 1000 + serviceAccountName: prometheus + version: v2.22.1 + serviceMonitorSelector: {} diff --git a/kubernetes/redis-deployment.yaml b/k8s/redis-deployment.yaml similarity index 99% rename from kubernetes/redis-deployment.yaml rename to k8s/redis-deployment.yaml index fc67deac..6bce8354 100644 --- a/kubernetes/redis-deployment.yaml +++ b/k8s/redis-deployment.yaml @@ -1,3 +1,4 @@ +--- apiVersion: apps/v1 kind: Deployment metadata: diff --git a/kubernetes/redis-service.yaml b/k8s/redis-service.yaml similarity index 97% rename from kubernetes/redis-service.yaml rename to k8s/redis-service.yaml index 9a2b4304..f6cae1c6 100644 --- a/kubernetes/redis-service.yaml +++ b/k8s/redis-service.yaml @@ -1,3 +1,4 @@ +--- apiVersion: v1 kind: Service metadata: