---
title: Mechanismy zabezpečení dat
description: Jednotná autentizace a autorizace, šifrování a hašování dat a subsystémy auditu a monitorování, které chrání data v celé platformě.
section: Concepts
weight: 2
related:
  - security/security-mechanisms
  - security
  - rest-api
  - eu-compliance
---

## Jednotný systém autentizace a autorizace

Jednotný systém autentizace a autorizace je klíčovou součástí ochrany dat, která zajišťuje bezpečný přístup k systémovým zdrojům. Umožňuje spravovat uživatele, jejich oprávnění a přístup k datům na úrovni celého systému.

Připomenutí:

- **Autentizace** je proces ověření totožnosti uživatele (například pomocí uživatelského jména a hesla).
- **Autorizace** je proces ověření oprávnění uživatele k provedení určitých akcí (například přístup k datům nebo systémovým funkcím).

### Součásti systému

#### Autentizace

- **Jméno a heslo**: tradiční způsob autentizace. Při přihlášení se uživatel musí nejprve identifikovat uživatelským jménem a heslem.
- **Vícefaktorová autentizace** (MFA): použití několika faktorů (například dynamicky obnovovaného softwarového tokenu pro webové API).

Autentizace založená na tokenech zjednodušuje proces pro stávající uživatele. Pro zahájení odešle uživatel serveru požadavek s uživatelským jménem a heslem. Server je ověří proti hodnotám zaregistrovaným ve své databázi totožností. Je-li totožnost potvrzena, server vrátí autentizační token (který se rovněž ukládá do databáze).

Když tentýž uživatel později požádá o přístup k chráněným zdrojům, lze tyto požadavky autorizovat autentizačním tokenem místo uživatelského jména a hesla. Server porovná token s tím, který je zaregistrovaný v databázi, a udělí přístup.

#### Autorizace

- **Role a oprávnění**: uživatelům jsou přidělovány role (například správce přístupu, uživatel), které definují jejich oprávnění.
- **ACL** (Access Control Lists): seznamy, které určují, kdo má přístup ke kterým zdrojům.
- **RBAC** (Role-Based Access Control): řízení přístupu na základě rolí.
- **ABAC** (Attribute-Based Access Control): řízení přístupu na základě atributů (například podle denní doby nebo polohy).

#### Ukládání uživatelských dat

- **Databáze uživatelů**: ukládá informace o uživatelích, jejich rolích a oprávněních do jediné databáze.

#### Zabezpečení

- **Šifrování**: chrání data při přenosu i při ukládání.
- **Přístupové tokeny**: dynamicky obnovované softwarové tokeny používané ke správě relací.
- **Audit**: protokolování všech akcí uživatelů pro pozdější analýzu.

### Implementace systému

Platforma využívá autentizaci založenou na tokenech. Uživatel se přihlásí jménem a heslem, systém je ověří a vrátí přístupový token, který se pak posílá s každým následujícím požadavkem k autorizaci přístupu k chráněným zdrojům. Jako přihlašovací jméno se používá e-mailová adresa uživatele.

Příklad požadavku ve formátu `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
```

V odpovědi obdržíme následující zprávu:

```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"}}
```

V této odpovědi nás zajímá parametr `access_token`. Hodnota tohoto hlavičkového pole se používá jako heslo pro každý požadavek a s každým požadavkem se mění.

Zde je příklad požadavku, který používá token z předchozí odpovědi:

```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
```

V odpovědi obdržíme následující zprávu:

```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
}
```

K ukončení relace lze použít proceduru `SignOut`, případně uložit potřebné hlavičky z posledního požadavku a příště je znovu použít, pokud token dosud nevypršel. Mějte na paměti, že bez ukončení relace zůstává poslední token po určitou dobu platný, a to v závislosti na systémovém nastavení serveru.

### Výhody systému

Jednotný systém autentizace a autorizace je výkonný nástroj pro ochranu dat a řízení přístupu. Přináší tyto výhody:

- **Centralizovaná správa**: zjednodušuje správu uživatelů a jejich oprávnění.
- **Zabezpečení**: chrání data před neoprávněným přístupem.
- **Konzistence**: všechny aplikace a systémy používají stejný mechanismus autentizace a autorizace.
- **Škálovatelnost**: usnadňuje přidávání nových aplikací a uživatelů.

## Šifrování dat

K ochraně kritických informací systém využívá šifrování (převod informací do podoby, kterou nelze přečíst bez příslušného klíče) a hašování (převod dat na jedinečný řetězec pevné délky — haš). Jde o jeden z klíčových mechanismů ochrany dat, který zajišťuje důvěrnost, integritu a bezpečnost informací jak při ukládání, tak při přenosu.

Systém používá různé algoritmy šifrování a hašování dat.

### Uplatnění šifrování v systému

#### Šifrování při ukládání

- **Databáze**: šifrování jednotlivých polí databáze.
- **Soubory**: šifrování souborů před jejich uložením na disk.

#### Šifrování dat při přenosu

- **HTTPS**: použití SSL/TLS k šifrování dat při síťovém přenosu.
- **VPN**: vytvoření zabezpečeného tunelu pro přenos dat.

#### Šifrování hesel

Ukládání hašů hesel místo samotných hesel.

### Příklady šifrování a dešifrování dat

Podívejme se na příklady šifrování a dešifrování konfiguračních souborů systému.

#### Šifrování dat

```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)
```

#### Dešifrování dat

```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
)
```

### Přínosy šifrování dat

- **Důvěrnost**: ochrana dat před neoprávněným přístupem.
- **Integrita**: zajištění, že data nebyla pozměněna.
- **Pravost**: potvrzení zdroje dat.
- **Soulad s předpisy**: splnění regulatorních požadavků.

## Audit a monitorování

Činnost uživatelů a systému sleduje několik subsystémů, které odhalují podezřelé chování a zajišťují soulad s bezpečnostními požadavky. Společně:

- shromažďují, analyzují a uchovávají informace o činnosti uživatelů a systému, čímž zajišťují odpovědnost a soulad s předpisy;
- nepřetržitě monitorují systém a zařízení v reálném čase, aby bylo možné detekovat incidenty a reagovat na ně.

### Cíle

- **Odpovědnost**: zajištění, že veškerá činnost uživatelů a systému je zaznamenávána.
- **Zabezpečení**: detekce a předcházení neoprávněné činnosti.
- **Odhalování problémů**: identifikace hardwarových problémů a anomálií a přijetí nápravných opatření.
- **Optimalizace výkonu**: analýza výkonu systému a hledání úzkých míst, která vyžadují optimalizaci.
- **Predikce a plánování**: sběr dat pro předpovídání budoucí zátěže a plánování zdrojů.
- **Soulad s předpisy**: zajištění souladu s regulatorními požadavky.
- **Analýza incidentů**: analýza incidentů, k nimž došlo, za účelem předcházení dalším.

### Součásti auditu a monitorování

#### Sběr dat

- **Protokoly**: záznamy o akcích uživatelů a systému na všech úrovních.
- **Metriky**: data o výkonu systému (například vytížení procesoru, využití paměti).

#### Ukládání dat

- **Úložiště protokolů**: sběr dat z různých zdrojů s distribuovaným ukládáním protokolů a metrik uspořádaným podle tematických oblastí.
- **Rotace protokolů**: automatické mazání starých protokolů kvůli úspoře místa.

#### Analýza dat

- **Vyhledávání a filtrování**: možnost vyhledávat a filtrovat protokoly podle různých kritérií.
- **Analytika**: použití nástrojů pro analýzu dat (například Zabbix).

#### Upozornění

- **Upozornění**: odesílání oznámení o podezřelé činnosti a mimořádných událostech (například e-mailem nebo do chatu Telegram).
- **Automatické akce**: automatická reakce na incidenty (například zablokování uživatele).

### Příklad implementace

#### Protokolování

Použití knihovny pro protokolování v aplikaci.

```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
```

#### Sběr chyb v datech z měřidel

```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
```

#### Ukládání protokolů

Použití centralizovaného úložiště pro protokoly.

##### Tabulka `audits`

Tato tabulka ukládá informace o protokolování dat.

| Pole              | Typ                              | Popis                                                           |
| ----------------- | -------------------------------- | --------------------------------------------------------------- |
| `id`              | `integer`                        | Jedinečný identifikátor záznamu (primární klíč).                |
| `auditable_id`    | `integer`                        | Odkaz na auditovaný objekt (`equipment.id`, `stations.id` ...). |
| `auditable_type`  | `character varying`              | Auditovaný objekt (`equipment`, `stations` ...).                |
| `user_id`         | `integer`                        | Odkaz na identifikátor uživatele (`users.id`)                   |
| `action`          | `character varying`              | Akce                                                            |
| `audited_changes` | `jsonb`                          | Auditované změny                                                |
| `version`         | `integer`                        | Verze změn                                                      |
| `remote_address`  | `character varying`              | Vzdálená adresa                                                 |
| `request_uuid`    | `character varying`              | Identifikátor události.                                         |
| `created_at`      | `timestamp(6) without time zone` | Datum/čas změny.                                                |

##### Tabulka `error_logs`

Tato tabulka ukládá informace o chybách v datech přicházejících z měřidel.

| Pole            | Typ                              | Popis                                              |
| --------------- | -------------------------------- | -------------------------------------------------- |
| `id`            | `integer`                        | Jedinečný identifikátor záznamu (primární klíč).   |
| `loggable_id`   | `integer`                        | Odkaz na registrovaný objekt (`equipment.id` ...). |
| `loggable_type` | `character varying`              | Registrovaný objekt (`equipment` ...).             |
| `message`       | `integer`                        | Odkaz na identifikátor chyby.                      |
| `params`        | `jsonb`                          | Charakteristiky chyby.                             |
| `created_at`    | `timestamp(6) without time zone` | Datum/čas změny.                                   |

#### Analýza protokolů

Nástroje používané k analýze protokolů:

- Nastavení webových formulářů pro vizualizaci a analýzu protokolů.
- Vytváření dashboardů pro monitorování činnosti uživatelů.

#### Upozornění

Přizpůsobená upozornění na podezřelou činnost:

- Konfigurace upozornění v Zabbixu pro monitorování metrik.
- Odesílání oznámení e-mailem nebo do chatu Telegram při poplachových událostech.

#### Přínosy auditu a monitorování

Audit a monitorování jsou výkonné nástroje ochrany dat, které umožňují sledovat činnost uživatelů a systému, odhalovat podezřelé chování a zajišťovat soulad s bezpečnostními požadavky. Umožňují:

- zajistit odpovědnost a bezpečnost dat;
- identifikovat incidenty a předcházet jim;
- splnit regulatorní požadavky.
