
Допустим, есть набор команд оболочки {ls, cat, kill}
Я хочу разрешить пользователям в группе A выполнять команды {ls, cat}, а пользователям в группе B — выполнять команды {cat, kill}.
Как это сделать, какие подходы лучше всего использовать?
Я думал о некоторых решениях, но они не кажутся мне на 100% безопасными.
решение1
Одним из способов ограничения возможности выполнения команд являетсяограниченная оболочка.
Выдержка из руководства, где сказано, что следующее запрещено или не выполняется:
Changing directories with the cd builtin.
Setting or unsetting the values of the SHELL, PATH, ENV, or BASH_ENV variables.
Specifying command names containing slashes.
Specifying a filename containing a slash as an argument to the . builtin command.
Specifying a filename containing a slash as an argument to the -p option to the hash builtin command.
Importing function definitions from the shell environment at startup.
Parsing the value of SHELLOPTS from the shell environment at startup.
Redirecting output using the ‘>’, ‘>|’, ‘<>’, ‘>&’, ‘&>’, and ‘>>’ redirection operators.
Using the exec builtin to replace the shell with another command.
Adding or deleting builtin commands with the -f and -d options to the enable builtin.
Using the enable builtin command to enable disabled shell builtins.
Specifying the -p option to the command builtin.
Turning off restricted mode with ‘set +r’ or ‘set +o restricted’.
После этого вы можете добавить ссылку на команду, которую вы хотите, чтобы они могли выполнить.
Может быть, другой путь к вашей цели должен пролегать черезиспользованиеsudo
.
В вашем случае вы можете отредактировать sudoers
файл (с помощью visudo
) и получить что-то похожее на:
User_Alias USERS_GROUP_A = joe, mike, cedric
User_Alias USERS_GROUP_B = jude, zoe, cedric
Cmnd_Alias COMMANDS_GROUP_A = /bin/ls, /bin/cat, /usr/bin/zip
Cmnd_Alias COMMANDS_GROUP_B = /bin/kill, /bin/cat, /usr/bin/zip
USERS_GROUP_A ALL= COMMANDS_GROUP_A
USERS_GROUP_B ALL= COMMANDS_GROUP_B
# users of the group USERS_GROUP_A may run /bin/ls, /bin/cat, and /usr/bin/zip
# from any machine (ALL).
# users of the group USERS_GROUP_B may run /bin/kill,/bin/cat and /usr/bin/zip
# from any machine (ALL).
Примечания:
- Проблема в примере: обычно
kill
этовстроенная команда оболочки(проверьте это с помощьюtype kill
). Если вы позволите пользователям иметьshell
боюсь, вы не найдете способа избежать их использованияkill
(если только вы не измените исходный код оболочки надлежащим образом и не перекомпилируете его...). Если команды, которые вы хотите закрыть для этих пользователей, имеют атрибут
read
иexecution
установлены для всех (напримерls -l /usr/bin/zip
, )-rwxr-xr-x 1 root root 188296 Oct 21 2013 /usr/bin/zip
может быть, вы можете использовать обходной путь, ограничив
execution
атрибут только владельцем и его группойsudo chattr o-x /usr/bin/zip
,-rwxr-xr-- 1 root root 188296 Oct 21 2013 /usr/bin/zip
добавление нового пользователя (напримеркулюзер) к этой группе (возможно, с помощью
/usr/sbin/nologin
)shell
, и написав следующие 2 строки вместо соответствующих вышеприведенных:USERS_GROUP_A ALL=(cooluser) NOPASSWD: COMMANDS_GROUP_A USERS_GROUP_B ALL=(cooluser) NOPASSWD: COMMANDS_GROUP_B # users of the USERS_GROUP_A may run /bin/ls, /bin/cat and /usr/bin/zip # as the user cooluser from any machine (ALL). # users of the USERS_GROUP_B may run /bin/kill,/bin/cat and /usr/bin/zip # as the user cooluser from any machine (ALL).
Ключевое слово
NOPASSWD:
— избегать запроса пароля.
Ваши пользователи могут выполнять команды сsudo -u cooluser /usr/bin/zip
Побочный эффект: другие пользователи не смогут выполнить эту команду, пока вы не включите их в группу владельца файла... а если это так, то это
root
должно быть не так уж и безопасно...
Использованная литература: