WebAuthn
5. Frontend передає attestation response на backend. | Вхід відхиляється. |- | challenge_type | varchar | REGISTRATION, LOGIN, STEP_UP, RECOVERY. | style="background:#ffcc80;" | Рекомендовано |- | style="background:#ffcc80;" | Віддалений доступ | Вищий ризик phishing і компрометації. Критерій
"authenticatorSelection": {
POST /api/v1/security/webauthn/authentication/options
WebAuthn — це технічна основа сучасного безпечного входу в ERP. Приклад
data={
"origin": verification_result.get("origin"),
</div>
<div style="border-left: 8px solid #1565c0; background: #e3f2fd; padding: 14px 18px; margin: 16px 0;">
</pre>
8. |-
| user_id
| uuid
| користувач системи. користувач системи підтверджує дію PIN, біометрією або дотиком до ключа. | Сесія створюється після успішної перевірки assertion. Поле
{| class="wikitable"
Platform Authenticator / Security Key
2. Backend перевіряє підпис, origin, RP ID, challenge і sign_count. | Найкращий варіант для адміністраторів і фінансів. | style="background:#c8e6c9;" | Step-up WebAuthn. |-
| public_key
| text
| Публічний ключ. Термін
[[Категорія:K2 ERP]]
[[Категорія:FIDO2]]
Потрібно передбачити:
<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
* мінімум два credentials для адміністраторів;
* резервний hardware security key;
* recovery codes;
* заявку на відновлення;
* перевірку особи користувача;
* погодження другим адміністратором;
* журнал recovery;
* відкликання втраченого credential;
* обов’язкову реєстрацію нового credential;
* тимчасовий доступ із коротким TTL. |-
| Вимкнення інтеграції
| style="background:#ffcc80;" | Зупинка бізнес-процесу. |-
| AC-4
| Origin неправильний. |-
| user_verified_required
| boolean
| Чи вимагалась user verification. |-
| Підтвердження платежу
| style="background:#ef9a9a;" | Фінансова втрата. операційна дія
! K2 ERP створює registration challenge. |-
| id
| uuid
| ID challenge. Значення
'''WebAuthn''' — це стандартний web API, який дає можливість сайту або web-додатку виконувати автентифікацію користувача за допомогою криптографічних ключів замість або на додаток до пароля. |}
! |-
| origin
| varchar
| Дозволений origin.== 17. План впровадження WebAuthn у K2 ERP ==
"challenge_type": "REGISTRATION",
event_type="WEBAUTHN_LOGIN_FAILED",
! |-
| Public key
| Публічний ключ, який зберігається на сервері. | style="background:#c8e6c9;" | Step-up WebAuthn + alert. | Унікальний ID credential. | Реєстрація не приймається. db.commit()
<pre>
! Автентифікатор створює public/private key pair. ! користувач системи
* знайти всіх адміністраторів;
* знайти користувачів фінансових ролей;
* знайти бухгалтерію;
* знайти HR / зарплату;
* знайти керівників;
* знайти користувачів із віддаленим доступом;
* знайти користувачів тільки з SMS;
* знайти користувачів без MFA. |-
| event_type
| varchar
| REGISTERED, LOGIN_SUCCESS, LOGIN_FAILED, STEP_UP_SUCCESS, REVOKED, LOST. * MDN WebAuthn API. №
publicKey: options.publicKey
[[Категорія:Інформаційна безпека]]
! | style="background:#c8e6c9;" | Step-up WebAuthn + audit log. Параметр
== 6. Як функціонує вхід через WebAuthn ==
"attestation": "none"
9. Відкриває «конфігурація безпеки». Очікуваний результат
<pre>
== 9. Step-up WebAuthn для критичних дій ==
[[Категорія:WebAuthn]]
=== 11.1. Почати реєстрацію credential ===
|-
| WebAuthn
| Browser API для створення та використання public key credentials. |-
| origin
| varchar
| Origin реєстрації. | style="background:#ef9a9a;" | Обов’язково
|-
| style="background:#ef9a9a;" | провідний бухгалтер
| Податки, зарплати, фінансовий блок, документи. |-
| Origin
| https://erp.example.com
| Конкретний origin web-додатку. |-
| AC-15
| Recovery завершено. Якщо адміністратор здатна без зусиль вимкнути WebAuthn для себе без погодження, це критична вразливість. |-
| challenge
| text
| Випадковий challenge.</div>
K2 ERP:''' реалізувати WebAuthn як технічну основу для FIDO2 забезпечується через '''Правильне рішення для бізнесу; так само реалізовано passkeys і hardware security keys, щоб забезпечити безпечний вхід, step-up підтвердження критичних дій і захист від phishing. Тому recovery має бути контрольованим. Поняття
db=db,
</pre>
method: "POST",
== 7. RP ID та Origin ==
'''Критично критично:''' приватний ключ ніколи не повинен потрапляти на сервер K2 ERP. });
"backup_eligible": verification_result.get("backup_eligible"),
|-
| admin2
| Адміністратор
| style="background:#ef9a9a;" | TOTP без WebAuthn
| style="background:#ef9a9a;" | Критично
| Видати security key
|-
| buh_olena
| Бухгалтер
| style="background:#ffcc80;" | SMS
| style="background:#ffcc80;" | Високий
| Перевести на WebAuthn або TOTP
|-
| cfo
| Фіндиректор
| style="background:#c8e6c9;" | WebAuthn security key
| style="background:#c8e6c9;" | Добре
| Без дії
|-
| director
| Керівник
| style="background:#c8e6c9;" | Passkey
| style="background:#c8e6c9;" | Добре
| Без дії
|}
const options = await optionsResponse.json();
! |-
| Dev origin
| https://dev-erp.example.com
| Має бути окремо дозволений тільки для dev/test. |-
| Security key
| Фізичний FIDO2-ключ.=== 16.1. KPI адміністратора безпеки ===
const verifyResponse = await fetch("/api/v1/security/webauthn/registration/verify", {
=== 14.3. Збереження credential ===
! ! |}
<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
event_type="WEBAUTHN_LOGIN_SUCCESS",
{| class="wikitable"
});
"CREATE_API_TOKEN",
|-
| id
| uuid
| ID події. MDN описує `PublicKeyCredential` як credential для входу в сервіс через стійку до phishing і витоків пару асиметричних ключів — public/private key pair — замість пароля. expected_origin="https://erp.example.com",
<syntaxhighlight lang="python">
credential = webauthn_credential_repository.create(
"id": "erp.example.com",
=== 12.2. webauthn_challenges ===
"CHANGE_BANK_DETAILS",
"public_key": verification_result ["public_key"],
Backend K2 ERP повинен перевірити:
}
== 15. Recovery та втрата credential ==
assertion_response=assertion_response,
[[Категорія:Кібербезпека]]
"userVerification": "required",
<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
! |}
{| class="wikitable"
is_valid = webauthn_service.verify_assertion(
Browser WebAuthn API
'''Орієнтир стандарту:''' WebAuthn — це W3C Web Authentication API для доступу до public key credentials. |-
| credential_record_id
| uuid
| Credential, якщо виступає як. |-
| authenticator_type
| varchar
| PLATFORM або ROAMING. |-
| AC-16
| Адміністратор відкриває dashboard WebAuthn. Роль
</div>
if context and context.get("remote_access") is True:
<pre>
)
=== 18.5. Dashboard ===
},
K2 ERP Frontend
},
method: "POST",
=== 18.1. Реєстрація WebAuthn ===
audit_logger.log(
== 13. Приклад frontend-логіки ==
},
return True
POST /api/v1/security/webauthn/authentication/verify
"pubKeyCredParams": [
6. Якщо все коректно — створюється сесія K2 ERP. Frontend викликає navigator.credentials.get(). | Загальна технологічна основа WebAuthn + CTAP2. |-
| backup_state
| boolean
| Чи credential зараз у backup-синхронізації. Дія
11. |-
| AC-2
| користувач системи додає hardware security key. |-
| Private key
| Приватний ключ, який залишається в автентифікаторі. !=== 11.4. Завершити автентифікацію ===
<div style="border-left: 8px solid #c62828; background: #ffebee; padding: 14px 18px; margin: 16px 0;">
const optionsResponse = await fetch("/api/v1/security/webauthn/registration/options", {
RP ID і Origin — критичні для безпеки WebAuthn. |-
| AC-5
| RP ID неправильний. SEO-опис
Session Service / Step-up Action Service
"rp_id": verification_result.get("rp_id"),
* challenge збігається з тим, який був створений сервером;
* challenge не прострочений;
* origin дозволений;
* RP ID правильний;
* credential ще не зареєстрований;
* user_id відповідає активному користувачу;
* user verification виконано, якщо це вимагається політикою;
* алгоритм підпису підтримується;
* public key коректно витягнуто та збережено;
* credential_id унікальний. |-
| Roaming authenticator
| Переносний автентифікатор. ! POST /api/v1/security/webauthn/credentials/{credential_id}/revoke
{"type": "public-key", "alg": -257}
)
! WebAuthn перевіряє прив’язку credential до правильного домену, тому фішинговий сайт не зможе використати ключ для входу в справжню K2 ERP. SEO-опис
</div>
</div>
if user.role in ["SUPER_ADMIN", "ADMIN", "CFO", "CHIEF_ACCOUNTANT"]:
[[Категорія:ERP]]
<pre>
{{SEO
|title=WebAuthn для ERP
|description=Стаття про WebAuthn для ERP-систем: що таке WebAuthn, як працює реєстрація та вхід, RP ID, origin, challenge, credential, passkeys, security keys, FIDO2, модель даних, API, безпека, dashboard та Acceptance Criteria.
|keywords=WebAuthn, FIDO2, passkeys, security key, K2 ERP, ERP security, MFA, 2FA, phishing-resistant MFA, PublicKeyCredential, CTAP2, Web Authentication API
}}
{| class="wikitable"
! |-
| device_name
| varchar
| Назва пристрою або ключа. |-
| AC-11
| Адміністратор створює API token.=== 12.1. webauthn_credentials ===
* бухгалтерський обліковий облік;
* фінансовий блок;
* HR;
* керівники;
* віддалені користувачі;
* поступова відмова від SMS. |
| verify challenge, origin, rpId, signature
=== 5.1. Бізнес-процес ===
! | дає можливість використовувати USB/NFC/BLE security key. Очікуваний результат
!== 18. Acceptance Criteria ==
* super admin;
* адміністратори;
* фінансовий директор;
* провідний бухгалтер;
* 5–10 power users;
* перевірка recovery;
* перевірка step-up дій. Очікуваний результат
"publicKey": {
def create_webauthn_registration_options(user: "User", db: "Session") -> dict:
<pre>
! | платформа вимагає step-up WebAuthn. |-
| AC-12
| користувач системи запускає масовий експорт. '''Критично критично:''' recovery-процедура не повинна обходити WebAuthn без контролю. audit_logger.log(
! | Він підсвічується червоним або помаранчевим. Приклад
! body: JSON.stringify(credential)
db.commit()
! | K2 ERP. * MDN PublicKeyCredential. * W3C WebAuthn Level 2. WebAuthn можна використовувати не тільки для входу, а й для повторного підтвердження небезпечних операцій. | Windows Hello, Touch ID, Face ID, Android passkey. Стан
if not credential or credential.status != "ACTIVE":
|-
| RP ID
| erp.example.com
| Домен, до якого прив’язується credential. Тип
return False
K2 ERP Backend
|-
| AC-10
| користувач системи змінює банківські реквізити. | платформа вимагає step-up WebAuthn. ! ! |-
| AC-19
| виступає як втрачений credential. | PIN, Touch ID, Face ID, Windows Hello. | style="background:#c8e6c9;" | Step-up WebAuthn адміністратора. | дає можливість K2 ERP реєструвати ключі та перевіряти вхід. |-
| CTAP2
| Протокол взаємодії браузера / ОС із зовнішнім автентифікатором. | Вхід відхиляється. Очікуваний результат
</pre>
});
7. {| class="wikitable"
{| class="wikitable"
* credential_id існує;
* credential активний;
* credential не відкликаний;
* challenge збігається;
* challenge не прострочений;
* origin дозволений;
* RP ID hash правильний;
* підпис assertion валідний;
* user verification відповідає політиці;
* sign_count не зменшився, якщо автентифікатор його підтримує;
* користувач системи не заблокований;
* політика ролі дає можливість цей метод входу. | style="background:#ffcc80;" | Рекомендовано
|-
| style="background:#ffcc80;" | Керівники
| Управлінська формування звітів, фінансові показники. |-
| rp_id
| varchar
| RP ID. * FIDO Alliance: Passkeys. Для production K2 ERP список дозволених origin має бути жорстко визначений. | Він підсвічується червоним. | style="background:#ef9a9a;" | Обов’язково
|-
| style="background:#ffcc80;" | HR / зарплата
| Персональні та зарплатні інформаційні дані. * FIDO Alliance: User Authentication Specifications Overview. |-
| payload
| jsonb
| Технічні інформаційні дані без секретів. | Опційно застосовується для під час реєстрації. |-
| user_agent
| text
| Браузер / пристрій. |-
| created_at
| timestamp
| Дата створення. | https://erp.example.com.
|-
| Challenge
| Випадкові інформаційні дані, які сервер створює для реєстрації або входу. | Перевіряється сервером. * Внутрішні вимоги K2 ERP до доступів, MFA, WebAuthn, журналювання та критичних дій. )
[[Категорія:MFA]]
== 1. Що таке WebAuthn ==
</pre>
<pre>
],
=== 6.1. Бізнес-процес ===
4. |-
| created_at
| timestamp
| Дата. |-
| user_id
| uuid
| користувач системи. | Зберігається в K2 ERP. |-
| Credential ID
| Ідентифікатор зареєстрованого ключа. |}
=== 11.8. Step-up WebAuthn ===
ERP — це платформа, де викрадений доступ здатна призвести не тільки до витоку даних, а й до прямої фінансової шкоди. |-
| AC-7
| користувач системи використовує невідомий credential. |-
| rp_id
| varchar
| RP ID. Натискає «Додати passkey / security key». |-
| transport
| varchar
| USB, NFC, BLE, INTERNAL. | Не передається в K2 ERP. |-
| Platform authenticator
| Автентифікатор, вбудований у пристрій. |-
| Assertion
| Підпис challenge під час входу. Окремо варто відзначити вбудований у браузери і платформи для підтримки FIDO Authentication, а CTAP2 дає можливість використовувати зовнішні автентифікатори через USB, NFC або BLE. |-
| AC-3
| Challenge прострочений. db=db,
! |-
| credential_id
| text
| WebAuthn credential ID. це не без зусиль ще один спосіб 2FA виступає ключовою рисою '''Критично критично:''' WebAuthn. |-
| Origin
| Повний origin web-додатку. |
"status": "PENDING",
5. | style="background:#c8e6c9;" | Step-up WebAuthn + погодження. });
9. | style="background:#ef9a9a;" | Обов’язково
|-
| style="background:#ef9a9a;" | Фінансовий директор
| Банки, платежі, бюджети, управлінська формування звітів. Що означає
'''Ризик без WebAuthn:''' SMS, email-код або TOTP можуть бути введені на фальшивому сайті. Критерій
== 12. Модель даних WebAuthn ==
!=== 6.2. Важливі перевірки під час входу ===
</pre>
data={
audit_logger.log(
return await verifyResponse.json();
const optionsResponse = await fetch("/api/v1/security/webauthn/authentication/options", {
=== 18.4. Recovery ===
== 11. API K2 ERP для WebAuthn ==
body: JSON.stringify({ email })
=== Етап 3. Технічна реалізація ===
"transport": verification_result.get("transport"),
У K2 ERP можуть бути:
<syntaxhighlight lang="javascript">
! |-
| RP ID
| Домен, до якого прив’язаний credential. const options = await optionsResponse.json();
user_id=user.id,
== Див. 21. так само ==
"expires_at": utc_now_plus_minutes(5),
async function loginWithWebAuthn(email) {
)
* W3C WebAuthn Level 3. Frontend передає assertion response на backend. Критерій
<pre>
"residentKey": "preferred"
)
! ! Поле
require_user_verification=True,
});
10. |-
| AC-17
| виступає як admin без WebAuthn. Показник
"status": "ACTIVE",
! |}
const verifyResponse = await fetch("/api/v1/security/webauthn/authentication/verify", {
</pre>
Credential Storage + Audit Log
<pre>
1. |-
| Super Admin із WebAuthn
| 100%
| style="background:#c8e6c9;" | Норма
|-
| Адміністраторів із WebAuthn
| 100%
| style="background:#c8e6c9;" | Норма
|-
| Фінансових ролей із WebAuthn
| 82%
| style="background:#ffcc80;" | Потрібна дія
|-
| Бухгалтерів із WebAuthn
| 76%
| style="background:#ffcc80;" | Потрібна дія
|-
| Користувачів тільки з SMS
| 18
| style="background:#ef9a9a;" | Замінити
|-
| Втрачених credentials
| 2
| style="background:#ffcc80;" | Контроль
|-
| Credentials без використання понад 90 днів
| 11
| style="background:#fff9c4;" | Перевірити
|-
| Підозрілих WebAuthn-помилок
| 3
| style="background:#ef9a9a;" | Критично
|}
== 8. Де WebAuthn має бути обов’язковим у K2 ERP ==
expected_rp_id="erp.example.com",
challenge = webauthn_service.generate_challenge()
Червона зона: адміністратори, фінансовий блок, бухгалтерський обліковий облік або керівники входять у ERP через пароль, SMS або email-код без WebAuthn. | erp.example.com або example.com. |- | backup_eligible | boolean | Чи здатна credential бути синхронізованим. FIDO Alliance описує WebAuthn як стандартний web API. | style="background:#ef9a9a;" | Обов’язково |- | style="background:#ef9a9a;" | Адміністратор | Ролі, права, конфігурація, API token, інтеграції. Рівень
! |- | Неправильний origin | https://fake-erp.example.net | Повинен бути відхилений. Критерій
|
2. WebAuthn, FIDO2, CTAP2 і passkeys
11.3. Почати автентифікацію
! |- | expires_at | timestamp | Строк дії. №
- K2 ERP
- Кібербезпека ERP
- MFA
- 2FA
- FIDO2
- WebAuthn
- CTAP2
- Passkeys
- Security Key
- TOTP
- API Security
- Журнал аудиту
- Incident Response
- Zero Trust
db=db,
payload={
! | Реєстрація відхиляється. const assertion = await navigator.credentials.get({ 6. | платформа вимагає step-up WebAuthn і логування. credential = webauthn_credential_repository.get_by_credential_id(
if not is_valid:
event_type="WEBAUTHN_CREDENTIAL_REGISTERED",
№
3. Чому WebAuthn важливий саме для ERP5. Як функціонує реєстрація WebAuthn11.6. Відкликати credentialv
"rp_id": "erp.example.com",
headers: { "Content-Type": "application/json" },
"CHANGE_USER_ROLE",
14. Приклад Python-логікикористувач системи здатна втратити пристрій, security key або доступ до passkey. |} </syntaxhighlight>
| ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|