Дата и время публикации:
Применение и использование
1. Применение
Ранее, в простой схеме процедуры аутентификации и авторизации, во время выполнения финальной её части и выделено на рисунке 1.1, производилась проверка на соответствие SHELL, указанной в учетной записи пользователя, списку разрешенным в системе интерпретаторов команд.
Рисунок 1.1
При этом результат проверки для обычных пользователей и системных будет иметь противоположное значение, потому что последним ограничивают полномочия и запрещают какой-либо вход в систему, а первым наоборот их разрешают в соответствие с тем, что указано в свойствах учетных записей аутентификационных данных пользователя.
Отсюда, вход в систему системным и обычным пользователям неизбежно будет блокирован, если SHELL, указанная в учетной записи, не была найдена в списке разрешенных.
2.Назначение
2.1 Файл /etc/shells
Файл /etc/shells является текстовым файлом, который содержит список разрешенных для использования интерпретаторов команд, которые указываются в каждой отдельной нуль-терминированной строке и только лишь указания их абсолютного пути. Пример файла /etc/shells взят из дистрибутива Debian/buster и приведен в дамп 2.1
Дамп 2.1
# /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash
В качестве примера использования файла /etc/shells можно привести команду chsh(1), которая обращается к файлу /etc/shells, когда пользователь имеет намерение переназначить SHELL в своей учетной записи, как показано в дампе 2.2
Дамп 2.2
user@home:/home/user$ chsh --shell /bin/sh Пароль: user@home:/home/user$ user@home:/home/user$ chsh --shell /bin/false Пароль: chsh: /bin/false не является допустимой оболочкой
В тоже время, суперпользователю разрешается директивное изменение SHELL пользователя без каких-либо ограничений. Поэтому, как показано в дапме 2.3,
Дамп 2.3
root@home:~# chsh --shell /bin/false abuser root@home:~# su abuser root@home:~# su user user@home:/root$
если суперпользователь указал /bin/false в качестве SHELL пользователю abuse, ему неизбежно будет запрещен вход в систему. В тоже время, пользователю user был разрешен вход в систему, потому что назначенный ему интерпретатор команд находится в списке разрешенных. Соответственно, программа замещения SU(1) и ей подобные, реализующие простые схемы аутентификации и авторизации пользователя, неизбежно будет вынуждены обращаться к файлу /etc/shells.
2.2 Функция GETUSERSHELL
При каждом запросе функция возвращает строку, в которым содержится абсолютный путь интерпретатора команд. Если сам файле не существует или является не читаемым, поведение getusershell() определено так, если бы в этой строке были перечислены /bin/sh и /bin/csh. При этом функция возвращает нулевой указатель тогда, когда был достигнут конец файла.
Пример использования функции restricted_shell() из исходного кода SU(1), которая поиск SHELL в файле /etc/shells приведен в листинге 2.4.
Листинг 2.4
... 339 . . . 340 /* Возвращает true, если SHELL является запрещенным (либо был не найден 341 getusershell), или false, подразумевая, что он является стандартной оболочкой. */ 342 343 static bool 344 restricted_shell ( const char *shell ) 345 { 346 char *line; 347 348 setusershell (); 349 while ((line = getusershell ()) != NULL) 350 { 351 if (*line != '#' && STREQ (line, shell)) 352 { 353 endusershell(); 354 return false; 355 } 356 } 357 endusershell (); 358 return true; 359 } 360 . . . . . .
При этом,
- 348 строке вызывается setusershell() для установки на начало файла;
- с 349 по 356 строку в цикле перебераем в /etc/shells строки, пока getusershell() не вернет нулевой указатель, т.е. конец файла. Внутри цикла, в каждой прочитанной строке производится проверка путем сравнения на соответствие символу комментария и абсолютного пути shell, переданного в единственном аргументе функции;
- в 353 и 357 строках вызывается функция endusershell(), которая закрывает файл;
- все три функции getusershell, setusershell, endusershell доступны обычным пользователям.
3. Библиография
3.1 How to Create the /etc/shells file ...
3.2 Chris's Wiki::Blog. What /etc/shells is and isn't
3.4 SU(1): run shell with substitute user/group IDs – Linux man page