====== DevSecOps и промышленные решения ====== * [[https://habr.com/ru/companies/nubes/articles/808035/|Автоматический выпуск SSL-сертификатов. Используем Kubernetes и FreeIPA]] ===== Программа курса ===== * [[https://www.specialist.ru/course/devops3|DevSecOps и промышленные решения]] ===== Модуль 0. Подготовка к занятию ===== - Узнать и записать свой номер стенда: X= - Сообщить его в чат преподавателю ===== Модуль 1: Развертывание инфраструктуры предприятия ===== ==== Теория ==== ==== Лабораторные работы: Развертывание стенда и kubernetes кластера ==== * Разворачиваем стенд курса [[https://www.specialist.ru/course/yun2-b|Linux. Уровень 2. Администрирование сервисов и сетей]] или [[https://rutube.ru/video/18b52d9721f7464b4485fec7d894e8ca/|Развертывание стенда дома (смотреть с 13-й минуты)]] ==== 1.1 Схема стенда, импорт, настройка и запуск VM gate и server ==== * !!! kubeN 8Gb RAM + 4 CPU!!! Запустите с правами 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 ==== * Развертывание FreeIPA [[Решение FreeIPA#С использованием docker compose]] ? попробовать из репозитория вендора, для решения проблемы доступа к ДНС из других контейнеров на этой системе? или убрать на gate.isp.un A запись server.corpX.un ==== 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 * [[Решение FreeIPA#Управление DNS]] для добавления A записей kubeN * Настройка клиента DNS на gate и server # cat /etc/resolv.conf search corpX.un nameserver 192.168.X.10 # host kubeN * [[Система Kubernetes#Подготовка к развертыванию через Kubespray]] * Развертывание Kubernetes через Kubespray ([[Система Kubernetes#Вариант 2 (docker)]]) ==== 1.5 Установка и инициализация компьютеров пользователей ==== * Импорт ВМ client1 * [[Инсталяция системы в конфигурации Desktop]] * FreeIPA [[Решение FreeIPA#Установка и инициализация клиента]] client1 * FreeIPA [[Решение FreeIPA#Управление пользователями]] user1 * Настройка [[Firefox#Использование системных сертификатов]] в Firefox ===== Модуль 2: Развертывание приложений в кластере Kubernetes ===== ==== 2.1 Развертывание Keycloak ==== * Dynamic Volume Provisioning [[Система Kubernetes#rancher local-path-provisioner]] * Использование баз данных ([[Сервис PostgreSQL#CloudNativePG]]) * [[Система Kubernetes#MetalLB]] * [[Система Kubernetes#Установка Helm]] * [[Система Kubernetes#ingress-nginx]] * [[Решение 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") * [[Сервис Keycloak#Базовая конфигурация]] * [[Авторизация с использованием LDAP сервера]] (демонстрирует преподаватель, можно с gate) * Интеграция Keycloak с [[Сервис Keycloak#FreeIPA]] через LDAP * [[Сервис Keycloak#Аутентификация пользователей WEB приложения]] * Демонстрирует преподаватель * [[Технология Docker#Приложение apwebd]], [[Система Kubernetes#Deployment]], [[Система Kubernetes#Service]], [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]], [[Система Kubernetes#ingress example]] ==== 2.2 Развертывание GitLab ==== * Использование распределённых хранилищ ([[Система Kubernetes#longhorn]]) * [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]] server# scp /opt/freeipa-data/gitlab.* kube1:/tmp/ server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/tmp/ kubectl -n my-gitlab-ns create secret generic gitlab-tls \ --from-file=tls.crt=/tmp/gitlab.crt \ --from-file=tls.key=/tmp/gitlab.key \ --from-file=ca.crt=/tmp/ca.crt * Инструмент GitLab [[Инструмент GitLab#Установка через docker-compose]] + %s/server.corpX/gitlab.corpX/ ... privileged: true ... - '22:22' ... # - '/etc/gitlab:/etc/gitlab' ... * Инструмент GitLab [[Инструмент GitLab#Клиент OpenID]] + %s/^/8пробелов/ * [[Система Kubernetes#kompose]] kube1:~/gitlab# kompose convert kube1:~/gitlab# cat vol1-persistentvolumeclaim.yaml ... storage: 2000Mi 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 ... volumeMounts: - name: secret-tls-volume subPath: tls.crt mountPath: /etc/gitlab/ssl/gitlab.corpX.un.crt - name: secret-tls-volume subPath: tls.key mountPath: /etc/gitlab/ssl/gitlab.corpX.un.key - name: secret-tls-volume subPath: ca.crt mountPath: /etc/gitlab/tmp/ca.crt ... hostname: gitlab volumes: - name: secret-tls-volume secret: secretName: gitlab-tls ... kube1:~/gitlab# cat gitlab-service.yaml ... spec: loadBalancerIP: 192.168.X.66 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 pods/gitlab- -f * Создать УЗ user1 через [[Инструмент GitLab#REST API интерфейс]] и связать через [[Инструмент GitLab#Клиент OpenID]] ==== 2.3 Стратегии развертывания и масштабирование нагрузки ==== * Добавляем корпоративный сертификат в кластер kubernetes server# bash -c ' scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/ ssh kube1 update-ca-certificates ssh kube1 systemctl restart containerd scp /opt/freeipa-data/etc/ipa/ca.crt kube2:/usr/local/share/ca-certificates/ ssh kube2 update-ca-certificates ssh kube2 systemctl restart containerd scp /opt/freeipa-data/etc/ipa/ca.crt kube3:/usr/local/share/ca-certificates/ ssh kube3 update-ca-certificates ssh kube3 systemctl restart containerd scp /opt/freeipa-data/etc/ipa/ca.crt kube4:/usr/local/share/ca-certificates/ ssh kube4 update-ca-certificates ssh kube4 systemctl restart containerd ' * [[Система Kubernetes#Управление образами]] * [[Стратегии деплоя в Kubernetes]] ==== 2.4 ArgoCD и универсальный Helm Chart ==== ===== Модуль 3: Безопасность в DevOps ===== * Инструменты для статического анализа кода * Анализ уязвимостей в контейнерах * Интеграция инструментов безопасности в CI/CD * Управление секретами и сертификатами * [[Управление доступом в Kubernetes]] * Интеграция с внешними системами идентификации * Использование IDS/IPS в Kubernetes ===== Модуль 4: Восстановление кластера после сбоев ===== * Мониторинг кластера Kubernetes * Резервное копирование и восстановление данных приложений * Восстановление управляющих и рабочих узлов * Восстановление etcd ===== Черновик ===== ==== 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)