Рассмотрим как работают стандартные права в linux — sticky bit, suid, guid, umask и acl.
Начнем с обычных прав. Создадим директорию test и файл test внутри директории test ).
Права в linux условно деляться на три колонки.
- Права владельца(пользователя) в данном случае rw.
- Права группы — также rw.
- Права для всех остальных — r.
Стандартный набор прав это rwx — read, write, execute, что означает чтение, запись, выполнение соответственно.
Менять права можно через команду chmod используя при этом как буквенное обозначение, так и битовое.
Чтобы изменить права на файл для пользователя, добавив бит исполнения, выполним следующую команду:
Вначале указываем кому даем права u — user, ставим + и какие права добавляем.
Соответственно исходя их этого можно комбинировать буквы в различных вариациях.
Далее рассмотрим как делать тоже самое, но с битами доступа и собственно как их считать.
Максимально возможное значение имеет вид 777. Что это значит?
rwx = 421 соответственно. Следовательно первая 7 — 4+2+1. Также и во всех остальных случаях.
Например мы хотим задать rw |r|r , в битовом представление это будет так:
rw- = 4+2+0 = 6, r— = 4+0+0 = 4, также с последним r, в итоге получаем 644. Довольно просто.
SETUID, SETGID и Sticky bit
Все эти биты, дополнительные и могут также задаваться через буквенное или битовое представление.
setuid — дополнительный бит доступа позволяющей пользователю получить права владельца запускаемого файла. Самый популярный пример — это утилита sudo. Ее можно запустить от обычного пользователя, но получив права владельца утилиты.
В выводе помечается флагом s вместо x.
Давайте рассмотрим такой пример. Если из под непривелигированного пользователя выполнить команду cat /etc/shadow, то получим ошибку прав.
Смотрим какие биты есть у команды cat, меняем их из под рута, добавляя setuid и выполняем команду выше еще раз, от обычного пользователя.
Как видим все работает. Машина тестовая, поэтому можно светить shadow немного)
Также тут можно заметить, что для задания доп битов в битовом представлении работает все таже схема выше, только теперь перед основными правами, мы должны дописать еще один дополнительный бит — 4,2,1 для setuid, setgid, sticky bit соответственно.
setgid — ровно тоже самое что и setgid, только права пользователю из под которого запускается утилита повышаются до группы владельца файла. Устанавливается также, только вместо u указываем g, те группа +s. Ну либо через биты. Отображается в системе также в виде буквы «s», но только в группе.
sticky bit — последний дополнительный бит, который если установлен на директорию, то удалить файлы внутри этой директории может только владелец файлов. Обычно этот бит выставлен на директории /tmp, помечается буквой «t».
UMASK — параметр позволяющий создавать файлы и директории с определенными правами по умолчанию. Значение umask вычетается из дефолтных прав, которые для файла будут «666», а для директории «777». Следовательно встречающийся очень часто дефолтный umask — 022, создаст файл с правами 666-022=644, а директорию с правами 777-022=755.
Создадим пустой файл и посмотрим права.
-rw-r—r— = 0644.
Создадим директорию
Права выдались — 755. Umask работает корректно.
ACL
Есть еще в linux дополнительная штука ACL, которая позволяет более гибко управлять правами.
Посмотреть права чего либо можно через команду getfacl
Она также показывает дополнительные флаги о которых мы говорили выше. Если в выводе команды ls -l <file> в строке прав присутствует знак + в конце, это говорит о том, что к данному файлу применен ACL.
Задать права ACL можно через команду setfactl
Синтаксис достаточно простой, мы указываем кому даем права , указываем имя пользователя/группы и сами права.