Масштаб проблемы: 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 нарушений. Сканируйте, анонимизируйте и архивируйте.