|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Vadim Guchenko 2:5020/400 02 Dec 2004 15:21:09 To : All Subject : Миф о ненадежности пускания рута по ssh -------------------------------------------------------------------------------- Hello, All! Речь идет о случае, когда на сервере вообще существует возможность получить рута удаленно. Параноидальные случаи, когда рута можно получить лишь с локальной консоли, не рассматриваются, т.к. они только затрудняют нормальную работу админа, давая при этом сомнительную выгоду. Рассмотрим два случая: 1. Удаленный вход от имени root с использованием пароля разрешен. Требуется подобрать пароль рута. 2. Удаленный вход от имени root с использованием пароля запрещен. Вместо него создан по крайней мере один пользователь в группе wheel, который получает рута локально, используя команду su. Требуется подобрать логин пользователя из группы wheel, пароль этого пользователя и пароль рута для su. Замечание: на сервере может быть сколько угодно пользователей, не входящих в группу wheel и следовательно не способных получить рута по команде su. Hа переборе это никак не скажется. Утверждение: число комбинаций для подбора логина пользователя в группе wheel, пароля этого пользователя для ssh и пароля root для команды su не больше, чем число комбинаций для подбора одного лишь пароля root для ssh длиной, равной сумме длин логина пользователя в группе wheel, пароля этого пользователя для ssh и пароля root для команды su, увеличенной на 2, при следующих условиях: 1. Количество _различных_ символов, из которых могут состоять логин и пароли, не менее 26. 2. Сумма длин логина пользователя в группе wheel, пароля этого пользователя для ssh и пароля root для команды su не больше 38. Доказательство: обозначим длину логина пользователя в группе wheel за L, длину пароля этого пользователя для входа по ssh за P, длину пароля root при использовании команды su за R. Обозначим количество _различных_ символов, из которых могут состоять логин и пароли, за S. Будем предполагать, что логин и пароли не могут быть пустыми (состоят хотя бы из одного символа) и их длины заранее неизвестны. Обозначим сумму их длин за M = L + P + R. Построим перебор всех возможных комбинаций по следующему алгоритму: сначала будем перебирать все комбинации логина и паролей так, чтобы сумма их длин была равна 3. Затем, чтобы сумма их длин была равна 4. И т.д. И на последнем шаге, чтобы сумма их длин была равна M. Тогда число всех комбинаций N равно: N = N(3) + N(4) + ... + N(M) = СУММА N(i), i = 3, 4, ..., M. Hа i-m шаге будем перебирать всевозможные строки символов длиной i. Т.к. в каждой позиции строки символ может принимать одно из S значений, то число всех различных строк длиной i равно S^i. При этом существует множество способов разбить одну строку на три составляющих (логин пользователя, пароль пользователя и пароль рута). Вычислим число разбиений строки длиной i на три составляющих. У нас есть два разделителя и i-1 позиции между символами строки, в которые их можно вставить. Будем считать, что номер позиции, куда вставляется разделитель, равен порядковому номеру цифры, находящейся слева от позиции разделителя. Hа первом шаге мы ставим первый разделитель в позицию 1, а второй разделитель ставим в цикле в позиции с 2 по i-1. Всего комбинаций i-2. Hа втором шаге мы ставим первый разделитель в позицию 2, а второй разделитель ставим в цикле в позиции с 3 по i-1. Всего комбинаций i-3. И т.д. Hа последнем шаге мы ставим первый разделитель в позицию i-2, а второй разделитель в позицию i-1. Всего 1 комбинация. Получилось i-2 шагов. Суммируем и получаем арифметическую прогрессию: (i - 2) + (i - 3) + ... + 1 = ((i - 2) +1) * (i - 2) / 2 = (i - 1)(i - 2) / 2 Таким образом N(i) = (i - 1)(i - 2) / 2 * S^i N = СУММА (i - 1)(i - 2) / 2 * S^i, i = 3, 4, ..., M. N <= СУММА (M - 1)(M - 2) / 2 * S^i, i = 3, 4, ..., M. Определим при каких значениях M справедливо следующее неравенство: СУММА (M - 1)(M - 2) / 2 * S^i < СУММА K * S^i, i = 3, 4, ..., M. Для этого должно выполняться следующее условие: (M - 1)(M - 2) / 2 < K M^2 - 3M + 2 - 2K < 0 Корни уравнения M^2 - 3M + 2 - 2K = 0: M1 = (3 + КОРЕHЬ (1 + 8K)) / 2 M2 = (3 - КОРЕHЬ (1 + 8K)) / 2 (3 - КОРЕHЬ (1 + 8K)) / 2 < M < (3 + КОРЕHЬ (1 + 8K)) / 2 А т.к. M > 0, то окончательно получаем условие: M < (3 + КОРЕHЬ (1 + 8K)) / 2 Возьмем S = 26 и K = S = 26. Тогда M < 8,7 <= 8. Мало для M. Возьмем K = S^2 = 26^2 = 676. Тогда M < 38,2 <= 38. Приемлемо. Очевидно, чем больше значение S, тем большее значение может принимать M. В итоге получаем: N <= СУММА (M - 1)(M - 2) / 2 * S^i < СУММА S^2 * S^i = СУММА S^(i+2), i = 3, 4, ..., M, S >= 26, M <= 38. N < СУММА S^i, i = 5, 6, ..., M+2, S >= 26, M <= 38. N < СУММА S^i, i = 1, 2, ..., M+2, S >= 26, M <= 38. Правая часть неравенства есть ни что иное, как количество комбинаций при подборе одного пароля длиной M+2 символов. Что и требовалось доказать. В процессе перебора на самом нижнем уровне цикла, когда у нас есть некоторая последовательность символов, разделенная на три строки, мы каждую из этих строк последовательно используем как логин пользователя в группе wheel, пароль этого пользователя для ssh и пароль root для команды su соответственно. Если логин и первый пароль не подошел и на сервер зайти не удалось, то второй пароль разумеется не применяем. Если логин и первый пароль подошел и на сервер удалось зайти, то можно использовать оптимизацию алгоритма и продолжать подбирать лишь второй пароль для команды su, причем не только в пределах его длины на текущем шаге i, но и вплоть до максимальной длины. Также можно загрузить программу перебора прямо на сервер и запустить ее с него, что может ускорить перебор. Если перебрали все варианты и рута не получили, значит пользователь не входит в группу wheel. Продолжаем перебор с использованием логина пользователя и его пароля на ssh и ищем входы на сервер под другими именами. В случае же подбора только одного пароля на root по ssh, у нас нет шанса на промежуточный успех. Вход не удастся, пока не будет подобран весь пароль. Следствие из утверждения: если есть желание создать некоторого пользователя, дать ему доступ по ssh и позволить ему брать рута уже с сервера, то можно просуммировать длины логина, пароля пользователя и пароля на рут, прибавить 2 и полученное число использовать в качестве длины нового пароля на рут, которому можно дать доступ по ssh напрямую. С точки зрения подбора входа на сервер результат получится не хуже. Реально же я не верю в подбор пароля вообще ни в каком из описанных случаев, если конечно пароль не из словаря и длиной хотя бы 7 символов. With best regards, Vadim Guchenko. E-mail: s0lver@kraslan.ru --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/9179d3e89e67.html, оценка из 5, голосов 10
|