Перейти к основному содержимому

Безопасность LMS

Зачем нужно

LMS работает с детскими аккаунтами, образовательным контентом и фактами учебной активности. Документ описывает требования безопасности поверх ../../platform/security-baseline.md.

Чувствительные данные

КатегорияЗащита
прогресс ученикадоступ по lms.progress.read + scope; родитель видит только своих детей
домашние задания и feedbackдоступ по participant role; ученик видит свои, преподаватель — назначенные ему
чат с преподавателемprivate channel, доступ по lms.chat.read + членству
тетрадь и проектприватные данные ученика, доступ по lms.workbook.read + ownership
Learning Group rosterдоступ только в selected organization + workspace scope; ФИО подтягиваются из identity read model
Learning Group inviteraw token/contact хранится в identity/notifications, LMS хранит только safe ref
запись занятий (видео)приватный S3, signed URLs ограниченного срока
детские профилиминимизация PII, никаких лишних данных

Доступ к данным ребёнка

  • ребёнок — owner своих учебных evidence;
  • родитель имеет permission lms.children.read.family и видит детей своей семьи;
  • преподаватель имеет permission lms.assigned.read и видит только назначенных учеников;
  • наличие ученика в Learning Group не открывает progress без отдельного teacher assignment;
  • support без явного permission не видит детский контент.

Teacher mode и Learning Workspace

  • Преподавательский режим всегда требует selected organization_id.
  • LMS проверяет organization_id через identity membership, а не доверяет клиентскому селектору.
  • Learning Group Participant хранит только student_profile_id и служебный статус.
  • Создание invite не должно логировать email/phone или raw token в LMS.
  • Progress по группе строится построчно: если нет teacher assignment на enrollment/course/node, строка скрывается или помечается как недоступная.

Actor context

LMS обязана проверять X-Actor-Context:

  • personal — пользователь действует от своего имени;
  • child_delegated — взрослый действует за ребёнка через delegated_session;
  • family_adult — взрослый смотрит данные ребёнка без подмены;
  • admin — администратор;
  • oauth_client — внешний сервис (только для интеграций).

Контент

  • ученический контент сканируется на потенциально вредоносные файлы (антивирус);
  • ссылки в чате нормализуются;
  • встроенный HTML/Markdown санитизируется;
  • видео и файлы — приватный S3, выдача по signed URL.

Rate limits

EndpointЛимит
POST /activity-attempts60 / min / user
POST /chat-messages30 / min / user
POST /bookings10 / min / user
POST /learning-workspace/groups/{id}/invites20 / hour / teacher
GET /student-profiles/{id}/progress30 / min / user
webhook от task-bank1000 / min / IP

Запись занятий

  • запись группового занятия включается с уведомлением участников;
  • доступ только по permission lms.session_recording.read (преподаватели, admins);
  • родители получают доступ только к занятиям своих детей по индивидуальному запросу;
  • запись хранится 1 год, затем удаляется или архивируется.

Audit

  • изменение прогресса вручную;
  • изменение attendance ретроактивно;
  • удаление сабмишнов / feedback;
  • доступ к чужим детским данным;
  • ручные начисления XP и бейджей;
  • управление дорожной картой.
  • создание, архивирование и изменение Learning Group;
  • добавление/удаление participants;
  • отправка/отзыв invites;
  • создание/отмена group assignments.

Геймификация и приватность

  • XP, бейджи, серии — публичны для самого ученика и его семьи;
  • лидерборды — opt-in, по правилам платформы;
  • никнеймы и аватары — модерация на уровне storefront_public_profile.

Что запрещено

  • передавать прогресс ребёнка наружу без consent;
  • использовать прод-данные в dev/staging без анонимизации;
  • хранить расширенные PII (паспорт, СНИЛС) в LMS — это домен CRM;
  • логировать содержимое чата и feedback;
  • использовать Learning Group как canonical student registry или organization membership;
  • показывать group progress только на основании участия в Learning Group;
  • записывать тренировочный олимпиадный attempt как competition submission/result;
  • встраивать контент третьих сторон без CSP-разрешения.

Связанные документы