× К оглавлению На главную Об авторе

Дата и время публикации:

Применение и использование


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  . . .
. . .

При этом,

3. Библиография


3.1 How to Create the /etc/shells file ...

3.2 Chris's Wiki::Blog. What /etc/shells is and isn't

3.3 coreutils/src/su.c

3.4 SU(1): run shell with substitute user/group IDs – Linux man page

3.5 getusershell(3): permitted user shells – Linux man page