2

Скажем, есть набор команд оболочки {ls, cat, kill}

Я хочу, чтобы пользователи в группе A могли выполнять команды {ls, cat}, а пользователи в группе B могли выполнять команды {cat, kill}

Как это сделать, каковы лучшие подходы?

Я думал о некоторых решениях, но они не кажутся безопасными на 100%.

1 ответ1

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
    

    добавление нового пользователя (например, cooluser) в эту группу (возможно, с /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 должно быть не так безопасно ...

Рекомендации:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .