Сценарий проверки за 5–10 минут
Сценарий для эксперта: убедиться, что программа устанавливается без интернета, работает на русском языке, обезличивает данные и сохраняет связи между таблицами. Используется только синтетический демо-набор, который входит в пакет.
Команды рассчитаны на Astra Linux и РЕД ОС после установки пакета (см. руководство администратора, раздел 3). Демо-набор лежит в /usr/share/morok/demo. Отдельные значения в выводе (идентификаторы, имена, время) у вас будут другими: они зависят от ключа, который вы создадите на шаге 5. Строки, по которым нужно сверяться, перечислены в «Ожидается».
Все шаги автоматизированы скриптом scripts/demo-check.sh (в репозитории), который прогоняется в контейнерах Astra и РЕД ОС без сети (make demo-check). Время выполнения скрипта — около секунды; остальное время сценария занимает чтение вывода.
Шаг 1. Копирование демо-набора в рабочий каталог (1 мин)
cp -r /usr/share/morok/demo ~/morok-demo
cd ~/morok-demo
ls
Ожидается:
README.md data morok-events.yaml morok.yaml
Шаг 2. Версия
morok version
Ожидается четыре строки: версия, коммит, дата сборки, версия Go:
morok <версия>
коммит: <хеш>
дата сборки: <дата>
Go: <версия Go>
Шаг 3. Справка на русском языке
morok --help
Ожидается:
morok — подготовка обезличенных копий данных для разработки и тестирования.
Использование:
morok <команда> [флаги]
Команды:
run выполнить обезличивание по конфигурации
validate проверить конфигурацию
scan проанализировать выборку источника и выдать черновик конфигурации
version показать версию
help показать справку по команде
Подробнее: morok help <команда>
Шаг 4. Поиск персональных данных: scan (1 мин)
Посмотрите на исходные данные (все они вымышлены):
head -3 data/clients.csv
id,fio,phone,email,snils,inn,birth_date,address
100001,Мельникова Виктория Салаватовна,+7 900 000-20-63,v.melnikova28@example.org,248-537-066 96,505998130023,04.07.1993,"280128, г. Красногорск, ул. Краснознамённая, д. 93, кв. 258"
100002,Верных Рустам Рамилевич,+7 900 000-56-21,r.vernyh29@example.ru,039-760-915 92,544658600797,04.05.1951,"444833, г. Елизово, пр-т Нахимова, д. 150, кв. 56"
Запустите анализ:
morok scan --source-type csv --source ./data --tables clients,orders -o draft.yaml
Ожидается:
таблица clients: столбцов 8, найдено ПДн: 7
таблица orders: столбцов 5, найдено ПДн: 0
черновик записан: draft.yaml
В draft.yaml для каждого найденного поля предложено правило с комментарием (что найдено, доля, число проверенных значений). Связи clients.id и orders.client_id предложены закомментированным правилом hmac с unique: true. В готовой демо-конфигурации morok.yaml эти правила уже включены.
Шаг 5. Ключ (1 мин)
openssl rand -hex 32 > key.hex
chmod 600 key.hex
Без openssl: head -c 32 /dev/urandom | xxd -p -c 64 > key.hex. Файл содержит 64 hex-символа; права 0600 обязательны.
Шаг 6. Проверка конфигурации
morok validate
Ожидается:
конфигурация корректна: 2 таблицы, 10 полей
хеш конфигурации: sha256:40ea18039b9ad8309c8826a5efd3fae603196e9f12998b6375755bd967b70d6d
Хеш совпадает с приведённым, если файл morok.yaml не менялся.
Шаг 7. Пробный прогон (1 мин)
morok run --dry-run
Ожидается (время может отличаться):
пробный прогон: данные не записываются
таблица clients: прочитано строк: 200
таблица orders: прочитано строк: 600
clients: обработано 200 строк, изменено полей: 8
orders: обработано 600 строк, изменено полей: 2
отчёт: report/report.dry-run.md, report/report.dry-run.json
готово за 0,0 с
Каталога out после пробного прогона нет.
Шаг 8. Рабочий прогон
morok run
Ожидается:
таблица clients: прочитано строк: 200
таблица orders: прочитано строк: 600
clients: обработано 200 строк, изменено полей: 8
orders: обработано 600 строк, изменено полей: 2
отчёт: report/report.md, report/report.json
готово за 0,0 с
Результат — out/clients.csv и out/orders.csv. Исходные файлы в data/ не изменились.
Шаг 9. Сравнение исходника и результата (1 мин)
head -3 data/clients.csv
head -3 out/clients.csv
Ожидается: в результате другие id, ФИО, телефон, email, СНИЛС, ИНН и адрес; дата рождения огрублена до года; формат значений сохранён, например (у вас значения другие):
id,fio,phone,email,snils,inn,birth_date,address
990094,Тухачевский Феликс Вадимович,+7 (975) 447-41-52,fsu.eskdje@example.ru,326-321-174 37,336982064035,1993,"185387, г. Новочеркасск, ул. Торговая, д. 71, кв. 296"
127643,Кузьменко Анна Даниловна,+7 (946) 981-63-69,awj.is@example.com,568-519-680 52,715213709847,1951,"587476, г. Черкесск, б-р Арбат, д. 126, кв. 293"
Комментарии в заказах удалены:
head -3 out/orders.csv
id,client_id,amount,order_date,comment
5000001,579762,30734.72,2025-08-01,
5000002,419564,33260.59,2025-02-22,
Шаг 10. Проверка связей между таблицами (1 мин)
Каждый client_id в обезличенных заказах должен встречаться среди id обезличенных клиентов:
comm -23 <(awk -F, 'NR>1{print $2}' out/orders.csv | sort -u) \
<(awk -F, 'NR>1{print $1}' out/clients.csv | sort -u) | wc -l
Ожидается: 0. Оба поля обезличены правилом hmac с общим доменом client_id и unique: true, поэтому одинаковые исходные идентификаторы превращаются в одинаковые, а разные — в разные.
Шаг 11. Отчёт (1 мин)
head -12 report/report.md
grep -F 'не сверено' report/report.md
Ожидается: таблица с версией программы, хешем конфигурации, идентификатором ключа, режимом «рабочий прогон»; разделы по таблицам с методами и числом изменённых значений; строка:
Соответствие способам по приказу Роскомнадзора от 19.06.2025 № 140: не сверено (требуется юридическая проверка).
Статус «не сверено» означает, что соответствие способов приказу программа не утверждает; подробности — в руководстве пользователя, раздел 9.3. Значений данных и ключа в отчёте нет:
grep -c 'Мельникова' report/report.md report/report.json
Ожидается: report/report.md:0 и report/report.json:0.
Шаг 12. Повторяемость
Повторный прогон с тем же ключом даёт тот же результат:
cksum out/clients.csv
morok run --force --quiet
cksum out/clients.csv
Ожидается: суммы совпадают.
Шаг 13. Вложенные данные (JSONL)
morok run -c morok-events.yaml
head -1 out-events/events.jsonl
Ожидается в выводе events: обработано 200 строк, изменено полей: 4; в out-events/events.jsonl заменены client.id, client.name и контакты в массиве client.contacts[], остальные поля (event_id, ts, success, note) не изменены.
Шаг 14. Режим CI: поле без правила (1 мин)
Уберите правило для phone из конфигурации и запустите проверку покрытия:
grep -v 'name: phone' morok.yaml > morok-incomplete.yaml
morok run -c morok-incomplete.yaml --strict --quiet
echo "код возврата: $?"
Ожидается:
найдены ПДн без правил обезличивания:
clients.phone: номер телефона, доля 1.00
ошибка: обработка остановлена: поля с ПДн не покрыты правилами (1)
код возврата: 5
Обработка остановлена до записи: ни результата, ни отчёта этот запуск не создал.
Шаг 15. Ключ с широкими правами отвергается
chmod 644 key.hex
morok run --dry-run; echo "код возврата: $?"
chmod 600 key.hex
Ожидается:
ошибка: файл ключа «./key.hex» доступен другим пользователям; выполните chmod 600 ./key.hex
код возврата: 4
Шаг 16. Отсутствие сети
Программа не обращается к сети при работе с файлами. Для проверки выполните прогон без сетевых интерфейсов (если unshare доступен и разрешён пользователю):
sudo unshare -n morok run --dry-run
Ожидается тот же вывод, что на шаге 7. Допустимо также отключить сетевой интерфейс на время проверки. В контейнерах проверки пакета (make demo-check) сеть отключена (--network none).
Итог
Если все «Ожидается» совпали:
- пакет установлен и работает без интернета;
- интерфейс и отчёт на русском языке;
- исходные значения заменены, формат и связи между таблицами сохранены;
- поля с персональными данными без правил выявляются в режиме CI (код 5);
- реальные персональные данные в проверке не использовались.