DevSecOps и промышленные решения
Программа курса
Модуль 0. Подготовка к занятию
Узнать и записать свой номер стенда: X=
Сообщить его в чат преподавателю
Модуль 1: Развертывание инфраструктуры предприятия
Теория
Лабораторные работы: Развертывание стенда и kubernetes кластера
1.1 Схема стенда, импорт, настройка и запуск VM gate и server
Запустите с правами 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
# sh net_gate.sh
# init 6
# sh net_server.sh
# init 6
1.3 Развертывание FreeIPA
1.4 Развертывание Kubernetes
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
# host kubeN
1.5 Установка и инициализация компьютеров пользователей
Модуль 2: Развертывание приложений в кластере Kubernetes
2.1 Развертывание Keycloak
-
Использование баз данных, (развертывание через оператор
CloudNativePG)
Преподаватель может показать использование
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
Сервис Keycloak в
Kubernetes (версия 25.2.0, tls: true, postgresql.enabled: false, externalDatabase.host: “my-pgcluster-rw.my-pgcluster-ns”)
-
-
Интеграция Keycloak с
FreeIPA через LDAP
-
2.2 Развертывание GitLab
Использование распределённых хранилищ (
longhorn)
Добавляем в
DNS через
GUI запись: gitlab A 192.168.X.65
-
-
-
kube1:~/gitlab# sed -i -e 's/server.corpX/gitlab.corpX/' docker-compose.yml
...
privileged: true
...
- '22:22'
...
# - '/etc/gitlab:/etc/gitlab'
...
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: 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-<TAB> -f
2.3 Стратегии развертывания и масштабирование нагрузки
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
kube1:~/webd-k8s# cp my-webd-deployment.yaml my-webd-deployment2.yaml
kube1:~/webd-k8s# cp my-webd-service.yaml my-webd-service2.yaml
...
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# 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
server# scp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/
server# ssh kube1 update-ca-certificates
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
-
Анализ уязвимостей в контейнерах
Интеграция инструментов безопасности в CI/CD
-
-
Интеграция с внешними системами идентификации
Использование IDS/IPS в Kubernetes
Модуль 4: Восстановление кластера после сбоев
Мониторинг кластера Kubernetes
Резервное копирование и восстановление данных приложений
Восстановление управляющих и рабочих узлов
Восстановление etcd
Черновик
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#
cp /opt/freeipa-data/etc/ipa/ca.crt kube1:/usr/local/share/ca-certificates/
update-ca-certificates
systemctl reload docker
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
'