После завершения этого раздела учащиеся смогут:
управлять разрешениями по умолчанию для новых файлов, создаваемых пользователями;
объяснить влияние специальных разрешений;
использовать специальные разрешения и разрешения по умолчанию, чтобы назначить группу-владельца для файлов, созданных в определенном каталоге.
Специальные разрешения — это четвертый тип разрешений в дополнение к основным типам (пользователь, группа и остальные). Как следует из названия, эти разрешения предоставляют дополнительные функции, связанные с доступом, помимо тех функций, которые дают основные типы разрешений. В этом разделе подробно описано влияние специальных разрешений. В таблице ниже приведена сводная информация по ним.
Таблица 7.2. Влияние специальных разрешений на файлы и каталоги
Специальное разрешение
Влияние на файлы
Влияние на каталоги
u+s (suid)
u+s
Файл выполняется от имени пользователя, который владеет файлом, а не пользователя, который вызвал его выполнение.
Не влияет.
g+s (sgid)
g+s
Файл выполняется от имени группы, которая владеет файлом.
Для новых файлов, созданных в каталоге, в качестве группы-владельца задается группа-владелец каталога.
o+t (sticky)
o+t
Пользователи с разрешением на запись в каталог могут удалять только те файлы, которыми они владеют; они не могут удалять или принудительно сохранять данные в файлы, принадлежащие другим пользователям.
Наличие разрешения setuid для исполняемого файла означает, что команды будут выполняться от имени пользователя, являющегося владельцем файла, а не от имени пользователя, который выполнил команду. Рассмотрим в качестве примера команду passwd.
[user@host ~]$ ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 35504 Jul 16 2010 /usr/bin/passwd
[user@host ~]$
ls -l /usr/bin/passwd
s
В длинном списке найти разрешения setuid можно по букве s в нижнем регистре там, где обычно должно быть x (разрешения на выполнение владельцем). Если у владельца нет разрешений на выполнение, s заменяется на S в верхнем регистре.
x
S
Специальное разрешение setgid для каталога означает, что файлы, созданные в этом каталоге, наследуют группу-владельца от каталога, а не от создавшего их пользователя. Это разрешение обычно используется в общих каталогах групп для автоматического перевода файла из стандартной частной группы в общую группу, а также в тех случаях когда файлы в каталоге всегда должны принадлежать определенной группе. Рассмотрим в качестве примера каталог /run/log/journal.
/run/log/journal
[user@host ~]$ ls -ld /run/log/journal drwxr-sr-x. 3 root systemd-journal 60 May 18 09:15 /run/log/journal
ls -ld /run/log/journal
Если установить разрешение setgid для исполняемого файла, команды будут выполняться от имени группы, которой принадлежит этот файл, а не от имени пользователя, выполнившего команду (так же, как при использовании setuid). Рассмотрим в качестве примера команду locate.
[user@host ~]$ ls -ld /usr/bin/locate -rwx--s--x. 1 root slocate 47128 Aug 12 17:17 /usr/bin/locate
ls -ld /usr/bin/locate
В длинном списке найти разрешения setgid можно по букве s в нижнем регистре там, где обычно должно быть x (разрешения на выполнение группой). Если у группы нет разрешений на выполнение, s заменяется на S в верхнем регистре.
Разрешение sticky bit для каталога задает устанавливает специальное ограничение на удаление файлов. Только владелец файла (и пользователь с правами root) может удалять файлы в этом каталоге. Рассмотрим в качестве примера каталог /tmp.
root
/tmp
[user@host ~]$ ls -ld /tmp drwxrwxrwt. 39 root root 4096 Feb 8 20:52 /tmp
ls -ld /tmp
t
В длинном списке найти разрешения sticky bit можно по букве t в нижнем регистре там, где обычно должно быть x (разрешения на выполнение остальными). Если у остальных нет разрешений на выполнение, t заменяется на T в верхнем регистре.
T
Установка специальных разрешений
В символьном формате: setuid = u+s; setgid = g+s; sticky = o+t
В цифровом формате (четвертая предшествующая цифра): setuid = 4; setgid = 2; sticky = 1
Примеры
Добавление бита setgid для каталога directory:
directory
[user@host ~]# chmod g+s directory
[user@host ~]#
chmod g+s directory
Установка бита setgid для каталога directory и добавление разрешений на чтение, запись и выполнение для пользователя и группы без предоставления доступа остальным:
[user@host ~]# chmod 2770 directory
chmod 2770 directory
Когда вы создаете новый файл или каталог, ему назначаются начальные разрешения. На эти начальные разрешения влияют два фактора. Первый ― создаете вы обычный файл или каталог. Второй ― текущая пользовательская маска (umask).
Если вы создаете новый каталог, операционная система назначает ему восьмеричные разрешения 0777 (drwxrwxrwx). Если вы создаете новый обычный файл, операционная система назначает ему восьмеричные разрешения 0666 (-rw-rw-rw-). Необходимо явно добавлять разрешение на выполнение для обычного файла. Так злоумышленникам будет сложнее скомпрометировать сетевую службу, чтобы она создала новый файл и сразу же запустила его как программу.
drwxrwxrwx
-rw-rw-rw-
Однако в сеансе командной оболочки также будет установлена пользовательская маска для дальнейшего ограничения первоначальных разрешений. Это восьмеричная битовая маска, которая используется для очистки разрешений новых файлов и каталогов, создаваемых процессом. Если в маске установлен какой-либо бит, то соответствующее разрешение в новых файлах очищается. Например, маска 0002 очищает бит записи для остальных пользователей. Начальные нули показывают, что специальные разрешения пользователя и группы не удаляются. Маска 0077 очищает все разрешения группы и остальных пользователей для новых файлов.
Команда umask без аргументов отображает текущее значение пользовательской маски командной оболочки.
[user@host ~]$ umask 0002
umask
Для изменения маски текущей командной оболочки используется команда umask с одним числовым аргументом. Числовой аргумент должен быть восьмеричным значением, соответствующим новой маске. Вы можете опустить ведущие нули в маске.
Системные значения маски по умолчанию для командной оболочки Bash определены в файлах /etc/profile и /etc/bashrc. Пользователи могут переопределять системные значения по умолчанию в файлах .bash_profile и .bashrc в своих домашних каталогах.
/etc/profile
/etc/bashrc
.bash_profile
.bashrc
Пример пользовательской маски
В следующем примере объясняется, как пользовательская маска влияет на разрешения для файлов и каталогов. Посмотрите на разрешения пользовательской маски по умолчанию для файлов и каталогов в текущей оболочке. У владельца и группы-владельца есть разрешения на чтение и запись для файлов, а у остальных пользователей есть разрешение на чтение. У владельца и группы-владельца есть разрешения на чтение, запись и выполнение для каталогов. Единственное разрешением для остальных пользователей ― чтение.
[user@host ~]$ umask 0002 [user@host ~]$ touch default [user@host ~]$ ls -l default.txt -rw-rw-r--. 1 user user 0 May 9 01:54 default.txt [user@host ~]$ mkdir default [user@host ~]$ ls -ld default drwxrwxr-x. 2 user user 0 May 9 01:54 default
touch default
ls -l default.txt
mkdir default
ls -ld default
Если задать для пользовательской маски значение 0, разрешения на доступ к файлам для остальных пользователей изменятся с чтения на чтение и запись. Разрешения на доступ к каталогу для остальных пользователей изменятся с чтения и выполнения на чтение, запись и выполнение.
[user@host ~]$ umask 0 [user@host ~]$ touch zero.txt [user@host ~]$ ls -l zero.txt -rw-rw-rw-. 1 user user 0 May 9 01:54 zero.txt [user@host ~]$ mkdir zero [user@host ~]$ ls -ld zero drwxrwxrwx. 2 user user 0 May 9 01:54 zero
umask 0
touch zero.txt
ls -l zero.txt
mkdir zero
ls -ld zero
Чтобы замаскировать все разрешения на доступ к файлам и каталогам для остальных пользователей, задайте для пользовательской маски значение 007.
[user@host ~]$ umask 007 [user@host ~]$ touch seven.txt [user@host ~]$ ls -l seven.txt -rw-rw----. 1 user user 0 May 9 01:55 seven.txt [user@host ~]$ mkdir seven [user@host ~]$ ls -ld seven drwxrwx---. 2 user user 0 May 9 01:54 seven
umask 007
touch seven.txt
ls -l seven.txt
mkdir seven
ls -ld seven
Маска 027 гарантирует, что для новых файлов пользователь получает разрешения на чтение и запись, а группа получает разрешение на чтение. Для новых каталогов группа получает разрешения на чтение и запись, а остальные пользователи не получают никаких разрешений.
[user@host ~]$ umask 027 [user@host ~]$ touch two-seven.txt [user@host ~]$ ls -l two-seven.txt -rw-r-----. 1 user user 0 May 9 01:55 two-seven.txt [user@host ~]$ mkdir two-seven [user@host ~]$ ls -ld two-seven drwxr-x---. 2 user user 0 May 9 01:54 two-seven
umask 027
touch two-seven.txt
ls -l two-seven.txt
mkdir two-seven
ls -ld two-seven
Значение маски по умолчанию для пользователей задается сценариями запуска командной оболочки. По умолчанию, если UID учетной записи ― 200 или больше, а имя пользователя и имя основной группы совпадают, будет назначена пользовательская маска 002. В противном случае будет использоваться маска 022.
Как пользователь root, вы можете изменить это поведение, добавив сценарий запуска оболочки с именем /etc/profile.d/local-umask.sh, похожий на вывод в этом примере:
/etc/profile.d/local-umask.sh
[root@host ~]# cat /etc/profile.d/local-umask.sh # Overrides default umask configuration if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then umask 007 else umask 022 fi
[root@host ~]#
cat /etc/profile.d/local-umask.sh
В предыдущем примере будет задана маска 007 для пользователей с UID, превышающим 199, у которых имя пользователя совпадает с именем основной группы, и 022 для всех остальных. Чтобы задать для всех маску 022, можно создать этот файл со следующим содержимым:
# Overrides default umask configuration umask 022
Чтобы глобальные изменения пользовательской маски вступили в силу, необходимо выйти из оболочки и снова выполнить вход. Пока вы этого не сделаете, будет действовать пользовательская маска, настроенная в текущей оболочке.
Man-страницы bash(1), ls(1), chmod(1) и umask(1)