Идентификатор пользователя - User identifier

Unix-подобный операционные системы идентифицируют пользователя по значению, называемому идентификатор пользователя, часто сокращенно ID пользователя или же UID. UID, наряду с идентификатором группы (GID) и другими критериями контроля доступа, используется для определения того, к каким системным ресурсам может получить доступ пользователь. В файл паролей карты текстовые имена пользователей в UID. UID хранятся в inodes из Unix файловая система, Бег процессы, деготь архивы, а ныне устаревшие Сетевая информационная служба. В POSIX -соответствующие среды, команда командной строки я бы предоставляет UID текущего пользователя, а также дополнительную информацию, такую ​​как имя пользователя, основная группа пользователей и идентификатор группы (GID).

Атрибуты процесса

Стандарт POSIX ввел три разных поля UID в таблицу дескрипторов процесса, чтобы позволить привилегированным процессам динамически выполнять разные роли:

Действующий идентификатор пользователя

Эффективный UID (euid) процесса используется для большинства проверок доступа. Он также используется как владелец файлов, созданных этим процессом. Эффективный GID (egid) процесса также влияет на управление доступом и может также влиять на создание файла в зависимости от семантики конкретной используемой реализации ядра и, возможно, используемых параметров монтирования. Согласно семантике BSD Unix, групповое владение, данное вновь созданному файлу, безусловно, наследуется от группового владения каталогом, в котором он создан. Согласно с AT&T Система UNIX V семантика (также принятая в вариантах Linux), вновь созданному файлу обычно присваивается групповое владение, указанное egid процесса, создающего файл. Большинство файловых систем реализуют метод выбора, следует ли использовать семантику BSD или AT&T в отношении группового владения вновь созданным файлом; Семантика BSD выбирается для определенных каталогов, когда установлено разрешение S_ISGID (s-gid).[1]

ID пользователя файловой системы

В Linux также есть идентификатор пользователя файловой системы (fsuid), который используется явно для управления доступом к файловой системе. Он соответствует euid если явно не указано иное. Это может быть ID пользователя root, только если разрушенный, Suid, или же euid это корень. Когда бы euid изменяется, изменение распространяется на fsuid.

Намерение fsuid разрешать программы (например, NFS server), чтобы ограничить себя правами файловой системы некоторых заданных uid не давая этого uid разрешение посылать им сигналы. Начиная с ядра 2.0, наличие fsuid больше не требуется, потому что Linux придерживается SUSv3 правила отправки сигналов, но fsuid остается по соображениям совместимости.[2]

Сохраненный идентификатор пользователя

Сохраненный идентификатор пользователя (Suid) используется, когда программе, работающей с повышенными привилегиями, необходимо временно выполнить некоторую непривилегированную работу; изменение euid от привилегированного значения (обычно 0) к некоторому непривилегированному значению (любому другому значению, кроме привилегированного), заставляет привилегированное значение сохраняться в Suid.[3] Позже программа euid можно вернуть к значению, сохраненному в Suid, чтобы можно было восстановить повышенные привилегии; непривилегированный процесс может установить свой euid к одному из трех значений: значение разрушенный, значение Suid, или значение euid.

Реальный идентификатор пользователя

Настоящий UID (разрушенный) и настоящий GID (rgid) идентифицируют настоящего владельца процесса и влияют на разрешения на отправку сигналов. Процесс без привилегий суперпользователя может сигнализировать другому процессу, только если отправитель разрушенный или же euid совпадает с приемником разрушенный или же Suid. Поскольку дочерний процесс наследует свои учетные данные от своего родителя, дочерний и родительский процесс могут передавать друг другу сигналы.

Конвенции

Тип

POSIX требует, чтобы UID был целочисленным типом. Большинство Unix-подобных операционных систем представляют UID как целое число без знака. Размер значений UID варьируется в разных системах; некоторые ОС UNIX[который? ] используются 15-битные значения, допускающие значения до 32767[нужна цитата ], а другие, такие как Linux (до версии 2.4) поддерживается 16 бит UID, что делает возможным 65536 уникальных идентификаторов. Большинство современных Unix-подобных систем (например, Solaris-2.0 в 1990 г., Linux 2.4 в 2001 г.) перешли на 32-битный UID, позволяющие 4 294 967 296 (232) уникальные идентификаторы.

Зарезервированные диапазоны

В Стандартная база Linux Базовая спецификация указывает, что значения UID в диапазоне от 0 до 99 должны статически выделяться системой и не должны создаваться приложениями, в то время как UID от 100 до 499 должны быть зарезервированы для динамического распределения системными администраторами и сценариями после установки.[4]

Debian Linux не только резервирует диапазон 100–999 для динамически назначаемых системных пользователей и групп, но также централизованно и статически выделяет пользователей и группы в диапазоне 60000–64999 и дополнительно резервирует диапазон 65000–65533.[5]

Systemd определяет ряд специальных диапазонов UID, включая[6]

  • 60001-60513: UID для домашних каталогов, управляемых systemd-homed
  • 61184-65519 (0xef00-0xffef): UID для динамических пользователей

В FreeBSD переносчики, которым нужен UID для своего пакета, могут выбрать свободный из диапазона от 50 до 999, а затем зарегистрировать статическое распределение.[7][8]

Некоторые системы POSIX выделяют UID новым пользователям, начиная с 500 (macOS, Red Hat Enterprise Linux до версии 6), другие начинаются с 1000 (Red Hat Enterprise Linux с версии 7,[9] openSUSE, Debian[5]). Во многих системах Linux эти диапазоны указаны в /etc/login.defs, за useradd и аналогичные инструменты.

Центральное распределение UID в корпоративных сетях (например, через LDAP и NFS серверы) могут ограничиваться использованием только номеров UID, намного превышающих 1000 и выходящих за пределы диапазона 60000–65535, чтобы избежать потенциальных конфликтов с UID, локально выделенными на клиентских компьютерах.

Виртуализация на уровне ОС может переназначать идентификаторы пользователей, например с помощью Пространства имен Linux, и поэтому необходимо выделить диапазоны, в которые отображаются переназначенные UID и GID:

  • Snapd сопоставляет UID и GID в диапазоне 524288-589823 (0x80000-0x8ffff)
  • systemd-nspawn автоматическое выделение диапазонов UID для каждого контейнера использует диапазон 524288-1879048191 (0x80000-0x6fffffff)[6]

Авторы systemd рекомендуют Виртуализация на уровне ОС системы должны выделить 65536 (216) UID для каждого контейнера и сопоставьте их, добавив целое число, кратное 216.[6]

Особые ценности

  • 0: суперпользователь обычно имеет нулевой UID (0).[10]
  • −1: значение (uid_t) -1 зарезервировано POSIX для идентификации пропущенного аргумента.[11]
  • 65535: этого значения по-прежнему избегают, потому что это было возвращаемое значение ошибки API, когда uid_t был 16 бит.
  • Никто: исторически пользователь "никто "был присвоен UID -2 некоторыми операционными системами, хотя другие значения, такие как 215−1 = 32 767 также используются, например, OpenBSD.[12] Для совместимости между 16-битными и 32-битными UID многие дистрибутивы Linux теперь устанавливают его равным 2.16−2 = 65 534; ядро Linux по умолчанию возвращает это значение, когда 32-битный UID не соответствует возвращаемому значению 16-битных системных вызовов.[13] Fedora Linux никому не назначает последний UID диапазона, статически выделенного для использования системой (0-99): 99, и вместо этого вызывает 65534 nfsnobody.

Альтернативы

NFSv4 был предназначен для предотвращения конфликтов числовых идентификаторов путем идентификации пользователей (и групп) в пакетах протокола с использованием текстовых имен «user @ domain», а не целых чисел. Однако, пока ядра операционных систем и локальные файловые системы продолжают использовать целочисленные идентификаторы пользователей, это происходит за счет дополнительных шагов преобразования (с использованием процессов демона idmap), которые могут создавать дополнительные точки отказа, если локальные механизмы сопоставления UID или базы данных получают настроен неправильно, утерян или рассинхронизирован. Часть «@domain» имени пользователя может использоваться, чтобы указать, какой орган присвоил конкретное имя, например, в форме

  • а Kerberos имя области
  • ан Active Directory доменное имя
  • имя поставщика операционной системы (для распределения для конкретного дистрибутива)
  • имя компьютера (для выделенных устройств)

Но на практике многие существующие реализации позволяют устанавливать для домена NFSv4 только фиксированное значение, что делает его бесполезным.

Смотрите также

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

  1. ^ chmod (1) – Solaris 10 Справочник по командам пользователя Руководство
  2. ^ Керриск, Майкл. Интерфейс программирования Linux. No Starch Press, 2010, стр. 171.
  3. ^ "Сетуид демистифицирован" (PDF). Cs.berkeley.edu. Получено 2016-09-24.
  4. ^ «9.3. Диапазоны UID». Refspecs.linuxfoundation.org. Получено 2016-09-24.
  5. ^ а б «Руководство по политике Debian - Раздел 9.2.2: классы UID и GID». Debian.org. 2019-07-18. Получено 2019-07-26.
  6. ^ а б c "Пользователи, группы, UID и GID в системах systemd". Получено 2020-09-26.
  7. ^ "Справочник FreeBSD Porter". Freebsd.org. Получено 2016-09-24.
  8. ^ http://www.freebsd.org/doc/en/books/porters-handbook/users-and-groups.html
  9. ^ «Изменения в системе RHEL7». Certdepot.net. 2016-01-17. Получено 2017-03-22.
  10. ^ "Getpwuid". Pubs.opengroup.org. Получено 2016-09-24.
  11. ^ "Чоун". Pubs.opengroup.org. Получено 2016-09-24.
  12. ^ «Отчет о проблеме NetBSD № 6594: учетные данные« никто »по умолчанию (32767: 9999) не соответствуют учетным данным mountd по умолчанию (-2: -2)». GnaNFSv4ts.netbsd.org. Получено 2016-09-24.
  13. ^ «Действующие пространства имен, часть 5: Пространства имен пользователей». Lwn.net. Получено 2016-09-24.