Skip to content

Latest commit

 

History

History
298 lines (210 loc) · 10.9 KB

File metadata and controls

298 lines (210 loc) · 10.9 KB

Руководство по автоматической генерации паролей

Описание функционала

Скрипт add_users.py поддерживает автоматическую генерацию временных паролей для новых пользователей, если поле password в CSV файле оставлено пустым.

Характеристики генерируемых паролей

Сложность: Средняя

Каждый сгенерированный пароль гарантированно содержит:

  • ✓ Минимум одну заглавную букву (A-Z)
  • ✓ Минимум одну строчную букву (a-z)
  • ✓ Минимум одну цифру (0-9)
  • ✓ Минимум один специальный символ (!@#$%^&*()_+-=[]{}|)

Параметры безопасности

  • Минимальная длина: 12 символов (настраивается)
  • Криптографическая стойкость: Используется модуль secrets для генерации криптографически стойких случайных чисел
  • Случайность: Символы перемешиваются с использованием secrets.SystemRandom()

Пример сгенерированного пароля

Ab3$xY9mNp2!

Настройка

Параметры в файле .env

# Включить автоматическую генерацию паролей
AUTO_GENERATE_PASSWORD=true

# Длина генерируемого пароля (минимум 12 символов)
GENERATED_PASSWORD_LENGTH=12

Возможные значения

Параметр Значение Описание
AUTO_GENERATE_PASSWORD true Включить автогенерацию
AUTO_GENERATE_PASSWORD false Отключить (по умолчанию)
GENERATED_PASSWORD_LENGTH 12 Минимальная длина (рекомендуется)
GENERATED_PASSWORD_LENGTH 16 Повышенная безопасность
GENERATED_PASSWORD_LENGTH 20 Высокая безопасность

Важно: Если указать длину менее 12 символов, она автоматически будет увеличена до 12.

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

Сценарий 1: Все пароли генерируются автоматически

Файл .env:

AUTO_GENERATE_PASSWORD=true
GENERATED_PASSWORD_LENGTH=12

CSV файл (users.csv):

login;password;password_change_required;first_name;last_name;...
ivanov;;true;Иван;Иванов;...
petrov;;true;Петр;Петров;...

Результат:

  • Для ivanov будет сгенерирован пароль, например: Xy7!mK2pLq9@
  • Для petrov будет сгенерирован пароль, например: Bv4#nR8wZt3$

Сценарий 2: Смешанный режим

Файл .env:

AUTO_GENERATE_PASSWORD=true
GENERATED_PASSWORD_LENGTH=16

CSV файл (users.csv):

login;password;password_change_required;first_name;last_name;...
ivanov;MyCustomPass123!;true;Иван;Иванов;...
petrov;;true;Петр;Петров;...
sidorov;AnotherPass456!;false;Сидор;Сидоров;...

Результат:

  • ivanov: использует указанный пароль MyCustomPass123!
  • petrov: получает автоматически сгенерированный пароль из 16 символов
  • sidorov: использует указанный пароль AnotherPass456!

Сценарий 3: Автогенерация отключена (по умолчанию)

Файл .env:

AUTO_GENERATE_PASSWORD=false

CSV файл (users.csv):

login;password;password_change_required;first_name;last_name;...
ivanov;;true;Иван;Иванов;...

Результат:

ERROR: Строка #1. Пароль пуст. Отмена добавления пользователя.

Пользователь не будет создан, если пароль пуст и автогенерация отключена.

Логирование

Успешная генерация

INFO: Строка #1. Пароль не указан. Сгенерирован временный пароль длиной 12 символов.

Отключенная автогенерация с пустым паролем

ERROR: Строка #1. Пароль пуст. Отмена добавления пользователя.

Интеграция с отправкой Email

Если включена отправка приветственных писем (SEND_WELCOME_EMAIL=true), сгенерированный пароль будет автоматически включен в email-сообщение пользователю.

Пример письма:

Ваши учетные данные:
Логин: ivanov@company.ru
Временный пароль: Xy7!mK2pLq9@

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

✓ Рекомендации

  1. Используйте автогенерацию для временных учетных записей
  2. Всегда устанавливайте password_change_required=true при автогенерации
  3. Отправляйте пароли только через защищенные каналы (SMTP SSL)
  4. Логируйте только факт генерации, но не сам пароль
  5. Используйте длину 16+ символов для критичных систем

✗ Что НЕ делать

  • ❌ Не сохраняйте сгенерированные пароли в открытом виде
  • ❌ Не используйте короткие пароли (менее 12 символов)
  • ❌ Не отключайте требование смены пароля при первом входе
  • ❌ Не отправляйте пароли через незащищенные каналы

Технические детали

Алгоритм генерации

def generate_temp_password(length: int = 12) -> str:
    # 1. Гарантируем наличие каждого типа символов (1 из каждой категории)
    password_chars = [
        secrets.choice(uppercase_letters),  # A-Z
        secrets.choice(lowercase_letters),  # a-z
        secrets.choice(digits),             # 0-9
        secrets.choice(special_chars)       # !@#$...
    ]
    
    # 2. Заполняем остаток случайными символами
    all_chars = uppercase + lowercase + digits + special
    password_chars.extend(secrets.choice(all_chars) for _ in range(length - 4))
    
    # 3. Перемешиваем криптографически стойким генератором
    rng = secrets.SystemRandom()
    rng.shuffle(password_chars)
    
    # 4. Преобразуем в строку
    return ''.join(password_chars)

Используемые символы

Категория Символы Количество
Заглавные буквы A-Z 26
Строчные буквы a-z 26
Цифры 0-9 10
Спецсимволы !@#$%^&*()_+-=[]{}
Всего 79

Энтропия

Для пароля длиной 12 символов из алфавита 79 символов:

Энтропия = log2(79^12) ≈ 77.5 бит

Это обеспечивает высокий уровень защиты от атак методом перебора.

Проверка сгенерированных паролей

Все сгенерированные пароли автоматически валидируются с помощью регулярного выражения из параметра PASSWORD_PATTERN:

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

Это гарантирует, что пароль:

  • Содержит минимум 1 заглавную букву
  • Содержит минимум 1 цифру
  • Содержит минимум 1 специальный символ
  • Имеет длину минимум 10 символов

Примеры сгенерированных паролей

При GENERATED_PASSWORD_LENGTH=12:

Ab3$xY9mNp2!
Kj7@pL4wQt8#
Zn2!rM6vBc9*
Fm4#gS8yDh1+

При GENERATED_PASSWORD_LENGTH=16:

Xy7!mK2pLq9@Jn4#
Bc3$vR8wZt6!Hm2+
Pq5*nK9yDf3@Lw7#
Vt2#jM6rGh4!Zx8$

При GENERATED_PASSWORD_LENGTH=20:

Ab3$xY9mNp2!Kj7@pL4w
Zn2!rM6vBc9*Fm4#gS8y
Dh1+Qw5@Rt3#Yx7!Mn2$
Cv6*Bn8+Km4!Pt9#Lz3@

Совместимость с Yandex 360

Сгенерированные пароли полностью совместимы с требованиями Yandex 360:

  • ✓ Минимальная длина (обычно 8-10 символов)
  • ✓ Обязательная сложность (заглавные, строчные, цифры, спецсимволы)
  • ✓ Поддерживаемые специальные символы

FAQ

Можно ли использовать другие специальные символы?

Да, вы можете изменить набор спецсимволов в функции generate_temp_password():

special_chars = '!@#$%^&*()_+-=[]{}|~`,./<>?;:\'"'

Как сделать пароли более сложными?

Увеличьте GENERATED_PASSWORD_LENGTH:

GENERATED_PASSWORD_LENGTH=20

Можно ли отключить определенные символы?

Да, например, чтобы исключить символы, которые легко спутать (0, O, l, 1):

# В функции generate_temp_password()
uppercase_letters = 'ABCDEFGHJKLMNPQRSTUVWXYZ'  # без I, O
lowercase_letters = 'abcdefghijkmnopqrstuvwxyz'  # без l
digits = '23456789'  # без 0, 1

Безопасно ли использовать автогенерацию?

Да, если:

  1. Пароли отправляются через защищенный канал (SMTP SSL)
  2. Установлено password_change_required=true
  3. Используется достаточная длина (12+ символов)
  4. Пользователь меняет пароль при первом входе

Дополнительная информация

Для более подробной информации об отправке сгенерированных паролей по email см. EMAIL_SENDING_README.md.