Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

$ echo this is my file > arnolds-file /* Создать файл */

$ ls -l arnolds-file /* Показать его права доступа */

– rw-r--r-- 1 arnold devel 16 Oct 20 14:14 arnolds-file

$ su - miriam /* Смена пользователя */

Password:

$ cd /tmp /* Перейти в /tmp */

$ rm arnolds-file /* Попытка удаления файла */

rm: remove write-protected regular file 'arnolds-file'? y

 /* rm предупреждает */

rm: cannot remove 'arnolds-file': Operation not permitted

 /* Ядро запрещает удаление */

Основным назначением этой особенности является как раз использование в таких каталогах, как

/tmp
, куда хотят помещать свои файлы множество пользователей. С одной стороны, каталог должен иметь права записи для всех, чтобы каждый мог создавать там свои файлы. С другой стороны, раз запись разрешена для всех, любой пользователь может удалять файлы всех остальных пользователей! «Липкий» бит каталога красиво решает эту проблему. Для добавления к файлу или каталогу «липкого» бита используйте '
chmod +t
':

$ mkdir mytmp /* Создать каталог */

$ chmod a+wxt mytmp /* Добавить права записи для всех и «липкий» бит */

$ ls -ld mytmp /* Проверить результат */

drwxrwxrwt 2 arnold devel 4096 Oct 20 14:23 mytmp

В заключение, обратите внимание, что владелец каталога также может удалить файлы, даже если они не принадлежат ему.

11.6. Установка действительных и эффективных ID

Все становится интереснее, когда процессу приходится менять значения UID и GID. Установка набора групп проста. Изменение значений действительных и эффективных UID и GID сложнее.

11.6.1. Изменение набора групп

Функция

setgroups
устанавливает новый набор групп:

#include <sys/types.h> /* Common */

#include <unistd.h>

#include <grp.h>

int setgroups(size_t size, const gid_t *list);

Параметр

size
указывает, сколько элементов в массиве
list
. Возвращаемое значение равно 0, если все было нормально, и -1 с установленным errno в противном случае.

В отличие от функций для манипулирования значениями действительных и эффективных UID и GID, эту функцию может вызвать лишь процесс, действующий как

root
. Это один пример того, что POSIX называет привилегированной операцией; сама она как таковая не стандартизуется POSIX.

setgroups
используется любой программой, которая осуществляет регистрацию в системе, такой как
/bin/login
для регистрации в консоли и
/bin/sshd
для удаленной регистрации с помощью
ssh
.

11.6.2. Изменение действительного и эффективного ID

Работа с двумя различными ID пользователей представляет для программиста приложения проблему. Могут быть вещи, которые программе нужно сделать, работая с эффективным UID, а другие вещи — работая с действительным UID.

Например, до того, как в системах Unix появилось управление заданиями, многие программы предоставляли переходы в оболочку, т.е. способ запуска команды или интерактивной оболочки из текущей программы. Хорошим примером этого является редактор

ed
: набор командной строки, начинающейся с '
!
', запускает оставшуюся часть строки в качестве команды оболочки. Набрав '
!sh
', вы получаете интерактивную оболочку. (Это работает до сих пор — попробуйте!) Предположим, описанная ранее гипотетическая игровая программа также предоставляет переход в оболочку: она должна быть запущена от имени действительного пользователя, а не эффективного. В противном случае, редактирование файла счета или многие гораздо худшие вещи становятся для игрока тривиальной задачей!

Таким образом, имеется явная потребность в возможности замены эффективного UID действительным UID. Более того, полезна возможность обратного переключения эффективного UID на первоначальный. (В этом причина необходимости наличия сохраненного set-user ID; появляется возможность восстановления первоначальных привилегий, которые были у процесса при его запуске.)

Как и для множества Unix API, различные системы решили проблему разными способами, иногда с использованием одного и того же API, но с другой семантикой, а иногда введением другого API. Погружение в исторические подробности годится лишь для создания головной боли, поэтому мы не будем с этим беспокоиться. Вместо этого мы рассмотрим, что предоставляет POSIX и как работает каждый API. Более того, наше обсуждение фокусируется на значениях действительных и эффективных UID; значения GID работают аналогичным образом, поэтому мы не будем хлопотать с повторением подробностей для этих системных вызовов. Функции следующие:

#include <sys/types.h> /* POSIX */

#include <unistd.h>

int seteuid(uid_t euid); /* Установка эффективного ID */

int setegid(gid_t egid);

int setuid(uid_t uid);

 /* Установка эффективного ID, root устанавливает все */

int setgid(gid_t gid);

int setreuid(uid_t ruid, uid_t euid);

 /* Совместимость с BSD, устанавливаются оба */

int setregid(gid_t rgid, gid_t egid);

Есть три набора функций. Первые два были созданы POSIX:

int seteuid(uid_t euid)

Эта функция устанавливает лишь эффективный UID. Обычный пользователь (не

root
) может установить в качестве ID лишь в значения действительного, эффективного или сохраненного set-user ID. Приложения, которые будут переключать эффективный UID. должны использовать исключительно эту функцию.

Процесс с эффективным UID, равным нулю, может установить в качестве эффективного UID любое значение. Поскольку в качестве значения эффективного UID можно установить также сохраненный set-user ID, процесс может восстановить свои привилегии root с помощью другого вызова

seteuid
.

int setegid(gid_t egid)

Эта функция делает для эффективного ID группы то, что

seteuid
делает для эффективного ID пользователя.

Следующий набор функций предлагает первоначальный API Unix для изменения действительных и эффективных UID и GID. В модели POSIX эти функции являются тем. что должна использовать программа с setuid-root для постоянного изменения действительного или эффективного UID:

int setuid(uid_t uid)

Для обычного пользователя эта функция также устанавливает лишь эффективный UID. Как и для

seteuid
, значением эффективного UID может быть любое из текущих значений действительного, эффективного иди сохраненного set-user ID. Изменение не постоянно; эффективный UID может быть изменен последующим вызовом на другое значение (из того же исходного набора).

Поделиться:
Популярные книги

Драконы

Мартин Джордж Р.Р.
Фантастика:
фэнтези
8.08
рейтинг книги
Драконы

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Путь

Yagger Егор
Фантастика:
космическая фантастика
4.25
рейтинг книги
Путь

Матабар VIII

Клеванский Кирилл Сергеевич
8. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Матабар VIII

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Я спас ссср! том iv

Вязовский Алексей
4. Я спас СССР
Фантастика:
альтернативная история
6.62
рейтинг книги
Я спас ссср! том iv

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Как прорастают зерна

Волкова Дарья
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Как прорастают зерна

Князь Андер Арес 4

Грехов Тимофей
4. Андер Арес
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Князь Андер Арес 4

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Древесный маг Орловского княжества 4

Павлов Игорь Васильевич
4. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 4

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10