====== 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 и промышленные решения]]
===== Модуль 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 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:~# ###git -C conf/ pull
gate:~# sh conf/dhcp.sh
* Настройка MAC адресов 08:00:27:12:34:5N (для получения назначенного IP через [[Сервис DHCP]]) и запуск kube1-4
* [[Решение FreeIPA#Настройка доступа для клиентов DNS]]
* [[Решение 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#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")
* Преподаватель может показать Helm [[Система Kubernetes#Работа с чувствительными данными (секретами)]] для сокрытия чувствительных данных
* [[Сервис Keycloak#Базовая конфигурация]] (только realm, преподавателю можно user2)
* [[Авторизация с использованием LDAP сервера]] (демонстрирует преподаватель, можно с gate)
* Интеграция Keycloak с [[Сервис Keycloak#FreeIPA]] через LDAP
* [[Сервис Keycloak#Страница для проверки учетных записей]]
* [[Сервис Keycloak#Аутентификация пользователей WEB приложения]]
==== 2.2 Развертывание GitLab ====
* Использование распределённых хранилищ ([[Система Kubernetes#longhorn]])
* Добавляем в DNS через GUI запись: gitlab A 192.168.X.65
* Решение FreeIPA [[Решение FreeIPA#Поддержка ACME]]
* Решение FreeIPA [[Решение FreeIPA#Динамический DNS]]
* Управление сертификатами с использованием [[Система Kubernetes#cert-manager]]
* Инструмент 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: 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
# apt update && DEBIAN_FRONTEND=noninteractive apt install msmtp-mta bsd-mailx -y
# echo -e 'account default\nhost mail.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 pods/gitlab- -f
* [[Инструмент GitLab#Проверка конфигурации и перезапуск]] для процесса Sidekiq
* Для демонстрации OpenID можно создать УЗ user1 через [[Инструмент GitLab#REST API интерфейс]] и связать через [[Инструмент GitLab#Клиент OpenID]]
==== 2.3 Стратегии развертывания и масштабирование нагрузки ====
* htwebd A 192.168.X.66
* [[Система 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]]
* [[Система Kubernetes#cert-manager]]
* [[Система Kubernetes#Gateway]]
* [[Система Kubernetes#HTTPRoute]]
kube1:~/webd-k8s# cp my-webd-deployment.yaml my-webd-deployment2.yaml
kube1:~/webd-k8s# cp my-webd-service.yaml my-webd-service2.yaml
...
* [[Стратегии деплоя в Kubernetes]]
==== 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# less uni-webd-chart/values.yaml
...
service:
port: 80
...
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# cat env.yaml
domain: corpX.un
kube1:~/webd-k8s# helm template my-htwebd uni-webd-chart/ -f apps/htwebd/values.yaml -f env.yaml
* [[Универсальный Helm-чарт#Добавляем lifecycle.postStart и Gateway API]]
* [[Контроллер ArgoCD#Развертывание и подключение к контроллеру ArgoCD]]
* Добавление корпоративного корневого сертификата для загрузки Git репозитория
server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/
server# ssh kube1 update-ca-certificates
* [[Контроллер ArgoCD#Добавление корпоративного корневого сертификата]] в контроллер ArgoCD
* [[Контроллер ArgoCD#Управление приложениями через kubectl]]
* Можно показать [[Контроллер ArgoCD#Развертывание множества приложений через ApplicationSet]], добавив приложение ehwebd
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 =====
* [[https://habr.com/ru/companies/dsec/articles/702652/|SAST для самых маленьких. Обзор open-source инструментов поиска уязвимостей для C/C++]]
* [[Инструмент Semgrep]] для статического анализа кода
* Анализ уязвимостей в контейнерах
* Интеграция инструментов безопасности в 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)
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
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#Управление образами]]
* Демонстрирует преподаватель
* [[Технология Docker#Приложение apwebd]], [[Система Kubernetes#Deployment]], [[Система Kubernetes#Service]], [[Решение FreeIPA#Создание ключа и сертификата для стороннего сервиса]], [[Система Kubernetes#ingress example]]