Безпека і приватність
Пілотна редакція від 2026-10-15; буде уточнена після огляду юриста. Сервіс у пілоті, тому текст написано простою мовою і він може змінитися. Підсвічені місця в [дужках] заповнимо, щойно їх буде визначено.
Електронна версія: https://partneroom.cv.biz.ua/security/
Тут лише те, що вже зроблено і перевірено в коді. Чого ще немає, ми пишемо окремо, у розділі «Плануємо». Такий розподіл зберігатимемо і далі: пункт переходить у «Що вже працює» лише після реалізації і перевірки.
1. Вхід і акаунти
- Паролі зберігаються лише як хеш Argon2id. Пароль має бути не коротшим за 10 символів; занадто прості, поширені або схожі на імʼя чи email паролі сервіс не приймає.
- Обмеження спроб. Вхід — не більше 5 невдалих спроб на одну адресу і 30 з однієї IP-адреси за 10 хвилин; блокування адреси не заважає входити іншим людям. Реєстрація, прийняття запрошення, скидання пароля і форма листа очікування мають ліміти і на IP-адресу, і на email. Лічильники зберігаються в базі на сервері, а не в памʼяті процесу.
- Двофакторна автентифікація (за бажанням): після пароля — шестизначний код із застосунку-автентифікатора (TOTP). Той самий код удруге не спрацює. Є 10 одноразових кодів відновлення; у базі вони лежать лише як хеш. Власник може вимагати 2FA від власників і партнерських менеджерів своєї компанії.
- Скидання пароля — одноразове посилання на email, діє 1 годину. Ні скидання пароля, ні реєстрація не показують, чи є акаунт з такою адресою. Нова адреса підтверджується листом; до підтвердження не можна запрошувати людей, надсилати запити на партнерство і розсилки.
- Сесії зберігаються на сервері. Cookie сесії недоступна для скриптів сторінки (HttpOnly) і не надсилається з чужих сайтів (SameSite=Lax). На робочому сервері вона передаватиметься лише через HTTPS (Secure). Сесія завершується після 12 годин без активності. Кнопка «Вийти з усіх пристроїв» і зміна пароля (з поточним паролем) завершують усі інші ваші сесії.
- Запрошення в команду одноразові, діють 72 години. У базі зберігається лише хеш посилання, а не саме посилання. Посилання підтвердження email і скидання пароля підписані сервером і мають строк дії.
- Адмінка персоналу сервісу відкривається лише з дозволених IP-адрес, вхід — через звичайну сторінку входу з тими самими лімітами і з обовʼязковою 2FA.
2. Ізоляція компаній і приватний шар
- Компанії ізольовані. Кожен запит у кабінеті працює в контексті однієї компанії. Автоматичні тести перевіряють, що дані однієї компанії не видно іншій, і без них зміни не приймаються.
- Приватне лишається приватним. Ваші статуси, погоджувачів, внутрішні коментарі й нотатки партнер не бачить ні в кабінеті, ні в картках задач від бота.
- Прочитане — лише ваше. Позначки «прочитано» в чаті з партнером ставить лише ваша явна дія: відкриття чату нічого не позначає. Бачите ці позначки лише ви.
3. Захист сторінок
- Content Security Policy. Браузер виконує лише скрипти з файлів нашого сайту: скрипти, вбудовані в сторінку, політика забороняє. Форми надсилаються лише на наш сайт.
- Сторінки сервісу не можна вбудувати в чужий сайт (frame-ancestors 'none', X-Frame-Options: DENY).
- Кожна форма захищена від підроблених запитів з інших сайтів (CSRF-токен).
- Усе, що вводять користувачі, екранується під час показу, тож чужий HTML чи скрипт на сторінці не виконається.
- Заголовки
X-Content-Type-Options: nosniffіReferrer-Policy: strict-origin-when-cross-origin.
4. Файли
- Файли задач і чатів не лежать у відкритому доступі. Їх віддає лише сервіс після перевірки, що ви маєте право бачити цю задачу чи чат.
- Розмір — до 10 МБ, типи — лише зі списку дозволених. Тип визначаємо самі, а не довіряємо браузеру.
- На диску файл лежить під випадковою назвою, а завантажується як файл, а не відкривається як сторінка.
5. Журнал безпеки
Сервіс записує вхід і невдалі спроби входу, зміни ролей, запрошення, зміни статусів, процесів і правил погодження. Власник компанії бачить журнал у кабінеті: «Налаштування → Безпека». У журнал не потрапляють тексти повідомлень і паролі.
6. Чесно про Telegram
- Бот отримує повідомлення від Telegram у відкритому вигляді, як будь-який Telegram-бот. Наскрізного шифрування для повідомлень груп немає.
- Надовго зберігаються лише повідомлення, привʼязані до задач. Інші зберігаються не довше 7 днів, щоб їх можна було привʼязати, і потім видаляються автоматично.
- Поки групу не привʼязано до партнера в кабінеті, бот не зберігає з неї жодних повідомлень і даних учасників.
- У групі бот публікує і закріплює повідомлення про це. Команда /privacy пояснює, що зберігається. Команда /forgetme видаляє ще не привʼязані повідомлення людини, а там, де її текст уже потрапив у задачу, коментар до ліда, копію в чаті з партнером, сповіщення чи чергу бота, замінює текст і імʼя на «Повідомлення видалено на вимогу автора». Нові повідомлення цієї людини сервіс більше не зберігає. Листи, які вже надіслано, і самі повідомлення в групі Telegram сервіс видалити не може.
- Повідомлення ботів сервіс не зберігає і на них не відповідає.
- Токен бота компанії зберігається лише в зашифрованому вигляді; ключ шифрування лежить окремо від бази.
- У пілоті Telegram-міст перевіряється на тестовому боті. До реальних груп бот підключається лише за рішенням компанії.
7. Гроші
Partneroom не приймає, не зберігає і не переказує кошти і не підключається до банківських рахунків. У розділі «Розрахунки» сторони лише позначають, хто кому винен і чи пройшла оплата.
8. Чесні межі
- Хто адмініструє сервер, технічно може отримати доступ до даних на ньому. Тому ми обмежуємо такий доступ правилом: лише на ваш запит у підтримку або для усунення збою чи інциденту, і про кожен такий доступ повідомляємо власника компанії.
- Дані в базі поки не шифруються окремими ключами.
- Пілот працює локально, без стороннього хостингу, і резервних копій поза сервером ще немає.
9. Плануємо
Цього ще немає. Пункти переїдуть вище, коли будуть зроблені й перевірені:
- вхід ключами доступу (passkeys) як другий фактор на додачу до кодів із застосунку;
- шифрування текстів і файлів у базі окремими ключами компанії й партнерства;
- захист на рівні бази даних (row-level security у PostgreSQL) на додачу до перевірок у застосунку;
- робочий сервер у ЄС з HTTPS і HSTS;
- зашифровані резервні копії поза сервером і щомісячна перевірка відновлення;
- список активних сесій з пристроями і завершення окремої сесії;
- запис кожного доступу персоналу сервісу в журнал компанії;
- шрифти кабінету з нашого сервера замість Google Fonts;
- зовнішній огляд безпеки перед платним запуском.
10. Як повідомити про вразливість
Напишіть на [email для питань приватності — уточнюється]: що знайшли і як це відтворити. Будь ласка, не відкривайте чужих даних і не порушуйте роботу сервісу під час перевірки. Ми відповімо і розповімо, що виправили.