---
title: Механизмы защиты данных
description: Единая система аутентификации и авторизации, шифрование и хеширование данных, а также подсистемы аудита и мониторинга, защищающие данные на всех уровнях платформы.
section: Concepts
weight: 2
related:
  - security/security-mechanisms
  - security
  - rest-api
  - eu-compliance
---

## Единая система аутентификации и авторизации

Единая система аутентификации и авторизации — это ключевой компонент защиты данных, обеспечивающий безопасный доступ к ресурсам системы. Она позволяет управлять пользователями, их правами и доступом к данным на общесистемном уровне.

Напомним:

- **Аутентификация** — это процесс проверки подлинности пользователя (например, по имени пользователя и паролю).
- **Авторизация** — это процесс проверки прав пользователя на выполнение определённых действий (например, доступа к данным или функциям системы).

### Компоненты системы

#### Аутентификация

- **Логин и пароль**: традиционный метод аутентификации. При входе пользователь должен сначала идентифицировать себя по имени пользователя и паролю.
- **Многофакторная аутентификация** (MFA): использование нескольких факторов (например, динамически обновляемого программного токена для веб-API).

Аутентификация на основе токенов упрощает процесс для уже зарегистрированных пользователей. Для начала работы пользователь отправляет на сервер запрос с именем пользователя и паролем. Сервер сверяет их со значениями, зарегистрированными в его базе данных учётных записей. Если подлинность подтверждена, сервер возвращает токен аутентификации (который также сохраняется в базе данных).

Когда тот же пользователь позже запрашивает доступ к защищённым ресурсам, эти запросы могут быть авторизованы токеном аутентификации вместо имени пользователя и пароля. Сервер сверяет токен с зарегистрированным в базе данных и предоставляет доступ.

#### Авторизация

- **Роли и права**: пользователям назначаются роли (например, администратор доступа, пользователь), которые определяют их права.
- **ACL** (Access Control Lists): списки, определяющие, кто имеет доступ к каким ресурсам.
- **RBAC** (Role-Based Access Control): управление доступом на основе ролей.
- **ABAC** (Attribute-Based Access Control): управление доступом на основе атрибутов (например, по времени суток или местоположению).

#### Хранение пользовательских данных

- **База данных пользователей**: хранит сведения о пользователях, их ролях и правах в единой базе данных.

#### Безопасность

- **Шифрование**: защищает данные при передаче и хранении.
- **Токены доступа**: динамически обновляемые программные токены, используемые для управления сеансами.
- **Аудит**: журналирование всех действий пользователей для последующего анализа.

### Реализация системы

Платформа использует процесс аутентификации на основе токенов. Пользователь входит по логину и паролю, система проверяет их и возвращает токен доступа, который затем отправляется с каждым последующим запросом для авторизации доступа к защищённым ресурсам. В качестве логина используется адрес электронной почты пользователя.

Пример запроса в формате `Curl`:

```bash title="Request example"
curl -i --header "Content-Type: application/json" \
--request POST \
--data '{"email":"api@local.net","password":"Str0ngPas$"}'\
https://server123/api/v1/auth/sign_in
```

В ответ мы получаем следующее сообщение:

```bash title="Response example"
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff X-Download-Options: noopen X-Permitted-Cross-Domain-Policies: none Referrer-Policy: strict-origin-when-cross-origin Content-Type: application/json; charset=utf-8 access-token: tgervk9_9xicJYpmSsnnNA
token-type: Bearer
client: D-Uv3ER53873olhnNLjL9w
expiry: 1615227012
uid: api@local.net
ETag: W/"5b9bcc76f7223b72b79d9f2d31ff0fd5"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: c18e06b4-e5bd-40b5-875d-7ac958e2fbb5
X-Runtime: 0.391069
Transfer-Encoding: chunked
{"data":{"id":6,"email":"api@local.
net","provider":"email","uid":"api@local.net","name":"API user"}}
```

В этом ответе нас интересует параметр `access_token`. Значение этого заголовка используется как пароль для каждого запроса и меняется с каждым запросом.

Ниже приведён пример запроса, использующего токен из предыдущего ответа:

```bash title="Request example with token"
curl -i --header "access-token: tgervk9_9xicJYpmSsnnNA" \
--header "token-type: Bearer" \
--header "client: D-Uv3ER53873olhnNLjL9w" \
--header "uid: api@local.net" \
--request GET \
--header "Content-Type: application/json" \
--data '{"page":"2"}' \
https://server123/api/v1/stations
```

В ответ мы получаем следующее сообщение:

```bash title="Response example"
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Permitted-Cross-Domain-Policies: none
Referrer-Policy: strict-origin-when-cross-origin
Content-Type: application/json; charset=utf-8
access-token: Bmh2GVrxr6aW0Hngor4gPw
token-type: Bearer
client: D-Uv3ER53873olhnNLjL9w
expiry: 1615311367
uid: api@local.net
ETag: W/"ba0df406b647bd92f0bf3a18916714c1"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 35a26441-ae78-48fa-8b2e-e92d2605133b
X-Runtime: 0.167748
Transfer-Encoding: chunked
{"data": [
{"id":1,"name":"865293041101853","equipment_brand_name":"Corrector
BK","phone":"","equipment_id":1},...
],
"total_pages":7,
"current_page":2
}
```

Чтобы завершить сеанс, можно воспользоваться процедурой `SignOut` либо сохранить необходимые заголовки из последнего запроса и повторно использовать их в следующий раз, если срок действия токена ещё не истёк. Обратите внимание, что без завершения сеанса последний токен остаётся действительным в течение некоторого времени, зависящего от системных настроек сервера.

### Преимущества системы

Единая система аутентификации и авторизации — это мощный инструмент защиты данных и контроля доступа. Она обеспечивает следующие преимущества:

- **Централизованное управление**: упрощает управление пользователями и их правами.
- **Безопасность**: защищает данные от несанкционированного доступа.
- **Согласованность**: все приложения и системы используют единый механизм аутентификации и авторизации.
- **Масштабируемость**: позволяет легко добавлять новые приложения и пользователей.

## Шифрование данных

Для защиты критически важной информации система использует шифрование (преобразование информации в форму, которую нельзя прочитать без соответствующего ключа) и хеширование (преобразование данных в уникальную строку фиксированной длины — хеш). Это один из ключевых механизмов защиты данных, обеспечивающий конфиденциальность, целостность и безопасность информации как при хранении, так и при передаче.

В системе применяются различные алгоритмы шифрования и хеширования данных.

### Применение шифрования в системе

#### Шифрование при хранении

- **Базы данных**: шифрование отдельных полей базы данных.
- **Файлы**: шифрование файлов перед сохранением на диск.

#### Шифрование данных при передаче

- **HTTPS**: использование SSL/TLS для шифрования данных при передаче по сети.
- **VPN**: создание защищённого туннеля для передачи данных.

#### Шифрование паролей

Хранение хешей паролей вместо самих паролей.

### Примеры шифрования и расшифровки данных

Рассмотрим примеры шифрования и расшифровки файлов конфигурации системы.

#### Шифрование данных

```ruby title="example.config"
mkdir_p(encrypted_dir_path)
encrypted = Rails.application.encrypted(encrypted_file_path, key_path: 'config/system.key')
encrypted.write(File.read(decrypted_file_path))
File.delete(decrypted_file_path)
```

#### Расшифровка данных

```ruby title="example.config"
mkdir_p(decrypted_dir_path)
File.write(decrypted_file_path,
  Rails.application.encrypted(encrypted_file_path, key_path: 'config/system.key').read
)
```

### Преимущества шифрования данных

- **Конфиденциальность**: защита данных от несанкционированного доступа.
- **Целостность**: гарантия того, что данные не были изменены.
- **Подлинность**: подтверждение источника данных.
- **Требования соответствия**: выполнение требований регуляторов.

## Аудит и мониторинг

Несколько подсистем отслеживают активность пользователей и системы, выявляют подозрительное поведение и обеспечивают соблюдение требований безопасности. Совместно они:

- собирают, анализируют и хранят информацию об активности пользователей и системы для обеспечения подотчётности и соответствия;
- непрерывно отслеживают систему и оборудование в реальном времени для выявления инцидентов и реагирования на них.

### Задачи

- **Подотчётность**: обеспечение того, что вся активность пользователей и системы фиксируется.
- **Безопасность**: выявление и предотвращение несанкционированной активности.
- **Обнаружение проблем**: выявление аппаратных проблем и аномалий и принятие корректирующих мер.
- **Оптимизация производительности**: анализ производительности системы и поиск узких мест, требующих оптимизации.
- **Прогнозирование и планирование**: сбор данных для прогнозирования будущих нагрузок и планирования ресурсов.
- **Соответствие**: обеспечение соблюдения требований регуляторов.
- **Анализ инцидентов**: анализ произошедших инцидентов для предотвращения будущих.

### Компоненты аудита и мониторинга

#### Сбор данных

- **Журналы**: записи действий пользователей и системы на всех уровнях.
- **Метрики**: данные о производительности системы (например, загрузка ЦП, использование памяти).

#### Хранение данных

- **Хранилище журналов**: сбор данных из различных источников с распределённым хранением журналов и метрик, организованным по предметным областям.
- **Ротация журналов**: автоматическое удаление старых журналов для экономии места.

#### Анализ данных

- **Поиск и фильтрация**: возможность искать и фильтровать журналы по различным критериям.
- **Аналитика**: использование инструментов анализа данных (например, Zabbix).

#### Оповещения

- **Оповещения**: отправка уведомлений о подозрительной активности и нештатных ситуациях (например, по электронной почте или в чат Telegram).
- **Автоматические действия**: автоматическое реагирование на инциденты (например, блокировка пользователя).

### Пример реализации

#### Журналирование

Использование библиотеки для журналирования в приложении.

```ruby title="Ruby on Rails"
# Logs all changes to models
gem "audited"

# Logging settings
Audited.config do |config|
    config.audit_class = CustomAudit
end

class CustomAudit < Audited::Audit
  default_scope { order(created_at: :desc) }

  ACTION_NAME = { 'Create' => 'create',
                  'Update' => 'update',
                  'Destroy' => 'destroy' }.freeze

end

# Metering device
class Equipment < ApplicationRecord
  audited except: [:password]
	...
end
```

#### Сбор ошибок в данных от приборов учёта

```ruby title="Ruby on Rails"
# data model for error collection
class ErrorLog < ApplicationRecord
    enum message: { invalid_equipment_serial_number: 0,
                  invalid_equipment_software_version: 1,
                  ...
                  }
    belongs_to :loggable, polymorphic: true
    belongs_to :loggable_equipment, class_name: 'Equipment', foreign_key: :loggable_id, optional: true
    validates :loggable_type, :loggable_id, :message, presence: true
end


# Event log
unless valid_value?(serial_number)
	message_params = {equipment: equipment, new_serial_number: serial_number}
	message2logger(loggable_obj: equipment, message: :invalid_equipment_serial_number, params: message_params)
end
```

#### Хранение журналов

Использование централизованного хранилища журналов.

##### Таблица `audits`

В этой таблице хранится информация журналирования данных.

| Поле              | Тип                              | Описание                                                         |
| ----------------- | -------------------------------- | ---------------------------------------------------------------- |
| `id`              | `integer`                        | Уникальный идентификатор записи (первичный ключ).                |
| `auditable_id`    | `integer`                        | Ссылка на аудируемый объект (`equipment.id`, `stations.id` ...). |
| `auditable_type`  | `character varying`              | Аудируемый объект (`equipment`, `stations` ...).                 |
| `user_id`         | `integer`                        | Ссылка на идентификатор пользователя (`users.id`)                |
| `action`          | `character varying`              | Действие                                                         |
| `audited_changes` | `jsonb`                          | Аудируемые изменения                                             |
| `version`         | `integer`                        | Версия изменений                                                 |
| `remote_address`  | `character varying`              | Удалённый адрес                                                  |
| `request_uuid`    | `character varying`              | Идентификатор события.                                           |
| `created_at`      | `timestamp(6) without time zone` | Дата/время изменения.                                            |

##### Таблица `error_logs`

В этой таблице хранится информация об ошибках в данных, поступающих от приборов учёта.

| Поле            | Тип                              | Описание                                                  |
| --------------- | -------------------------------- | --------------------------------------------------------- |
| `id`            | `integer`                        | Уникальный идентификатор записи (первичный ключ).         |
| `loggable_id`   | `integer`                        | Ссылка на зарегистрированный объект (`equipment.id` ...). |
| `loggable_type` | `character varying`              | Зарегистрированный объект (`equipment` ...).              |
| `message`       | `integer`                        | Ссылка на идентификатор ошибки.                           |
| `params`        | `jsonb`                          | Характеристики ошибки.                                    |
| `created_at`    | `timestamp(6) without time zone` | Дата/время изменения.                                     |

#### Анализ журналов

Инструменты, используемые для анализа журналов:

- Настройка веб-форм для визуализации и анализа журналов.
- Создание панелей мониторинга для отслеживания активности пользователей.

#### Оповещения

Настраиваемые оповещения о подозрительной активности:

- Настройка оповещений в Zabbix для мониторинга метрик.
- Отправка уведомлений по электронной почте или в чат Telegram при аварийных событиях.

#### Преимущества аудита и мониторинга

Аудит и мониторинг — это мощные инструменты защиты данных, позволяющие отслеживать активность пользователей и системы, выявлять подозрительное поведение и обеспечивать соблюдение требований безопасности. Они позволяют:

- обеспечить подотчётность и безопасность данных;
- выявлять и предотвращать инциденты;
- выполнять требования регуляторов.
