Перейти к основному содержимому
megapromotingДавайте обсудим

Решения · Учреждения & администрация

Разделы, которых требует постановление правительства, записанные в коде и обновляемые сотрудником — не добавленные в конце, как приложение.

Примэрия или учреждение имеет фиксированный перечень обязательных разделов, обязанность обеспечивать прозрачность принятия решений и сотрудника, который должен опубликовать объявление без звонка программисту. Мы строим именно это, с журналом аудита, который удаляется сам по сроку, и с лимитом на попытки аутентификации.

Уже построеноДве собственные, публичные и проверяемые сегодня платформы. Первая — официальный сайт сельской примэрии: Laravel 12 на PHP 8.2 с MySQL 8, 40 шаблонами, 32 маршрутами, 10 миграциями, с редакционным содержимым, которое меняется редко и хранится в одном файле конфигурации на 1.613 строк и с тем, что меняется часто, в базе, редактируемым из панели; вход в панель ограничен 5 запросами в минуту, а журнал аудита удаляется ежедневно после 12 месяцев, с явной ссылкой на правовое основание. Заголовки безопасности можно прочитать извне прямо сейчас. Вторая — гражданская платформа в производстве, с 65 маршрутами интерфейса программирования, более чем 50 миграциями, 103 файлами тестов на серверной стороне и 59 end-to-end сценариями, с проверкой доступности в тестах. Что мы не считаем «сданным»: интероперабельность с государственными сервисами — код федеративной аутентификации и электронной подписи написан и протестирован, но отключен, потому что отсутствуют договор с органом и системный сертификат.

Сайт государственного учреждения оценивают не по виду, а по списку. Постановление Правительства 728/2023 устанавливает, какие разделы должны быть: прозрачность принятия решений, проекты и решения, объявления, документы, контакты, бюджет. Они обязательны, проверяются и не подлежат обсуждению. Поэтому мы строим их с самого начала, как структуру, а не добавляем в конце — добавленные в конце они выглядят формально и бесполезно, и это сразу видно.

Второе условие более практичное: учреждение должно уметь публиковать само. Объявление о тендере, проект решения, вынесенный на консультацию, фотография с мероприятия — если все проходит через разработчика, общественно значимая информация остается на бумаге или в группе социальной сети, а сайт становится мертвой витриной. Мы намеренно разделили два вида контента: редакционный, который меняется редко, — география, история, учреждения, контакты, бюджет — хранится в одном файле конфигурации, читаемом напрямую шаблонами; тот, который меняется часто, хранится в базе данных и редактируется из панели.

Третье условие — то, о котором никто не спрашивает в техническом задании: что происходит с данными. Панель публичного администрирования нуждается в лимите на попытки аутентификации — на шестой запрос в минуту с одного и того же адреса ответ 429, и это покрыто автоматическим тестом, а не предполагается. Журнал аудита содержит IP-адреса, а значит, это персональные данные: запланированная задача ежедневно очищает его от всего, что старше двенадцати месяцев, с правовым основанием, записанным в комментарии к коду, а не в отдельном документе, который никто не открывает.

И, наконец, часть, о которой мы предпочитаем говорить до тендера: интероперабельность с государственными сервисами. Федеративная аутентификация и электронная подпись у нас написаны и протестированы, но отключены переключателем, потому что отсутствуют договор с органом и системный сертификат — отсутствует бумага, а не код. Для государственной платежной платформы, магистрали интероперабельности и кабинета гражданина у нас нет никакого кода, ни в одном репозитории, и мы пишем это как есть.

Что входит

Что конкретно меняется в учреждениях и администрации

Обязательные разделы, с самого начала построенные как структура

Прозрачность принятия решений, проекты и решения, объявления, документы, контакты, бюджет, а также заявление о доступности, информация об обработке данных, раздел открытых данных и карта сайта. Соответствие постановлению правительства записано в коде — в шаблонах и в конфигурации — а не только заявлено в предложении.

Два вида контента, два разных места

То, что меняется редко — данные о населенном пункте, история, учреждения, состав совета, контакты, бюджет — находится в одном файле конфигурации на 1.613 строк, который шаблоны читают напрямую; то, что меняется часто — объявления, галерея, проекты и решения, документы, настройки прозрачности — находится в базе данных и редактируется из панели. Разделение не эстетическое: оно сводит к минимуму то, что кто-то может испортить ошибочным редактированием.

Служащий публикует сам, без разработчика в цепочке

Панель охватывает ровно те операции, которые еженедельно выполняются в примэрии: новое объявление, проект решения, вынесенный на консультации, загруженный документ, несколько фотографий. Каждое административное действие попадает в таблицу аудита — кто, что, когда — потому что в государственном учреждении вопрос «кто это опубликовал» рано или поздно получает ответ, который имеет значение.

Лимит на аутентификацию, проверенный тестом

Пять запросов в минуту с одного и того же адреса для формы аутентификации; шестой получает 429. Это не настройка, о которой мы просто заявляем: есть автоматический тест, который проверяет именно возврат кода 429. Разница между настроенной мерой и протестированной видна только тогда, когда кто-то меняет маршрут и забывает о нем.

Заголовки безопасности присутствуют в реальном ответе, а не только в конфигурации

На продакшене они читаются извне: запрет встраивания в кадр, `nosniff`, строгая политика referrer, принудительный защищенный транспорт на год с поддоменами, политика разрешений, которая закрывает геолокацию, микрофон и камеру, плюс явная политика содержимого. Мы проверяем их запросом, а не обещанием.

Минимизация данных как запланированная задача, с правовым основанием рядом с ней

Журналы аудита содержат IP-адреса. Задача выполняется ежедневно и удаляет все, что старше двенадцати месяцев, с указанием правового основания, записанным в комментарии к коду. Это разница между политикой конфиденциальности, которая говорит «храним столько, сколько необходимо», и системой, в которой срок действительно применяется сам.

Автоматически проверяемая доступность при каждой поставке

В гражданской платформе проверка выполняется в автоматических тестах по критериям WCAG 2.0 A и AA плюс 2.1 A и AA, с контрольной линией на страницу: любая новая проблема останавливает поставку, даже если общий уровень не изменился. Для государственного учреждения доступность не является имиджевой опцией, а заявление о доступности не пишется без того, чтобы что-то уже было запущено.

Структурированные данные, которые сообщают машине, что вы — учреждение

Главная страница публикует структурированные данные типа правительственной организации, с почтовым адресом. Это важно для того, как учреждение отображается в результатах, и для систем, которые читают автоматически; это также одна из немногих категорий, для которой документация двигателя по-прежнему показывает обогащенный результат с часто задаваемыми вопросами — но «хорошо известный и авторитетный» не является флажком, который мы ставим, поэтому мы не продаем это как результат поставки.

Что мы не делаем, сказано до тендера

Мы не заявляем как поставленную связь с государственной платежной платформой, с магистралью интероперабельности или с кабинетом гражданина: у нас нет кода для них ни в одном репозитории. Федеративную аутентификацию и электронную подпись у нас записаны и протестированы, но они отключены — отсутствуют контракт с органом власти и системный сертификат. А размещение на государственной инфраструктуре, где это обязательно, — это процедурное требование, а не техническая опция.

Traseul

Как запрос проходит через систему.

01

Картируем требования до дизайна

Первая поставка — это список обязательных разделов для типа вашего учреждения и их соответствие тому, что вы публикуете сегодня. Отсюда видно, чего не хватает, что существует на бумаге и что опубликовано в месте, на которое нельзя сослаться. Дизайн идет после списка, а не наоборот.

02

Мы отделяем редакционный контент от операционного

Что меняется редко, уходит в конфигурацию; что меняется часто, уходит в базу, с панелью. Мы передаём заполненную структуру с реальными данными учреждения — не с заполняющим текстом — потому что сайт учреждения с временным содержанием никто не может оценить, и обычно он таким и остаётся.

03

Мы ставим ворота: лимит аутентификации, аудит, заголовки, сроки

Лимит на форму аутентификации с тестом, который его проверяет, журнал аудита с запланированным удалением в срок, заголовки безопасности, проверенные извне, страница с информацией об обработке данных с названными основаниями. Мы передаём результат проверок, а не только конфигурацию.

04

Передаём с обучением для того, кто публикует

Мы передаём репозиторий, документ ввода в эксплуатацию и доступы, плюс обучение для лица, которое будет публиковать объявления. Передача не считается завершённой, пока сотрудник не опубликует сам объявление, которое появится на сайте.

1Веб-сервер с заголовками, проверяемыми снаружи2приложение с публичными маршрутами и панелью3редакционный контент в файле конфигурации, контентоперационный на базе4аудиторский журнал с запланированным удалением через 12 месяцев
4 straturi

Данные

К чему прикасаемся, где оно лежит и сколько остаётся

Правила отличаются от одной отрасли к другой. Это те, что применяются в учреждениях и администрации.

Контент принадлежит учреждению; мы строим структуру
Данные о населенном пункте, составе совета, служебные контакты и бюджет предоставляются учреждением и остаются его данными. Служебные номера телефонов и имена сотрудников являются публичными на сайте учреждения, но не используются в маркетинговых материалах — ни нами, ни в портфолио.
Журнал аудита содержит персональные данные
IP-адрес в журнале — персональные данные. Поэтому у него есть срок: всё, что старше двенадцати месяцев, удаляется ежедневно, с правовым основанием, указанным рядом с кодом. Журнал сохраняет актера, его роль, тип события и то, внутреннее оно или публичное — это разделение важно, когда часть учёта нужно показать гражданину.
Что публикуется и что остаётся в внутреннем деле
В гражданской платформе идентификационные элементы — например регистрационный номер — уходят в дело для органа власти и никогда не появляются публично; публичная позиция округляется; ни одна фотография не попадает на сайт без размытия, утверждённого человеком, а тот, кто редактирует, не является тем, кто утверждает. Правила — это ограничения в базе, а не инструкции для оператора.
Сроки хранения, с опубликованным текстом рядом
Каждый срок хранит в той же таблице опубликованный текст слово в слово и правовое основание — сырые медиа 90 дней, отредактированные медиа 3 года, личность того, кто сообщает, 3 года, сканы этикеток 12 месяцев. Функция очистки по умолчанию сообщает, что она удалила бы; реальное удаление требует явного аргумента.
Права субъекта данных как маршруты, а не как адрес электронной почты
Экспорт, удаление и учёт запросов существуют как функции. Учреждение, которое получает запрос на доступ, должно быть в состоянии выполнить его без ручного открытия базы данных — иначе законный срок расходуется в ожидании разработчика.

Случай

Срок хранения, который применяется сам, каждую ночь

Ситуация

Панель администрирования сайта мэрии ведёт журнал аудита: кто опубликовал, что и когда. Журнал содержит IP-адреса, значит, содержит персональные данные. Почти все такие сайты решают проблему одной фразой в политике конфиденциальности — «мы храним данные столько, сколько необходимо» — и на этом всё заканчивается.

Что мы построили

Я написал срок как запланированную задачу: рутина запускается ежедневно и удаляет из журнала всё, что старше двенадцати месяцев, а ссылка на правовое основание указана в комментарии над кодом. На том же этапе я поставил ограничение для формы входа — пять запросов в минуту с одного и того же адреса — и автоматический тест, который проверяет возврат кода 429, чтобы мера не исчезла молча при рефакторинге.

Что получилось

Опубликованная политика и поведение системы говорят об одном и том же, и разницу можно проверить: срок — это строка кода, которая выполняется каждую ночь, а не намерение. Заголовки безопасности читаются снаружи одним запросом.

Чего этот случай не говорит

Хостинг, артефакты публикации и конфигурация сервера остаются внутренней информацией. А содержимое — данные о населенном пункте, составе совета, бюджете — принадлежит учреждению и предоставляется им: мы построили структуру и панель, а не данные.

Вопросы

Что спрашивают в учреждениях и администрации

Какие разделы обязательны и кто проверяет?

Список следует из Постановления Правительства 728/2023: прозрачность принятия решений, проекты и решения, объявления, документы, контакты, бюджет, а также страницы доступности и информирования об обработке данных. Мы строим их как структуру с самого начала. В работе, которую мы цитируем, соответствие записано в коде — в шаблонах и в конфигурации — а не только заявлено в предложении.

Можем ли мы опубликовать объявление сами, без того чтобы звонить вам?

Да, и это половина работы. Объявления, проекты решений, документы и галерея редактируются из панели. То, что остается в конфигурации, — это редко меняющееся содержимое: история, география, состав совета — именно для того, чтобы обычное редактирование не могло нарушить структуру.

Кто опубликовал объявление и когда — можно узнать?

Да. Каждое административное действие попадает в таблицу аудита, с участником, ролью, типом события и моментом. Журнал содержит и IP-адрес, значит, это персональные данные и у них есть срок: ежедневно удаляется всё, что старше двенадцати месяцев.

Что происходит, если кто-то пытается угадать пароль панели?

На шестом запросе в минуту с одного и того же адреса он получает 429. Это не утверждение: автоматический тест проверяет именно этот код ответа. Кроме того, заголовки безопасности в реальном ответе можно прочитать снаружи — запрет на встраивание в фрейм, `nosniff`, политика referrer, принудительный защищенный транспорт и явная политика содержимого.

Можете связать сайт с правительственной аутентификацией и электронной подписью?

Код написан и протестирован, но отключен с помощью переключателя, а тест по умолчанию как раз проверяет, что отключенное состояние ничего не пропускает. Не хватает не кода: не хватает договора с органом власти и сертификата системы. Рабочий вариант на сегодня — чтобы гражданин подписал на официальном портале и загрузил обратно подписанный документ. Мы предпочитаем говорить это до тендера, а не после.

А платежи в бюджет, через государственную платформу?

У нас нет кода для нее ни в одном репозитории — так же, как для магистрали интероперабельности и для кабинета гражданина. Мы проверили это поиском по целому слову во всех наших проектах. Когда учреждению они нужны, это работа по интеграции с его собственными условиями и собственным календарем согласований, и так мы и пишем это в предложении.

Сайт должен быть размещен на инфраструктуре государства?

Там, где это обязательно по постановлению правительства, да, и это требование процедуры, а не технический выбор. Мы относимся к этому так с самого начала, потому что это меняет способ публикации и список необходимых согласований, а не только адрес сервера.

Как вы показываете, что сайт доступен?

С проверкой, которая запускается в автоматических тестах, по критериям WCAG 2.0 A и AA плюс 2.1 A и AA, с базовой линией по каждой странице: любая новая проблема останавливает поставку. Заявление о доступности пишется после запуска проверки, а не до — иначе это текст, который противоречит странице, на которой он размещён.

Что происходит с фотографиями, присланными гражданами?

В гражданской платформе исходная фотография остаётся частным доказательством; в публичный доступ попадает только отредактированная версия, с сохранённым происхождением и с явным одобрением модератора, причём тот, кто редактирует, не тот, кто утверждает. Если состояние изображения становится небезопасным, дело автоматически убирается из публичного доступа. Это ограничения в базе данных, а не инструкции для оператора.

Что вы хотели бы наладить?

Расскажите о своём процессе. Вместе определим, что стоит построить, что можно подключить и как проверим результат.

Давайте обсудим