---
title: Mecanisme de securitate a datelor
description: Sistemul unificat de autentificare și autorizare, criptarea datelor și calcularea hash-ului, precum și componentele de audit și monitorizare care protejează datele în întreaga platformă.
section: Concepts
weight: 2
related:
  - security/security-mechanisms
  - security
  - rest-api
  - eu-compliance
---

## Sistemul unificat de autentificare și autorizare

Sistemul unificat de autentificare și autorizare este o componentă esențială a protecției datelor și asigură accesul securizat la resursele sistemului. Vă permite să gestionați utilizatorii, drepturile acestora și accesul la date în întregul sistem.

Reamintim:

- **Autentificarea** este procesul de verificare a identității unui utilizator (de exemplu, cu un nume de utilizator și o parolă).
- **Autorizarea** este procesul de verificare a drepturilor unui utilizator de a efectua anumite acțiuni (de exemplu, accesul la date sau la funcțiile sistemului).

### Componentele sistemului

#### Autentificare

- **Nume de utilizator și parolă**: metoda tradițională de autentificare. La conectare, utilizatorul trebuie mai întâi să se identifice prin numele de utilizator și parola.
- **Autentificare multifactor** (MFA): utilizarea mai multor factori (de exemplu, un token software actualizat dinamic pentru interfața Web API).

Autentificarea pe bază de token simplifică procesul pentru utilizatorii deja înregistrați. Pentru început, utilizatorul trimite serverului o cerere cu numele de utilizator și parola. Serverul le compară cu valorile înregistrate în baza sa de date de identități. Dacă identitatea este confirmată, serverul returnează un token de autentificare (care se stochează și el în baza de date).

Când același utilizator cere ulterior acces la resursele protejate, cererile sale pot fi autorizate cu tokenul de autentificare în locul numelui de utilizator și al parolei. Serverul compară tokenul cu cel înregistrat în baza de date și acordă accesul.

#### Autorizare

- **Roluri și drepturi**: utilizatorilor li se atribuie roluri (de exemplu, administrator de acces, utilizator) care le stabilesc drepturile.
- **ACL** (Access Control Lists): liste de control al accesului, care stabilesc cine și la ce resurse are acces.
- **RBAC** (Role-Based Access Control): controlul accesului pe bază de roluri.
- **ABAC** (Attribute-Based Access Control): controlul accesului pe bază de atribute (de exemplu, după ora din zi sau după locul din care se face accesul).

#### Stocarea datelor utilizatorilor

- **Baza de date a utilizatorilor**: stochează într-o singură bază de date informațiile despre utilizatori, rolurile și drepturile acestora.

#### Securitate

- **Criptare**: protejează datele în timpul transmisiei și al stocării.
- **Tokenuri de acces**: tokenuri software actualizate dinamic, folosite pentru gestionarea sesiunilor.
- **Auditare**: jurnalizarea tuturor acțiunilor utilizatorilor pentru analiza ulterioară.

### Implementarea sistemului

Platforma folosește un flux de autentificare pe bază de token. Utilizatorul se autentifică cu numele de utilizator și parola, sistemul le verifică și returnează un token de acces, iar acest token se trimite apoi cu fiecare cerere ulterioară pentru autorizarea accesului la resursele protejate. Ca nume de utilizator se folosește adresa de e-mail a utilizatorului.

Exemplu de cerere în format `Curl`:

```bash title="Request example"
curl -i --header "Content-Type: application/json" \
--request POST \
--data '{"email":"api-user@example.com","password":"Str0ngPas$"}'\
https://server123/api/v1/auth/sign_in
```

Ca răspuns se primește următorul mesaj:

```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: EXAMPLE-ACCESS-TOKEN-1
token-type: Bearer
client: EXAMPLE-CLIENT-ID
expiry: 1615227012
uid: api-user@example.com
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-user@example.com","name":"API user"}}
```

Din acest răspuns ne interesează parametrul `access_token`. Valoarea acestui antet se folosește ca parolă pentru fiecare cerere și se schimbă la fiecare cerere.

Iată un exemplu de cerere care folosește tokenul din răspunsul anterior:

```bash title="Request example with token"
curl -i --header "access-token: EXAMPLE-ACCESS-TOKEN-1" \
--header "token-type: Bearer" \
--header "client: EXAMPLE-CLIENT-ID" \
--header "uid: api-user@example.com" \
--request GET \
--header "Content-Type: application/json" \
--data '{"page":"2"}' \
https://server123/api/v1/stations
```

Ca răspuns se primește următorul mesaj:

```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: EXAMPLE-ACCESS-TOKEN-2
token-type: Bearer
client: EXAMPLE-CLIENT-ID
expiry: 1615311367
uid: api-user@example.com
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":"860000000000001","equipment_brand_name":"Corrector
BK","phone":"","equipment_id":1},...
],
"total_pages":7,
"current_page":2
}
```

Pentru a încheia sesiunea, puteți să folosiți procedura de deconectare (`SignOut`) sau să salvați anteturile necesare din ultima cerere și să le reutilizați data viitoare, dacă tokenul nu a expirat. Rețineți că, fără încheierea sesiunii, ultimul token rămâne valabil o perioadă de timp care depinde de setările de sistem ale serverului.

### Avantajele sistemului

Un sistem unificat de autentificare și autorizare este un instrument puternic pentru protecția datelor și controlul accesului. Oferă următoarele avantaje:

- **Gestionare centralizată**: simplifică gestionarea utilizatorilor și a drepturilor acestora.
- **Securitate**: protejează datele împotriva accesului neautorizat.
- **Coerență**: toate aplicațiile și sistemele folosesc același mecanism de autentificare și autorizare.
- **Scalabilitate**: permite adăugarea ușoară de noi aplicații și utilizatori.

## Criptarea datelor

Pentru a proteja informațiile critice, sistemul folosește criptarea (transformarea informațiilor într-o formă care nu poate fi citită fără cheia corespunzătoare) și calcularea hash-ului (transformarea datelor într-un șir unic de lungime fixă – un hash). Criptarea și calcularea hash-ului formează unul dintre mecanismele esențiale de protecție a datelor, care asigură confidențialitatea, integritatea și securitatea informațiilor, atât a celor stocate, cât și a celor în tranzit.

Sistemul folosește diverși algoritmi de criptare a datelor și de calculare a hash-ului.

### Aplicarea criptării în sistem

#### Criptarea datelor stocate

- **Baze de date**: criptarea anumitor câmpuri din baza de date.
- **Fișiere**: criptarea fișierelor înainte de salvarea lor pe disc.

#### Criptarea datelor în tranzit

- **HTTPS**: utilizarea protocoalelor SSL/TLS pentru criptarea datelor în timpul transmisiei prin rețea.
- **VPN**: crearea unui tunel securizat pentru transmisia datelor.

#### Criptarea parolelor

Stocarea hash-urilor parolelor în locul parolelor propriu-zise.

### Exemple de criptare și decriptare a datelor

Să analizăm câteva exemple de criptare și decriptare a fișierelor de configurare ale sistemului.

#### Criptarea datelor

```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)
```

#### Decriptarea datelor

```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
)
```

### Avantajele criptării datelor

- **Confidențialitate**: protecția datelor împotriva accesului neautorizat.
- **Integritate**: garanția că datele nu au fost modificate.
- **Autenticitate**: confirmarea sursei datelor.
- **Cerințe de conformitate**: respectarea cerințelor din reglementări.

## Audit și monitorizare

Mai multe componente monitorizează activitatea utilizatorilor și a sistemului, detectează comportamentele suspecte și asigură conformitatea cu cerințele de securitate. Împreună, acestea:

- colectează, analizează și stochează informații despre activitatea utilizatorilor și a sistemului, pentru a asigura trasabilitatea și conformitatea;
- monitorizează continuu, în timp real, sistemul și echipamentele, pentru a detecta incidentele și a reacționa la ele.

### Obiective

- **Trasabilitate**: garanția că toată activitatea utilizatorilor și a sistemului este înregistrată.
- **Securitate**: detectarea și prevenirea activității neautorizate.
- **Detectarea problemelor**: identificarea problemelor hardware și a anomaliilor, precum și aplicarea măsurilor corective.
- **Optimizarea performanței**: analiza performanței sistemului și identificarea blocajelor care necesită optimizare.
- **Prognoză și planificare**: colectarea datelor pentru a prognoza încărcarea viitoare și a planifica resursele.
- **Conformitate**: asigurarea conformității cu cerințele din reglementări.
- **Analiza incidentelor**: analiza incidentelor care au avut loc, pentru a le preveni pe cele viitoare.

### Componentele de audit și monitorizare

#### Colectarea datelor

- **Jurnale**: înregistrările acțiunilor utilizatorilor și ale sistemului la toate nivelurile.
- **Metrici**: date despre performanța sistemului (de exemplu, gradul de utilizare a procesorului, consumul de memorie).

#### Stocarea datelor

- **Stocarea jurnalelor**: colectarea datelor din diverse surse, cu stocarea distribuită a jurnalelor și a metricilor, organizată pe domenii tematice.
- **Rotația jurnalelor**: ștergerea automată a jurnalelor vechi, pentru a economisi spațiu.

#### Analiza datelor

- **Căutare și filtrare**: posibilitatea de a căuta și de a filtra jurnalele după diverse criterii.
- **Analiză**: utilizarea instrumentelor de analiză a datelor (de exemplu, Zabbix).

#### Alerte

- **Alerte**: trimiterea de notificări despre activitatea suspectă și despre situațiile de avarie (de exemplu, prin e-mail sau într-un chat Telegram).
- **Acțiuni automate**: reacția automată la incidente (de exemplu, blocarea unui utilizator).

### Exemplu de implementare

#### Jurnalizare

Utilizarea unei biblioteci pentru jurnalizare în aplicație.

```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
```

#### Colectarea erorilor din datele primite de la contoare

```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
```

#### Stocarea jurnalelor

Utilizarea unui spațiu de stocare centralizat pentru jurnale.

##### Tabelul `audits`

Acest tabel stochează informațiile de jurnalizare a datelor.

| Câmp              | Tip                              | Descriere                                                                  |
| ----------------- | -------------------------------- | -------------------------------------------------------------------------- |
| `id`              | `integer`                        | Identificatorul unic al înregistrării (cheie primară).                     |
| `auditable_id`    | `integer`                        | Referință la entitatea auditată (`equipment.id`, `stations.id` ...).       |
| `auditable_type`  | `character varying`              | Entitatea auditată (`equipment`, `stations` ...).                          |
| `user_id`         | `integer`                        | Referință la identificatorul utilizatorului (`users.id`)                   |
| `action`          | `character varying`              | Acțiune                                                                    |
| `audited_changes` | `jsonb`                          | Modificări auditate                                                        |
| `version`         | `integer`                        | Versiunea modificărilor                                                    |
| `remote_address`  | `character varying`              | Adresă la distanță                                                         |
| `request_uuid`    | `character varying`              | Identificatorul evenimentului.                                             |
| `created_at`      | `timestamp(6) without time zone` | Data și ora modificării.                                                   |

##### Tabelul `error_logs`

Acest tabel stochează informații despre erorile din datele primite de la contoare.

| Câmp            | Tip                              | Descriere                                                    |
| --------------- | -------------------------------- | ------------------------------------------------------------ |
| `id`            | `integer`                        | Identificatorul unic al înregistrării (cheie primară).       |
| `loggable_id`   | `integer`                        | Referință la entitatea înregistrată (`equipment.id` ...).    |
| `loggable_type` | `character varying`              | Entitatea înregistrată (`equipment` ...).                    |
| `message`       | `integer`                        | Referință la identificatorul erorii.                         |
| `params`        | `jsonb`                          | Caracteristicile erorii.                                     |
| `created_at`    | `timestamp(6) without time zone` | Data și ora modificării.                                     |

#### Analiza jurnalelor

Instrumente folosite pentru analiza jurnalelor:

- Configurarea unor formulare web pentru vizualizarea și analiza jurnalelor.
- Crearea de tablouri de bord pentru monitorizarea activității utilizatorilor.

#### Alerte

Alerte personalizate pentru activitatea suspectă:

- Configurarea alertelor în Zabbix pentru monitorizarea metricilor.
- Trimiterea de notificări despre evenimentele de alarmă prin e-mail sau într-un chat Telegram.

#### Avantajele auditării și monitorizării

Auditarea și monitorizarea sunt instrumente puternice de protecție a datelor, care vă permit să urmăriți activitatea utilizatorilor și a sistemului, să identificați comportamentele suspecte și să asigurați conformitatea cu cerințele de securitate. Cu ajutorul lor puteți:

- asigura trasabilitatea și securitatea datelor;
- identifica și preveni incidentele;
- îndeplini cerințele din reglementări.
