Архитектура идентификации: UID, GID и системные файлы конфигурации
Архитектура идентификации: UID, GID и системные файлы конфигурации
Операционная система Linux абсолютно равнодушна к тому, как вас зовут. Для ядра системы не существует ни пользователя root, ни пользователя alice. Ядро — математический механизм, который оперирует исключительно числами. Если вы планируете автоматизировать управление доступом, первое, что нужно усвоить: имена созданы только для удобства людей, а реальная власть в системе базируется на числовых идентификаторах.
В этой статье мы разберем, как текстовые имена превращаются в системные числа, где хранится эта связь и почему понимание простых текстовых файлов — ключ к управлению всей инфраструктурой пользователей.
UID и GID: истинные лица пользователей
Каждому процессу и файлу в Linux назначен владелец. Этот владелец определяется двумя ключевыми числами:
- UID (User Identifier) — уникальный идентификатор пользователя.
- GID (Group Identifier) — уникальный идентификатор основной группы пользователя.
Когда вы вводите команду ls -l и видите, что файлом владеет alice, это лишь иллюзия, услужливо созданная утилитой ls. На самом деле файл принадлежит, например, UID . Утилита на лету «переводит» число в понятное имя.
В Linux существует строгая иерархия диапазонов UID:
| Диапазон UID | Назначение | Описание |
|---|---|---|
| 0 | Суперпользователь (root) |
Абсолютный властелин системы. Ядро предоставляет неограниченные права любому аккаунту с UID 0, независимо от его текстового имени. |
| 1 – 999 | Системные аккаунты | Используются для запуска служб (веб-сервер, база данных). Под ними нельзя войти в систему. Это изолирует процессы друг от друга ради безопасности. |
| Обычные пользователи | Реальные люди (или автоматизированные скрипты), которым нужен доступ к оболочке. При написании bash-скриптов для аудита обычно фильтруют именно этот диапазон. |
Мост между человеком и ядром: /etc/passwd
Если ядро понимает только числа, то как система узнает, что при вводе логина alice нужно использовать UID ? Эту роль выполняет плоский текстовый файл /etc/passwd.
Это главная база данных аккаунтов в Linux. В ней нет никакой магии — это просто таблица, где разделителем колонок выступает двоеточие (:).
Давайте препарируем типичную строку из этого файла:
alice:x:1001:1001:Alice Smith,,,:/home/alice:/bin/bash
Каждая запись состоит ровно из семи полей:
- Имя пользователя (
alice) — логин для входа. - Пароль (
x) — исторически здесь хранился зашифрованный пароль. Сейчас здесь всегда стоит букваx, указывающая, что пароль спрятан в другом, более безопасном месте. - UID (
1001) — тот самый номер, который система использует под капотом. - GID (
1001) — номер основной группы пользователя. - GECOS (
Alice Smith,,,) — информационное поле. Обычно содержит полное имя, номер кабинета или рабочий телефон. Запятые разделяют эти метаданные. - Домашняя директория (
/home/alice) — папка, в которую попадает пользователь сразу после успешного входа. - Оболочка (Shell) (
/bin/bash) — программа, которая запускается при входе. Если здесь указать/usr/sbin/nologin, аккаунт будет существовать, но войти в него через терминал станет невозможно (так делают для системных служб).
Иллюзия команды useradd
Зная структуру /etc/passwd, вы получаете важный инсайт для автоматизации: команда useradd не делает ничего сверхъестественного. Это просто скрипт-обертка, который:
- Находит первый свободный UID .
- Добавляет новую строку в конец
/etc/passwd. - Создает папку в
/homeи копирует туда базовые файлы.
Теоретически, вы можете создать пользователя вручную, просто открыв /etc/passwd в текстовом редакторе и дописав туда строку. Система примет этого пользователя как родного.
Эволюция безопасности: файл /etc/shadow
Вы обратили внимание на букву x во втором поле /etc/passwd?
На заре развития Unix зашифрованные пароли хранились прямо в /etc/passwd. Проблема заключалась в том, что этот файл должен быть доступен для чтения всем пользователям системы. Иначе команда ls не смогла бы прочитать файл, чтобы перевести UID владельца файла в имя, и система бы сломалась.
Когда вычислительные мощности выросли, злоумышленники начали просто копировать /etc/passwd и подбирать пароли на своих компьютерах методом перебора (брутфорс).
Решением стало разделение:
- Публичная информация (имена, UID, папки) осталась в
/etc/passwd(доступен всем для чтения). - Секретная информация (хэши паролей) переехала в файл
/etc/shadow.
Файл /etc/shadow доступен для чтения только пользователю root. Обычный пользователь не может даже посмотреть, как выглядит зашифрованный пароль соседа.
Пример строки из /etc/shadow:
alice:$6$xyz123$vT...longhash...:19245:0:99999:7:::
Здесь поля также разделены двоеточиями, но их смысл связан исключительно с безопасностью:
- Имя пользователя (
alice) — для связи с/etc/passwd. - Хэш пароля (
$6$...) — криптографический хэш. Если здесь стоит*или!, вход по паролю заблокирован (полезно для сервисных аккаунтов или при доступе только по SSH-ключам). - Дата изменения — количество дней с 1 января 1970 года, когда пароль менялся в последний раз.
- Политики устаревания — последующие числовые поля определяют, через сколько дней пользователь обязан сменить пароль, за сколько дней его предупредить и когда заблокировать аккаунт окончательно.
Резюме
Архитектура идентификации в Linux элегантна в своей простоте. Вся сложная система прав доступа опирается на два плоских текстовых файла: /etc/passwd для маршрутизации имен в числа и /etc/shadow для безопасной аутентификации.
Понимая, что ядро доверяет только UID, а не текстовому логину, вы сможете избежать критических ошибок при написании скриптов автоматизации. В следующей главе мы расширим эту модель и посмотрим, как работает файл /etc/group и почему концепция групп является фундаментом для коллективной работы с файлами.