Настройка приложения#
Функции и интерфейсы функций СЗИ, доступные каждой роли пользователей#
Функции и интерфейсы функций СЗИ:
Выявление уязвимостей;
Настройка контроля целостности;
Проверка корректности конфигурации контейнеров;
Регистрация событий;
Управление доступом;
Централизованное управление образами контейнеров;
Идентификация и аутентификация пользователей.
Параметры (настройки) безопасности СЗИ, доступные для каждой роли пользователей, и их безопасные значения#
Параметры (настройки) безопасности СЗИ:
Выявление уязвимостей;
Настройка контроля целостности;
Проверка корректности конфигурации контейнеров;
Регистрация событий;
Управление доступом;
Централизованное управление образами контейнеров;
Идентификация и аутентификация пользователей.
Типы событий безопасности, связанных с доступными пользователю функциями#
В DropApp к регистрации событий безопасности предъявляются следующие требования:
регистрировать события, относящиеся к инцидентам безопасности DropApp, связанные с попытками осуществления несанкционированного доступа к DropApp;
оповещать администратора безопасности DropApp и администратора информационной (автоматизированной) системы об инцидентах безопасности;
выполнять действия, являющиеся реакцией на инциденты безопасности;
осуществлять сбор и хранение записей в журнале событий безопасности, которые позволяют определить, когда и какие действия происходили.
Для каждой функции безопасности в DropApp определен перечень событий, необходимых для регистрации и учета.
Для регистрируемых событий безопасности в каждой записи журнала событий безопасности указывается номер (уникальный идентификатор) события, дата, время, тип события безопасности.
Записи журнала событий безопасности представлены в структурированном виде и содержат информацию о времени события безопасности, взятую из хостовой операционной системы.
Средство контейнеризации осуществляет запись событий безопасности контейнеров в журнал событий безопасности информационной (автоматизированной) системы с указанием идентификатора контейнера.
Журнал событий безопасности средства контейнеризации доступен только для чтения. При исчерпании области памяти, отведенной под журнал событий безопасности средства контейнеризации, средство контейнеризации осуществляет архивирование журнала с последующей очисткой указанного журнала.
Регистрации подлежат события безопасности указанные в таблице ниже.
№ |
Название события безопасности |
Тип события безопасности |
|---|---|---|
1 |
Неуспешные попытки аутентификации пользователей DropApp |
Ошибка аутентификации в Kube-apiserver |
Ошибка авторизации в Kube-apiserver |
||
Ошибка аутентификации в Dex |
||
2 |
Создание, модификация и удаление образов контейнеров |
Создание, модификация образа |
3 |
Получение доступа к образам контейнеров |
Pull образа контейнера |
4 |
Запуск и остановка контейнеров с указанием причины остановки |
Создание и запуск pod |
Остановка и удаление pod |
||
5 |
Изменение ролевой модели |
Создание роли |
Обновление роли |
||
Удаление роли |
||
6 |
Модификация запускаемых контейнеров |
|
7 |
Выявление известных уязвимостей в образах контейнеров и некорректности конфигурации |
Выявление уязвимостей в образах контейнеров |
Выявление некорректности конфигурации |
||
8 |
Факты нарушения целостности объектов контроля |
Для каждого события безопасности регистрируются:
описание события безопасности;
сведения о критичности события безопасности.
Средство контейнеризации обеспечивает запись событий безопасности контейнеров в журнал событий безопасности информационной (автоматизированной) системы с указанием идентификатора пользователя хостовой операционной системы, от имени которого был запущен контейнер.
Параметры для выборки событий в окне Explore приложения Grafana в режиме code и примеры записей событий#
Неуспешные попытки аутентификации пользователей DropApp:
ошибка аутентификации в Kube-apiserver:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} | json |responseStatus_code=401#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "3c21b97f-e0ce-4890-9824-1dd5211bbe8a", "stage": "ResponseStarted", "requestURI": "/api/v1/namespaces/test-audit/pods?limit=500", "verb": "list", "user": {}, "sourceIPs": [ "0.0.0.0" ], "userAgent": "kubectl/v1.25.16 (linux/amd64) kubernetes/89a4ea3", "objectRef": { "resource": "pods", "namespace": "test-audit", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }, "requestReceivedTimestamp": "2024-02-05T12:47:15.504089Z", "stageTimestamp": "2024-02-05T12:47:15.504370Z" }ошибка авторизации в Kube-apiserver:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `"authorization.k8s.io/decision":"forbid"`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "9f84ac8b-4f5e-44ef-a089-105c301c41aa", "stage": "ResponseComplete", "requestURI": "/api/v1/namespaces/dapp-kube-apiserver", "verb": "get", "user": { "username": "system:serviceaccount:trivy-system:trivy-operator", "uid": "96409cac-48cd-44bf-a96e-686db8207d30", "groups": [ "system:serviceaccounts", "system:serviceaccounts:trivy-system", "system:authenticated" ], "extra": { "authentication.kubernetes.io/pod-name": [ "trivy-operator-7646897d94-m9mqc" ], "authentication.kubernetes.io/pod-uid": [ "82fca108-c78c-4795-9658-e1cf67f05bc4" ] } }, "sourceIPs": [ "0.0.0.0" ], "userAgent": "trivy-operator/v0.0.0 (linux/amd64) kubernetes/$Format", "objectRef": { "resource": "namespaces", "namespace": "dapp-kube-apiserver", "name": "dapp-kube-apiserver", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "status": "Failure", "message": "namespaces \"dapp-kube-apiserver\" is forbidden: User \"system:serviceaccount:trivy-system:trivy-operator\" cannot get resource \"namespaces\" in API group \"\" in the namespace \"dapp-kube-apiserver\"", "reason": "Forbidden", "details": { "name": "dapp-kube-apiserver", "kind": "namespaces" }, "code": 403 }, "requestReceivedTimestamp": "2024-07-25T12:31:34.304742Z", "stageTimestamp": "2024-07-25T12:31:34.304963Z", "annotations": { "authorization.k8s.io/decision": "forbid", "authorization.k8s.io/reason": "" } }ошибка аутентификации в Dex:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {container="dex"} |= `Failed login`#Пример записи о событии {time="2024-07-25T17:46:06Z" level=error msg="Failed login attempt for user: \"johndoe@example.com\". Invalid credentials."Создание, модификация и удаление образов контейнеров:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {app="harbor", component="registry"} |= `PUT`#Пример записи о событии 0.0.0.0 - - [25/Jul/2024:18:01:40 +0000] "PUT /v2/library/curl/manifests/8.5.0 HTTP/1.1" 201 0 "" "containers/5.26.2 (github.com/containers/image)"#Во внутреннем журнале Harbor также Username Resource Resource Type Operation Timestamp admin library/curl:8.5.0 artifact create 7/25/24, 9:01 PMПолучение доступа к образам контейнеров: pull образа контейнера:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {app="harbor", component="registry", stream="stderr"} |= `GET`#Пример записи о событии time="2024-07-25T18:13:02.823782634Z" level=info msg="response completed" go.version=go1.22.5 http.request.host="harbor-registry:5000" http.request.id=be75896e-7252-4822-9c1f-677de519c072 http.request.method=GET http.request.remoteaddr="0.0.0.0:50658" http.request.uri="/v2/dropapp/curl/blobs/sha256:changit" http.request.useragent=harbor-registry-client http.response.contenttype="application/octet-stream" http.response.duration=112.758114ms http.response.status=200 http.response.written=911#Во внутреннем журнале Harbor также Username Resource Resource Type Operation Timestamp admin library/curl:8.5.0 artifact pull 7/25/24, 9:01 PMЗапуск и остановка контейнеров с указанием причины остановки:
cоздание и запуск pod:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `/pods` |= `create` |= `ResponseComplete`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "a4875b7f-00fa-4eac-bfca-c9dba047a049", "stage": "ResponseComplete", "requestURI": "/api/v1/namespaces/trivy-system/pods/scan-vulnerabilityreport-5468886d8b-pn2sk", "verb": "delete", "user": { "username": "system:serviceaccount:kube-system:generic-garbage-collector", "uid": "75fdcfd4-5627-4727-acdf-dadc73d045b5", "groups": [ "system:serviceaccounts", "system:serviceaccounts:kube-system", "system:authenticated" ] }, "sourceIPs": [ "0.0.0.0" ], "userAgent": "kube-controller-manager/v1.25.16 (linux/amd64) kubernetes/4fb89a6/system:serviceaccount:kube-system:generic-garbage-collector", "objectRef": { "resource": "pods", "namespace": "trivy-system", "name": "scan-vulnerabilityreport-5468886d8b-pn2sk", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "code": 200 }, "requestReceivedTimestamp": "2024-07-25T19:38:50.929670Z", "stageTimestamp": "2024-07-25T19:38:50.935019Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"system:controller:generic-garbage-collector\" of ClusterRole \"system:controller:generic-garbage-collector\" to ServiceAccount \"generic-garbage-collector/kube-system\"" } }остановка и удаление pod:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `/pods` |= `delete` |= `ResponseComplete`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "b965708b-8fd8-4b1b-8859-e91230cb5b1b", "stage": "ResponseComplete", "requestURI": "/api/v1/namespaces/trivy-system/pods/scan-vulnerabilityreport-7fbd6c5454-pqv9n", "verb": "delete", "user": { "username": "system:serviceaccount:kube-system:generic-garbage-collector", "uid": "75fdcfd4-5627-4727-acdf-dadc73d045b5", "groups": [ "system:serviceaccounts", "system:serviceaccounts:kube-system", "system:authenticated" ] }, "sourceIPs": [ "0.0.0.0" ], "userAgent": "kube-controller-manager/v1.25.16 (linux/amd64) kubernetes/4fb89a6/system:serviceaccount:kube-system:generic-garbage-collector", "objectRef": { "resource": "pods", "namespace": "trivy-system", "name": "scan-vulnerabilityreport-7fbd6c5454-pqv9n", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "code": 200 }, "requestReceivedTimestamp": "2024-07-25T19:36:56.925040Z", "stageTimestamp": "2024-07-25T19:36:56.931565Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"system:controller:generic-garbage-collector\" of ClusterRole \"system:controller:generic-garbage-collector\" to ServiceAccount \"generic-garbage-collector/kube-system\"" } }Изменение ролевой модели:
создание роли:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `/apis/rbac.authorization.k8s.io` != `"verb":"get"` != `"verb":"watch"` != `"verb":"list"`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "8653f4f7-2c07-42a2-bd3c-31c165b2765e", "stage": "ResponseComplete", "requestURI": "/apis/rbac.authorization.k8s.io/v1/namespaces/trivy-system/roles", "verb": "create", "user": { "username": "https://dex.<example.ru>#dapp-k8s-admin", "groups": [ "ipausers", "k8s-admins", "system:authenticated" ] }, "sourceIPs": [ "0.0.0.0", "0.0.0.0", "0.0.0.0" ], "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/0.0.0.0 Safari/537.36 SberBrowser/0.0.0.0", "objectRef": { "resource": "roles", "namespace": "trivy-system", "name": "example-role", "apiGroup": "rbac.authorization.k8s.io", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "code": 201 }, "requestReceivedTimestamp": "2024-07-25T19:47:16.110448Z", "stageTimestamp": "2024-07-25T19:47:16.115665Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"dapp-k8s-admins\" of ClusterRole \"cluster-admin\" to Group \"k8s-admins\"", "mutation.webhook.admission.k8s.io/round_0_index_2": "{\"configuration\":\"gatekeeper-mutating-webhook-configuration\",\"webhook\":\"mutation.gatekeeper.sh\",\"mutated\":false}" } }обновление роли:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `/apis/rbac.authorization.k8s.io` != `"verb":"get"` != `"verb":"watch"` != `"verb":"list"`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "d26cd60b-5b3a-43db-90e5-11d7e41ac2ae", "stage": "ResponseComplete", "requestURI": "/apis/rbac.authorization.k8s.io/v1/namespaces/trivy-system/roles/example-role", "verb": "update", "user": { "username": "https://dex.<example.ru>#dapp-k8s-admin", "groups": [ "ipausers", "k8s-admins", "system:authenticated" ] }, "sourceIPs": [ "0.0.0.0", "0.0.0.0", "0.0.0.0" ], "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/0.0.0.0 Safari/537.36 SberBrowser/0.0.0.0", "objectRef": { "resource": "roles", "namespace": "trivy-system", "name": "example-role", "uid": "f9d67168-5bac-4a7b-b657-0a751eba8329", "apiGroup": "rbac.authorization.k8s.io", "apiVersion": "v1", "resourceVersion": "7414073" }, "responseStatus": { "metadata": {}, "code": 200 }, "requestReceivedTimestamp": "2024-07-25T19:50:44.327013Z", "stageTimestamp": "2024-07-25T19:50:44.332007Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"dapp-k8s-admins\" of ClusterRole \"cluster-admin\" to Group \"k8s-admins\"", "mutation.webhook.admission.k8s.io/round_0_index_2": "{\"configuration\":\"gatekeeper-mutating-webhook-configuration\",\"webhook\":\"mutation.gatekeeper.sh\",\"mutated\":false}" } }удаление роли:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `/apis/rbac.authorization.k8s.io` != `"verb":"get"` != `"verb":"watch"` != `"verb":"list"`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "34c0b59d-ba66-4c57-aee4-062045a23047", "stage": "ResponseComplete", "requestURI": "/apis/rbac.authorization.k8s.io/v1/namespaces/trivy-system/roles/example-role", "verb": "delete", "user": { "username": "https://dex.<example.ru>#dapp-k8s-admin", "groups": [ "ipausers", "k8s-admins", "system:authenticated" ] }, "sourceIPs": [ "0.0.0.0", "0.0.0.0", "0.0.0.0" ], "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/0.0.0.0 Safari/537.36 SberBrowser/0.0.0.0", "objectRef": { "resource": "roles", "namespace": "trivy-system", "name": "example-role", "apiGroup": "rbac.authorization.k8s.io", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "status": "Success", "details": { "name": "example-role", "group": "rbac.authorization.k8s.io", "kind": "roles", "uid": "f9d67168-5bac-4a7b-b657-0a751eba8329" }, "code": 200 }, "requestReceivedTimestamp": "2024-07-25T19:52:54.738788Z", "stageTimestamp": "2024-07-25T19:52:54.741121Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"dapp-k8s-admins\" of ClusterRole \"cluster-admin\" to Group \"k8s-admins\"" } }Модификация запускаемых контейнеров:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="auditlogs"} |= `/pods` |= `patch`#Пример записи о событии { "kind": "Event", "apiVersion": "audit.k8s.io/v1", "level": "Metadata", "auditID": "8e618b7c-d893-4bbd-8b2f-e5247e7adb35", "stage": "ResponseComplete", "requestURI": "/api/v1/namespaces/trivy-system/pods/scan-vulnerabilityreport-58f45498d4-rqpdr", "verb": "patch", "user": { "username": "system:serviceaccount:kube-system:job-controller", "uid": "10c55c0b-33e2-412a-8aa3-139d002bf072", "groups": [ "system:serviceaccounts", "system:serviceaccounts:kube-system", "system:authenticated" ] }, "sourceIPs": [ "0.0.0.0" ], "userAgent": "kube-controller-manager/v1.25.16 (linux/amd64) kubernetes/4fb89a6/system:serviceaccount:kube-system:job-controller", "objectRef": { "resource": "pods", "namespace": "trivy-system", "name": "scan-vulnerabilityreport-58f45498d4-rqpdr", "apiVersion": "v1" }, "responseStatus": { "metadata": {}, "code": 200 }, "requestReceivedTimestamp": "2024-07-25T19:55:46.054918Z", "stageTimestamp": "2024-07-25T19:55:46.081837Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "RBAC: allowed by ClusterRoleBinding \"system:controller:job-controller\" of ClusterRole \"system:controller:job-controller\" to ServiceAccount \"job-controller/kube-system\"", "mutation.webhook.admission.k8s.io/round_0_index_1": "{\"configuration\":\"connaisseur-webhook\",\"webhook\":\"connaisseur-svc.connaisseur.svc\",\"mutated\":false}", "mutation.webhook.admission.k8s.io/round_0_index_2": "{\"configuration\":\"gatekeeper-mutating-webhook-configuration\",\"webhook\":\"mutation.gatekeeper.sh\",\"mutated\":false}", "pod-security.kubernetes.io/enforce-policy": "privileged:latest" } }Выявление известных уязвимостей:
в образах контейнеров:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {job="trivy-system/trivy-operator-notifier-job"}#Пример записи о событии [('MEDIUM', 9), ('HIGH', 3), ('CRITICAL', 1)] уязвимостей обнаружено при сканировании replicaset-trivy-operator-769f8485f4-trivy-operatorвыявление некорректности конфигурации:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {app="gatekeeper", container="manager"} |= `container` |= `has an invalid`#Пример записи о событии { "level": "info", "ts": 1721938056.357489, "logger": "controller", "msg": "container <test-trivy> has an invalid image repo <<example.repo>/fstec/1.4.2/dapp-trivy-2/trivy:v0.49.1>, allowed repos are [\"openpolicyagent/\"]", "process": "audit", "audit_id": "2024-07-25T20:07:34Z", "details": {}, "event_type": "violation_audited", "constraint_group": "constraints.gatekeeper.sh", "constraint_api_version": "v1beta1", "constraint_kind": "K8sAllowedRepos", "constraint_name": "repo-is-openpolicyagent", "constraint_namespace": "", "constraint_action": "deny", "constraint_annotations": null, "resource_group": "", "resource_api_version": "v1", "resource_kind": "Pod", "resource_namespace": "default", "resource_name": "test-trivy", "resource_labels": { "run": "test-trivy" } }Факты нарушения целостности объектов контроля:
#Параметры для выборки событий в окне Explore приложения Grafana в режиме code {app="connaisseur"} |= `error validating`#Пример записи о событии { "level": "error", "msg": "error validating Pod scan-vulnerabilityreport-58f45498d4-rqpdr: static deny for image <example.repo>/fstec/1.4.2/dapp-trivy-2/trivy:v0.49.1 using rule *:*", "time": "2024-07-25T19:55:13Z" }