Как Linux идентифицирует пользователей?

9

Я имею в виду, если два пользователя имеют одинаковые имена, как система узнает, что они на самом деле разные пользователи, когда она применяет права доступа к файлам?

Это сомнение пришло мне в голову, когда я собирался переименовать свой дом, /home/old-archпрежде чем переустанавливать систему (у меня есть /homeсобственный раздел, и я не форматирую его), чтобы я мог получить новый, чистый /home/arch. Я задавался вопросом, даст ли новая система старые разрешения на мои файлы или она распознает меня как другую arch.

Арк Стентон
источник
12
Простой ответ - «нет», потому что у вас не должно быть нескольких пользователей с одним и тем же именем.
Игнасио Васкес-Абрамс
6
UID, которые отличаются от имен пользователей, но обычно ассоциируются с ними, - это то, как отслеживаются подобные вещи. Смотрите вывод ls -n.
DopeGhoti
5
«Отправить» - слишком туманная операция, чтобы ответить на вопрос. Разрешения применяются только к одной системе (произвольного размера).
Игнасио Васкес-Абрамс
1
@ IgnacioVazquez-Abrams Этот вопрос мне действительно пришел в голову, когда я собирался переименовать свой дом /home/old-archперед переустановкой системы (у меня есть /homeсобственный раздел, и я не форматирую его), чтобы у меня тогда был новый, нетронутый /home/arch. Я задавался вопросом, сохраню ли я те же разрешения для своих файлов, или система распознает меня как другое arch.
Арка Стэнтон
1
Я думаю, что случай, о котором вы упомянули в своем комментарии, интересен: два пользователя с одинаковым именем пользователя, но в разных системах, установленных на одном компьютере, имеют доступ к одним и тем же файлам в общем разделе. Возможно, вы могли бы добавить это к вопросу?
Time4Tea

Ответы:

10

В Unix пользователи идентифицируются по их идентификатору (uid), который должен быть уникальным (в рамках локальной системы). Таким образом, даже если бы можно было создать 2 разных пользователей с одинаковыми именами (adduser в моей системе отказывается это делать, см. Этот вопрос для получения дополнительной информации. Могут ли отдельные учетные записи Unix иметь общее имя пользователя, но иметь отдельные пароли? ), Им потребуется получить разные идентификаторы Хотя вы можете манипулировать файлами, содержащими информацию о пользователях, в соответствии с вашими критериями, каждая программа основана на предположении, что идентификаторы пользователя уникальны в системе, поэтому такие пользователи будут идентичны.

РЕДАКТИРОВАТЬ: другой ответ продемонстрировал случай, когда у вас есть 2 разных имени пользователя для одного и того же UID - хотя, если говорить о системе, это все равно, что иметь два разных имени для одного и того же пользователя, поэтому следует избегать подобных конструкций, если это возможно , если вы не хотите специально создать псевдоним для пользователя в системе (см. вопрос о псевдонимах пользователей unix на serverfault для получения дополнительной информации о технических особенностях).

Система использует эти идентификаторы для обеспечения прав доступа к файлам. Uid и gid (идентификатор группы) пользователя, которому принадлежит файл, записываются в метаданные файла. Если вы перенесете диск на другой компьютер с другим пользователем, который случайно использует один и тот же uid, файл внезапно будет принадлежать этому пользователю в этой системе. Знание того, что идентификаторы uid в системе unix обычно не превышают 16-битные целые числа, показывает, что идентификаторы uid не должны быть глобально уникальными, а уникальными только в области действия локальной системы.

Лоллен Джамплан
источник
22

Если вы заставите там существовать несколько пользователей с одним и тем же именем пользователя, то будет несколько записей /etc/{shadow,passwd}с одним и тем же именем:

$ cat /etc/passwd
...
a:x:1001:1002::/home/a:/bin/bash
a:x:1002:1003::/home/b:/bin/bash

# cat /etc/shadow
a:...:17702:0:99999:7:::
a:...:17702:0:99999:7:::

Если вы попытаетесь войти в систему как этот пользователь, вы войдете в систему как первое совпадение.

$ ssh a@<host>
Password:
$ id
uid=1001(a) gid=1002(a) groups=1002(a)
$ pwd
/home/a

Не будет никакого способа войти как второй пользователь с тем же именем.

Обратите внимание, что Linux отслеживает пользователей по их uid, а не по имени пользователя.

Однако было бы возможно, чтобы два разных имени пользователя были одинаковыми. Рассмотрим другую версию /etc/passwd:

$ cat /etc/passwd
...
a:x:1001:1002::/home/a:/bin/bash
b:x:1001:1002::/home/b:/bin/bash

Обратите внимание, что для обоих имен пользователей aи bтретьего столбца 1001 - это идентификатор пользователя / uid. Теперь, если пользователь aили пользователь bвходит в систему (даже с разными паролями), они оба будут «пользователь 1001» и будут отображаться как пользователь aс точки зрения ОС. Здесь также первая совпадающая запись является возвращенной (в большинстве случаев):

$ ssh a@host
Password: <a's password>
$ id
uid=1001(a) gid=1002(a) groups=1002(a)

$ ssh b@host
Password: <b's password>
$ id
uid=1001(a) gid=1002(a) groups=1002(a)

Оба aи buid, 1001и будут иметь доступ к ресурсам, доступным для uid 1001.

Энди Далтон
источник
почему он не проверяет дублированные имена пользователей при создании нового?
phuclv
9
Заметьте, что я думаю, что даже самые базовые данные useraddприведут в порядок, если вы попытаетесь добавить существующего пользователя, поэтому под «силой» здесь Энди в значительной степени означает «ручное редактирование», /etc/passwdи /etc/shadowэто очень большая территория «Не пытайтесь это дома».
Шадур
«Не будет возможности войти в систему как второй пользователь с тем же именем». Не могли бы вы все еще позвонить setuidсо вторым UID? Или даже sudo -u '#<uid>' bash?
Jazzpi
1
@jazzpi Это может зависеть от определения «войти». Тем не менее, я, конечно, мог видеть графические менеджеры входа, позволяющие эту ситуацию ...
CVn
3

Я собирался переименовать свой дом /home/old-archперед переустановкой системы. Я задавался вопросом, даст ли новая система старые разрешения на мои файлы или она распознает меня как другую арку.

Если у вас однопользовательская система и вы выполняете переустановку с тем же или похожим дистрибутивом, очень вероятно, что ваша учетная запись пользователя будет иметь такой же идентификатор пользователя и, следовательно, будет одним и тем же пользователем с точки зрения ядра. Например, насколько я помню, пользователь, созданный во время установки, имел UID 1000 в системах Debian. Другие системы могут использовать другое число, но, скорее всего, это будет какое-то целое число небольшого размера, одинаковое при каждой установке.

То же самое относится и к другим пользователям (если они есть), поскольку идентификаторы UID обычно назначаются последовательно. Вероятно, у третьего созданного пользователя будет тот же UID, что и у третьего пользователя, созданного в другой системе. Вам нужно будет предпринять шаги заранее, чтобы убедиться, что идентификаторы не используются повторно в обеих системах.

По тем же причинам, все, что использует NFS, должно иметь общую пользовательскую базу данных.

Но в этом случае, поскольку это ваша личная система, вы можете просто войти в систему как root и запускать, chown newuser. -R /home/olduserдаже если UID будет другим.

(Системы Windows отличаются друг от друга, они генерируют эту длинную строку идентификатора, которая является более случайной. Там, если вы переместите диск на другой компьютер, вы увидите, что файлы принадлежат неизвестному пользователю, и у вас не будет доступа без использования полномочий администратора.

Кроме того, я сказал «вероятно» много в выше. Нельзя сказать, если какой-то дистрибутив ведет себя по-другому. Современный Linux также поддерживает 32-разрядные идентификаторы UID, поэтому, хотя это не так много, как в случае идентификаторов Windows SID, все еще есть место, чтобы использовать, например, случайные идентификаторы UID. Обычно для этого мало что нужно. Предполагается, что системный администратор должен знать, к каким дискам они подключаются к системе, и соответствующим образом регулировать владение файлами или делать точку монтирования недоступной для других пользователей.)

ilkkachu
источник
1

Unix - это очень старая система, эпоха, когда объемы хранения были очень малы, и все - и файлы, и пользователи - были идентифицированы по номерам . Имена пришли позже , после того как хранилище немного выросло.

Достоинство этой системы является то , что имена только этикетки подключили к реальным ручкам: числовые идентификаторы. Таким образом, вы можете иметь несколько имен для одного пользователя (при непосредственном редактировании / etc / passwd), а также несколько имен для одного файла (полезно хранить файл только один раз, но просматривать его в нескольких местах).

Пределы - это система для пользователя и раздел для файла.

Я говорю это только для того, чтобы уточнить, объяснить, почему вещи такие, какие они есть .

Должен признаться, я никогда не пробовал противоположный путь - одно и то же имя с разными идентификаторами - я всегда думал, что это невозможно. Это? Не как ошибка?

ypouplard
источник
1
Итак, вы говорите, что другие файловые системы, такие как NTFS или CIFS, используют имена пользователей, а не буквенно-цифровые SIDS для хранения файловых прав и разрешений?
doneal24
Не уверен, но я верю, что это так, поскольку буквенно-цифровой SIDS не существовал при создании Windows - я до сих пор помню день, когда я купил Windows 286 , которая была первым графическим преемником MS-DOS…
ypouplard
1
@ DougO'Neal: SID NT имеют два формата: текстовое представление и 12-байтовую двоичную форму. AFAIK, NTFS использует последний для внутренних целей, поэтому он все еще использует числа для идентификации пользователей - просто очень большие числа. :)
Чао
3
@ypouplard Когда Windows была создана, это была однопользовательская операционная система. Не нужно было устанавливать файловую принадлежность, поскольку человек, сидящий за клавиатурой, управлял всем.
doneal24