Скрипт add_users.py поддерживает автоматическую генерацию временных паролей для новых пользователей, если поле password в CSV файле оставлено пустым.
Каждый сгенерированный пароль гарантированно содержит:
- ✓ Минимум одну заглавную букву (A-Z)
- ✓ Минимум одну строчную букву (a-z)
- ✓ Минимум одну цифру (0-9)
- ✓ Минимум один специальный символ (!@#$%^&*()_+-=[]{}|)
- Минимальная длина: 12 символов (настраивается)
- Криптографическая стойкость: Используется модуль
secretsдля генерации криптографически стойких случайных чисел - Случайность: Символы перемешиваются с использованием
secrets.SystemRandom()
Ab3$xY9mNp2!
# Включить автоматическую генерацию паролей
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.
Файл .env:
AUTO_GENERATE_PASSWORD=true
GENERATED_PASSWORD_LENGTH=12CSV файл (users.csv):
login;password;password_change_required;first_name;last_name;...
ivanov;;true;Иван;Иванов;...
petrov;;true;Петр;Петров;...Результат:
- Для
ivanovбудет сгенерирован пароль, например:Xy7!mK2pLq9@ - Для
petrovбудет сгенерирован пароль, например:Bv4#nR8wZt3$
Файл .env:
AUTO_GENERATE_PASSWORD=true
GENERATED_PASSWORD_LENGTH=16CSV файл (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!
Файл .env:
AUTO_GENERATE_PASSWORD=falseCSV файл (users.csv):
login;password;password_change_required;first_name;last_name;...
ivanov;;true;Иван;Иванов;...Результат:
ERROR: Строка #1. Пароль пуст. Отмена добавления пользователя.
Пользователь не будет создан, если пароль пуст и автогенерация отключена.
INFO: Строка #1. Пароль не указан. Сгенерирован временный пароль длиной 12 символов.
ERROR: Строка #1. Пароль пуст. Отмена добавления пользователя.
Если включена отправка приветственных писем (SEND_WELCOME_EMAIL=true), сгенерированный пароль будет автоматически включен в email-сообщение пользователю.
Пример письма:
Ваши учетные данные:
Логин: ivanov@company.ru
Временный пароль: Xy7!mK2pLq9@
- Используйте автогенерацию для временных учетных записей
- Всегда устанавливайте
password_change_required=trueпри автогенерации - Отправляйте пароли только через защищенные каналы (SMTP SSL)
- Логируйте только факт генерации, но не сам пароль
- Используйте длину 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:
- ✓ Минимальная длина (обычно 8-10 символов)
- ✓ Обязательная сложность (заглавные, строчные, цифры, спецсимволы)
- ✓ Поддерживаемые специальные символы
Да, вы можете изменить набор спецсимволов в функции 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Да, если:
- Пароли отправляются через защищенный канал (SMTP SSL)
- Установлено
password_change_required=true - Используется достаточная длина (12+ символов)
- Пользователь меняет пароль при первом входе
Для более подробной информации об отправке сгенерированных паролей по email см. EMAIL_SENDING_README.md.