---
title: سازوکارهای امنیت داده‌ها
description: احراز هویت و صدور مجوز یکپارچه، رمزگذاری و درهم‌سازی داده‌ها، به‌همراه زیرسامانه‌های ممیزی و پایش که از داده‌ها در سراسر پلتفرم محافظت می‌کنند.
section: Concepts
weight: 2
related:
  - security/security-mechanisms
  - security
  - rest-api
  - eu-compliance
---

## سامانهٔ یکپارچهٔ احراز هویت و صدور مجوز

سامانهٔ یکپارچهٔ احراز هویت و صدور مجوز یکی از مؤلفه‌های کلیدی حفاظت از داده‌هاست که دسترسی امن به منابع سامانه را فراهم می‌کند. این سامانه به شما امکان می‌دهد کاربران، مجوزهای آن‌ها و دسترسی به داده‌ها را در سطح کل سامانه مدیریت کنید.

یادآوری:

- **احراز هویت** فرایند راستی‌آزمایی هویت یک کاربر است (برای نمونه، با نام کاربری و گذرواژه).
- **صدور مجوز** فرایند راستی‌آزمایی مجوزهای یک کاربر برای انجام کنش‌های مشخص است (برای نمونه، دسترسی به داده‌ها یا کارکردهای سامانه).

### مؤلفه‌های سامانه

#### احراز هویت

- **نام کاربری و گذرواژه**: روش سنتی احراز هویت. کاربر هنگام ورود باید نخست خود را با نام کاربری و گذرواژه شناسایی کند.
- **احراز هویت چندعاملی** (MFA): استفاده از چند عامل (برای نمونه، یک توکن نرم‌افزاری که به‌صورت پویا برای web API به‌روزرسانی می‌شود).

احراز هویت مبتنی بر توکن، فرایند را برای کاربران ثبت‌شده ساده می‌کند. برای شروع، کاربر درخواستی همراه با نام کاربری و گذرواژه به سرور می‌فرستد. سرور آن‌ها را در برابر مقادیر ثبت‌شده در پایگاه‌دادهٔ هویت خود اعتبارسنجی می‌کند. اگر هویت تأیید شود، سرور یک توکن احراز هویت بازمی‌گرداند (که در پایگاه‌داده نیز ذخیره می‌شود).

هنگامی که همان کاربر بعدها درخواست دسترسی به منابع محافظت‌شده را می‌دهد، می‌توان آن درخواست‌ها را به‌جای نام کاربری و گذرواژه با توکن احراز هویت مجاز کرد. سرور توکن را در برابر توکن ثبت‌شده در پایگاه‌داده بررسی می‌کند و دسترسی را اعطا می‌کند.

#### صدور مجوز

- **نقش‌ها و مجوزها**: به کاربران نقش‌هایی اختصاص می‌یابد (برای نمونه، مدیر دسترسی، کاربر) که مجوزهای آن‌ها را تعریف می‌کند.
- **ACL** (فهرست‌های کنترل دسترسی): فهرست‌هایی که تعیین می‌کنند چه کسی به کدام منابع دسترسی دارد.
- **RBAC** (کنترل دسترسی مبتنی بر نقش): کنترل دسترسی بر پایهٔ نقش.
- **ABAC** (کنترل دسترسی مبتنی بر ویژگی): کنترل دسترسی بر پایهٔ ویژگی (برای نمونه، بر اساس زمان روز یا موقعیت مکانی).

#### ذخیرهٔ داده‌های کاربر

- **پایگاه‌دادهٔ کاربران**: اطلاعات مربوط به کاربران، نقش‌ها و مجوزهای آن‌ها را در یک پایگاه‌دادهٔ واحد ذخیره می‌کند.

#### امنیت

- **رمزگذاری**: از داده‌ها هنگام انتقال و ذخیره‌سازی محافظت می‌کند.
- **توکن‌های دسترسی**: توکن‌های نرم‌افزاری که به‌صورت پویا به‌روزرسانی می‌شوند و برای مدیریت نشست به کار می‌روند.
- **ممیزی**: ثبت تمام کنش‌های کاربر برای تحلیل بعدی.

### پیاده‌سازی سامانه

پلتفرم از جریان احراز هویت مبتنی بر توکن استفاده می‌کند. کاربر با نام کاربری و گذرواژه وارد می‌شود، سامانه آن‌ها را اعتبارسنجی می‌کند و یک توکن دسترسی بازمی‌گرداند، و سپس آن توکن همراه با هر درخواست بعدی فرستاده می‌شود تا دسترسی به منابع محافظت‌شده مجاز شود. نشانی ایمیل کاربر به‌عنوان نام کاربری استفاده می‌شود.

نمونه‌ای از یک درخواست در قالب `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` استفاده کنید، یا هدرهای لازم را از آخرین درخواست ذخیره کنید و در صورتی که توکن منقضی نشده باشد، دفعهٔ بعد دوباره از آن‌ها استفاده کنید. توجه داشته باشید که بدون پایان‌دادن به نشست، آخرین توکن بسته به تنظیمات سامانه‌ای سرور تا مدتی معتبر باقی می‌ماند.

### مزایای سامانه

سامانهٔ یکپارچهٔ احراز هویت و صدور مجوز ابزاری توانمند برای حفاظت از داده‌ها و کنترل دسترسی است. این سامانه مزایای زیر را فراهم می‌کند:

- **مدیریت متمرکز**: مدیریت کاربران و مجوزهای آن‌ها را ساده می‌کند.
- **امنیت**: از داده‌ها در برابر دسترسی غیرمجاز محافظت می‌کند.
- **یکپارچگی**: همهٔ برنامه‌ها و سامانه‌ها از یک سازوکار احراز هویت و صدور مجوز یکسان استفاده می‌کنند.
- **مقیاس‌پذیری**: افزودن برنامه‌ها و کاربران جدید را آسان می‌کند.

## رمزگذاری داده‌ها

برای محافظت از اطلاعات حیاتی، سامانه از رمزگذاری (تبدیل اطلاعات به شکلی که بدون کلید مناسب قابل خواندن نباشد) و درهم‌سازی (تبدیل داده‌ها به یک رشتهٔ یکتا با طول ثابت — یک hash) استفاده می‌کند. این یکی از سازوکارهای کلیدی حفاظت از داده‌هاست که محرمانگی، یکپارچگی و امنیت اطلاعات را هم در ذخیره‌سازی و هم در انتقال تضمین می‌کند.

سامانه از الگوریتم‌های گوناگون رمزگذاری و درهم‌سازی داده‌ها بهره می‌برد.

### کاربرد رمزگذاری در سامانه

#### رمزگذاری ذخیره‌سازی

- **پایگاه‌های داده**: رمزگذاری فیلدهای جداگانهٔ پایگاه‌داده.
- **فایل‌ها**: رمزگذاری فایل‌ها پیش از ذخیرهٔ آن‌ها روی دیسک.

#### رمزگذاری داده‌ها در انتقال

- **HTTPS**: استفاده از SSL/TLS برای رمزگذاری داده‌ها هنگام انتقال در شبکه.
- **VPN**: ایجاد یک تونل امن برای انتقال داده‌ها.

#### رمزگذاری گذرواژه

ذخیرهٔ hashهای گذرواژه به‌جای خودِ گذرواژه‌ها.

### نمونه‌هایی از رمزگذاری و رمزگشایی داده‌ها

بیایید نمونه‌هایی از رمزگذاری و رمزگشایی فایل‌های پیکربندی سامانه را بررسی کنیم.

#### رمزگذاری داده‌ها

```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
)
```

### مزایای رمزگذاری داده‌ها

- **محرمانگی**: محافظت از داده‌ها در برابر دسترسی غیرمجاز.
- **یکپارچگی**: اطمینان از اینکه داده‌ها تغییر نکرده‌اند.
- **اصالت**: تأیید منبع داده‌ها.
- **الزامات انطباق**: برآورده‌کردن الزامات مقرراتی.

## ممیزی و پایش

چند زیرسامانه فعالیت کاربر و سامانه را پایش می‌کنند، رفتار مشکوک را شناسایی می‌کنند و انطباق با الزامات امنیتی را تضمین می‌کنند. این زیرسامانه‌ها در کنار یکدیگر:

- اطلاعات مربوط به فعالیت کاربر و سامانه را برای تضمین پاسخ‌گویی و انطباق گردآوری، تحلیل و ذخیره می‌کنند؛
- سامانه و تجهیزات را به‌طور پیوسته و بی‌درنگ پایش می‌کنند تا رویدادها را شناسایی کرده و به آن‌ها واکنش نشان دهند.

### اهداف

- **پاسخ‌گویی**: اطمینان از اینکه تمام فعالیت کاربر و سامانه ثبت می‌شود.
- **امنیت**: شناسایی و پیشگیری از فعالیت غیرمجاز.
- **شناسایی مشکل**: شناسایی مشکلات و ناهنجاری‌های سخت‌افزاری و اتخاذ اقدام اصلاحی.
- **بهینه‌سازی کارایی**: تحلیل کارایی سامانه و یافتن گلوگاه‌هایی که نیازمند بهینه‌سازی هستند.
- **پیش‌بینی و برنامه‌ریزی**: گردآوری داده‌ها برای پیش‌بینی بارهای کاری آینده و برنامه‌ریزی منابع.
- **انطباق**: تضمین انطباق با الزامات مقرراتی.
- **تحلیل رویداد**: تحلیل رویدادهای رخ‌داده برای پیشگیری از رویدادهای آینده.

### مؤلفه‌های ممیزی و پایش

#### گردآوری داده‌ها

- **لاگ‌ها**: ثبت کنش‌های کاربر و سامانه در تمام سطوح.
- **سنجه‌ها**: داده‌های کارایی سامانه (برای نمونه، میزان بهره‌برداری از CPU، مصرف حافظه).

#### ذخیرهٔ داده‌ها

- **ذخیرهٔ لاگ‌ها**: گردآوری داده‌ها از منابع گوناگون، با ذخیره‌سازی توزیع‌شدهٔ لاگ‌ها و سنجه‌ها که بر اساس حوزهٔ موضوعی سازمان‌دهی شده است.
- **چرخش لاگ‌ها**: حذف خودکار لاگ‌های قدیمی برای صرفه‌جویی در فضا.

#### تحلیل داده‌ها

- **جست‌وجو و پالایش**: امکان جست‌وجو و پالایش لاگ‌ها بر اساس معیارهای گوناگون.
- **تحلیل‌گری**: استفاده از ابزارهای تحلیل داده (برای نمونه، 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 برای رویدادهای هشدار.

#### مزایای ممیزی و پایش

ممیزی و پایش ابزارهای توانمند حفاظت از داده‌ها هستند که به شما امکان می‌دهند فعالیت کاربر و سامانه را ردیابی کنید، رفتار مشکوک را شناسایی کنید و انطباق با الزامات امنیتی را تضمین کنید. این ابزارها به شما امکان می‌دهند:

- پاسخ‌گویی و امنیت داده‌ها را تضمین کنید؛
- رویدادها را شناسایی و از آن‌ها پیشگیری کنید؛
- الزامات مقرراتی را برآورده کنید.
