2FA
Критично важливо: пароль сам по собі не є достатнім захистом для ERP. Якщо пароль бухгалтера, адміністратора, фінансового директора або менеджера буде викрадено, зловмисник може отримати доступ до фінансів, зарплат, договорів, клієнтів, складу, цін, банківських реквізитів і управлінської звітності.
Правильне рішення: у K2 ERP потрібно впровадити 2FA як мінімальний обов'язковий рівень захисту для критичних ролей: адміністраторів, бухгалтерії, фінансів, керівників, HR, користувачів із доступом до банківських операцій і користувачів із віддаленим доступом.
Орієнтир: CISA зазначає, що phishing-resistant MFA є стандартом, до якого мають прагнути організації, але будь-яка MFA краще, ніж її відсутність. Для ERP це означає: 2FA потрібно впроваджувати негайно, а для критичних ролей поступово переходити на сильніші методи — FIDO2 або passkeys.
1. Що таке 2FA
2FA — це двофакторна автентифікація. Вона вимагає від користувача підтвердити вхід двома різними факторами.
Найпростіший приклад:
1. Користувач вводить логін і пароль. 2. Система просить другий фактор: код із додатку, SMS, push або security key. 3. Тільки після другого фактора користувач входить у K2 ERP.
| Фактор | Приклад | Коментар |
|---|---|---|
| Щось, що користувач знає | Пароль або PIN | Перший фактор. |
| Щось, що користувач має | Телефон, додаток Authenticator, security key, passkey | Другий фактор. |
| Щось, чим користувач є | Біометрія на пристрої | Може використовуватись для активації passkey або пристрою. |
NIST у Digital Identity Guidelines описує, що для AAL2 потрібна багатофакторна автентифікація або комбінація двох різних однофакторних автентифікаторів. Це фактично відповідає ідеї 2FA: одного пароля недостатньо.
2. 2FA vs MFA
2FA і MFA часто використовують як синоніми, але між ними є різниця.
| Термін | Що означає | Приклад |
|---|---|---|
| 2FA | Рівно два фактори автентифікації. | Пароль + TOTP-код. |
| MFA | Два або більше факторів. | Пароль + FIDO2 + додатковий step-up для критичної дії. |
Важливо: 2FA — це мінімальний рівень захисту. Для критичних ролей у K2 ERP краще мислити ширше: MFA, adaptive MFA, step-up MFA і phishing-resistant MFA.
3. Чому 2FA критична для ERP
ERP — це центр управління компанією.
У K2 ERP або іншій ERP можуть бути:
- фінансові документи;
- рахунки;
- банківські виписки;
- платежі;
- зарплати;
- кадрові дані;
- податкові документи;
- договори;
- клієнти;
- постачальники;
- ціни;
- знижки;
- залишки;
- виробничі рецептури;
- управлінська звітність;
- інтеграції з банками, ПРРО, маркетплейсами, службами доставки та електронним підписом.
Ризик без 2FA: викрадений пароль може відкрити доступ до ERP без додаткової перевірки. Для зловмисника це означає можливість діяти від імені реального працівника.
4. Де 2FA має бути обов’язковою
| Роль / зона | Чому 2FA обов’язкова | Рівень |
|---|---|---|
| Адміністратор K2 ERP | Може змінювати права, ролі, інтеграції, налаштування. | Критично |
| Головний бухгалтер | Має доступ до фінансів, податків, зарплат. | Критично |
| Фінансовий директор | Має доступ до платежів, бюджетів, рахунків, звітів. | Критично |
| Користувачі з банківськими операціями | Можуть впливати на платежі або реквізити. | Критично |
| HR / зарплата | Доступ до персональних і зарплатних даних. | Високий |
| Менеджери з доступом до цін | Можуть змінювати комерційні умови. | Високий |
| Віддалений доступ | Вхід поза офісом має підвищений ризик. | Високий |
| Користувачі з експортом даних | Можуть вивантажити клієнтів, ціни, договори, залишки. | Високий |
5. Методи 2FA
| Метод | Приклад | Рівень безпеки | Коментар |
|---|---|---|---|
| SMS-код | Код у SMS | Базовий | Краще, ніж тільки пароль, але не найкращий варіант. |
| Email-код | Код на email | Базовий | Безпека залежить від пошти. |
| TOTP | Google Authenticator, Microsoft Authenticator, 1Password, Bitwarden | Добрий | Код генерується в додатку і змінюється кожні 30 секунд. |
| Push | Підтвердження в мобільному додатку | Добрий | Потрібен захист від випадкового підтвердження. |
| Push із number matching | Користувач вводить число з екрана входу | Кращий | Зменшує ризик MFA fatigue. |
| FIDO2 security key | YubiKey, Feitian, Titan Key | Дуже сильний | Phishing-resistant варіант. |
| Passkeys | Ключ доступу на пристрої | Дуже сильний | Сучасний варіант без класичного пароля. |
6. Рекомендація для K2 ERP
| Роль | Мінімальний метод | Рекомендований метод | Колір |
|---|---|---|---|
| Адміністратор | TOTP | FIDO2 / passkey | Сильний захист |
| Головний бухгалтер | TOTP | FIDO2 / passkey | Сильний захист |
| Фінансовий директор | TOTP | FIDO2 / passkey | Сильний захист |
| HR / зарплата | TOTP | TOTP або FIDO2 | Обов'язково |
| Менеджер продажів | TOTP або push | TOTP | Бажано |
| Склад | TOTP або SMS | TOTP | Бажано |
| Тимчасовий користувач | TOTP | Короткий TTL + TOTP | Контроль |
Правило для K2 ERP: SMS можна використовувати тільки як перехідний або резервний варіант. Для критичних ролей потрібні TOTP, FIDO2 або passkeys.
7. Ризики слабкої 2FA
7.1. SMS-2FA
| Ризик | Опис | Рівень |
|---|---|---|
| Перехоплення SMS | Код може бути скомпрометований через мобільні ризики або соціальну інженерію. | Високий |
| Залежність від оператора | Користувач може не отримати код. | Середній |
| Незручність за кордоном | SMS може не приходити в роумінгу. | Середній |
| Не phishing-resistant | Код можна ввести на фальшивому сайті. | Критично |
7.2. Email-2FA
| Ризик | Опис | Рівень |
|---|---|---|
| Злам пошти | Якщо пошту зламано, код також доступний зловмиснику. | Критично |
| Затримки доставки | Код може приходити із затримкою. | Середній |
| Не phishing-resistant | Код можна виманити. | Критично |
7.3. Push-2FA без number matching
| Ризик | Опис | Рівень |
|---|---|---|
| MFA fatigue | Користувач отримує багато push-запитів і випадково підтверджує. | Критично |
| Випадкове підтвердження | Користувач натискає approve, не читаючи. | Високий |
8. 2FA для критичних операцій
2FA має використовуватись не тільки при вході, але й перед небезпечними діями.
| Операція | Чому потрібна повторна 2FA | Рекомендація |
|---|---|---|
| Зміна банківських реквізитів | Ризик підміни рахунку. | 2FA + погодження. |
| Створення платежу | Ризик фінансової втрати. | 2FA + рольовий контроль. |
| Зміна ролей користувача | Ризик несанкціонованого доступу. | 2FA адміністратора. |
| Масовий експорт даних | Ризик витоку. | 2FA + журнал. |
| Видалення документа | Ризик приховування операцій. | 2FA + audit log. |
| Вимкнення інтеграції | Ризик зупинки бізнес-процесу. | 2FA + погодження. |
9. Політика 2FA для K2 ERP
9.1. Обов’язкові правила
| Правило | Опис | Статус |
|---|---|---|
| 2FA для адміністраторів | Без 2FA адміністратор не може увійти. | Обов'язково |
| 2FA для бухгалтерії | Доступ до фінансових і податкових даних тільки з 2FA. | Обов'язково |
| 2FA для фінансів | Платежі, бюджети, реквізити — тільки з 2FA. | Обов'язково |
| 2FA для віддаленого доступу | Вхід поза офісом тільки з 2FA. | Обов'язково |
| 2FA для нового пристрою | Новий пристрій потребує другого фактора. | Обов'язково |
| 2FA для нової країни/IP | Система має вимагати повторну перевірку. | Обов'язково |
| Заборона спільних логінів | 2FA неможливо нормально використовувати зі спільним акаунтом. | Обов'язково |
9.2. Рекомендовані правила
- вимагати 2FA для всіх користувачів;
- не дозволяти SMS для адміністраторів;
- не дозволяти email-код для фінансових ролей;
- вимагати FIDO2 / passkey для super admin;
- вимагати повторну 2FA для критичних дій;
- блокувати користувача після багатьох невдалих 2FA;
- логувати всі 2FA-події;
- показувати dashboard покриття 2FA.
10. Recovery 2FA
Користувач може втратити телефон, додаток або security key. Тому потрібен безпечний recovery-процес.
Потрібно передбачити:
- резервні коди;
- резервний метод 2FA;
- заявку на відновлення доступу;
- перевірку особи;
- погодження адміністратором;
- журнал recovery-події;
- тимчасовий доступ з коротким TTL;
- обов’язкове повторне налаштування 2FA після recovery.
Критично важливо: recovery не повинен бути слабшим за саму 2FA. Якщо другий фактор можна обійти простим проханням у чаті, це небезпечна архітектура.
11. Модель даних 2FA
11.1. two_factor_methods
| Поле | Тип | Опис |
|---|---|---|
| id | uuid | ID методу. |
| user_id | uuid | Користувач. |
| method_type | varchar | TOTP, SMS, EMAIL, PUSH, FIDO2, PASSKEY. |
| status | varchar | ACTIVE, PENDING, DISABLED, LOST. |
| is_primary | boolean | Основний метод. |
| last_used_at | timestamp | Останнє використання. |
| created_at | timestamp | Дата створення. |
11.2. two_factor_challenges
| Поле | Тип | Опис |
|---|---|---|
| id | uuid | ID challenge. |
| user_id | uuid | Користувач. |
| method_id | uuid | Метод 2FA. |
| challenge_type | varchar | LOGIN, STEP_UP, RECOVERY, CRITICAL_ACTION. |
| status | varchar | PENDING, PASSED, FAILED, EXPIRED. |
| risk_score | integer | Оцінка ризику. |
| ip_address | varchar | IP. |
| user_agent | text | Браузер / пристрій. |
| created_at | timestamp | Дата створення. |
| expires_at | timestamp | Строк дії. |
11.3. two_factor_events
| Поле | Тип | Опис |
|---|---|---|
| id | uuid | ID події. |
| user_id | uuid | Користувач. |
| event_type | varchar | 2FA_ENABLED, 2FA_DISABLED, 2FA_PASSED, 2FA_FAILED, RECOVERY_USED. |
| method_type | varchar | Тип 2FA. |
| ip_address | varchar | IP. |
| user_agent | text | Пристрій. |
| payload | jsonb | Технічні дані без секретів. |
| created_at | timestamp | Дата. |
12. Dashboard 2FA
12.1. KPI адміністратора
| Показник | Значення | Стан |
|---|---|---|
| Користувачів із 2FA | 86% | Потрібно довести до 100% |
| Адміністраторів із 2FA | 100% | Норма |
| Бухгалтерів із 2FA | 92% | Потрібна дія |
| Фінансових ролей із 2FA | 100% | Норма |
| Користувачів тільки з SMS | 18 | Замінити на TOTP/FIDO2 |
| Невдалих 2FA за день | 12 | Контроль |
| Підозрілих 2FA-запитів | 3 | Критично |
| Recovery-подій за місяць | 4 | Контроль |
12.2. Проблемні користувачі
| Користувач | Роль | 2FA | Ризик | Дія |
|---|---|---|---|---|
| admin2 | Адміністратор | Вимкнено | Критично | Заблокувати або увімкнути 2FA |
| buh_olena | Бухгалтер | SMS | Високий | Перевести на TOTP/FIDO2 |
| sales_ivan | Менеджер | TOTP | Норма | Без дії |
| cfo | Фіндиректор | FIDO2 | Добре | Без дії |
13. Приклад процесу входу з 2FA
1. Користувач відкриває K2 ERP. 2. Вводить логін і пароль. 3. Система перевіряє пароль. 4. Система визначає, чи потрібна 2FA. 5. Якщо потрібна — створює 2FA challenge. 6. Користувач вводить TOTP-код або підтверджує другим фактором. 7. Система перевіряє challenge. 8. Якщо все коректно — створює сесію. 9. Подія входу записується в журнал.
14. Приклад Python-логіки
14.1. Перевірка необхідності 2FA
def is_2fa_required(user: "User", request_context: "RequestContext") -> bool:
if user.role in ["ADMIN", "CHIEF_ACCOUNTANT", "CFO", "HR_PAYROLL"]:
return True
if request_context.is_remote_access:
return True
if request_context.is_new_device:
return True
if request_context.is_high_risk_ip:
return True
return user.two_factor_required
14.2. Створення 2FA challenge
def create_2fa_challenge(user_id: str, method_type: str, context: dict, db: "Session") -> "TwoFactorChallenge":
challenge = two_factor_challenge_repository.create(
db=db,
data={
"user_id": user_id,
"method_type": method_type,
"challenge_type": context.get("challenge_type", "LOGIN"),
"status": "PENDING",
"risk_score": context.get("risk_score", 0),
"ip_address": context.get("ip_address"),
"user_agent": context.get("user_agent"),
"expires_at": utc_now_plus_minutes(5),
},
)
audit_logger.log(
event_type="2FA_CHALLENGE_CREATED",
user_id=user_id,
payload={
"method_type": method_type,
"challenge_type": challenge.challenge_type,
},
)
db.commit()
return challenge
14.3. Перевірка TOTP-коду
def verify_totp_challenge(challenge_id: str, code: str, db: "Session") -> bool:
challenge = two_factor_challenge_repository.get_by_id(db, challenge_id)
if challenge.status != "PENDING":
return False
if challenge.expires_at < utc_now():
challenge.status = "EXPIRED"
db.commit()
return False
method = two_factor_method_repository.get_active_totp_method(
db=db,
user_id=challenge.user_id,
)
is_valid = totp_service.verify(
secret=method.secret_encrypted,
code=code,
)
if is_valid:
challenge.status = "PASSED"
method.last_used_at = utc_now()
else:
challenge.status = "FAILED"
audit_logger.log(
event_type="2FA_PASSED" if is_valid else "2FA_FAILED",
user_id=challenge.user_id,
payload={"challenge_id": str(challenge.id)},
)
db.commit()
return is_valid
15. Впровадження 2FA в K2 ERP
Етап 1. Аудит користувачів
- знайти всіх активних користувачів;
- знайти адміністраторів;
- знайти бухгалтерію;
- знайти фінансові ролі;
- знайти HR / зарплату;
- знайти користувачів із віддаленим доступом;
- знайти спільні логіни;
- знайти користувачів без входу понад 90 днів.
Етап 2. Політика 2FA
- визначити обов’язкові ролі;
- визначити дозволені методи;
- заборонити слабкі методи для критичних ролей;
- визначити recovery-процедуру;
- визначити step-up 2FA для критичних дій.
Етап 3. Технічна реалізація
- TOTP;
- SMS як резервний або перехідний варіант;
- FIDO2 / passkeys для критичних ролей;
- recovery codes;
- device trust;
- risk-based challenge;
- журнал 2FA;
- dashboard 2FA.
Етап 4. Запуск
- спочатку адміністратори;
- потім бухгалтерія;
- потім фінанси;
- потім керівники;
- потім HR;
- потім усі інші користувачі.
Етап 5. Контроль
- щотижневий звіт;
- список користувачів без 2FA;
- блокування критичних ролей без 2FA;
- поступова відмова від SMS;
- перехід критичних ролей на FIDO2 / passkeys.
16. Acceptance Criteria
16.1. Базова 2FA
| № | Критерій | Очікуваний результат |
|---|---|---|
| AC-1 | Користувач вмикає TOTP. | Система показує QR, приймає код і активує метод. |
| AC-2 | Користувач входить із 2FA. | Вхід дозволено тільки після другого фактора. |
| AC-3 | Користувач вводить неправильний код. | Challenge стає FAILED, спроба логуються. |
| AC-4 | Challenge прострочений. | Система вимагає новий challenge. |
16.2. Критичні ролі
| № | Критерій | Очікуваний результат |
|---|---|---|
| AC-5 | Адміністратор без 2FA намагається увійти. | Вхід заблоковано або примусово вимагається 2FA. |
| AC-6 | Бухгалтер без 2FA намагається увійти. | Система вимагає налаштувати 2FA. |
| AC-7 | Фіндиректор входить із нового пристрою. | Система вимагає 2FA і створює подію ризику. |
16.3. Step-up 2FA
| № | Критерій | Очікуваний результат |
|---|---|---|
| AC-8 | Користувач змінює банківські реквізити. | Система вимагає повторну 2FA. |
| AC-9 | Адміністратор змінює роль користувача. | Система вимагає повторну 2FA. |
| AC-10 | Користувач запускає масовий експорт. | Система вимагає 2FA і логування. |
16.4. Recovery
| № | Критерій | Очікуваний результат |
|---|---|---|
| AC-11 | Користувач втратив 2FA-пристрій. | Запускається recovery-процедура. |
| AC-12 | Recovery виконано. | Подія логуються, користувач зобов’язаний налаштувати новий фактор. |
| AC-13 | Recovery для адміністратора. | Потрібне додаткове погодження. |
16.5. Dashboard
| № | Критерій | Очікуваний результат |
|---|---|---|
| AC-14 | Адміністратор відкриває 2FA dashboard. | Він бачить покриття 2FA по ролях. |
| AC-15 | Є адміністратор без 2FA. | Він підсвічується червоним. |
| AC-16 | Є користувач тільки з SMS. | Він підсвічується помаранчевим. |
| AC-17 | Є підозрілі 2FA-запити. | Вони підсвічуються червоним і створюють alert. |
17. Висновок
2FA — це мінімальний рівень захисту ERP від викрадених паролів.
Червона зона: адміністратори, бухгалтерія, фінанси, HR або керівники входять у K2 ERP тільки за паролем.
Зелена зона: у K2 ERP увімкнено 2FA для критичних ролей, step-up 2FA для небезпечних операцій, dashboard контролю, журнал подій і поступовий перехід на FIDO2 / passkeys.
Головне правило: 2FA потрібно впроваджувати не колись, а одразу. Для ERP пароль без другого фактора — це незакритий ризик.
18. Джерела
- CISA: More than a Password.
- CISA: MFA Guidance.
- CISA: Phishing-Resistant MFA Guidance.
- NIST SP 800-63B: Digital Identity Guidelines.
- NIST SP 800-63B-4: Authentication and Authenticator Management.
- Внутрішні вимоги K2 ERP до ролей, доступів, 2FA, журналювання та API-безпеки.