Skip to content

Latest commit

 

History

History
257 lines (197 loc) · 10.1 KB

File metadata and controls

257 lines (197 loc) · 10.1 KB

Маскировка паролей в логах

Описание

Реализована система маскировки чувствительных данных в логах для предотвращения утечки паролей и токенов в файлы логов.

Функции маскировки

mask_sensitive_data

def mask_sensitive_data(data: dict) -> dict:

mask_csv_line

def mask_csv_line(line: str, headers: list) -> str:

mask_csv_line_safe

def mask_csv_line_safe(line: str) -> str:

Параметры mask_sensitive_data:

  • data (dict): Исходный словарь с данными

Параметры mask_csv_line:

  • line (str): CSV строка для маскировки
  • headers (list): Список заголовков CSV файла

Параметры mask_csv_line_safe:

  • line (str): CSV строка для маскировки

Возвращает:

  • dict: Копия словаря с замаскированными чувствительными полями (mask_sensitive_data)
  • str: CSV строка с замаскированными чувствительными полями (mask_csv_line, mask_csv_line_safe)

⚠️ Проблема безопасности CSV маскировки

Проблема:

Функция mask_csv_line() полагается на соответствие количества полей в строке количеству заголовков. Если это условие не выполняется, чувствительные данные могут попасть в логи.

Решение:

  1. mask_csv_line() - при несоответствии полей маскирует ВСЕ поля для безопасности
  2. mask_csv_line_safe() - использует регулярные выражения для поиска потенциальных паролей и токенов независимо от структуры CSV

⚠️ Дополнительная проблема и исправление:

Проблема: Первоначальная версия mask_csv_line_safe() могла захватывать части соседних полей при использовании регулярных выражений.

Исправление: Функция теперь:

  • Разделяет CSV строку на отдельные поля по разделителю ;
  • Анализирует каждое поле индивидуально
  • Применяет регулярные выражения только к целым полям
  • Исключает возможность захвата соседних полей

Замаскированные поля

mask_csv_line и mask_sensitive_data:

  • password - пароли пользователей
  • oauth_token - OAuth токены
  • access_token - токены доступа
  • token - общие токены

mask_csv_line_safe:

  • Пароли: минимум 8 символов + заглавная буква + цифра + спецсимвол
  • Исключает email адреса из маскировки
  • Исправлено: Анализирует каждое поле отдельно, не захватывает соседние поля

Принцип работы

  1. Глубокая копия: Создается полная копия исходных данных
  2. Рекурсивный поиск: Функция проходит по всем уровням вложенности
  3. Маскировка: Чувствительные поля заменяются на ***MASKED***
  4. Безопасность: Исходные данные остаются неизменными

Интеграция в код

1. Логирование данных пользователя:

# БЫЛО (небезопасно):
logger.debug(f"POST DATA: {user}")

# СТАЛО (безопасно):
logger.debug(f"POST DATA: {mask_sensitive_data(user)}")

2. Логирование данных из CSV:

# БЫЛО (небезопасно):
logger.debug(f'Обработка строки #{line_number} {element}')

# СТАЛО (безопасно):
logger.debug(f'Обработка строки #{line_number} {mask_sensitive_data(element)}')

3. Логирование PATCH данных:

# БЫЛО (небезопасно):
logger.debug(f"PATCH DATA: {patch_data}")

# СТАЛО (безопасно):
logger.debug(f"PATCH DATA: {mask_sensitive_data(patch_data)}")

4. Логирование CSV строк:

# БЫЛО (небезопасно):
logger.debug(f'Чтение строки из файла - {line}')
logger.error(f'Ошибка! Строка {line} - количество полей не соответствует')

# СТАЛО (безопасно - используем mask_csv_line_safe):
logger.debug(f'Чтение строки из файла - {mask_csv_line_safe(line)}')
logger.error(f'Ошибка! Строка {mask_csv_line_safe(line)} - количество полей не соответствует')

# Альтернативно (с заголовками, но менее безопасно):
logger.debug(f'Чтение строки из файла - {mask_csv_line(line, headers)}')
logger.error(f'Ошибка! Строка {mask_csv_line(line, headers)} - количество полей не соответствует')

Примеры маскировки

1. Маскировка словарей (mask_sensitive_data):

Исходные данные:

user_data = {
    "name": "John Doe",
    "password": "SecretPassword123!",
    "email": "john@example.com",
    "oauth_token": "ya29.a0AfH6SMC...",
    "contacts": [
        {
            "type": "phone",
            "value": "+1234567890"
        }
    ]
}

Замаскированные данные:

masked_data = {
    "name": "John Doe",
    "password": "***MASKED***",
    "email": "john@example.com",
    "oauth_token": "***MASKED***",
    "contacts": [
        {
            "type": "phone",
            "value": "+1234567890"
        }
    ]
}

2. Маскировка CSV строк (mask_csv_line):

Исходная CSV строка:

user1;SecretPass123!;John;Doe;john@example.com;abc123

Замаскированная CSV строка:

user1;***MASKED***;John;Doe;john@example.com;***MASKED***

3. Исправленная маскировка CSV (mask_csv_line_safe):

Проблемная строка (до исправления):

user1;SecretPass123!;John;Doe;john@example.com

Результат (после исправления):

user1;***MASKED***;John;Doe;john@example.com

Ключевое отличие: Функция теперь анализирует каждое поле отдельно, не захватывая соседние поля.

4. Улучшенное определение паролей:

Новое регулярное выражение:

^(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};:"\\|,.<>\/?])[A-Za-z0-9!@#$%^&*()_+\-=\[\]{};:"\\|,.<>\/?]{8,}$

Требования к паролю:

  • Минимум 8 символов
  • Минимум одна заглавная буква
  • Минимум одна цифра
  • Минимум один спецсимвол

Примеры маскировки:

Password123!     → ***MASKED***     (валидный пароль)
password123      → password123      (нет заглавной буквы)
PASSWORD123      → PASSWORD123      (нет спецсимвола)
PasswordABC      → PasswordABC      (нет цифр)
Pass123!         → ***MASKED***     (короткий но валидный)

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

✅ Что защищено:

  • Пароли пользователей
  • OAuth токены
  • Токены доступа
  • Любые поля с названием "token"

✅ Что НЕ замаскировано:

  • Имена пользователей
  • Email адреса
  • Номера телефонов
  • Другие нечувствительные данные

Тестирование

Для тестирования функции создан файл test_password_masking.py:

python test_password_masking.py

Тест проверяет:

  • Маскировку различных типов чувствительных данных
  • Рекурсивную обработку вложенных структур
  • Корректность работы с массивами
  • Сохранение нечувствительных данных

Файлы

  • add_modify_users.py - функция mask_sensitive_data() и интеграция
  • test_password_masking.py - тесты для проверки функции
  • PASSWORD_MASKING_README.md - данная документация

Использование

Функция автоматически применяется во всех местах логирования данных пользователей:

  1. При создании пользователей - маскирует пароли в POST запросах
  2. При обработке CSV - маскирует пароли в данных из файла
  3. При обновлении пользователей - маскирует пароли в PATCH запросах

Логи безопасности

Теперь в логах вместо реальных паролей будет отображаться:

POST DATA: {'name': {'first': 'John', 'last': 'Doe'}, 'password': '***MASKED***', 'nickname': 'johndoe'}

Это обеспечивает:

  • Безопасность логов
  • Соответствие требованиям GDPR
  • Защиту от утечек данных
  • Возможность отладки без раскрытия чувствительной информации