Настройка приложения#

Функции и интерфейсы функций СЗИ, доступные каждой роли пользователей#

Функции и интерфейсы функций СЗИ:

  • Выявление уязвимостей;

  • Настройка контроля целостности;

  • Проверка корректности конфигурации контейнеров;

  • Регистрация событий;

  • Управление доступом;

  • Централизованное управление образами контейнеров;

  • Идентификация и аутентификация пользователей.

Параметры (настройки) безопасности СЗИ, доступные для каждой роли пользователей, и их безопасные значения#

Параметры (настройки) безопасности СЗИ:

  • Выявление уязвимостей;

  • Настройка контроля целостности;

  • Проверка корректности конфигурации контейнеров;

  • Регистрация событий;

  • Управление доступом;

  • Централизованное управление образами контейнеров;

  • Идентификация и аутентификация пользователей.

Типы событий безопасности, связанных с доступными пользователю функциями#

В 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 и примеры записей событий#

  1. Неуспешные попытки аутентификации пользователей 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."
    
  2. Создание, модификация и удаление образов контейнеров:

    #Параметры для выборки событий в окне 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
    
  3. Получение доступа к образам контейнеров: 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
    
  4. Запуск и остановка контейнеров с указанием причины остановки:

    • 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\""
        }
    }
    
  5. Изменение ролевой модели:

    • создание роли:

    #Параметры для выборки событий в окне 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\""
        }
    }
    
  6. Модификация запускаемых контейнеров:

    #Параметры для выборки событий в окне 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"
        }
    }
    
  7. Выявление известных уязвимостей:

    • в образах контейнеров:

    #Параметры для выборки событий в окне 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"
        }
    }
    
  8. Факты нарушения целостности объектов контроля:

    #Параметры для выборки событий в окне 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"
    }