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