====== DevSecOps и промышленные решения ====== * [[https://habr.com/ru/companies/nixys/articles/816769/|Bare-metal Kubernetes — спускайся с облаков]] * [[https://habr.com/ru/companies/nubes/articles/808035/|Автоматический выпуск SSL-сертификатов. Используем Kubernetes и FreeIPA]] ===== Программа курса ===== * [[https://www.specialist.ru/course/devops3|DevSecOps и промышленные решения]] ===== Ссылка на презентацию ===== * [[https://docs.google.com/presentation/d/1x0pls2ClHYfdB3W3l6jb4If7e9vGpfDA/]] ===== Модуль 0. Подготовка к занятию ===== - Узнать и записать свой номер стенда: X= - Сообщить его в чат преподавателю ===== Модуль 1: Развертывание инфраструктуры предприятия ===== ===== Слайд ===== * https://docs.google.com/presentation/d/1x0pls2ClHYfdB3W3l6jb4If7e9vGpfDA/edit?slide=id.p6#slide=id.p6 ==== 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 ==== * [[Настройка стендов слушателей#Настройка виртуальных систем Unix]] с использованием [[Настройка стендов слушателей#Скрипты автоконфигурации]] * gate # sh net_gate.sh # init 6 * server # sh net_server.sh # init 6 * Создать в Putty профили gate, server и подключиться ==== 1.3 Развертывание FreeIPA ==== server# apt update * Установка [[Технология Docker#docker-compose]] * Может понадобится [[Технология Docker#Настройка registry-mirrors]] * Развертывание FreeIPA [[Решение FreeIPA#С использованием docker compose]] ==== 1.4 Развертывание Kubernetes ==== * Настройка сервера DHCP на gate gate:~# sh conf/dhcp.sh * Настройка MAC адресов 08:00:27:12:34:5N (для получения назначенного IP через [[Сервис DHCP]]) * Запуск kube1-4 * [[Решение FreeIPA#Поверка после установки]] и [[Решение FreeIPA#Настройка доступа для клиентов DNS]] * [[Решение FreeIPA#Управление DNS]] для добавления A записей kubeN * Настройка клиента DNS на gate и server # cat /etc/resolv.conf search corpX.un nameserver 192.168.X.10 # ping kubeN * [[Система Kubernetes#Подготовка к развертыванию через Kubespray]] * Развертывание Kubernetes через Kubespray ([[Система Kubernetes#Вариант 2 (docker)]]) * [[Система Kubernetes#Настройка автодополнения]] (alias k) ==== 1.5 Установка и инициализация компьютеров пользователей ==== * Импорт ВМ lin client1 * [[Инсталяция системы в конфигурации Desktop]] * Настройка [[Firefox#Использование системных сертификатов]] в Firefox * FreeIPA [[Решение FreeIPA#Установка и инициализация клиента]] client1 (лучше перезагрузить) * FreeIPA [[Решение FreeIPA#Управление пользователями]] user1 server# ssh-copy-id client1 ==== Практикум ==== * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod1_pract.mp4|Запись практикума]] (длительность: 41 минута) ===== Модуль 2: Развертывание приложений в кластере Kubernetes ===== ===== Слайд ===== * https://docs.google.com/presentation/d/1x0pls2ClHYfdB3W3l6jb4If7e9vGpfDA/edit?slide=id.p7#slide=id.p7 ==== 2.1 Развертывание Keycloak ==== * Dynamic Volume Provisioning [[Система Kubernetes#rancher local-path-provisioner]] * Использование баз данных, (развертывание через оператор [[Сервис PostgreSQL#CloudNativePG]]) * В 3-м модуле будет использование [[Система Kubernetes#Kustomize]] для сокрытия чувствительных данных * [[Система Kubernetes#MetalLB]] * [[Система Kubernetes#Установка Helm]] * Вебинар: [[Как и чем заменить Ingress NGINX]] * Устанавливаем [[Система Kubernetes#traefik]] * [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]] * [[Система Kubernetes#secrets tls]] (keycloak-tls в ns my-keycloak-ns) 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 * Сервис Keycloak в [[Сервис Keycloak#Kubernetes]] (версия 25.2.0, tls: true, postgresql.enabled: false, externalDatabase.host: "my-pgcluster-rw.my-pgcluster-ns") * В 3-м модуле будет использование [[Система Kubernetes#Работа с чувствительными данными (секретами)]] для сокрытия чувствительных данных в Helm * [[Сервис Keycloak#Базовая конфигурация]] (только realm, преподавателю можно user2) * [[Авторизация с использованием LDAP сервера]] (демонстрирует преподаватель, можно с gate) * Интеграция Keycloak с [[Сервис Keycloak#FreeIPA]] через LDAP * [[Сервис Keycloak#Страница для проверки учетных записей]] === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod2_pract_path1.mp4|Запись практикума]] (длительность: 23 минуты) ==== 2.2 Развертывание GitLab ==== * Использование распределённых хранилищ ([[Система Kubernetes#longhorn]]) * Добавляем в DNS через GUI запись: gitlab A 192.168.X.65 * Решение FreeIPA [[Решение FreeIPA#Поддержка ACME]] * Решение FreeIPA [[Решение FreeIPA#Динамический DNS]] * Управление сертификатами с использованием [[Система Kubernetes#cert-manager]] и выпуск сертификата для будущего развертывания gitlab * Инструмент GitLab [[Инструмент GitLab#Установка через docker-compose]] 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 * GitLab [[Инструмент GitLab#Клиент OpenID]] + %s/^/8пробелов/ * Использование [[Система Kubernetes#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 # /bin/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 * Может понадобиться [[Инструмент GitLab#Проверка конфигурации и перезапуск]] для процесса Sidekiq * Можно показать [[Инструмент GitLab#Настройка отправки почты]], потребуется развернуть почтовый сервер из лабораторной работы [[#4.1 Мониторинг кластера]] * Настройка подключения через OpenID (преподаватель) * Настройка [[Сервис Keycloak#Аутентификация пользователей WEB приложения]] через Keycloak * Создать УЗ user1 через [[Инструмент GitLab#REST API интерфейс]] и связать через [[Инструмент GitLab#Клиент OpenID]] === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod2_pract_path2.mp4|Запись практикума]] (длительность: 28 минут) ==== 2.3 Стратегии развертывания и масштабирование нагрузки ==== * Вебинар: [[Стратегии деплоя в Kubernetes]] * Развертываем [[Система Kubernetes#Deployment]] для тестового приложения, демонстрирующего версию kube1:~/webd-k8s# cat my-webd-deployment.yaml ... image: httpd lifecycle: ... cd /usr/local/apache2/htdocs/ echo "

Hello from htwebd on $(hostname) ver1.1

" > index.html
* [[Система Kubernetes#Service]] * Преподавателю продемонстрировать и, затем удалить [[Система Kubernetes#Horizontal Pod Autoscaler]] * Добавляем в DNS htwebd A 192.168.X.66 * Добавляем в [[Система Kubernetes#Traefik]] kubernetesGateway * [[Система Kubernetes#Gateway]] (пока, без HTTPS) * [[Система Kubernetes#HTTPRoute]] * Деплоим новую версию приложения 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 * Воспроизводим [[Стратегии деплоя в Kubernetes#Шаг 5. canary deployment with Gateway API]] с использованием [[Система Kubernetes#Traefik]] и [[Система Kubernetes#HTTPRoute]] * Преподаватель демонстрирует добавление HTTPS в [[Система Kubernetes#Gateway]] с использованием [[Система Kubernetes#cert-manager]] === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod2_pract_path3.mp4|Запись практикума]] (длительность: 14 минуты) ==== 2.4 ArgoCD и универсальный Helm Chart ==== * Вебинар: [[Универсальный Helm-чарт]] 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 * [[Универсальный Helm-чарт#Добавляем lifecycle.postStart и Gateway API]] в Универсальный Helm-чарт * Демонстрируем недостатки традиционного CI/CD и удаляем развертывание kube1# kubectl -n my-ns edit deployments.apps my-htwebd-dep ... 1.1 -> 1.2 ... client1$ curl https://htwebd.corpX.un kube1# kubectl delete ns my-ns * [[Контроллер ArgoCD#Развертывание и подключение к контроллеру ArgoCD]] * Добавление корпоративного корневого сертификата для работы с GitLab репозиторием server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/ kube1# update-ca-certificates * [[Контроллер ArgoCD#Добавление корпоративного корневого сертификата]] в контроллер ArgoCD * Добавляем в GitLab public группу student * Создаем проект webd-k8s (public, без readme, в группе student) в GitLab и настраиваем [[Контроллер ArgoCD#Управление приложениями через kubectl]] в ArgoCD * Повторяем попытку изменить поведение приложения "вручную" * Преподавателю можно показать [[Контроллер ArgoCD#Развертывание множества приложений через ApplicationSet]], добавив приложение ehwebd kube1:~/webd-k8s# mkdir apps/ehwebd kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/ehwebd/ kube1:~/webd-k8s# cat apps/ehwebd/values.yaml ... repository: brndnmtthws/nginx-echo-headers ... targetPort: 8080 ... kube1:~/webd-k8s# helm template my-ehwebd uni-webd-chart/ -f apps/ehwebd/values.yaml -f env.yaml === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod2_pract_path4.mp4|Запись практикума]] (длительность: 26 минут) ===== Модуль 3: Безопасность в DevOps ===== ===== Слайд ===== * https://docs.google.com/presentation/d/1x0pls2ClHYfdB3W3l6jb4If7e9vGpfDA/edit?slide=id.p8#slide=id.p8 ==== 3.1 Интеграция инструментов безопасности в CI/CD ==== * [[https://habr.com/ru/companies/dsec/articles/702652/|SAST для самых маленьких. Обзор open-source инструментов поиска уязвимостей для C/C++]] Инструмент Semgrep * [[Технология Docker#Установка]] Docker на client1 (у контейнеров на server есть проблемы с dns из-за freeipa) * [[Язык программирования Python#Виртуальная среда Python]] * Приложение на Python [[Язык программирования Python#Flask Gunicorn]] * Dockerfile [[Технология Docker#Приложение python pywebd]] * [[Инструмент Semgrep]] для статического анализа кода Сканер Trivy * Разместить образ pywebd в gitlab * [[Сканер Trivy]] для анализа уязвимостей в контейнерах CI * Демонстрирует преподаватель * [[Система Kubernetes#gitlab-runner kubernetes]] * Интеграция инструментов безопасности в [[Инструмент GitLab#Пример CI с использованием контейнеров|CI]] (см. [[#Примеры конфигураций]]) * Можно продемонстрировать [[Контроллер ArgoCD#Развертывание множества приложений через ApplicationSet]], приложения pywebd, (потребует [[Система Kubernetes#Добавление корпоративного корневого сертификата в кластер]]) kube1:~/webd-k8s# mkdir apps/pywebd kube1:~/webd-k8s# cp uni-webd-chart/values.yaml apps/pywebd/ kube1:~/webd-k8s# cat apps/pywebd/values.yaml ... PYWEBD_DOC_ROOT: /home/myuser/www/ ... - mkdir -p /home/myuser/www/ && echo \"

Hello from pywebd on $(hostname)

\" > /home/myuser/www/index.html ... kube1:~/webd-k8s# helm template my-pywebd uni-webd-chart/ -f apps/pywebd/values.yaml -f env.yaml
=== Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod3_pract_path1.mp4|Запись практикума]] (длительность: 16 минут) ==== 3.2 Управление секретами ==== * Вебинар: [[Управление секретами в сети предприятия]] * [[Hashicorp Vault#Установка и подключение]] Hashicorp Vault на server * Включение [[Hashicorp Vault#Transit secrets engine]] и создание ключей для pgcluster и keycloak * Создание [[Hashicorp Vault#Vault policy]] для pgcluster и keycloak * Создание [[Hashicorp Vault#Vault auth token role]] для pgcluster и keycloak * Установка [[Mozilla Sops]] на kube1 * [[Система Kubernetes#Kustomize]] для сокрытия чувствительных данных * [[Система Kubernetes#Работа с чувствительными данными (секретами)]] в Helm === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod3_pract_path2.mp4|Запись практикума]] (длительность: 17 минут) ==== 3.3 Управление доступом в Kubernetes ==== Управление доступом к API * [[Система Kubernetes#Инструмент командной строки kubectl]] на client1 * [[Система Kubernetes#Использование сертификатов]] для [[Система Kubernetes#Создание файла конфигурации kubectl]] и [[Система Kubernetes#Предоставление полного доступа к Namespace]] * [[Система Kubernetes#Предоставление полного доступа к Kubernetes Cluster|Cluster Roles]], [[Система Kubernetes#Создание и привязка ServiceAccount к ClusterRole]] (ns default), [[Система Kubernetes#Создание long-lived токена]] (ns default), [[Система Kubernetes#Создание файла конфигурации kubectl]] * Устанавливаем [[Система Kubernetes#Kubernetes Dashboard]] с client1 * Можно продемонстрировать интеграцию с внешними системами идентификации - [[Управление доступом в Kubernetes#Шаг 7. Использование OpenID Connect]] SecurityContext/NetworkPolicy * Обсудить [[Система Kubernetes#Использование SecurityContext]] # kubectl run my-ubuntu --image=ubuntu -- "sleep" "infinity" # kubectl exec -ti pods/my-ubuntu -- bash * Проверяем доступ через [[Сервис PostgreSQL#Клиент psql]] в pod и telnet с узлов кластера ([[Сервис PostgreSQL#Подключение по сети]]) * [[Система Kubernetes#Использование NetworkPolicy]] для управления доступом в NS кластера === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod3_pract_path3.mp4|Запись практикума]] (длительность: 23 минуты) ==== 3.4 Использование IDS/IPS в Kubernetes ==== * [[https://habr.com/ru/articles/813799/|DPI из подручных материалов]] * Готовимся перехватывать трафик # kubectl expose pod my-ubuntu --port=80 * Разворачиваем [[Система Kubernetes#Gateway API]] реализацию [[Система Kubernetes#Envoy Gateway]] * Удаляем приложение в ArgoCD ([[Контроллер ArgoCD#Управление приложениями через kubectl]]) * Разворачиваем htwebd из манифестов kube1:~/webd-k8s# kubectl apply -f my-webd-deployment.yaml,my-webd-service.yaml -n my-ns * Правим DNS запись htwebd A 192.168.X.67 * Добавляем [[Система Kubernetes#cert-manager certificate]], Envoy и HTTPS в [[Система Kubernetes#Gateway]] и requestMirror в [[Система Kubernetes#HTTPRoute]] * Разворачиваем основу для 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 * Можно развернуть snort из статьи [[https://habr.com/ru/articles/813799/|DPI из подручных материалов]] root@my-ubuntu:/# snort -i eth0 -S HOME_NET=[0.0.0.0/0] -c /etc/snort/snort.conf # -A console === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod3_pract_path4.mp4|Запись практикума]] (длительность: 17 минут) ===== Модуль 4: Восстановление кластера после сбоев ===== ===== Слайд ===== * https://docs.google.com/presentation/d/1x0pls2ClHYfdB3W3l6jb4If7e9vGpfDA/edit?slide=id.p9#slide=id.p9 ==== 4.1 Мониторинг кластера ==== * Вебинар: [[Мониторинг кластера Kubernetes]] * [[Система Kubernetes#Metrics Server]] * Для получения уведомлений по email на server понадобится [[Сервис HTTP#Установка и запуск сервера Apache]] на порту 81 и [[Сервис Ansible]] * Для тестирования уведомлений используем [[Система Kubernetes#Manifest]] развертывания с последующим стресс тестированием из [[Анализ производительности системы]] * [[Сервис VictoriaMetrics]] === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod4_pract_path1.mp4|Запись практикума]] (длительность: 35 минут) ==== 4.2 Резервное копирование и восстановление ==== * Резервное копирование и восстановление данных приложений с [[Система Kubernetes#Использование backup-ов]] longhorn (Вебинар: [[Работа с хранилищами в Kubernetes]]) * [[Сервис PostgreSQL#Резервное копирование и восстановление]] PostgreSQL (Вебинар: [[Все что должен знать DevOps про PostgreSQL]]) * [[Система Kubernetes#Отладка etcd]] === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod4_pract_path2.mp4|Запись практикума]] (длительность: 8 минут) ==== 4.3 Восстановление кластера после сбоев ==== * Остановить кластер, сделать снапшоты * Может понадобиться [[Инструмент GitLab#Проверка конфигурации и перезапуск]] GitLab * [[Система Kubernetes#Поиск и удаление подов в нерабочем состоянии]] * [[Управление сервисами в Linux#Управление юнитами Systemd]] systemctl reset-failed * Выбор узла кластера для "аварии" (Проверить Pod Deletion Policy в Longhorn, выяснить где keycloak, gitlab и master [[Сервис PostgreSQL#Проверка состояния кластера cnpg|cnpg кластера]]) * Если будет выбран 1-й узел, можно сделать kube1:~# rsync -avz /root/ kube2.corpX.un:/root/ cmder> notepad .kube/config * Выход из строя (выключение по питанию) * Анализ работоспособности кластера ([[Система Kubernetes#Отладка etcd]]) * Анализ работоспособности приложений ([[Сервис PostgreSQL#Проверка состояния кластера cnpg]]) * Может понадобиться удаление pod-ов (keycloak) с --grace-period=0 --force * [[Система Kubernetes#Удаление вышедшего из строя узла через kubespray]] * Использование [[Система Kubernetes#Развертывание через Kubespray]] для добавления kube4 в качестве управляющего, рабочего и etcd узла * Восстановление отказоустойчивости приложений (создание каталогов и установка ПО для [[Система Kubernetes#Dynamic Volume Provisioning]]) * Может понадобиться [[Сервис PostgreSQL#Миграция с вышедшего из строя узла]] для кластера CloudNativePG * Проверка состояния кластера и приложений === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod4_pract_path3.mp4|Запись практикума]] (длительность: 15 минут) ==== 4.4 Обновление кластера ==== * [[Система Kubernetes#Обновление кластера через kubespray]] * Проверка состояния кластера и приложений === Практикум === * [[https://val.bmstu.ru/~val/pract/dev3/dev3_mod4_pract_path4.mp4|Запись практикума]] (длительность: 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 ==== * [[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 * [[Система Kubernetes#Управление образами]] * Демонстрирует преподаватель * [[Технология Docker#Приложение apwebd]], [[Система Kubernetes#Deployment]], [[Система Kubernetes#Service]], [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]], [[Система Kubernetes#ingress example]]