User Tools

Site Tools


devsecops_и_промышленные_решения

This is an old revision of the document!


Table of Contents

DevSecOps и промышленные решения

Программа курса

Ссылка на презентацию

Модуль 0. Подготовка к занятию

  1. Узнать и записать свой номер стенда: X=
  2. Сообщить его в чат преподавателю

Модуль 1: Развертывание инфраструктуры предприятия

Теория

Лабораторные работы: Развертывание стенда и kubernetes кластера

1.1 Схема стенда, импорт, настройка и запуск VM gate и server

  • !!! kubeN 12Gb RAM (GitLab) + 4 CPU (Keycloak) !!!
Запустите с правами Administrator

C:\cmder\cmder.exe

bash

cd

test -d conf && rm -rf conf

git clone http://val.bmstu.ru/unix/conf.git

cd conf/virtualbox/

!!! 10 - это номер курса, вместо X укажите Ваш номер стенда, если не знаете его, спросите преподавателя !!!

./setup.sh X 10

1.2 Настройка сети VM gate и server

  • gate
# sh net_gate.sh

# init 6
  • server
# sh net_server.sh

# init 6
  • Создать в Putty профили gate, server и подключиться

1.3 Развертывание FreeIPA

server# sed -i -e 's/docker.ru/yandex.ru/g' /etc/apt/sources.list

server# apt update

1.4 Развертывание Kubernetes

  • Настройка сервера DHCP на gate
gate:~# ###git -C conf/ pull

gate:~# sh conf/dhcp.sh
  • Настройка MAC адресов 08:00:27:12:34:5N (для получения назначенного IP через Сервис DHCP)
  • Запуск kube1-4
  • Настройка клиента DNS на gate и server
# cat /etc/resolv.conf
search corpX.un
nameserver 192.168.X.10
# ping kubeN

1.5 Установка и инициализация компьютеров пользователей

Практикум

Модуль 2: Развертывание приложений в кластере Kubernetes

2.1 Развертывание Keycloak

  • Dynamic Volume Provisioning rancher local-path-provisioner
  • Использование баз данных, (развертывание через оператор CloudNativePG)
  • В 3-м модуле будет использование Kustomize для сокрытия чувствительных данных
kube1:~# kubectl create ns my-keycloak-ns

kube1:~# kubectl create secret tls keycloak-tls --key /tmp/keycloak.key --cert /tmp/keycloak.crt -n my-keycloak-ns

Практикум

2.2 Развертывание GitLab

  • Использование распределённых хранилищ (longhorn)
  • Добавляем в DNS через GUI запись: gitlab A 192.168.X.65
  • Решение FreeIPA Поддержка ACME
  • Решение FreeIPA Динамический DNS
  • Управление сертификатами с использованием cert-manager и выпуск сертификата для будущего развертывания gitlab
kube1:~/gitlab# sed -i -e 's/server.corpX/gitlab.corpX/' docker-compose.yml
...
    privileged: true
...
      - '22:22'
...
#      - '/etc/gitlab:/etc/gitlab'
...
  • Для демонстрации OpenID (преподаватель)
server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/tmp/

kube1:~/gitlab# kubectl -n my-gitlab-ns create configmap ca-crt --from-file=/tmp/ca.crt
  • Использование kompose для получения манифестов
kube1:~/gitlab# kompose convert

kube1:~/gitlab# cat vol1-persistentvolumeclaim.yaml
...
      storage: 3Gi
kube1:~/gitlab# cat gitlab-deployment.yaml
...
          image: ...
#          lifecycle:
#            postStart:
#              exec:
#                command:
#                - /bin/sh
#                - -c
#                - |
#                  mkdir -p /etc/gitlab/trusted-certs/
#                  cp /etc/gitlab/tmp/ca.crt /etc/gitlab/trusted-certs/ca.crt
#                  apt update && DEBIAN_FRONTEND=noninteractive apt install msmtp-mta bsd-mailx -y
#                  echo -e 'account default\nhost server.corpX.un' > /etc/msmtprc
...   
          volumeMounts:
            - name: gitlab-tls-volume
              subPath: tls.crt
              mountPath: /etc/gitlab/ssl/gitlab.corpX.un.crt
            - name: gitlab-tls-volume
              subPath: tls.key
              mountPath: /etc/gitlab/ssl/gitlab.corpX.un.key
#            - name: ca-crt-volume
#              subPath: ca.crt
#              mountPath: /etc/gitlab/tmp/ca.crt
...
      hostname: gitlab
...
      volumes:
        - name: gitlab-tls-volume
          secret:
            secretName: gitlab-tls
#        - name: ca-crt-volume
#          configMap:
#            name: ca-crt
...
kube1:~/gitlab# cat gitlab-service.yaml
...
spec: 
  loadBalancerIP: 192.168.X.65
  type: LoadBalancer
...
kube1:~/gitlab# kubectl -n my-gitlab-ns apply -f vol1-persistentvolumeclaim.yaml,gitlab-service.yaml,gitlab-deployment.yaml

kube1:~/gitlab# kubectl -n my-gitlab-ns logs deployments/gitlab -f

2.3 Стратегии развертывания и масштабирование нагрузки

  • Развертываем Deployment для тестового приложения, демонстрирующего версию
kube1:~/webd-k8s# cat my-webd-deployment.yaml
...
        image: httpd
        lifecycle:
...
                cd /usr/local/apache2/htdocs/
                echo "<h1>Hello from htwebd on $(hostname) ver1.1</h1>" > index.html
  • Добавляем в DNS htwebd A 192.168.X.66
  • Добавляем в Traefik kubernetesGateway
  • Деплоим новую версию приложения
kube1:~/webd-k8s# 
cp my-webd-deployment.yaml my-webd-deployment2.yaml
cp my-webd-service.yaml my-webd-service2.yaml

...
   ...my-webd2
...

kube1:~/webd-k8s# kubectl -n my-ns apply -f my-webd-deployment2.yaml,my-webd-service2.yaml
  • Преподаватель демонстрирует добавление HTTPS в Gateway с использованием cert-manager

2.4 ArgoCD и универсальный Helm Chart

kube1:~/webd-k8s# kubectl delete ns my-ns

kube1:~/webd-k8s# curl -fsSL https://val.bmstu.ru/unix/uni-webd-chart.tgz | tar xzvf -
  • Глобальные настройки для всех приложений
kube1:~/webd-k8s# cat env.yaml
domain: corpX.un
  • Значения “по умолчанию” и примеры для персональных values.yaml
kube1:~/webd-k8s# less uni-webd-chart/values.yaml
...
service:
  port: 80
...
  • Персональный values.yaml для приложения
kube1:~/webd-k8s# mkdir -p apps/htwebd/

kube1:~/webd-k8s# cat apps/htwebd/values.yaml
hostname: htwebd

replicaCount: 2
image:
  repository: httpd
kube1:~/webd-k8s# helm template my-htwebd uni-webd-chart/ -f apps/htwebd/values.yaml -f env.yaml
  • Демонстрируем недостатки традиционного CI/CD и удаляем развертывание
kube1# kubectl -n my-ns edit deployments.apps my-htwebd-dep
... 1.1 -> 1.2 ...

client1$ curl https://htwebd.corp13.un

kube1# kubectl delete ns my-ns
server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/

kube1# update-ca-certificates
  • Добавляем в GitLab public группу student
  • Создаем проект webd-k8s (public, без readme, в группе student) в GitLab и настраиваем Управление приложениями через kubectl в ArgoCD
  • Повторяем попытку изменить поведение приложения “вручную”
kube1:~/webd-k8s# mkdir apps/ehwebd

kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/ehwebd/

...

kube1:~/webd-k8s# helm template my-ehwebd uni-webd-chart/ -f apps/ehwebd/values.yaml -f env.yaml

Модуль 3: Безопасность в DevOps

3.1 Интеграция инструментов безопасности в CI/CD

Инструмент Semgrep

Сканер Trivy

  • Разместить образ pywebd в gitlab
  • Сканер Trivy для анализа уязвимостей в контейнерах

CI

kube1:~/webd-k8s# mkdir apps/pywebd

kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/pywebd/

...

kube1:~/webd-k8s# helm template my-pywebd uni-webd-chart/ -f apps/pywebd/values.yaml -f env.yaml

3.2 Управление секретами

3.3 Управление доступом в Kubernetes

Управление доступом к API

SecurityContext/NetworkPolicy

# kubectl run my-ubuntu --image=ubuntu -- "sleep" "infinity"

# kubectl exec -ti pods/my-ubuntu -- bash

3.4 Использование IDS/IPS в Kubernetes

  • Готовимся перехватывать трафик
# kubectl expose pod my-ubuntu --port=80
  • Разворачиваем htwebd из манифестов
kube1:~/webd-k8s# kubectl apply -f my-webd-deployment.yaml,my-webd-service.yaml -n my-ns
  • Разворачиваем основу для IDS
root@my-ubuntu:/# apt install netcat-traditional

root@my-ubuntu:/# while true; do nc -tlp 80; done    # need listen port or was RST TCP

client1$ curl http://htwebd.corpX.un/root.exe

root@my-ubuntu:/# Ctrl-Z

root@my-ubuntu:/# jobs

root@my-ubuntu:/# kill %1
root@my-ubuntu:/# snort -i eth0 -S HOME_NET=[0.0.0.0/0] -c /etc/snort/snort.conf # -A console 

Модуль 4: Восстановление кластера после сбоев

4.1 Мониторинг кластера

4.2 Резервное копирование и восстановление

4.3 Восстановление кластера после сбоев

  • Выбор узла кластера для “аварии” (Проверить Pod Deletion Policy в Longhorn, выяснить где keycloak, gitlab и master cnpg кластера)
  • Если будет выбран 1-й узел, можно сделать
kube1:~# rsync -avz /root/ kube2.corpX.un:/root/

cmder> notepad .kube/config
  • Выход из строя (выключение по питанию)
  • Проверка состояния кластера и приложений

4.4 Обновление кластера

Примеры конфигураций

stages:
  - lint
  - build
  - scan
  - push

variables:
  KANIKO_REGISTRY_MIRROR: "mirror.gcr.io"

Build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:v1.9.0-debug
    entrypoint: [""]
  script:
    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor
      --insecure --skip-tls-verify
      --context "${CI_PROJECT_DIR}"
      --dockerfile "${CI_PROJECT_DIR}/Dockerfile"
      --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"

  except:
    - tags
  tags:
    - build

Push latest:
  image:
    name: gcr.io/go-containerregistry/crane:debug
    entrypoint: [""]
  variables:
    GIT_STRATEGY: none
  stage: push
  only:
    - main
  script:
    - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - crane --insecure cp $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
  tags:
    - build

Push tag:
  image:
    name: gcr.io/go-containerregistry/crane:debug
    entrypoint: [""]
  variables:
    GIT_STRATEGY: none
  stage: push
  only:
    - tags
  script:
   - crane auth login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
   - crane --insecure cp $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
  tags:
    - build

semgrep:
  stage: lint
  image: semgrep/semgrep
  script: semgrep --config=auto --error
  variables:
    SEMGREP_SRC_DIRECTORY: $CI_PROJECT_DIR
    https_proxy: http://gate.isp.un:3128/
    no_proxy: localhost,127.0.0.1,un
  except:
    - tags
  tags:
    - build

trivy:
  stage: scan
  image:
    name: ghcr.io/aquasecurity/trivy
    entrypoint: [""] 
  variables:
    #TRIVY_USERNAME: "$CI_REGISTRY_USER"
    #TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD"
    TRIVY_REGISTRY: "$CI_REGISTRY"
    TRIVY_CACHE_DIR: ".trivycache/"
  script:
    - trivy image --exit-code 1 --severity HIGH --insecure $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  cache:
    paths:
      - ".trivycache/"
  except:
    - tags
  tags:
    - build

Черновик

DevSecOps

  • - Анализ кода и контейнеров на уязвимости
  • - Управление доступом в K8S
  • - Управление чувствительными данными в CI/CD (Hashicorp Vault, Mozilla Sops)
  • - Управление сертификатами (K8S cert-manager и FreeIPA)
  • Использование LDAP и OpenID для управления идентификацией (Keycloak и FreeIPA)
  • IDS/IPS (Suricata)

Промышленные решения

  • ArgoCD и универсальный Helm Chart
  • Распределенные блочные хранилища в K8S (Longhorn)
  • Операторы K8S и СУБД (CloudNativePG)
  • Брокеры сообщения (Kafka или RabbitMQ)
  • Service Mesh (Istio)
client1:~# time docker build -t gitlab.corpX.un:5000/student/gowebd:ver1.1 gowebd/
...
client1:~# time docker build -t gitlab.corpX.un:5000/student/gowebd:ver1.2 gowebd/
  • Добавляем корпоративный сертификат в систему server
server#
cp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/
update-ca-certificates
systemctl reload docker
devsecops_и_промышленные_решения.1781497958.txt.gz · Last modified: 2026/06/15 07:32 by val