Почему uid пользователя задается больше 1000
Перейти к содержимому

Почему uid пользователя задается больше 1000

  • автор:

Пользователи в Linux

Linux — система многопользовательская, а потому пользователь — ключевое понятие для организации всей системы доступа в Linux. Когда пользователь регистрируется в системе (проходит процедуру авторизации, например, вводя системное имя и пароль), он идентифицируется с учётной записью, в которой система хранит информацию о каждом пользователе: его системное имя и некоторые другие сведения, необходимые для работы с ним. Именно с учётными записями, а не с самими пользователями, и работает система. Ниже приведён список этих сведений.

Системное имя (user name)

Это то имя, которое вводит пользователь в ответ на приглашение login: . Оно может содержать только латинские буквы и знак “ _ ”. Это имя используется также в качестве имени учётной записи.

Идентификатор пользователя (UID)

Linux связывает системное имя c идентификатором пользователя в системе — UID (User ID). UID — это положительное целое число, по которому система и отслеживает пользователей 1 . Обычно это число выбирается автоматически при регистрации учётной записи, однако оно не может быть совершенно произвольным. В Linux есть некоторые соглашения относительно того, каким типам пользователей могут быть выданы идентификаторы из того или иного диапазона. В частности, UID от “ 0 ” до “ 100 ” зарезервированы для псевдопользователей 2 .

Идентификатор группы (GID)

Кроме идентификационного номера пользователя с учётной записью связан идентификатор группы. Группы пользователей применяются для организации доступа нескольких пользователей к некоторым ресурсам. У группы, так же, как и у пользователя, есть имя и идентификационный номер — GID (Group ID). В Linux каждый пользователь должен принадлежать как минимум к одной группе — группе по умолчанию. При создании учётной записи пользователя обычно создаётся и группа, имя которой совпадает с системным именем 3 , именно эта группа будет использоваться как группа по умолчанию для этого пользователя. Пользователь может входить более чем в одну группу, но в учётной записи указывается только номер группы по умолчанию. Группы позволяют регулировать доступ нескольких пользователей к различным ресурсам.

Полное имя (full name)

Помимо системного имени в учётной записи содержится и полное имя (имя и фамилия) использующего данную учётную запись человека. Конечно, пользователь может указать что угодно в качестве своего имени и фамилии. Полное имя необходимо не столько системе, сколько людям — чтобы иметь возможность определить, кому принадлежит учётная запись.

Домашний каталог (home directory)

Файлы всех пользователей в Linux хранятся раздельно, у каждого пользователя есть собственный домашний каталог, в котором он может хранить свои данные. Доступ других пользователей к домашнему каталогу пользователя может быть ограничен. Информация о домашнем каталоге обязательно должна присутствовать в учётной записи, потому что именно с него начинает работу пользователь, зарегистрировавшийся в системе.

Начальная оболочка (login shell)

Важнейший способ взаимодействовать с системой Linux — командная строка, которая позволяет пользователю вести «диалог» с системой: передавать ей команды и получать её ответы. Для этой цели служит специальная программа — командная оболочка (или интерпретатор командной строки), по-английски — shell. Начальная оболочка (login shell) запускается при входе пользователя в систему в текстовом режиме (например, на виртуальной консоли). Поскольку в Linux доступно несколько разных командных оболочек, в учётной записи указано, какую из командных оболочек нужно запустить для данного пользователя. Если специально не указывать начальную оболочку при создании учётной записи, она будет назначена по умолчанию, вероятнее всего это будет bash.

Все перечисленные данные об учётных записях хранятся в файле /etc/passwd . Сведения о конкретной учётной записи пользователя можно получить с помощью утилиты getent 4 :

[tester@tacit tester]$ getent passwd tester tester:x:506:506:Test Testovitch:/home/tester:/bin/bash [tester@tacit tester]$

Пример 1. Сведения об учётной записи

Первый параметр, passwd — это название базы, в которой нужно производить поиск, оно совпадает с именем соответствующего конфигурационного файла. Второй параметр, tester — это название учётной записи пользователя (системное имя). getent выводит ту строчку /etc/passwd , где описана искомая учётная запись: в ней через “ : ” указаны системное имя, пароль (тут стоит буква “ x ”, потому что пароль спрятан в другом месте, об этом ниже), UID, GID, полное имя, домашний каталог и начальная оболочка.

В Linux пароль пользователя в явном виде не хранится нигде, но только в зашифрованном. В современных системах обычно применяются так называемые «теневые пароли» (shadow passwords), которые хранятся отдельно от остальных сведений об учётной записи, а также позволяют назначать дополнительные ограничения, в частности, «срок годности» пароля. В зависимости от строгости политики безопасности зашифрованные пароли пользователей могут храниться в общем файле /etc/shadow (менее строго) или в отдельном файле shadow для каждого пользователя. В ALT Linux по умолчанию используется схема tcb , реализующая более строгую политику. Для просмотра сведений из файла shadow требуются полномочия суперпользователя, это можно сделать с помощью команды getent passwd tester . Подробнее о возможностях теневых паролей можно прочитать в руководствах shadow(5) и tcb(5) .

Также отдельно хранится информация обо всех группах пользователей в системе, для этого предназначен файл /etc/group . Информацию о конкретной группе можно получить с помощью той же утилиты getent :

[tester@tacit tester]$ getent group audio audio:x:81:yura,fedya [tester@tacit tester]$

Пример 2. Сведения о группе

Запись в файле /etc/group устроена очень просто: сначала идёт имя группы (как и имя учётной записи, потом поле для пароля (здесь опять “ х ”, но пароли для группы используются очень редко), GID, список через запятую названий учётных записей (имён пользователей), входящих в данную группу. Любой пользователь может получить список названий групп, в которых он состоит командой groups , а более подробные сведения о своей или чужой учётной записи командой id имя_пользователя . Принадлежность к группе существенна только в одном отношении — прав доступа, поскольку для каждого файла определён не только пользователь-владелец, но и группа-владелец.

Управление пользователями

Создание пользователей

  • создать запись в /etc/passwd , где присвоить учётной записи уникальное имя, UID и пр.;
  • создать домашний каталог пользователя, обеспечить пользователю доступ к его домашнему каталогу (сделать его владельцем каталога);
  • поместить в домашний каталог стандартное наполнение (обычно конфигурационные файлы), взятое из /etc/skel ;
  • модифицировать системные конфигурационные файлы, в частности, создать хранилище для приходящей почты для данного пользователя ( /var/spool/mail/tester ).

Все эти действия могут быть выполнены и вручную, однако это довольно неудобно и можно что-нибудь забыть. Для упрощения процесса используется утилита useradd (она же по традиции называется adduser ), для выполнения которой, естественно, потребуются полномочия администратора. В простейшем случае достаточно будет двух шагов:

root@tacit ~# useradd test root@tacit ~# passwd test passwd: updating all authentication tokens for user test. You can now choose the new password or passphrase. . . . Enter new password:

Пример 3. Создание пользователя

Сначала useradd добавляет учётную запись (имя пользователя — единственный параметр, в нашем примере — test ), заполняя её значениями по умолчанию и проводя все необходимые изменения в системе. С помощью дополнительных параметров при вызове useradd можно явно указать значение для того или иного поля учётной записи, также эта утилита позволяет модифицировать параметры создания пользователей по умолчанию. Подробности можно найти в руководстве useradd(8) . Утилита passwd , вызванная с правами суперпользователя, позволяет назначить данному пользователю любой пароль. При этом сведения о предшествующем пароле данного пользователя (если таковой был), будут полностью утрачены. passwd , вызванная обычным пользователем (без параметров), позволяет ему сменить свой собственный пароль, но для этого потребуется ввести текущий пароль пользователя.

Существуют аналогичные useradd утилиты для модификации параметров уже существующей учётной записи ( usermod ) и для удаления пользователей ( userdel ). Пользователь также может изменить некоторые некритичные сведения в своей учётной записи самостоятельно. В частности, для установки своего полного имени и некоторых других информационных полей учётной записи служит утилита chfn(1) из пакета shadow-change, сменить начальную оболочку поможет утилита chsh(1) (позволяет выбрать только одну из оболочек, перечисленных в /etc/shells ) из того же пакета. Обратите внимание, что в ALT Linux пользователь имеет право редактировать собственную учётную запись только в том случае, если установлен соответствующий режим доступа: команда control chsh должна возвращать public , аналогично control chfn . Установить нужный доступ может суперпользователь командой control chsh public (аналогично для chfn ).

Самую востребованную операцию по работе с группами — добавление пользователя в группу — проще всего выполнить простым редактированием файла /etc/group . Достаточно открыть этот файл в любом текстовом редакторе (естественно, с правами суперпользователя), найти строчку, начинающуюся с названия нужной группы, и добавить в конец этой строки имя нужного пользователя через запятую). Для управления группами существует комплект утилит groupadd(8) , groupdel(8) , groupmod(8) , подробности о работе с ними можно найти в соответствующих руководствах.

1Это может оказаться важным, например, в такой ситуации: учётную запись пользователя с именем test удалили из системы, а потом добавили снова. Однако с точки зрения системы это уже другой пользователь, потому что у него другой UID.

2Обычно Linux выдаёт нормальным пользователям UID, начиная с “ 500 ” или “ 1000 ”.

3Как правило, численное значение GID в этом случае совпадает со значением UID.

4Эта утилита также полезна для получения сведений о некоторых других системных ресурсах, см. getent —help .

Почему uid пользователя задается больше 1000

Даже если на компьютере работает только один человек, необходимо понимать аспекты управления пользователями в системе Linux . Важно создать по крайней мере одно имя пользователя (помимо пользователя root ) для повседневной работы.

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

Пользователи с точки зрения Linux

Система регистрирует следующую информацию о каждом пользователе.

Имя пользователя (user name)

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

Идентификационный номер пользователя (User ID)

Этот номер, сокращённо обозначаемый как UID , является уникальным идентификатором пользователя в системе, Вообще говоря, система отслеживает пользователей по их номерам UID, а не по именам.

Идентификационный номер группы (group ID)

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

Это зашифрованный (encripted) пароль пользователя. Для создания и изменения пароля используется команда passwd .

Полное имя (full name)

Помимо системного имени пользователя, в систему заносится и хранится имя (фамилия и т. д.) « реального » пользователя. Например, пользователю schmoj в реальной жизни может соответствовать человек по имени Joe Schmo.

Домашний каталог (home directory)

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

Начальная оболочка (login shell)

Командная оболочка, которая запускается при входе в систему. Например, /bin/bash или /bin/zsh .

Вся эта информация хранится в файле /etc/passwd . Каждая строка в файле имеет формат:

имя пользователя:зашифрованный пароль:UID:GID:полное имя:домашний каталог:оболочка
kiwi:Xv8Q981g71oKK:102:100:Laura Poole:/home/kiwi:/bin/bash

В этом примере на первом месте стоит имя пользователя, т. е. kiwi . В следующем поле помещается пароль в зашифрованном виде: Xv8Q981g71oKK . Пароли в системе хранятся не в « читаемом » формате, а в зашифрованном с собственным именем, использованным в качестве ключа. Иными словами, для того, чтобы расшифровать пароль, его нужно знать. Эта форма шифрования является достаточно надёжной.

В некоторых системах имеются « теневые пароли » (shadow passwords), когда информация о пароле хранится в файле /etc/shadow . Такая схема является несколько более безопасной, поскольку файл /etc/passwd может читаться кем угодно, а права доступа к файлу /etc/shadow гораздо сильнее ограничены. Теневые пароли также обеспечивают иные функции, например, истечение срока действия пароля.

Третье поле — 102 — UID. Это число должно быть уникальным. Четвёртое поле — 100 — GID, т. е. пользователь принадлежит к группе с номером 100. Информация о группах хранится в файле /etc/group .

Пятое поле — реальное имя пользователя, в данном случае — Laura Poole . Последние два поля — домашний каталог пользователя ( /home/kiwi ) и начальная оболочка ( /bin/bash ). Не требуется, чтобы имена пользователя и домашнего каталога совпадали, однако такая организация помогает устанавливать принадлежность каталога.

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

При создании новых пользователей надо совершить последовательность из нескольких действий. Во-первых, на пользователя заводится запись в файле /etc/passwd , где пользователю даются уникальные имя и UID. UID обычных пользователей должны быть больше 100, поскольку низкие UID зарезервированы для системных целей. Также указываются GID, реальное имя и другая информация. Дальше создаётся домашний каталог пользователя, и права доступа устанавливаются так, что этим каталогом владеет данный пользователь. В каталог помещаются файлы инициализации командной оболочки. Также во всей системе модифицируются конфигурационные файлы (например, хранилище (spool) для приходящей пользователям электронной почты).

Вручную создавать пользователей не так трудно, однако когда эксплуатируется система с большим количеством пользователей, может оказаться забытой какая-нибудь деталь. Проще всего в этом случае создавать новых пользователей посредством интерактивной программы, которая автоматически обновляет содержимое всех нужных системных файлов. Такая программа называется useradd или adduser , в зависимости от того, какое программное обеспечение установлено.

В файле /etc/default/useradd содержится информация о стандартной начальной конфигурации для всех новых пользователей. В этом файле задаются значения переменным, которые использует программа useradd . Кроме того, этот файл указывает, где находятся конфигурационные файлы содержащие настройки по умолчанию. Расположение этих файлов задаётся переменной SKEL . Файлы, которые помещаются в этот каталог (такие, как файл .profile , устанавливающий режим по умолчанию во всей системе, а также файлы .zshrc или .bashrc ), будут автоматически скопированы в домашний каталог создаваемого пользователя командой useradd .

Удаление пользователей

Удаление пользователей из системы может быть произведено командой userdel или deluser .

Если требуется временно запретить пользователю вход в систему, но не удалять его домашний каталог и прочие сделанные установки, можно просто поставить звёздочку (символ * ) в то поле файла /etc/passwd , где находится пароль. Например, таким образом изменённая строка для пользователя kiwi будет выглядеть как

kiwi:*Xv8Q981g71oKK:102:100:Laura Poole:/home/kiwi:/bin/bash

При этом вход в систему пользователя kiwi станет невозможным.

Установка атрибутов пользователя

После того, как создано имя нового пользователя, может оказаться нужным изменить атрибуты этого пользователя, например, домашний каталог или пароль. Самый простой способ сделать это — просто поменять информацию в файле /etc/passwd . Для создания пароля нужно использовать команду passwd . Так, команда

passwd larry

изменит пароль пользователя larry . Изменять пароли любых пользователей может только пользователь root , однако свои пароли пользователи могут изменять сами, отдавая команду passwd без параметров.

Группы пользователей

Как указывалось выше, каждый пользователь принадлежит одной либо нескольким группам. Единственное, что является существенным в принадлежности к той или иной группе — это права доступа. Для каждого файла определён не только пользователь-владелец, но и группа-владелец, и набор прав доступа, которые определяют, как пользователи из этой группы могут осуществлять доступ к этому файлу. При создании нового пользователя создаётся также группа, имя которой совпадает с именем пользователя и куда входит только он один.

Имеется несколько групп, определённых системой, например, bin , mail , sys . Эти группы созданы для оформления прав доступа к системным файлам, и пользователи не должны принадлежать к этим группам. Для пользователей создаются специальные группы, например, users . Для пользователей можно создать несколько групп, например, student , staff , faculty .

Информация о группах содержится в файле /etc/group . Формат каждой строки таков:

имя группы:пароль:GID:другие члены группы
root:*:0: users:*:100:mdw,larry guest:*:200: other:*:250:kiwi

Первая группа — root — специальная группа для пользователя root . Вторая группа — users — содержит обычных пользователей. GID этой группы равен 100, и в неё входят пользователи mdw и larry. Напомним, что в файле /etc/passwd каждому пользователю определена его группа по умолчанию. Тем не менее, пользователи могут принадлежать к более чем одной группе, и это осуществляется посредством перечисления их имён в файле /etc/group . Команда groups перечисляет список групп, к которым относится (имеет доступ) данный пользователь.

Третья группа называется guest и предназначена для посетителей. Для прочих пользователей создана группа other ; в эту группу занесён пользователь kiwi .

Иногда в файле /etc/group заполняется поле password (пароль) для того, чтобы установить пароль на групповой доступ. Это требуется редко. Для того, чтобы не позволять пользователям проникать в привилегированные группы (командой newgroup), в это поле надо поставить символ * .

Для создания новых групп пользователей могут быть использованы команды addgroup или groupadd . Обычно легче внести вручную новую строчку в файл /etc/group , поскольку никакого другого конфигурирования не требуется. Для удаления группы можно просто удалить соответствующую строчку в файле /etc/group .

Почему uid пользователя задается больше 1000 linux

В предыдущей части мы только окунули пальцы ног в воды namespace и при этом увидели, как это было просто — запустить процесс в изолированном UTS namespace. В этом посте мы осветим User namespace.

Среди прочих ресурсов, связанных с безопасностью, User namespaces изолирует идентификаторы пользователей и групп в системе. В этом посте мы сосредоточимся исключительно на ресурсах user и group ID (UID и GID соответственно), поскольку они играют фундаментальную роль в проведении проверок разрешений и других действий во всей системе, связанных с безопасностью.

В Linux эти ID — просто целые числа, которые идентифицируют пользователей и группы в системе. И каждому процессу назначаются какие-то из них, чтобы задать к каким операциями/ресурсам этот процесс может и не может получить доступ. Способность процесса нанести ущерб зависит от разрешений, связанных с назначенными ID.

User Namespaces

Мы проиллюстрируем возможности user namespaces, используя только пользовательские ID. Точно такие же действия применимы к групповым ID, к которым мы обратимся далее в этому посте.

User namespace имеет собственную копию пользовательского и группового идентификаторов. Затем изолирование позволяет связать процесс с другим набором ID — в зависимости от user namespace, которому он принадлежит в данный момент. Например, процесс $pid может выполняться от root (UID 0) в user namespace P и внезапно продолжает выполняться от proxy (UID 13) после переключения в другой user namespace Q.

User spaces могут быть вложенными! Это означает, что экземпляр пользовательского namespace (родительский) может иметь ноль и больше дочерних пространств имён, и каждое дочернее пространство имён может, в свою очередь, иметь свои собственные дочерние пространства имён и так далее… (до достижения предела в 32 уровня вложенности). Когда создаётся новый namespace C, Linux устанавливает текущий User namespace процесса P, создающего C, как родительский для C и это не может быть изменено впоследствии. В результате все user namespaces имеют ровно одного родителя, образуя древовидную структуру пространств имён. И, как и в случае с деревьями, исключение из этого правила находится наверху, где у нас есть корневой (или начальный, дефолтный) namespace. Это, если вы еще не делаете какую-то контейнерную магию, скорее всего user namespace, к которому принадлежат все ваши процессы, поскольку это единственный user namespace с момента запуска системы.

В этом посте мы будем использовать приглашения командной строки P$ и C$ для обозначения шела, который в настоящее время работает в родительском P и дочернем C user namespace соответственно.

Маппинги User ID

User namespace, по сути, содержит набор идентификаторов и некоторую информацию, связывающую эти ID с набором ID других user namespace — этот дуэт определяет полное представление о ID процессов, доступных в системе. Давайте посмотрим, как это может выглядеть:

В другом окне терминала давайте запустим шелл с помощью unshare (флаг -U создаёт процесс в новом user namespace):

Погодите, кто? Теперь, когда мы находимся во вложенном шелле в C, текущий пользователь становится nobody? Мы могли бы догадаться, что поскольку C является новым user namespace, процесс может иметь иной вид ID. Поэтому мы, возможно, и не ждали, что он останется iffy , но nobody — это не смешно. С другой стороны, это здорово, потому что мы получили изолирование, которое и хотели. Наш процесс теперь имеет другую (хоть и поломанную) подстановку ID в системе — в настоящее время он видит всех, как nobody и каждую группу как nogroup .

Информация, связывающая UID из одного user namespace с другим, называется маппингом user ID. Он представляет из себя таблицы поиска соответствия ID в текущем user namespace для ID в других namespace и каждый user namespace связан ровно одним маппингом UID (в дополнение еще к одному маппингу GID для group ID).

Map-файлы

Map-файлы — особенные файлы в системе. Чем особенные? Ну, тем, что возвращают разное содержимое всякий раз, когда вы читаете из них, в зависимости от того, какой ваш процесс читает. Например, map-файл /proc/$pid/uid_maps возвращает маппинг от UID’ов из user namespace, которому принадлежит процесс $pid , UID’ам в user namespace читающего процесса. И, как следствие, содержимое, возвращаемое в процесс X, может отличаться от того, что вернулось в процесс Y, даже если они читают один и тот же map файл одновременно.

В частности, процесс X, считывающий UID map-файл /proc/$pid/uid_map , получает набор строк. Каждая строка отображает непрерывный диапазон UID’ов в user namespace C процесса $pid , соответствующий диапазону UID в другом namespace.

Каждая строка имеет формат $fromID $toID $length , где:

  • $fromID является стартовым UID диапазона для user namespace процесса $pid
  • $lenght — это длина диапазона.
  • Трансляция $toID зависит от читающего процесса X. Если X принадлежит другому user namespace U, то $toID — это стартовый UID диапазона в U, который мапится с $fromID . В противном случае $toID — это стартовый UID диапазона в P — родительского user namespace процесса C.

Например, если процесс читает файл /proc/1409/uid_map и среди полученных строк видно 15 22 5 , то UID’ы с 15 по 19 в user namespace процесса 1409 маппятся в UID’ы 22-26 отдельного user namespace читающего процесса.

С другой стороны, если процесс читает из файла /proc/$$/uid_map (или map-файла любого процесса, принадлежащего тому же user namespace, что и читающий процесс) и получает 15 22 5 , то UID’ы c 15 по 19 в user namespace C маппятся в UID’ы c 22 по 26 родительского для C user namespace.

Давайте это попробуем:

Хорошо, это было не очень захватывающе, так как это были два крайних случая, но это говорит там о нескольких вещах:

  1. Вновь созданный user namespace будет фактически иметь пустые map-файлы.
  2. UID 4294967295 не маппится и непригоден для использования даже в root user namespace. Linux использует этот UID специально, чтобы показать отсутствие user ID.

Написание UID Map файлов

  1. Какие UID’ы доступны для процессов, которые относятся к целевому user namespace C.
  2. Какие UID’s в текущем user namespace соответствуют UID’ам в C.

Например, если мы из родительского user namespace P запишем следующее в map-файл для дочернего пространства имён C:

мы по существу говорим Linux, что:

  1. Что касается процессов в C, единственным UID’ами, которые существуют в системе, являются UID’ы 0 и 3 . Например, системный вызов setuid(9) всегда будет завершаться чем-то вроде недопустимого id пользователя.
  2. UID’ы 1000 и 0 в P соответствуют UID’ам 0 и 3 в C. Например, если процесс, работающий с UID 1000 в P, переключится в C, он обнаружит, что после переключения его UID стал root 0 .

Владелец пространств имён и привилегии

В предыдущем посте мы упомянули, что при создании новых пространств имён требуется доступ с уровнем суперпользователя. User namespaces не налагают этого требования. На самом деле, еще одной их особенностью является то, что они могут владеть другими пространствами имён.

Всякий раз, когда создаётся не user namespace N, Linux назначает текущий user namespace P процесса, создающего N, владельцем namespace N. Если P создан наряду с другими пространствами имён в одном и том же системном вызове clone , Linux гарантирует, что P будет создан первым и назначен владельцем других пространств имён.

Владелец пространств имён важен потому, что процесс, запрашивающий выполнения привилегированного действия над ресурсом, задействованным не user namespace, будет иметь свои UID привилегии, проверенные в отношении владельца этого user namespace, а не корневого user namespace. Например, скажем, что P является родительским user namespace дочернего C, а P и C владеют собственными network namespace M и N соответственно. Процесс может не иметь привилегий для создания сетевых устройств, включенных в M, но может быть в состоянии это делать для N.

Следствием наличия владельца пространств имён для нас является то, что мы можем отбросить требование sudo при выполнении команд с помощью unshare или isolate , если если мы запрашиваем также создание и user namespace. Например, unshare -u bash потребует sudo , но unshare -Uu bash — уже нет:

К сожалению, мы повторно применим требование прав суперпользователя в следующем посте, так как isolate нуждается в привилегиях root в корневом user namespace, чтобы корректно настроить Mount и Network namespace. Но мы обязательно отбросим привилегии командного процесса, чтобы убедиться, что команда не имеет ненужных разрешений.

Как разрешаются ID

Мы только что увидели процесс, запущенный от обычного пользователя 1000 внезапно переключился на root . Не волнуйтесь, никакой эскалации привилегий не было. Помните, что это просто маппинг ID: пока наш процесс думает, что он является пользователем root в системе, Linux знает, что root — в его случае — означает обычный UID 1000 (благодаря нашему маппингу). Так что в то время, когда пространства имён, принадлежащие его новому user namespace (подобно network namespace в C), признают его права в качестве root , другие (как например, network namespace в P) — нет. Поэтому процесс не может делать ничего, что пользователь 1000 не смог бы.

Всякий раз, когда процесс во вложенном user namespace выполняет операцию, требующую проверки разрешений — например, создание файла — его UID в этом user namespace сравнивается с эквивалентным ID пользователя в корневом user namespace путём обхода маппингов в дереве пространств имён до корня. В обратном направлении происходит движение, например, когда он читает ID пользователей, как мы это делаем с помощью ls -l my_file . UID владельца my_file маппится из корневого user namespace до текущего и окончательный соответствующий ID (или nobody, если маппинг отсутствовал где-либо вдоль всего дерева) отдаётся читающему процессу.

Групповые ID

Даже если мы оказались root в C, мы до сих пор ассоциированы с ужасной nogroup в качестве нашего ID группы. Нам просто нужно сделать то же самое для соответствующего /proc/$pid/gid_map . Прежде чем мы сможем это сделать, нам нужно отключить системный вызов setgroups (в этом нет необходимости, если у нашего пользователя уже есть CAP_SETGID capability в P, но мы не будем предполагать этого, поскольку это обычно идёт вместе с привилегиями суперпользователя), написав «deny» в файл proc/$pid/setgroups :

Реализация

Как вы можете видеть, есть много сложностей, связанных с управлением user namespaces, но реализация довольно проста. Всё, что нам нужно сделать, это написать кучу строк в файл — муторно было узнать, что и где писать. Без дальнейших церемоний, вот наши цели:

  1. Клонировать командного процесса в его собственном user namespace.
  2. Написать в UID и GID map-файлы командного процесса.
  3. Сбросить все привилегии суперпользователя перед выполнением команды.

1 достигается простым добавлением флага CLONE_NEWUSER в наш системный вызов clone .

Для 2 мы добавляем функцию prepare_user_ns , которая осторожно представляет одного обычного пользователя 1000 в качестве root .

И вызовем его из основного процесса в родительском user namespace прямо перед тем, как мы подадим сигнал командному процессу.

Для шага 3 мы обновляем функцию cmd_exec , чтобы убедиться, что команда выполняется от обычного непривилегированного пользователя 1000 , которого мы предоставили в маппинге (помните, что root пользователь 0 в user namespace командного процесса — это пользователь 1000 ):

И это всё! isolate теперь запускает процесс в изолированном user namespace.

В этом посте было довольно много подробностей о том, как работают User namespaces, но в конце концов настройка экземпляра была относительно безболезненной. В следующем посте мы рассмотрим возможность запуска команды в своём собственном Mount namespace с помощью isolate (раскрывая тайну, стоящую за инструкцией FROM из Dockerfile ). Там нам потребуется немного больше помочь Linux, чтобы правильно настроить инстанс.

В своих прошлых постах блога я уже затрагивал тему пользователей в операционной системе Linux. Например в теме о правах доступа в Linux я затрагивал вопросы принадлежности пользователя к группе, а так же то, что пользователи и группы имеют свои UID и GID. Так же поднималась тема о сбросе пароля пользователя root. Сегодня я бы хотел систематизировать знания о базе локальных пользователей в Linux, о том, как управлять пользователями и о файлах, отвечающих за управление пользователями.

Linux — это многопользовательская операционная система. Каждый пользователь в Linux принадлежит одной основной группе и одной или нескольким дополнительным группам. В Linux, как и в большинстве других операционных системах работа с пользователями заключается в наборе следующих манипуляций: добавление пользователя/группы, удаление пользователя/группы, модификация настроек пользователя/группы. Данные манипуляции производятся с помощью команд: useradd, groupadd, userdel, groupdel, usermod, groupmod, а так же passwd, gpasswd, id. Более подробно: Описание команд управления пользователями Linux. Существуют так же и графические средства администрирования пользователями, обычно они расположены в оболочке X в разделе Администрирование — Пользователи и группы.

Особенности управления пользователями в Linux

Пример добавления пользователя с помощью шелла:

В примере мы добавляем группу для нового пользователя (groupadd), далее создаем нового пользователя с полным именем Test Test, имеющего основную группу test и логин test, далее задаем пароль для пользователя test (passwd test) и проверяем параметры созданного пользователя (id и созданный каталог пользователя /home/test/). В листинге видно, что UID и GID — более 1000. Данная особенность является признаком обычного пользователя. Значения ниже (меньше) 1000 (а в некоторых дистрибутивах — меньше 500) указывают на то, что пользователь является системным пользователем.

В соответствии с соглашением, системные пользователи обычно имеют id меньше, чем 100, а пользователь root имеет id, равный 0. Автоматическая нумерация обычных пользователей начинается со значения UID_MIN, установленного в файле /etc/login.defs, это значение обычно установлено в 500 или 1000.

Помимо учетных записей обычных пользователей и учетной записи пользователя root, обычно в системе бывает несколько учетных записей специального назначения для демонов, таких как FTP, SSH, mail, news и т.д. Такие учетные записи часто управляют файлами, но к ним невозможно получить доступ путем обычной регистрации в системе. Поэтому обычно они имеют login shell, определенный как /sbin/nologin или /bin/false, чтобы попытки зарегистрироваться в системе терпели неудачу.

В некоторых системах, команда(ы) добавления пользователей имеют расширенный функционал. То есть, для примера, команда useradd в дистрибутивах Fedora и Red Hat по умолчанию, для нового пользователя создает новую группу и для отмены данной функции, необходимо использовать опцию -n. Для уточнения таких вопросов, необходимо обратиться к документации дистрибутива.

При удалении пользователя, его каталог не удаляется. В результате можно получить интересную ситуацию:

Управление базами данных пользователей и групп в Linux

Основные файлы, содержащие информацию о пользователях и группах, — это четыре файла в каталоге /etc.

файл паролей, содержащий основную информацию о пользователях

файл теневых шифрованных паролей, содержащий зашифрованные пароли

файл групп, содержащий основную информацию о группах и принадлежащих этим группам пользователях

файл теневых групп, содержащий шифрованные пароли групп

Данные файлы редактировать обычным текстовым редактором крайне не рекомендуется. Они (файлы), обновляются при выполнении вышеуказанных команд, при этом при изменении — блокируются и синхронизируются.

Если все же есть острая необходимость в редактировании указанный файлов, то при помощи команды vipw можно безопасно редактировать файл /etc/passwd, а при помощи команды vigr безопасно редактировать файл /etc/group. Эти команды заблокируют необходимые файлы на то время, пока при помощи редактора vi будут производиться изменения. Если вы вносите изменения в файл /etc/passwd, команда vipw подскажет, что необходимо проверить, не нужно ли обновить и файл /etc/shadow. Подобным образом, если вы обновляете файл /etc/group при помощи команды vigr, вы получите подсказку, что необходимо обновить и файл /etc/gshadow. Если необходимо удалить администраторов группы, необходимо использовать команду vigr, поскольку команда gpasswd позволяет только добавлять администраторов.

Обращаю внимание, что в современных системах, файлы passwd и group не хранят пароли в открытом виде. Это сделано из соображений безопасности. Сами файлы passwd и group должны быть доступными для чтения для всех, а зашифрованные пароли — недоступными для чтения для всех. Поэтому зашифрованные пароли хранятся в теневых файлах, и эти файлы доступны для чтения только пользователю root. Необходимый доступ для изменения аутентификационных данных обеспечивается при помощи suid-программы, которая имеет полномочия пользователя root, но может быть запущена любым пользователем.

Файл /etc/passwd

Файл /etc/passwd содержит одну строку для каждого пользователя системы. Каждая строка содержит семь полей, разделенных двоеточиями (:), описание полей на примере пользователя root:

поле значение описание
Имя пользователя root имя, используемое для входа в систему (логин)
Пароль x пароль пользователя (если зашифрован, используется символ — x)
id пользователя (UID) 0 Идентификатор пользователя
id группы (GID) 0 Идентификатор группы
Комментарий root Необязательное поле, используемое для описания пользователя. Например, для указания полного имени. Это поле может содержать несколько разделенных запятыми записей.
Домашний каталог /root Абсолютный путь для домашнего каталога пользователя.
Командная оболочка /bin/bash Программа, которая автоматически запускается при входе пользователя в систему. Обычно это интерактивный shell, такой как /bin/bash или /bin/sh, но это может быть и другая программа, не обязательно интерактивный shell.

Файл /etc/group

Файл /etc/group содержит одну строку для каждой группы системы.Каждая строка содержит четыре поля, разделенных двоеточиями (:), описание на примере группы root:

поле значение описание
Имя группы root Имя группы
Пароль x пароль группы (если зашифрован, используется символ — x)
id группы (GID) 0 идентификатор группы
Члены группы Разделенный запятыми список членов группы, за исключением тех членов, для которых это группа является основной.

Файл /etc/shadow

Файл /etc/shadow должен быть доступен для чтения только для пользователя root. Пароли могут быть зашифрованы при помощи DES, но чаще для шифрования используется MD5. Описание полей файла:

поле значение описание
имя пользователя test123 имя, используемое для входа в систему (логин)
Зашифрованный пароль $1$.ArJtddq$H399O2dO6aDa99UmDjJ7/1 Пароль в зашифрованном виде
количество дней 14959 количество дней с 1 января 1970, после которых производилось последнее изменение пароля
количество дней 0 количество дней до смены пароля
количество дней 99999 количество дней, после которых пользователь должен сменить пароль
количество дней 7 количество дней, после которых пользователь получает предупреждение о необходимости смены пароля
количество дней пусто количество дней, после истечения срока действия пароля, после которых учетная запись блокируется
количество дней пусто количество дней, с 1 января 1970, до которых действует учетная запись
количество дней пусто зарезервированное поле

Файл /etc/gshadow

Файл /etc/gshadow содержит информацию о группах, состоит из четырех полей для каждой записи:

поле значение описание
Имя группы test123 Имя группы
Пароль ! Поле используется для хранения зашифрованного пароля, если у группы имеется пароль. Если группа не имеет пароля, здесь можно увидеть ‘x’, ‘!’ или ‘!!’.
Администраторы пусто Разделенный запятыми список администраторов группы.
Члены группы пусто Разделенный запятыми список членов группы.

Вот такая ситуация с пользователями в Linux.

Подведу маленький итог:

Пользователи в Linux управляются командами указанными тут. Информация о пользователях и группах храниться в четырех файлах /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow. Данные файлы не редактируются стандартным редактором, только специальными командами управления пользователями и группами (useradd, userdel, usermod, groupadd, groupdel, groupmod, passwd и т.д.) или специальными командами редактирования (vipw, vigr и т.д.). Формат содержимого файлов представляет собой несколько строк, каждая из которых соответствует одному пользователю или группе.

В данной статье мы рассмотрим, что такое пользователи в Linux, как их смотреть, как их создавать, изменять и удалять, а так же, как рулить группами пользователей. Поехали?

По факту это любой кто использует компьютер. Имя пользователя это как правило его псевдоним, логин, который может состоять из букв Eng алфавита, арабских чисел и нижнего подчеркивания. Использовать можно любое имя кроме root, hal и adm, так как эти имена являются зарезервированными системой именами. Кроме логина в системе может храниться и полное имя реального пользователя, что иногда, при администрировании бывает полезным.

а расшифровывается она следующим образом:

  • account — логин пользователя
  • password — зашифрованный пароль пользователя
  • UID — id пользователя (uid создается более 1000)
  • GID — id основной группы (gid создается более 100)
  • GECOS — дополнительная информация о пользователе (не обязательно)
  • directory — домашний каталог ($HOME) пользователя
  • shell — командный интерпретатор пользователя (обычно /bin/sh)

Чтобы посмотреть какие пользователи существуют в системе, достаточно набрать следующую команду:

Ну и никто не запрещает посмотреть активных в данный момент пользователей:

При создании пользователя, нужно выполнить ряд следующих действий:

  1. создается запись в /etc/passwd
  2. создается домашний каталог пользователя (/home/username)
  3. устанавливаются необходимые права
  4. назначается необходимая командная оболочка
  5. модифицируются конфигурационные файлы прочих приложений

Чтобы как то упростить жизнь администраторам, существует специальная утилита useradd. Настройки этой утилиты хранятся в файле /etc/default/useradd, в котором можно изменить применяемые новым пользователям параметры по умолчанию.

Чтобы создать нового пользователя lolosh в группе users и lalki достаточно набрать следующую команду:

расшифровывается эта команда следующим образом:

Что означают эти ключи:

  • m — создаёт домашний каталог, вида /home/[имя пользователя]
  • -g — имя или номер основной группы пользователя
  • -G — список дополнительных групп, в которые входит пользователь
  • -s — определяет командную оболочку пользователя.

Подробнее узнать о том, что умеет эта утилита можно почитать в man страницах.

Для того, чтобы наделить пользователя дополнительной информацией, можно воспользоваться командой chfn. Рассмотрим что мы можем добавить:

Подробнее, о возможностях этой команды читайте man.

Для того, чтобы задать пользователю пароль, достаточно воспользоваться следующей командой:

далее программа дважды попросит ввести новый пароль.

Если мы хотим, чтобы пользователь сменил пароль при первом входе, можно воспользоваться следующей командой:

Так же еще можно установить срок годности учетной записи и многое другое, подробно можно почитать man.

Удалить пользователя можно следующей командой:

Обратите внимание, с указанным ключом -r удаляется и его домашняя директория.

Тут так же нет ничего сложного. Чтобы просмотреть список существующих групп, достаточно отобразить файл /etc/group:

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

Linux — начинающим. Часть 6. Управление пользователями и группами. Теория

Пользователи окружают нас всюду, в современных информационных системах это одно из ключевых понятий, вокруг которого строится вся система разграничения прав доступа и безопасности. Поэтому умение управлять пользователями и группами — это один из основных навыков необходимых любому администратору. Базовые механизмы управления пользователями и доступом в Linux достаточно просты и некоторым могут показаться грубыми, но нельзя осваивать более сложные механизмы, не обладая базовыми навыками, поэтому давайте начинать изучение этой непростой темы с самых ее азов.

Чтобы понять современную систему пользователей в Linux сделаем небольшой экскурс в историю. Как известно, Линус Торвальдс создавал ОС по образу и подобию UNIX и поэтому в основе Linux лежат многие простые и изящные решения этой системы. Одна из замечательных абстракций UNIX — это все есть файл, т.е. файлами также являются устройства, процессы, сетевые сокеты и т.д. и т.п. Это позволяет делать при помощи достаточно простых инструментов довольно сложные вещи, например, чтобы сделать образ диска достаточно просто скопировать файл блочного устройства в файл образа, а для работы с последовательным портом достаточно прочитать или записать что-либо в файл устройства ввода-вывода.

У каждого файла обязательно есть владелец и группа, которой он принадлежит. На этой схеме строится классическая система прав в Linux и UNIX: владелец, группа и остальные. Более подробно о ней вы можете прочитать в предыдущих частях нашего цикла:

Таким образом пользователи и группы определяют доступ не только к файлам в привычном нам понимании, но и ко всему спектру объектов операционной системы: процессам, устройствам, сокетам. Просто запомните, что все есть файл, а каждый файл имеет владельца и группу.

Условно всех пользователей можно разделить на специальных, служебных и обычных, но повторимся еще раз — деление это условное, все различие между ними заключается в предоставляемых им правах и некоторых иных возможностях. Чтобы получить список пользователей системы откроем файл /etc/passwd:

linux-user-and-group-management-001.jpg

Давайте рассмотрим его структуру подробнее. Каждая строка соответствует одному пользователю и имеет следующий формат:

С именем пользователя все понятно, а вот второй параметр может вызвать некоторое недоумение. Когда-то давно пароли хранились в открытом виде, о чем намекает само название файла, но затем от этой практики отказались и современные системы не хранят пароли в каком-либо виде вообще, хранится только сформированный по специальному алгоритму хеш, такие пароли в Linux называются затененными ( shadow). Для такого пароля во втором поле всегда ставится символ x.

UID (User identifier) и GID (Group identifier) — числовые идентификаторы пользователя и группы. Важно понимать, что система различает пользователей именно по UID, а не по наименованиям и многие системы имеют возможность создать несколько пользователей с одинаковым UID, с точки зрения системы это будет один и тот же пользователь.

Этим часто пользуются злоумышленники, один из типовых сценариев проникновения предусматривает создание пользователя с неприметным именем, но идентификаторами root, что позволяет действовать в системе от имени суперпользователя не привлекая ненужного внимания.

В реальных сценариях данную возможность использовать не следует, так как наличие таких пользователей может вызвать конфликты в системе. Например, Gnome 3 в Debian 10 просто отказался загружаться после того, как мы создали такого пользователя.

В поле комментарий можно написать все что угодно, определенного формата в современных системах нет, но исторически данное поле называется GECOS и подразумевает перечисление через запятую следующих опций:

Следующие два поля указывают на домашнюю директорию пользователя и его командную оболочку. Разным пользователям можно назначить разные командные оболочки, скажем, ваш коллега предпочитает zsh, то вы можете без проблем назначить ему любимую оболочку.

Рассмотрение командных оболочек Linux выходит за рамки данной статьи, поэтому мы оставим эту тему, но расскажем о двух специализированных «оболочках», которые указывают, когда пользователю запрещен интерактивный вход в систему. Это обычно применяется для служб и пользователей от имени которых исполняются некоторые скрипты. Даже если такая учетная запись будет скомпрометирована войти в консоль с ней не удастся.

Обычно для этой цели используется:

В современных системах директория /sbin является символической ссылкой на /usr/sbin. Реже используется «оболочка»:

linux-user-and-group-management-002.jpg

Как мы уже говорили выше, всех пользователей можно условно разделить на три группы. К специальным пользователям относятся root (суперпользователь) и nobody (с группами root и nogroup). Это практически полные противоположности, root имеет наименьшие UID и GID — 0 и является обладателем неограниченных прав, он имеет доступ к любому объекту системы и может выполнять любые настройки. В отличие от Администратора Windows, который максимально огражден от деструктивных действий, root может с легкостью уничтожить систему.

Мы думаем, что следующая команда известна каждому, а некоторым — печально известна:

Предупреждение! Данная команда уничтожает корневую файловую систему, что приводит к ее полной неработоспособности и потере всех данных. Приведена сугубо в качестве примера.

Современные дистрибутивы по умолчанию блокируют выполнение явно деструктивных команд, но не запрещают их, все это выглядит как предупреждение: «так делать опасно, но если ты настаиваешь. «

linux-user-and-group-management-003.jpg

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

Хорошая практика — сделать учетную запись root недоступной для интерактивного входа (как в Ubuntu) используя для повышения прав исключительно sudo, особенно это касается серверов с доступом к SSH из сети интернет.

Пользователь nobody (никто) — имеет наибольший идентификатор — 65534 и не может являться владельцем ни одного файла в системе, не состоит ни в одной привилегированной группе и не имеет никаких полномочий кроме стандартных. Используется для запуска от его имени процессов с низким уровнем доверия, чтобы ограничить их доступ к системе в случае возможной компрометации. Фактически к nobody будут всегда применяться права для «остальных» и при стандартных наборах привилегий 644 на файлы и 755 на директории он будет иметь возможность исключительно чтения и просмотра содержимого каталогов. Для чувствительных конфигурационных файлов, ключей и сертификатов используются более ограниченные наборы прав 640 или 600, к таким файлам nobody доступа не имеет.

Следующая условная группа — системные пользователи, которые используются для запуска служб и доступа к устройствам, например, www-data для веб-сервера или systemd-network для управления сетью через systemd. Первоначально для них выделялись идентификаторы от 1 до 100, но в связи с большим количеством служб в современных системах этот диапазон расширен до 499 в RHEL и производных от него, и до 999 в системах основанных на Debian.

Существует соглашение, что этот диапазон идентификаторов используется только системными службами и в нем не должно быть обычных пользователей. Однако никто не мешает назначить службе UID выше 1000, а пользователю менее 999, но никаких последствий это иметь не будет и никак не скажется на привилегиях. Это разделение чисто условное и предназначено для повышения удобства администрирования. Встретив в незнакомой системе пользователя с UID до 999, вы будете с большой долей вероятности предполагать, что это служба.

Кроме того, для многих стандартных пользователей идентификаторы зарезервированы, так во всех Debian и основанных на нем дистрибутивах www-data имеет UID и GID — 33, а proxy — 13. Это удобно, скажем вместо:

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

Многое стороннее ПО, например, сервер 1С и сборки PostgresPro занимают ближайшие свободные идентификаторы с верхнего конца диапазона: 999, 998 и т.д.

Из всего изложенного выше вы должны понимать, что система определяет пользователей по идентификаторам, а не по именам, а присвоение идентификаторов регулируется определенными правилами, но никакие из них, кроме двух специальных (0 для root и 65534 для nobody), не дают каких-либо дополнительных прав или привилегий.

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

Посмотреть список групп можно в файле /etc/group

linux-user-and-group-management-004.jpg

Он имеет следующий формат:

Большая часть полей аналогична записям в файле /etc/passwd и мы не будем подробно останавливаться на них. Разберем последний параметр — пользователи группы. При создании пользователя в Linux, если не указано иное, ему автоматически создается основная группа с повторяющим имя названием. Такой пользователь в последнем поле не указывается. Это хорошо видно на скриншоте выше. Но мы можем создать и отдельную группу, которая первоначально не содержит пользователей, и она будет иметь точно такой же вид записи с пустым последним полем.

После того как мы добавим пользователей в группу они будут перечислены в последнем поле через запятую.

linux-user-and-group-management-005.jpg

Давайте внимательно посмотрим на скриншот и проанализируем членство созданного при установке пользователя andrey в дополнительных группах. Практически все они связанны с доступом к оборудованию или дают возможность использовать некоторые системные механизмы, скажем группа plugdev предоставляет возможность монтировать съемные устройства.

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

Теперь о паролях, как мы уже говорили, современные системы не хранят пароли в открытом виде, а используют для этого хеши — односторонние криптографические функции, при вводе пароля система вычисляет его хеш и сравнивает с уже сохраненным, если хеши совпадают — то пароль введен верно. Такие пароли в Linux называются «затененными» и хранятся в отдельных файлах. Для пользователей это файл /etc/shadow:

linux-user-and-group-management-006.jpg

Синтаксис этого файла предусматривает девять полей, содержащих следующую информацию:

  • Имя пользователя
  • Хеш пароля, если поле содержит ! или *, это означает, что учётная запись заблокирована и этот пользователь не сможет войти в систему.
  • Дата последней смены пароля — Количество дней, прошедших с 1 января 1970 г.
  • Число дней, которое должно пройти до смены пароля — Минимальный срок (в днях), который должен пройти, прежде чем пользователь сможет сменить пароль.
  • Число дней, после которого необходимо сменить пароль — Максимальный срок (в днях), по истечении которого необходимо сменить пароль.
  • Число дней до предупреждения о необходимости смены пароля — Число дней до истечения срока действия пароля, в течение которых пользователь получает предупреждение об окончании его срока действия.
  • Число дней до отключения учётной записи — Число дней после окончания срока действия пароля до отключения учётной записи.
  • Дата отключения учетной записи — Количество дней, прошедших с 1 января 1970 г.
  • Зарезервированное поле

Наибольший интерес представляет второе поле, содержащее хеш пароля, оно имеет структуру:

Где ID — применяемый тип шифрования, могут использоваться следующие значения:

  • $1 — MD5, самый слабый хеш, в настоящее время не используется
  • $2 — Blowfish, использовался в BSD-системах
  • $5 — SHA-256
  • $6 — SHA-512

В современных системах используется наиболее стойкий хеш SHA-512.

Следующая часть строки — SALT — это соль (модификатор), генерируется случайно для каждого пользователя и используется для увеличения стойкости пароля. Хеш — это односторонняя криптографическая функция, которая позволяет быстро вычислить результат, но сделать обратное преобразование хеша невозможно. Единственный возможный вариант атаки — это подбор. Существуют уже вычисленные значения хеша для наиболее часто используемых сочетаний и словарных слов, т.н. радужные таблицы, с их помощью атака на хеш производится поиском по уже готовой базе.

Соль позволяет исключить атаки при помощи заранее вычисленных значений и при ее случайном значении позволяет скрыть наличие у пользователей одинаковых паролей. На скриншоте выше пользователям ivan и maria были установлены одинаковые пароли, но за счет различной соли они имеют различный хеш.

Ну и наконец ENCRYPTED — это, собственно, хеш. Кроме того, данное поле может содержать спецсимволы: *, ! и . Все они обозначают, что учетная запись заблокирована для входа с паролем, но не запрещают иные варианты входа (по SSH-ключу). Символ * обычно используется для системных учетных записей, которым вход в систему запрещен, ! ставится для записей пользователей без пароля или заблокированных администратором (тогда ! ставится перед содержимым поля). Иногда используется символ . означающий что данной учетной записи никогда не присваивался пароль (также для такой записи может использоваться просто !).

Для групп используется аналогичный по назначению файл /etc/gshadow

linux-user-and-group-management-007.jpg

Его структура более проста, а поля имеют следующее назначение:

  • Имя группы
  • Хеш пароля, если пароль установлен, не члены группы могут войти в нее, выполнив команду newgrp и указав пароль. Если это поле содержит * или !, ни один пользователь не сможет войти в неё указав пароль.
  • Администраторы группы — Перечисленные здесь (через запятую) члены группы могут добавлять или удалять членов группы с помощью команды gpasswd.
  • Члены группы — Здесь перечисляются (через запятую) обычные члены группы, не администраторы.

Поле пароля также может содержать спецсимволы и также как для пользователей символ * используется преимущественно для системных групп, а ! для групп пользователей. По умолчанию пароли групп отсутствуют и вход в них заблокирован, т.е. никто, кроме членов группы, не может войти в группу, а членам пароль не нужен.

Файлы shadow и gshadow содержат важную учетную информацию и должны быть хорошо защищены. Владельцами этих файлов является root:shadow и права доступа для них установлены как 640. Это означает, что вносить изменения в них может только владелец — root, а читать только члены специальной группы shadow. Это дополнительный уровень безопасности, позволяющий исключить доступ к этим файлам добавлением пользователя в группу root (что даст доступ на чтение к другим конфигурационным файлам).

linux-user-and-group-management-008.jpg

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

Поэтому даже если что-то пойдет не так, всегда есть возможность (при условии физического доступа к системе) восстановить состояние этих файлов на момент перед внесением изменений в конфигурацию. В качестве примера приведем следующую ситуацию: вы случайно удалили единственного пользователя с административными правами из группы sudo, root при этом заблокирован, после завершения сеанса в системе не останется ни одного привилегированного пользователя.

Читайте также:

  • Как сгенерировать ssh keys для git windows
  • Telnet centos 7 команды
  • Apps and features windows 10 как открыть
  • Nvtray exe что это за процесс windows 7
  • 1с получить mac адрес

Все, что вам нужно знать о UID в Linux

Все, что вам нужно знать о UID в Linux

Эта статья по основам Linux научит вас всему важному, связанному с UID в Linux.

Что такое UID в Linux?

UID обозначает идентификатор пользователя. UID — это номер, назначенный каждому пользователю Linux. Это представление пользователя в ядре Linux.

UID используется для идентификации пользователя в системе и для определения того, к каким системным ресурсам пользователь может получить доступ. Вот почему идентификатор пользователя должен быть уникальным.

Вы можете найти UID в файле /etc/passwd. Это тот же файл, который можно использовать для составления списка всех пользователей в системе Linux.

Используйте команду Linux для просмотра текстового файла, и вы увидите различную информацию о пользователях, присутствующих в вашей системе.

root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin andreyex:x:1000:1000:Andrey. /home/helder:/bin/bash davmail:x:127:65534::/var/lib/davmail:/usr/sbin/nologin statd:x:128:65534::/var/lib/nfs:/usr/sbin/nologin

Третье поле здесь представляет идентификатор пользователя или UID.

Обратите внимание, что в большинстве дистрибутивов Linux UID 1-500 обычно зарезервирован для системных пользователей. В Ubuntu и Fedora UID для новых пользователей начинаются с 1000.

Например, если вы используете команду useradd или adduser для создания нового пользователя, он получит следующий доступный номер после 1000 в качестве своего UID.

Корневой пользователь
В Linux UID — 0 и GID — 0 зарезервированы для пользователя root.

Как найти UID пользователя в Linux?

Вы всегда можете положиться на файл /etc/passwd, чтобы получить UID пользователя. Это не единственный способ получить информацию UID в Linux.

Команда id в Linux отобразит UID, GID и группы, к которым принадлежит ваш текущий пользователь:

id uid=1000(andreyex) gid=1000(andreyex) groups=1000(andreyex),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),127(kvm)

Вы также можете указать имена пользователей с помощью команды id, чтобы получить UID любого пользователя Linux:

id standard uid=1001(standard) gid=1001(standard) groups=1001(standard)

Как изменить UID пользователя в Linux?

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

Вы можете изменить UID, изменив пользователя с помощью команды usermod следующим образом:

usermod -u 1004 user_2

Вы должны иметь привилегию суперпользователя для выполнения вышеуказанной команды.

Вы помните концепцию прав доступа и владения файлами в Linux? Право собственности на файл определяется UID пользователя-владельца.

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

Что вы можете сделать, это вручную обновить владельца файлов, связанных со старым UID пользователя_2.

find / -user old_uid_of_user_2 -exec chown -h user_2 <> \;

Вот и все. Мы надеемся, что теперь у вас есть лучшее представление об UID в Linux. Не стесняйтесь задавать свои вопросы, если таковые имеются.

Как профессиональный пользователь Linux, если вы думаете, что мы пропустили какое-то важное понятие об UID, пожалуйста, дайте мне знать в разделе комментариев.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *