Права доступа к файлам в Linux
17.01.2022Ни одна система не будет полной без какой-либо формы безопасности. Должен быть доступен механизм для защиты файлов от несанкционированного просмотра или изменения. Система Linux следует методу разрешений файлов Unix, разрешая отдельным пользователям и группам доступ к файлам на основе набора параметров безопасности для каждого файла и каталога.
Изучение безопасности Linux
Ядром системы безопасности Linux является учетная запись пользователя. Каждому лицу, имеющему доступ к системе Linux, должна быть назначена уникальная учетная запись пользователя. Какие разрешения имеют пользователи для объектов в системе, зависит от учетной записи пользователя, с которой они входят в систему.
Разрешения пользователей отслеживаются с помощью идентификатора пользователя (часто называемого UID), который назначается учетной записи при ее создании. UID — это числовое значение, уникальное для каждого пользователя. Однако вы не входите в систему Linux, используя свой UID. Вместо этого вы используете имя для входа. Логин представляет собой буквенно-цифровую текстовую строку из восьми или менее символов, которую пользователь использует для входа в систему (вместе с соответствующим паролем).
Система Linux использует специальные файлы и утилиты для отслеживания и управления учетными записями пользователей в системе. Прежде чем мы сможем обсудить права доступа к файлам, нам нужно изучить, как Linux обрабатывает учетные записи пользователей.
Файл /etc/passwd
Система Linux использует специальный файл для сопоставления имени пользователя с соответствующим значением UID. Это файл /etc/passwd. Файл /etc/passwd содержит несколько фрагментов информации о пользователе. Вот как выглядит типичный файл /etc/passwd в системе Linux:
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
…
rich:x:500:500:Rich Blum:/home/rich:/bin/bash
mama:x:501:501:Mama:/home/mama:/bin/bash
katie:x:502:502:katie:/home/katie:/bin/bash
jessica:x:503:503:Jessica:/home/jessica:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
$
Список может быть очень длинным. Учетная запись пользователя root является администратором системы Linux и ей всегда назначается UID 0. Как видите, система Linux создает множество учетных записей пользователей для различных функций, которые не являются реальными пользователями. Они называются системными учетными записями. Системная учетная запись — это специальная учетная запись, которую службы, работающие в системе, используют для получения доступа к ресурсам в системе. Все службы, работающие в фоновом режиме, должны быть зарегистрированы в системе Linux под системной учетной записью пользователя.
До того, как безопасность стала большой проблемой, эти службы часто просто входили в систему, используя учетную запись пользователя root. К сожалению, если неавторизованный пользователь взломал один из этих сервисов, он мгновенно получил доступ к системе как пользователь root. Чтобы предотвратить это, теперь почти каждая служба, работающая в фоновом режиме на сервере Linux, имеет собственную учетную запись пользователя для входа в систему. Таким образом, даже если нарушитель компрометирует службу, он не обязательно сможет получить доступ ко всей системе.
Linux резервирует UID ниже 500 для системных учетных записей. Некоторым службам для правильной работы даже требуются определенные UID. Когда вы создаете учетные записи для обычных пользователей, большинство систем Linux назначают первый доступный UID, начинающийся с 500 (хотя это не обязательно верно для всех дистрибутивов Linux, таких как Ubuntu, который начинается с 1000).
Вы, наверное, заметили, что файл /etc/passwd содержит намного больше, чем просто имя пользователя и UID. Поля файла /etc/passwd содержат следующую информацию:
- Имя пользователя для входа
- Пароль для пользователя
- Числовой UID учетной записи пользователя
- Числовой идентификатор группы (GID) основной группы пользователя.
- Текстовое описание учетной записи пользователя (так называемое поле комментария).
- Расположение каталога $HOME для пользователя
- Оболочка по умолчанию для пользователя
В поле пароля в файле /etc/passwd указано значение x. Это не означает, что все учетные записи пользователей имеют один и тот же пароль. В старые времена Linux файл /etc/passwd содержал зашифрованную версию пароля пользователя. Однако, поскольку многим программам требуется доступ к файлу /etc/passwd для получения информации о пользователе, это стало своего рода проблемой безопасности. С появлением программного обеспечения, которое могло легко расшифровывать зашифрованные пароли, злоумышленники усердно пытались взломать пароли пользователей, хранящиеся в файле /etc/passwd. Разработчикам Linux нужно было переосмыслить эту политику.
Теперь в большинстве систем Linux пароли пользователей хранятся в отдельном файле (так называемом теневом файле, расположенном в /etc/shadow). Доступ к этому файлу разрешен только специальным программам (например, программе входа в систему).
Файл /etc/passwd — это стандартный текстовый файл. Вы можете использовать любой текстовый редактор, чтобы вручную выполнять функции управления пользователями (такие как добавление, изменение или удаление учетных записей пользователей) непосредственно в файле /etc/passwd. Однако это крайне опасная практика. Если файл /etc/passwd будет поврежден, система не сможет его прочитать, и это не позволит никому (даже привилегированному пользователю) войти в систему. Вместо этого безопаснее использовать стандартные утилиты управления пользователями Linux для выполнения все функции управления пользователями.
Файл /etc/shadow
Файл /etc/shadow обеспечивает больший контроль над тем, как система Linux управляет паролями. Только пользователь root имеет доступ к файлу /etc/shadow, что делает его более безопасным, чем файл /etc/passwd.
Файл /etc/shadow содержит по одной записи для каждой учетной записи пользователя в системе. Запись выглядит так:
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
Каждая запись файла /etc/shadow включает девять полей:
- Логин, соответствующий логину в файле /etc/passwd
- Зашифрованный пароль
- День последнего изменения пароля, указанный как количество дней с 1 января 1970 г.
- Минимальное количество дней до смены пароля
- Количество дней до смены пароля
- Количество дней до истечения срока действия пароля, за которое пользователь получает предупреждение о смене пароля.
- Количество дней после истечения срока действия пароля, прежде чем учетная запись будет отключена
- Дата (сохраненная как количество дней с 1 января 1970 г.) с момента отключения учетной записи пользователя.
- Поле, зарезервированное для будущего использования
Используя систему теневых паролей, система Linux имеет гораздо более точный контроль над паролями пользователей. Он может контролировать, как часто пользователь должен менять свой пароль и когда отключать учетную запись, если пароль не был изменен.
Добавление нового пользователя
Основным инструментом, используемым для добавления новых пользователей в вашу систему Linux, является useradd. Эта команда предоставляет простой способ создать новую учетную запись пользователя и одновременно настроить структуру каталогов пользователя $HOME. Команда useradd использует комбинацию системных значений по умолчанию и параметров командной строки для определения учетной записи пользователя. Чтобы просмотреть системные значения по умолчанию, используемые в вашем дистрибутиве Linux, введите команду useradd с параметром -D:
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#
Значения по умолчанию для команды useradd задаются с помощью файла /etc/default/useradd. Кроме того, дополнительные параметры безопасности определяются в файле /etc/login.defs. Вы можете настроить эти файлы, чтобы изменить поведение безопасности по умолчанию в вашей системе Linux.
Параметр -D показывает, какие значения по умолчанию использует команда useradd, если вы не укажете их в командной строке при создании новой учетной записи пользователя. В этом примере показаны следующие значения по умолчанию:
Новый пользователь будет добавлен в общую группу с идентификатором группы 100.
- Новый пользователь будет иметь домашнюю учетную запись, созданную в каталоге /home/loginname.
- Учетная запись не будет отключена по истечении срока действия пароля.
- Срок действия новой учетной записи не истечет в установленную дату.
- Новая учетная запись будет использовать оболочку bash в качестве оболочки по умолчанию.
- Система скопирует содержимое каталога /etc/skel в каталог пользователя $HOME.
- Система создаст файл в почтовом каталоге, чтобы учетная запись пользователя могла получать почту.
Команда useradd позволяет администратору создать конфигурацию каталога $HOME по умолчанию, а затем использовать ее в качестве шаблона для создания каталога $HOME нового пользователя. Это позволяет автоматически помещать файлы по умолчанию для системы в каталог $HOME каждого нового пользователя. В системе Ubuntu Linux каталог /etc/skel содержит следующие файлы:
$ ls -al /etc/skel
total 32
drwxr-xr-x 2 root root 4096 2010-04-29 08:26 .
drwxr-xr-x 135 root root 12288 2010-09-23 18:49 ..
-rw-r—r— 1 root root 220 2010-04-18 21:51 .bash_logout
-rw-r—r— 1 root root 3103 2010-04-18 21:51 .bashrc
-rw-r—r— 1 root root 179 2010-03-26 08:31 examples.desktop
-rw-r—r— 1 root root 675 2010-04-18 21:51 .profile
$
Это стандартные файлы запуска для среды оболочки Bash. Система автоматически копирует эти файлы по умолчанию в созданный вами каталог $HOME каждого пользователя.
Вы можете проверить это, создав новую учетную запись пользователя, используя системные параметры по умолчанию, а затем просмотрев каталог $HOME для нового пользователя:
# useradd -m test
# ls -al /home/test
total 24
drwxr-xr-x 2 test test 4096 2010-09-23 19:01 .
drwxr-xr-x 4 root root 4096 2010-09-23 19:01 ..
-rw-r—r— 1 test test 220 2010-04-18 21:51 .bash_logout
-rw-r—r— 1 test test 3103 2010-04-18 21:51 .bashrc
-rw-r—r— 1 test test 179 2010-03-26 08:31 examples.desktop
-rw-r—r— 1 test test 675 2010-04-18 21:51 .profile
#
Для многих дистрибутивов Linux команда useradd по умолчанию не создает каталог $HOME, но параметр командной строки –m сообщает ей создать каталог $HOME. Вы можете изменить это поведение в файле /etc/login.defs. Как видно из примера, команда useradd создала новый каталог $HOME, используя файлы, содержащиеся в каталоге /etc/skel.
Чтобы выполнить команды администрирования учетной записи пользователя, вам нужно либо войти в систему как специальная учетная запись пользователя root, либо использовать команду sudo для запуска команд в качестве учетной записи пользователя root.
Если вы хотите переопределить значение или поведение по умолчанию при создании нового пользователя, вы можете сделать это с помощью параметров командной строки.
Они показаны в таблице:
Параметр | Описание |
-c comment | Добавьте текст в поле комментария нового пользователя. |
-d home_dir | Укажите другое имя для домашнего каталога, отличное от имени для входа. |
-e expire_date | Укажите дату в формате ГГГГ-ММ-ДД, когда истечет срок действия учетной записи. |
-f inactive_days | Укажите количество дней после истечения срока действия пароля, по истечении которого учетная запись будет отключена. Значение 0 отключает учетную запись, как только истечет срок действия пароля; значение -1 отключает эту функцию. |
-g initial_group | Укажите имя группы или GID группы входа пользователя. |
-G group . . . | Укажите одну или несколько дополнительных групп, к которым принадлежит пользователь. |
-k | Скопируйте содержимое каталога /etc/skel в каталог $HOME пользователя (также необходимо использовать -m). |
-m | Создайте каталог $HOME пользователя |
-M | Не создавайте каталог $HOME пользователя (используется, если по умолчанию он создается). |
-n | Создайте новую группу, используя то же имя, что и имя пользователя для входа. |
-r | Создайте системную учетную запись. |
-p passwd | Укажите пароль по умолчанию для учетной записи пользователя. |
-s shell | Укажите оболочку входа по умолчанию. |
-u uid | Укажите уникальный UID для учетной записи. |
Как видите, вы можете переопределить все системные значения по умолчанию при создании новой учетной записи пользователя, просто используя параметры командной строки. Однако, если вам приходится все время переопределять значение, проще просто изменить системное значение по умолчанию.
Вы можете изменить системные значения новых пользователей по умолчанию, используя параметр -D вместе с параметром, представляющим значение, которое необходимо изменить. Эти параметры приведены в таблице:
Параметр | Описание |
-b default_home | Измените место, где создаются домашние каталоги пользователей. |
-e expiration_date | Изменить срок действия для новых учетных записей. |
-f inactive | Изменить количество дней после истечения срока действия пароля до отключения учетной записи. |
-g group | Измените имя группы по умолчанию или используемый GID. |
-s shell | Измените оболочку входа по умолчанию. |
Изменить значения по умолчанию несложно:
# useradd -D -s /bin/tsch
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#
Теперь команда useradd будет использовать оболочку tsch в качестве оболочки входа по умолчанию для всех новых учетных записей пользователей, которые вы создаете.