Пользователи и группы
К этому времени вам уже должно быть известно, что Linux является многопользовательской системой, и каждый пользователь принадлежит к одной основной группе и, возможно, дополнительным группам. Кроме того, войдя в систему в качестве одного пользователя, с помощью команд su или sudo -s можно стать другим пользователем. Понятие владения файлами в Linux тесно связано с идентификаторами пользователя и группами, поэтому давайте повторим основные сведения о пользователях и группах.
Кто я такой?
Если вы не стали другим пользователем, ваш идентификатор пользователя остался таким же, каким вы его ввели при входе в систему. Если вы становитесь другим пользователем, в приглашении командной строки может содержаться ваш идентификатор пользователя, как в большинстве примеров в этом руководстве. Если в приглашении командной строки не содержится идентификатора текущего пользователя, вы можете узнать его с помощью команды whoami. В листинге 41 показано несколько примеров, в которых настройки приглашения командной строки (из переменной среды PS1) отличаются от остальных примеров в этом руководстве.
Листинг 41. Определение идентификатора текущего пользователя
/home/ian$ whoami
tom
/home/ian$ exit
exit
$ whoami
ian
В какие группы я вхожу?
Подобным же образом с помощью команды groups можно узнать, в какие группы вы входите. С помощью команды id можно получить информацию и о пользователях, и о группах. Добавив в качестве параметра к команде groups или id идентификатор пользователя, можно просмотреть информацию об этом пользователе, а не о текущем. Несколько примеров приведено в листинге 42.
Листинг 42. Определение членства в группах
$ su tom
Password:
/home/ian$ groups
xml-101
/home/ian$ id
uid=1001(tom) gid=1001(xml-101) groups=1001(xml-101)
/home/ian$ exit
$ groups
ian adm dialout cdrom floppy audio dip video plugdev lpadmin scanner admin xml-101
$ id
uid=1000(ian) gid=1000(ian) groups=4(adm),20(dialout),24(cdrom),25(floppy),
29(audio),30(dip),44(video),46(plugdev),104(lpadmin),105(scanner),106(admin),
1000(ian),1001(xml-101)
$ groups tom
tom : xml-101
Владение файлом и полномочия доступа к нему
Точно так же как у любого пользователя есть свой идентификатор, а сам он является членом основной группы, у каждого файла в системе Linux есть связанные с ним один владелец и одна группа.
Обычные файлы
Для того чтобы вывести информацию о владельцах и группах файлов, выполните команду ls -l
Листинг 43. Определение владельца файла
gretchen@pinguino:~$ ls -l /bin/bash .bashrc
-rw-r--r-- 1 gretchen xml-101 2227 Dec 20 10:06 .bashrc
-rwxr-xr-x 1 root root 645140 Oct 5 08:16 /bin/bash
В этом примере файл .bashrc пользователя gretchen принадлежит ей и входит в группу xml-101, которая является её основной группой. Точно так же, владельцем /bin/bash является пользователь root, а его основной группой – группа root. Имена пользователей и названия групп берутся из различных пространств имен, поэтому название группы может быть таким же, как имя пользователя. На самом деле по умолчанию во многих дистрибутивах для каждого нового пользователя создаётся группа с таким же названием.
Для каждого объекта файловой системы в модели полномочий Linux есть три типа полномочий: полномочия чтения (r), записи (w) и выполнения (x). В полномочия записи входят также возможности удаления и изменения объекта. Кроме того, эти полномочия указываются отдельно для владельца файла, членов группы файла и для всех остальных.
Вернемся к первой колонке листинга 43. Обратите внимание, что она содержит строку из десяти символов. Первый символ описывает тип объекта (в этом примере – обозначает обычный файл), а оставшиеся девять символов представляют три группы по три символа в каждой. Первая группа обозначает полномочия чтения, записи и выполнения для владельца файла. Знак “-” обозначает, что соответствующего полномочия дано не было. Поэтому пользователь gretchen может читать файл .bashrc, проводить в него запись, но не может выполнять его, в то время как пользователь root может читать файл /bin/bash, проводить в него запись и выполнять его. Вторая группа обозначает полномочия чтения, записи и выполнения для группы файла. Члены группы xml-101 могут считывать файл .bashrc пользователя gretchen, но не могут производить в него запись, так же, как и все остальные. Подобным же образом, члены группы root и все остальные пользователи могут считывать и выполнять файл /bin/bash.
Каталоги
Для каталогов используются те же флаги полномочий, что и для обычных файлов, однако интерпретируются они иначе. Наличие у пользователя полномочий чтения каталога позволяет ему просматривать содержимое каталога. Пользователь, имеющий полномочия записи, может создавать и удалять файлы в этом каталоге. Полномочия выполнения позволяют пользователю входить в этот каталог и просматривать все подкаталоги. Без полномочий выполнения объекты файловой системы, находящиеся в этом каталоге, недоступны. Без полномочий чтения объекты файловой системы, находящиеся в каталоге, нельзя просматривать, однако доступ к ним можно получить, если вы знаете полный путь к этому объекту на диске. В листинге 44 приведен несколько искусственный пример, иллюстрирующий этот момент.
Листинг 44. Полномочия и каталоги
ian@pinguino:~$ ls -l /home
total 8
drwxr-x--- 2 greg xml-101 60 2005-12-20 11:37 greg
drwx------ 13 gretchen xml-101 4096 2005-12-21 12:22 gretchen
drwxr-xr-x 15 ian ian 4096 2005-12-21 10:25 ian
d-wx--x--x 2 tom xml-101 75 2005-12-21 11:05 tom
ian@pinguino:~$ ls -a ~greg
. .. .bash_history .bash_profile .bashrc
ian@pinguino:~$ ls -a ~gretchen
ls: /home/gretchen: Permission denied
ian@pinguino:~$ ls -a ~tom
ls: /home/tom: Permission denied
ian@pinguino:~$ head -n 3 ~tom/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
Первый символ длинного листинга описывает тип объекта (d для каталога). У каталога home пользователя greg установлены полномочия на чтение и выполнение для членов группы xml-101, поэтому пользователь ian может получить список файлов, находящихся в этом каталоге. У каталога home пользователя Gretchen нет ни полномочий на чтение, ни полномочий на запись, поэтому пользователь ian не может получить доступ к нему. У каталога home пользователя tom установлены только полномочия на выполнение, но нет полномочий на чтение, поэтому пользователь ian не может просмотреть содержимое этого каталога, но может получить доступ к располагающимся в нем объектам, если он точно знает, что они существуют.
Другие объекты файловой системы
В длинном листинге могут содержаться объекты файловой системы, отличные от файлов и каталогов, что можно увидеть по первому символу листинга. Мы будет рассматривать эти объекты ниже в этом разделе, отметим на данный момент лишь возможные типы объектов.
Таблица 3. Типы объектов файловой системы Код Тип объекта
- Обычный файл
d Каталог
l Символическая ссылка
c Специальное символическое устройство
b Специальное блочное устройство
p Буфер FIFO
s Сокет
Изменение полномочий
Добавление полномочий
Предположим, вы создали сценарий командной оболочки “Hello world”. При создании сценария он обычно не является исполняемым. Чтобы добавить полномочия на выполнение, используйте команду chmod с параметром +x, как показано в листинге 45.
Листинг 45. Создание исполняемого сценария командной оболочки
ian@pinguino:~$ echo 'echo "Hello world!"'>hello.sh
ian@pinguino:~$ ls -l hello.sh
-rw-r--r-- 1 ian ian 20 2005-12-22 12:57 hello.sh
ian@pinguino:~$ ./hello.sh
-bash: ./hello.sh: Permission denied
ian@pinguino:~$ chmod +x hello.sh
ian@pinguino:~$ ./hello.sh
Hello world!
ian@pinguino:~$ ls -l hello.sh
-rwxr-xr-x 1 ian ian 20 2005-12-22 12:57 hello.sh
Подобным же образом можно использовать r для установки полномочий на чтение и w для установки полномочий на запись. На самом деле можно использовать вместе любую комбинацию r, w и x. Например, команда chmod +rwx установит для файла все полномочия на чтение, запись и выполнение. Использование chmod в таком виде добавляет не установленные на данный момент полномочия.
Выборочное изменение
Вы могли заметить, что в приведенном выше примере права на выполнение устанавливаются для владельца, группы и других. Чтобы действовать более избирательно, необходимо использовать префикс для выражения режима: u для установки полномочий для пользователей, g для установки полномочий для групп и o для установки полномочий для всех остальных. Указание a определяет полномочия для всех пользователей, что равнозначно отсутствию префикса. В листинге 46 показано, как добавить пользователю и группе полномочия на запись и выполнение другой копии сценария командной оболочки.
Листинг 46. Выборочное добавление полномочий
ian@pinguino:~$ echo 'echo "Hello world!"'>hello2.sh
ian@pinguino:~$ chmod ug+xw hello2.sh
ian@pinguino:~$ ls -l hello2.sh
-rwxrwxr-- 1 ian ian 20 2005-12-22 13:17 hello2.sh
Снятие полномочий
Иногда вам нужно не добавить полномочия, а снять их. Просто измените + на a -, чтобы удалить все указанные и установленные полномочия. В листинге 47 показано, как снять все полномочия для остальных пользователей с двух сценариев командной оболочки.
Листинг 47. Снятие полномочий
ian@pinguino:~$ ls -l hello*
-rwxrwxr-- 1 ian ian 20 2005-12-22 13:17 hello2.sh
-rwxr-xr-x 1 ian ian 20 2005-12-22 12:57 hello.sh
ian@pinguino:~$ chmod o-xrw hello*
ian@pinguino:~$ ls -l hello*
-rwxrwx--- 1 ian ian 20 2005-12-22 13:17 hello2.sh
-rwxr-x--- 1 ian ian 20 2005-12-22 12:57 hello.sh
Следует отметить, что можно за один раз изменить полномочия более чем у одного файла. Как и с некоторыми другими командами, с которыми вы встречались в руководстве для экзамена 103, вы даже можете использовать параметр -R (или –recursive) для рекурсивного обхода каталогов и папок.
Установка полномочий
Теперь, когда вы можете добавлять и удалять полномочия, вы можете задать вопрос – как установить только определенный набор полномочий. Это делается с помощью знака = вместо + и -. Для того чтобы установить полномочия для приведенных выше сценариев так, чтобы другие пользователи не имели прав доступа, можно вместо команд на удаление полномочий использовать команду chmod o= hello*.
Если вы желаете установить различные полномочия для пользователя, группы и остальных пользователей, вы можете разделять различные выражения запятыми; например, ug=rwx,o=rx, также вы можете использовать цифровой способ указания полномочий, описываемый ниже.
Установка полномочий в восьмеричном формате
До настоящего момента для указания полномочий вы использовали символы (ugoa и rxw). В каждой группе существует три возможных типа полномочий. Также можно указывать полномочия, используя вместо символов числа в восьмеричном формате. Для установки полномочий, таким образом, может потребоваться до четырёх восьмеричных цифр. Рассматривать первую цифру мы будем при обсуждении атрибутов. Вторая цифра определяет полномочия для пользователя, третья – полномочия для группы и четвертая – полномочия для остальных пользователей. Каждая из этих трех цифр получается путем сложения желаемых полномочий: на чтение (4), на запись (2) и на исполнение (1). В примере для hello.sh, приведенном в листинге 45, сценарий был создан с полномочиями -rw-r–r–, что соответствует восьмеричному 644. Установка прав на выполнение для всех изменит режим на 755.
Использование полномочий в цифровом виде очень удобно в случаях, когда вы хотите установить все полномочия сразу, не указывая одинаковые полномочия для каждой группы.
Режимы доступа
Когда вы входите в систему, запускается новый процесс командной оболочки с вашим идентификатором пользователя и идентификатором группы. Эти идентификаторы определяют полномочия на доступ ко всем файлам в системе. Обычно это означает, что вы не можете открывать файлы, принадлежащие другим пользователям, и системные файлы. На самом деле мы как пользователи полностью полагаемся на другие программы, выполняющие действия от нашего имени. Поскольку программы, которые вы запускаете, наследуют ваш идентификатор пользователя, они не могут получить доступа к объектам файловой системы, доступа к которым не имеете вы.
В качестве важного примера можно привести файл /etc/passwd, который не может быть изменен обычными пользователями напрямую, так как полномочия на запись есть только у пользователя root:. Однако обычным пользователям необходима возможность изменения файла /etc/passwd каким-либо образом всякий раз, когда им нужно изменить свой пароль. Итак, если пользователь не может изменить этот файл, как это можно сделать?
suid and sgid
В модели полномочий Linux есть два специальных режима доступа, называемых suid (установить идентификатор пользователя) и sgid (установить идентификатор группы). Если у исполняемой программы установлен режим доступа suid, она будет запущена так, как если бы это сделал владелец файла, а не пользователь, который фактически её запустил. Подобно этому, при установленном режиме доступа sgid программа будет работать так, как если бы её запустил пользователь, входящий в группу, которой принадлежит файл, а не в группу, в которой фактически состоит пользователь. Эти режимы можно установить как по отдельности, так и вместе.
В листинге 48 показан исполняемый файл passwd, владельцем которого является пользователь root:
Листинг 48. Режим доступа suid файла /usr/bin/passwd
ian@pinguino:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 25648 2005-10-11 12:14 /usr/bin/passwd
Заметьте, что вместо x в тройке символов полномочий пользователя стоит s. Это обозначает, что для этой конкретной программы установлен флаг выполнения и режим доступа suid. При запуске программы passwd она будет выполняться так, как будто бы её запустил пользователь root, со всеми правами доступа привилегированного пользователя, а не того пользователя, который её действительно запустил. Поскольку программа passwd работает с уровнем доступа пользователя root, она может изменить файл /etc/passwd.
Флаги suid и sgid занимают в длинном листинге каталога то же место, что и флаг x. Если файл исполняемый, установленные флаги suid и sgid будут отображаться как маленькая s, в противном случае они будут выводиться как большая S.
Несмотря на то, что флаги suid и sgid очень удобны, и даже необходимы во многих ситуациях, неправильное использование этих режимов доступа может привести к появлению брешей в системе обеспечения безопасности. У вас должно быть как можно меньше программ, работающих в режиме доступа suid. Команда passwd является одной из немногих, которая должна работать в режиме suid.
Установка suid и sgid
Флаги suid и sgid устанавливаются с использованием символа s; например, u+s устанавливает режим доступа suid, а g-s снимает режим доступа sgid. В восьмеричном формате режиму suid соответствует значение 4 в первой цифре (старший разряд), а режиму sgid соответствует значение 2.
Каталоги и sgid
Если для каталога установлен режим sgid, все файлы и каталоги, созданные в нем, будут наследовать идентификатор группы этого каталога. В частности, это полезно для деревьев каталогов, используемых группой людей, работающих над одним проектом. В листинге 49 показано, как пользователь greg может настроить каталог, с которым могут работать все пользователи группы xml-101, а также пример того, как пользователь gretchen может создать файл в каталоге.
Листинг 49. Режим доступа sgid и каталоги
greg@pinguino:~$ mkdir xml101
greg@pinguino:~$ chmod g+ws xml101
greg@pinguino:~$ ls -ld xml101
drwxrwsr-x 2 greg xml-101 6 Dec 25 22:01 xml101
greg@pinguino:~$ su - gretchen
Password:
gretchen@pinguino:~$ touch ~greg/xml101/gretchen.txt
gretchen@pinguino:~$ ls -l ~greg/xml101/gretchen.txt
-rw-r--r-- 1 gretchen xml-101 0 Dec 25 22:02 /home/greg/xml101/gretchen.txt
Теперь любой член группы xml-101 может создавать файлы в папке xml101 пользователя greg. Как показано в листинге 50, другие члены группы не могут изменять файл gretchen.txt, но у них есть полномочия на запись в каталог и потому они могут удалить файл.
Листинг 50. Режим доступа sgid и владение файлом
gretchen@pinguino:~$ su - tom
Password:
~$ cat something >> ~greg/xml101/gretchen.txt
-su: /home/greg/xml101/gretchen.txt: Permission denied
~$ rm ~greg/xml101/gretchen.txt
rm: remove write-protected regular empty file `/home/greg/xml101/gretchen.txt'? y
~$ ls -l ~greg/xml101
total 0
Бит закрепления в памяти
Только что вы увидели, как любой пользователь, имеющий полномочия на запись в каталог, может удалить находящиеся в ней файлы. Такая ситуация может быть приемлемой для проекта рабочей группы, но нежелательна для файлового пространства, находящегося в общем доступе, например, каталога /tmp. К счастью, решение существует.
Оставшийся флаг режима доступа называется битом закрепления в памяти (sticky bit). Он представляется символом t и числом 1 в восьмеричной цифре старшего разряда. Он отображается в длинном листинге каталога на месте флага выполнения для остальных пользователей (последний символ), значение регистра аналогично значению регистра для suid и sgid. Если для каталога установлен этот флаг, он допускает удаление файла или ссылок только владельцем или суперпользователем (root). В листинге 51 показано, как пользователь greg может установить бит закрепления в памяти на свой каталог xml101, а также показано, что этот флаг установлен для каталога /tmp.
Листинг 51. Каталоги с закреплением в памяти
greg@pinguino:~$ chmod +t xml101
greg@pinguino:~$ ls -l xml101
total 0
greg@pinguino:~$ ls -ld xml101
drwxrwsr-t 2 greg xml-101 6 Dec 26 09:41 xml101
greg@pinguino:~$ ls -ld xml101 /tmp
drwxrwxrwt 13 root root 520 Dec 26 10:03 /tmp
drwxrwsr-t 2 greg xml-101 6 Dec 26 09:41 xml101
Исторически, в системах UNIX® бит закрепления в памяти использовался на файлах и обозначал, что исполняемые файлы необходимо хранить в области свопинга, чтобы исключить их повторную загрузку. Современные ядра системы Linux игнорируют установку бита закрепления в памяти для файлов.
Файлы только для чтения
Режимы доступа и полномочия предоставляют широкие средства управления тем, кто и что может делать с файлами и каталогами. Как бы то ни было, они не предотвращают неумышленного удаления файлов пользователем root. В различных файловых системах существуют дополнительные атрибуты, которые предоставляют дополнительные возможности. Одним из таких атрибутов является атрибут только для чтения. Если этот атрибут установлен, даже пользователь root не сможет удалить файл, пока атрибут не будет снят.
Чтобы просмотреть, установлен ли на файле или каталоги флаг “только для чтения” (или какой-либо иной атрибут), необходимо использовать команду lsattr. Чтобы сделать файл доступным только для чтения, необходимо подать команду chattr с параметром -i.
В листинге 52 показано, что пользователь root может создать файл только для чтения, но не может удалить его до тех пор, пока не снят флаг “только для чтения”.
Листинг 52. Файлы только для чтения
root@pinguino:~# touch keep.me
root@pinguino:~# chattr +i keep.me
root@pinguino:~# lsattr keep.me
----i------------ keep.me
root@pinguino:~# rm -f keep.me
rm: cannot remove `keep.me': Operation not permitted
root@pinguino:~# chattr -i keep.me
root@pinguino:~# rm -f keep.me
Для того чтобы изменить флаг “только для чтения”, необходимы полномочия root, или, по меньшей мере, привилегия CAP_LINUX_IMMUTABLE. Перевод файлов в режим “только для чтения” часто выполняется в ходе мероприятий по обеспечению безопасности и обнаружению вторжений. Дополнительную информацию можно найти в документации man по ключевому слову capabilities (man capabilities).
umask
При создании нового файла ему присваиваются определенные полномочия. Часто устанавливается режим 0666, что открывает возможность чтения и записи в этот файл для всех пользователей. В любом случае на процесс определения полномочий при создании файла влияет значение umask, которое определяет, какие полномочия пользователь не желает автоматически присваивать вновь создаваемым файлам и каталогам. Система использует значение umask для ограничения изначально установленных полномочий. Просмотреть значение параметра umask можно с помощью команды umask, пример использования которой показан в листинге 53.
Листинг 53. Вывод umask в восьмеричном формате
ian@pinguino:~$ umask
0022
Необходимо помнить, что umask указывает только полномочия, которые не должны быть предоставлены. По умолчанию в системах Linux параметру umask обычно присваивается значение 0022, что снимает с групп и других пользователей полномочия на запись во вновь создаваемые файлы. Для того, чтобы вывести значение параметра umask в символическом виде, отображая, какие полномочия разрешены, используйте параметр -S.
Использовать команду umask можно не только для просмотра, но и для установки значения параметра umask. Итак, если вы желаете хранить ваши файлы в конфиденциальном порядке и полностью отключить доступ группы и всех остальных пользователей, вам необходимо использовать значение umask, равное 0077. Также можно установить umask в символическом виде, umask u=rwx,g=,o=, как это показано в листинге 54.
Листинг 54. Установка umask
ian@pinguino:~$ umask
0022
ian@pinguino:~$ umask -S
u=rwx,g=rx,o=rx
ian@pinguino:~$ umask u=rwx,g=,o=
ian@pinguino:~$ umask
0077
ian@pinguino:~$ touch newfile
ian@pinguino:~$ ls -l newfile
-rw------- 1 ian ian 0 2005-12-26 12:49 newfile
В следующем разделе будет показано, как можно изменить владельца или группу существующего объекта файловой системы.
Взято на ibm developerworks