Политика паролей — это набор правил, который определяет, как Stronghold генерирует пароль. Такие политики используются только в части механизмов секретов. Они позволяют настроить требования к генерируемым паролям для конкретного механизма. Поддержка политик зависит от используемого механизма секретов, поэтому перед настройкой проверьте его документацию.
Политики паролей не связаны с политиками доступа. У этих сущностей похожие названия, но разное назначение.
Stronghold использует модель настройки политик паролей, совместимую с Vault 1.5+.
Политики паролей — это расширенная возможность Stronghold. Они используются при генерации учётных данных для внешних систем, например для баз данных или LDAP. Используйте их с осторожностью.
Обзор работы
Политика паролей состоит из двух частей:
- параметра
length, который задаёт длину пароля; - набора правил, которым должен соответствовать пароль.
Stronghold сначала генерирует пароль-кандидат из объединённого набора символов, полученного из всех правил charset.
Повторяющиеся символы из разных наборов удаляются.
После этого Stronghold проверяет пароль-кандидат на соответствие всем правилам.
Правило — это утверждение о том, каким должен быть пароль.
Например, правило charset может требовать, чтобы в пароле была как минимум одна строчная буква.
Если пароль не содержит ни одной строчной буквы, он будет отклонён.
В одной политике можно указать несколько правил. Это позволяет задавать более сложные требования, например наличие как минимум одной строчной буквы, одной прописной буквы и одной цифры.
Генерация пароля-кандидата
Способ генерации пароля-кандидата влияет на безопасность. Пароль должен формироваться так, чтобы результат нельзя было предсказать или использовать особенности генерации для атаки.
Для генерации пароля-кандидата нужны следующие данные:
- Криптографически стойкий генератор случайных чисел.
- Набор символов
charset, из которого выбираются символы. - Длина пароля.
На высоком уровне процесс выглядит так:
- Stronghold получает
Nслучайных значений, гдеNравно длине пароля. - Каждое значение интерпретируется как индекс символа в массиве
charset. - По этим индексам выбираются символы.
- Из выбранных символов собирается пароль-кандидат.
- Полученный пароль проверяется по всем правилам политики.
Например, нужно сгенерировать пароль длиной 8 из набора символов abcdefghij.
Stronghold получил следующие случайные значения:
[3, 2, 0, 8, 7, 3, 5, 1]Эти значения соответствуют индексам символов в charset:
[3, 2, 0, 8, 7, 3, 5, 1] => [d, c, a, i, h, d, f, b]В результате получается пароль-кандидат dcaihdfb.
Предотвращение смещения
При ограничении случайного значения размером массива charset через операцию modulo может возникать смещение.
Оно приводит к тому, что часть символов выбирается чаще остальных.
Например, если генератор возвращает значения в диапазоне 0–255, а длина charset не делит 256 без остатка, первые символы набора могут встречаться чаще.
Рассмотрим упрощённый пример.
Пусть charset равен abcdefghij, то есть содержит 10 символов.
Пусть генератор возвращает значения в диапазоне 0–25.
В этом случае:
- значения
0–9соответствуют всем10символам; - значения
10–19снова соответствуют всем10символам; - значения
20–25соответствуют только первым6символам.
Из-за этого символы abcdef будут выбираться чаще, чем ghij.
Чтобы избежать такого поведения, Stronghold вычисляет максимальное допустимое значение, которое можно безопасно использовать для индексации charset.
Если случайное число превышает это значение, оно отбрасывается, и генерация продолжается.
За счёт этого длина итогового пароля не уменьшается, а распределение символов остаётся корректным.
Особенности производительности
Скорость генерации пароля зависит от конфигурации политики. В общем случае чем строже ограничения, тем больше времени требуется на генерацию.
Общую оценку можно представить так:
(время генерации одного пароля-кандидата) * (число сгенерированных паролей-кандидатов)Количество попыток зависит от того, насколько вероятно, что очередной пароль-кандидат не пройдёт проверку по всем правилам.
Практически это означает следующее:
- чем больше ограничений по
min-chars, тем выше вероятность повторной генерации; - чем меньше размер обязательного поднабора символов, тем ниже вероятность быстро получить подходящий пароль;
- с ростом длины пароля вероятность выполнить часть требований увеличивается, но растёт и стоимость самой генерации.
Особенно заметное снижение производительности возникает, если одно из правил требует хотя бы один символ из очень маленького набора, например !@#$, а общий charset при этом значительно больше.
Чтобы оценить производительность конкретной политики, протестируйте её через API генерации паролей в вашем окружении Stronghold.
Синтаксис политики паролей
Политики паролей задаются в формате HCL или JSON. Они описывают длину пароля и набор правил, которым должен соответствовать пароль.
Минимальная политика выглядит так:
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
}Эта политика генерирует пароли длиной 20 символов только из строчных латинских букв.
В одной политике можно указывать несколько правил одного и того же типа.
Например, следующая политика генерирует пароль длиной 20 символов, который содержит как минимум одну строчную букву, одну прописную букву, одну цифру и один специальный символ из набора !@#$%^&*:
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}
rule "charset" {
charset = "!@#$%^&*"
min-chars = 1
}Для корректной политики нужно указать хотя бы одно правило charset.
Политика без charset недопустима, потому что Stronghold не сможет определить набор символов для генерации.
Следующая политика будет отклонена:
length = 20Параметры и доступные правила
Параметр length
Параметр length задаёт длину генерируемого пароля.
Основные особенности:
- тип —
int; - параметр обязателен;
- значение должно быть не меньше
4.
length не является правилом.
Это отдельная часть конфигурации, которая определяет длину пароля до проверки по правилам.
Правило charset
Правило charset задаёт набор символов и, при необходимости, минимальное количество символов из этого набора, которое должно присутствовать в пароле.
Это правило одновременно:
- участвует в формировании общего набора символов для генерации;
- задаёт ограничение на состав итогового пароля.
Если в политике указано несколько правил charset, Stronghold объединяет все наборы символов и удаляет дубликаты до начала генерации.
При этом каждое правило charset всё равно проверяется отдельно.
После объединения и удаления дубликатов итоговый charset, из которого генерируются пароли-кандидаты, не должен содержать более 256 символов.
Параметры правила charset
В правиле charset доступны следующие параметры:
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
charset | string | — | Строковое представление набора символов. Поддерживаются строки в кодировке UTF-8. Все символы должны быть печатными |
min-chars | int | 0 | Минимальное число символов из charset, которое должно присутствовать в пароле |
Если min-chars не указан или равен 0, набор символов будет использоваться при генерации, но не будет накладывать обязательного требования на итоговый пароль.
Пример правила charset
length = 20
rule "charset" {
charset = "abcde"
min-chars = 1
}
rule "charset" {
charset = "01234"
min-chars = 1
}Эта политика генерирует пароль из объединённого набора abcde01234.
При этом пароль должен содержать как минимум один символ из abcde и как минимум один символ из 01234.
Если наборы символов в разных правилах пересекаются, Stronghold удаляет дубликаты перед генерацией.
Например, если указаны наборы abcde и cdefg, для генерации будет использоваться abcdefg.
При этом пароль всё равно должен удовлетворять обоим правилам.
Ещё один пример:
length = 8
rule "charset" {
charset = "abcde"
}
rule "charset" {
charset = "01234"
min-chars = 1
}Эта политика генерирует пароль длиной 8 из набора abcde01234.
При этом пароль должен содержать хотя бы один символ из 01234, но не обязан содержать символы из abcde.
Поэтому значение 04031945 для такой политики допустимо.
Примеры политик
Только наборы символов без обязательного минимума
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
}
rule "charset" {
charset = "0123456789"
}
rule "charset" {
charset = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
}Одна прописная буква, одна строчная буква и одна цифра
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}
rule "charset" {
charset = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
}Одна прописная буква, одна строчная буква, одна цифра и один символ из полного ASCII-набора специальных символов
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}
rule "charset" {
charset = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
min-chars = 1
}Одна прописная буква, одна строчная буква, одна цифра и один символ из !@#$
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}
rule "charset" {
charset = "!@#$"
min-chars = 1
}
rule "charset" {
charset = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
}Политика паролей по умолчанию
Stronghold использует политику паролей по умолчанию для паролей, которые генерируются без явного указания политики.
Такая политика требует:
20символов в пароле;- одну прописную букву;
- одну строчную букву;
- одну цифру;
- один символ тире (
-).
Пример политики по умолчанию:
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}
rule "charset" {
charset = "-"
min-chars = 1
}