pdn-filter: установка и использование

Версия 1.0.0. Правообладатель — ООО «Айти Дев Линк». Библиотека маскирует значения персональных данных в журналах. Она не является средством защиты информации.

1. Что нужно

  • Node.js 18 или новее (Windows, Linux, macOS). На российских ОС Node.js ставится из репозитория системы, например sudo apt install nodejs npm (Astra Linux, ALT) или sudo dnf install nodejs (РЕД ОС).
  • Доступ к интернету не требуется. Docker, виртуальные машины, база данных и сервер не нужны. Зависимостей у пакета нет.

2. Установка

Скачайте архив pdn-filter-1.0.0.tgz и выполните в каталоге проекта одну команду:

npm install --offline ./pdn-filter-1.0.0.tgz

Команда ставит библиотеку из локального файла и не обращается к сети.

3. Проверка установки

npx pdn-filter --самопроверка

Ожидаемый результат: строки OK и итог «Самопроверка пройдена: 13 из 13.»

4. Быстрый старт

const { mask, createFilter } = require('pdn-filter');

mask('Пациент Иванов Иван Иванович, СНИЛС 112-233-445 95, тел. +7 (916) 123-45-67');
// 'Пациент [ФИО], СНИЛС [СНИЛС], тел. [ТЕЛЕФОН]'

const filter = createFilter({ mode: 'partial' });
filter.mask('СНИЛС 112-233-445 95'); // 'СНИЛС ***-***-*** 95'

Объекты: исходный объект не изменяется, значения полей snils, inn, phone, fio и похожих маскируются по имени поля.

filter.maskDeep({ user: { snils: '11223344595' }, note: 'ИНН 7707083893' });
// { user: { snils: '*********95' }, note: 'ИНН ********93' }

5. Что находится

ВидМеткаКак определяется
СНИЛС[СНИЛС]11 цифр с верным контрольным числом; с ключевым словом «СНИЛС» — любой
ИНН[ИНН]10 или 12 цифр с верной суммой; с ключевым словом «ИНН» — любой
ОГРН, ОГРНИП[ОГРН]13 или 15 цифр с верной суммой
Полис ОМС (ЕНП)[ПОЛИС_ОМС]16 цифр с верной контрольной цифрой; с ключевым словом «полис», «ОМС», «ЕНП» — любой
Паспорт РФ[ПАСПОРТ]«4504 123456», «45 04 123456»; слитно (10 цифр) только рядом со словом «паспорт» или «серия»
Телефон[ТЕЛЕФОН]+7 / 8 / 7 и 10 цифр; без префикса только рядом со словом «тел.»
ФИО[ФИО]«Фамилия Имя Отчество», «Имя Отчество», «Иванов И.И.», а также после «ФИО:», «пациент»
Электронная почта[EMAIL]обычный адрес

Числа проверяются по контрольным суммам, поэтому обычные числа в логах (время, суммы, номера заказов) не искажаются.

6. Настройки

createFilter({
  types: ['snils', 'inn', 'phone'],   // что искать (по умолчанию всё)
  mode: 'label',                       // label | partial | hash
  hashKey: 'секрет',                   // обязателен для hash: [СНИЛС:3fa9c1d2]
  keepDigits: 2,                       // сколько последних цифр оставлять в partial
  strictContext: false,                // true — числа ищутся только рядом с ключевыми словами
  extraNames: ['Мельник'],             // фамилии и имена, которые нужно маскировать всегда
  replacer: (type, value) => '***',    // полностью своя замена
  maskKeys: true,                      // маскировать по имени поля в объектах
  keyRules: { cardholder: 'fio' },     // свои имена полей
});

filter.scan(text) возвращает места находок (type, start, end) без самих значений.

7. Подключение к логгерам

const { createFilter, wrapLogger, patchConsole, pinoOptions, winstonFormat, createMaskingStream } = require('pdn-filter');
const filter = createFilter();

const log = wrapLogger(console, filter);          // любой логгер с info/warn/error...
const restore = patchConsole(filter);              // подменить console, restore() вернёт как было
const logger = pino(pinoOptions(filter));          // pino
winston.format.combine(winstonFormat(filter), winston.format.json());   // winston
process.stdin.pipe(createMaskingStream(filter)).pipe(process.stdout);   // поток строк

Сами pino и winston пакет не устанавливает: адаптеры возвращают обычные объекты настроек.

8. Командная строка

cat app.log | npx pdn-filter --mode partial > app.masked.log

Параметры: --mode label|partial|hash, --key, --types snils,inn,..., --strict, --самопроверка, --help.

9. Валидаторы

const { isSnils, isInn, isOgrn, isOgrnip, isEnp, isPassportRf, isPhoneRu, isIcd10 } = require('pdn-filter/validators');
isSnils('112-233-445 95'); // true
isIcd10('J18.9');          // true (проверяется только формат кода)

10. Ограничения

  • Поиск ФИО эвристический (по отчеству и инициалам), справочников имён нет. Фамилию и имя без отчества пакет находит только после слов «ФИО», «пациент» или из списка extraNames. Заглавные буквы целиком («ИВАНОВ ИВАН») не распознаются.
  • Десятизначное число без ключевого слова, прошедшее проверку ИНН, маскируется; исключение — значения в диапазоне Unix-времени 2017–2033 годов. Для строгого режима используйте strictContext.
  • Для ЕНП применяется проверка по алгоритму Луна, номера старых образцов полисов не охватываются.
  • Пакет обрабатывает уже сформированный текст и объекты. Данные, не попавшие в строки (например, бинарные поля), он не видит.
  • Всегда проверяйте результат на своих реальных логах до промышленного использования.

11. Типичные проблемы

СимптомПричинаЧто сделать
node: команда не найденане установлен Node.jsустановить пакет из репозитория ОС
npm ERR! code ENOENTневерный путь к архивузапустить команду в каталоге с архивом
версия Node.js старее 18устаревшая ОСобновить пакет Node.js из репозитория ОС

12. Удаление

npm uninstall pdn-filter

Библиотека ставится в каталог node_modules/pdn-filter проекта. Сетевых портов и фоновых служб нет.

Вопросы по установке и использованию принимаются через форму обратной связи.