anonym.legal
Назад к блогуGDPR и соблюдение

Excel и GDPR: почему электронные таблицы...

Excel листы содержат больше всего PII, но редко защищены. Узнайте как сканировать, анонимизировать и безопасно управлять электронными таблицами для...

April 21, 20268 мин чтения
Excel GDPRspreadsheet anonymizationXLSX complianceHR datadata minimization

Масштаб проблемы: Excel как бомба PII

Статистика

  • 89% корпоративных организаций используют Excel для отчетов
  • 67% Excel листов содержат неправильно классифицированную PII
  • 3x больше данных утекает из Excel чем из любого другого источника
  • 1 из 3 нарушений данных связано с неправильно управляемым Excel листом

Почему Excel опасен?

1. Отсутствие версионирования

Payroll_March.xlsx (v1)
Payroll_March_FINAL.xlsx (v2)
Payroll_March_FINAL_v2.xlsx (v3)
Payroll_March_FINAL_FINAL.xlsx (v4) <- Этот содержит PII, отправлен ко всем
Payroll_March_REALLY_FINAL.xlsx (v5)

Проблема: Никто не знает какая версия правильная. Старые версии содержат PII.

2. Отсутствие аудита доступа

Кто открывал файл?
Кто скопировал данные?
Когда были последние изменения?
Историю невозможно отследить.

3. Скрытые данные

Таблица: Лист1
- Колонки A-C: видимые (разрешенные данные)
- Колонки D-F: СКРЫТЫЕ (содержат SSN, оклад)
- Строки 1-100: видимые
- Строки 101-500: СКРЫТЫЕ (архивные PII)

4. Метаданные утечек

Файл: Employee_List.xlsx
Автор: john.doe@company.com
Компания: Acme Corporation
Тайна: €75,000
Комментарии: "Salary for John"

Метаданные экстрагируются легко:

python
from openpyxl import load_workbook
wb = load_workbook('Employee_List.xlsx')
print(wb.properties.author)
print(wb.properties.subject)

Практическое обнаружение PII в Excel

Система 1: Автоматическое сканирование

import openpyxl
from presidio_analyzer import AnalyzerEngine

class ExcelPIIScanner:
    def __init__(self):
        self.analyzer = AnalyzerEngine()
    
    def scan_worksheet(self, ws):
        """
        Сканирует все видимые и скрытые ячейки
        """
        violations = []
        
        # Сканируем видимые ячейки
        for row_idx, row in enumerate(ws.iter_rows(values_only=False), 1):
            for col_idx, cell in enumerate(row, 1):
                if cell.value and isinstance(cell.value, str):
                    # Анализируем содержимое ячейки
                    pii_results = self.analyzer.analyze(
                        text=cell.value,
                        language='en'
                    )
                    
                    if pii_results:
                        violations.append({
                            'sheet': ws.title,
                            'cell': cell.coordinate,
                            'row': row_idx,
                            'column': col_idx,
                            'value': cell.value,
                            'pii_entities': [
                                {'type': r.entity_type, 'score': r.score}
                                for r in pii_results
                            ]
                        })
        
        # Сканируем скрытые колонки
        for hidden_col in ws.hidden_columns:
            # Раскрываем скрытую колонку
            ws.column_dimensions[hidden_col].hidden = False
            
            # Сканируем как выше
            # ...
        
        # Сканируем скрытые строки
        for hidden_row in ws.hidden_rows:
            # Аналогично
            # ...
        
        return violations
    
    def scan_file(self, excel_path):
        wb = openpyxl.load_workbook(excel_path)
        all_violations = []
        
        for ws in wb.worksheets:
            violations = self.scan_worksheet(ws)
            all_violations.extend(violations)
        
        return all_violations

# Использование
scanner = ExcelPIIScanner()
violations = scanner.scan_file('payroll.xlsx')

print(f"Найдено PII в {len(violations)} ячейках:")
for v in violations:
    print(f"  {v['sheet']} {v['cell']}: {v['pii_entities']}")

Система 2: Анонимизация

from presidio_anonymizer import AnonymizerEngine

class ExcelPIIAnonymizer:
    def __init__(self):
        self.anonymizer = AnonymizerEngine()
    
    def anonymize_worksheet(self, ws, violations):
        """
        Анонимизирует идентифицированные ячейки
        """
        for violation in violations:
            cell = ws[violation['cell']]
            
            # Анонимизируем содержимое
            original_value = cell.value
            anonymized_value = self.anonymizer.anonymize(
                text=original_value,
                analyzer_results=[],  # TODO: использовать реальные результаты
                operators={entity['type']: {'type': 'replace'} 
                          for entity in violation['pii_entities']}
            )
            
            # Обновляем ячейку
            cell.value = anonymized_value.text
    
    def anonymize_file(self, excel_path, violations):
        wb = openpyxl.load_workbook(excel_path)
        
        # Группируем нарушения по листам
        violations_by_sheet = {}
        for v in violations:
            sheet_name = v['sheet']
            if sheet_name not in violations_by_sheet:
                violations_by_sheet[sheet_name] = []
            violations_by_sheet[sheet_name].append(v)
        
        # Анонимизируем каждый лист
        for sheet_name, violations in violations_by_sheet.items():
            ws = wb[sheet_name]
            self.anonymize_worksheet(ws, violations)
        
        # Сохраняем
        wb.save(excel_path.replace('.xlsx', '_anonymized.xlsx'))

# Использование
anonymizer = ExcelPIIAnonymizer()
anonymizer.anonymize_file('payroll.xlsx', violations)

GDPR требования для Excel

1. Инвентаризация (Data Mapping)

✅ Какие Excel файлы содержат PII? ✅ Где они хранятся (shared drive, cloud)? ✅ Кто имеет доступ? ✅ Как часто обновляются?

2. Минимизация (Data Minimization)

✅ Удалить ненужные колонки ✅ Скрыть/удалить архивные строки ✅ Не собирать лишние данные

3. Защита (Security)

✅ Шифровать файлы (AES-256) ✅ Контроль доступа (разрешения только для необходимых) ✅ Аудит (кто, когда, что изменил) ✅ Версионирование (не 10 копий с разными версиями)

4. Удаление (Deletion)

✅ График хранения (храни X месяцев, затем удали) ✅ Автоматическое удаление (не ручное) ✅ Верификация удаления (log)

Лучшие практики

Плохо

❌ Хранить PII в Excel ❌ Отправлять Excel по email ❌ Копировать данные между файлами ❌ Отслеживать версии как v1, v2, v3, FINAL, FINAL_v2

Хорошо

✅ Хранить в защищенной базе данных ✅ Использовать API если нужен доступ ✅ Анонимизировать для аналитики ✅ Версионирование через Git/SVN

Вывод

Excel файлы — самый большой источник GDPR нарушений. Сканируйте, анонимизируйте и архивируйте.

Готовы защитить ваши данные?

Начните анонимизацию PII с 285+ типов сущностей на 48 языках.