Всегда ли у учетной записи root UID / GID 0?

50

Во всех системах Linux, которыми я управлял, учетная запись root имеет GID и UID, равный 0. Это гарантировано, или возможно, что система будет давать root другим ID?

Танаки
источник
3
ID 0 имеет все права. Фактическое имя (или имена -multiple-) может отличаться. Например, на моем сервере два пользователя uid 0. Один называется «корень», другой - «тоор».
Hennes

Ответы:

80

На самом деле есть две части вашего вопроса.

У учетной записи суперпользователя всегда есть uid / gid 0/0 в Linux?

Да. Как отметил Рич Хомолка в комментарии , в ядре есть код, который явно проверяет uid 0, когда нужно проверить пользователя root, что означает, что root всегда имеет как минимум uid 0.

Всегда ли имя учетной записи пользователя с uid 0 root?

No. root это просто имя, указанное в / etc / passwd или другом хранилище аутентификации. С таким же успехом вы можете вызвать учетную запись admin, и сама ОС не будет беспокоиться, но некоторым приложениям это может не понравиться, поскольку они ожидают, что существует привилегированная учетная запись с именем root. Вызов учетной записи uid 0 в * nix rootявляется очень жестким соглашением, но он не требуется системой (хотя это может требоваться определенным программным обеспечением пользователя, возможно, включая утилиты системного администрирования).

Стоит также отметить , что, как отметил Саймон Рихтер , на BSDs там часто существует вторая UID 0 счета, по соглашению с именем toor(что «корень» , записанный задом наперед, а также лексически приходит после root того, как в списке отсортированы в алфавитном порядке). Например, FreeBSD использует его для предоставления пользователю root настраиваемого параметра оболочки, оставляя пользователю root оболочку по умолчанию, которая гарантированно существует в корневом разделе системы (полезно для целей восстановления).

CVn
источник
15
В ядре есть код для проверки root, uid == 0. Да, он жестко запрограммирован и постоянен.
Богатая Гомолка
1
BSD обычно имеет rootи toor, оба с UID 0.
Simon Richter
@SimonRichter. В этом случае существует учетная запись суперпользователя с именем root, так что нет проблем, если библиотеки хранилища аутентификации не запутаются у двух пользователей с одинаковым UID (в этом случае BSD не сделает этого так, что Кстати, или библиотеки будут исправлены).
CVN
Там же код в ядре , которое использует UID = 0 в качестве представителя корня, и магазины, в переменных с именем «ROOT_UID», но я не нашел ничего (6 лет спустя) , который на самом деле зависит от пользователя , будучи назван «корнем». Независимо от того, находится ли UID в / etc / passwd или нет, в конечном итоге будут запущены процессы с UID = 0. :)
dannysauer
15

1) администратор всегда uid == 0. Это закодировано в ядре. Чтобы изменить это, потребовалось бы некоторое кодирование в ядре. Там нет особого смысла в этом, так что это не сделано. Например, это было бы несовместимо для других unixes, использующих тот же NFS, например.

2) uid 0 не обязательно отображается на root. Лучший пример - FreeBSD. У него есть две учетные записи uid == 0, разница заключается в оболочке. В root есть shell / bin / sh, простая оболочка, полезная для плохих дисков, когда вам нужен fsck / usr. toor использует tcsh, который гораздо более полезен в не чрезвычайных ситуациях, поскольку имеет такие вещи, как история и т. д.

Другой, более личный пример; у меня была одна работа, где у них была корневая учетная запись (т. е. uid = 0) через NIS. Пароль, пусто! Потому что новый системный администратор не мог вспомнить пароль пользователя root на машинах. Я кричал об этом по понятным причинам (пароли NIS по определению не могут скрывать свою пустоту). Я не был доволен этим аккаунтом.

И это действительно не система, которая дает UID 0 является root, это вы. Вы можете изменить это, используя файлы passwd или другие каталоги имен (NIS, ldap), но они не скомпилированы. Хотя у вас должна быть хотя бы одна учетная запись uid 0 в / etc / passwd, поскольку у вас может не быть сети, когда она вам действительно нужна ,

Таким образом, root всегда равен uid 0, но uid 0 не обязательно всегда root.

Рич Гомолка
источник
1
Ой, боль от выбора только одного принятого ответа ...
Танаки
5
@Tanaki Как правило, «примите» ответ, который помог вам больше всего ответить на ваш вопрос, и опишите все ответы, которые вы сочли полезными. Ничто не говорит о том, что вы должны принять самый голосующий или первый письменный ответ.
CVN
1

Хорошо для систем, которые используют nonStop сервер, ROOT_UID не 0, а 65535.

Пользователи и группы OSS Среда OSS не предоставляет общих имен пользователей и идентификаторов пользователей UNIX по умолчанию, если они явно не созданы администратором сайта. Однако эквивалентные имена пользователей OSS и идентификаторы пользователей существуют. Например, привилегии, обычно связанные с именем пользователя UNIX root и идентификатором пользователя 0, существуют для идентификатора пользователя OSS (UID) 65535 (суперидентификатора), который является пользователем SUPER.SUPER и его псевдонимами.

См. Https://h20195.www2.hpe.com/V2/GetPDF.aspx/4AA4-6316ENW.pdf

В coreutils вы можете найти этот заголовочный файл root-uid.h:

/* The user ID that always has appropriate privileges in the POSIX sense.

   Copyright 2012-2016 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

   Written by Paul Eggert.  */

#ifndef ROOT_UID_H_
#define ROOT_UID_H_

/* The user ID that always has appropriate privileges in the POSIX sense.  */
#ifdef __TANDEM
# define ROOT_UID 65535
#else
# define ROOT_UID 0
#endif

#endif
Nuxwin
источник