Почему я могу запустить корневую оболочку с помощью sudo даже с '! 'в своей теневой записи?

9
$cat /etc/passwd |grep -i root
root:x:0:0:root:/root:/bin/bash

$sudo cat /etc/shadow |grep -i root
root:!:17179:0:99999:7:::

Во втором поле теневого файла !означает, что пользователь root не может войти в систему, но почему я могу войти в систему как пользователь root sudo su?

Почему я не могу войти в систему как пользователь root su rootили su -?

Sinoosh
источник
1
«Во втором поле теневого файла! Означает, что пользователь root не может войти» Нет, это не так. где ты услышал это?
Гонки
@LightnessRacesinOrbit, что это значит?
Джордж Удосен
@ Джордж: Муру цитировал руководство в своем ответе и подробно объяснил. Вы должны прочитать документацию!
Гонки

Ответы:

15

!В shadowзашифрованном занесении в поле пароля, пароль не может проверить подлинность против него. От man shadow:

If the password field contains some string that is not a valid
result of crypt(3), for instance ! or *, the user will not be able
to use a unix password to log in (but the user may log in the
system by other means).

Как сказано в руководстве, это не означает, что вы не можете войти в систему как root. Это просто означает, что вы не можете войти в систему как root, используя пароль для учетной записи root. (Вы можете войти в систему как root через SSH, используя ключи SSH, например, если вы настроили его ранее, даже если учетная запись заблокирована.)

sudoобычно проходит аутентификацию с вашим паролем, а не root. Это может быть изменено путем установки одного из targetpw, rootpwили runaspwв sudoers. Если вы установите один из этих параметров и попытаетесь использовать пароль, когда пароль заблокирован, произойдет сбой .

Мур
источник
Отлично, это означает, что я могу переключиться на любого пользователя с помощью sudo с моим паролем, будь то активный пользователь или заблокированный пользователь, верно?
Sinoosh
1
@Sinoosh при условии отсутствия других ограничений, да
Muru
4

Теперь давайте посмотрим на команды соответственно:

  1. sudo su:

    • sudoзапускает команду su(замещающий пользователь) с привилегиями суперпользователя, поэтому, даже если он /etc/shadowговорит или имеет, root:!:17179:0:99999:7:::он все равно будет запускать команды с привилегиями суперпользователя
  2. su -или su root:

    • Это фактически переключает на пользователя root, который из /etc/shadowфайла не может войти в систему, поэтому использование этих команд не будет работать. Если вы хотите, чтобы они работали, то учетная запись root должна быть разблокирована путем предоставления ей пароля.

Резюме:

su -0r su rootпереключается на пользователя root , не существует, так что это не может произойти, но sudo suзапускает команду switch с rootпривилегиями, поэтому в этом случае она пойдет, если вы находитесь в sudoгруппе. В этом случае вы на самом деле не входите в систему как root, просто действуете как root .

Источник: В чем разница между «su -» и «su root»?

Джордж Удосен
источник
Спасибо, значит sudo suне видит поля пропуска в теневом файле?
Sinoosh
1
@Sinoosh sudo su- неправильный способ бегать sudo shили sudo bash.
Бакуриу