====== 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)