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

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

Жанры

Linux программирование в примерах
Шрифт:

$ chmod u+s myprogram /* Добавить бит setuid */

$ chmod g+s myprogram /* Добавить бит setgid */

$ ls -l myprogram

– rwsr-sr-x 1 arnold devel 4573 Oct 9 18:17 myprogram

Наличие символа s в месте, где обычно находится символ x, указывает на присутствие битов setuid/setgid.

Как упоминалось в разделе 8.2.1 «Использование опций монтирования», опция

nosuid
команды mount для файловой системы предотвращает обращение ядра к битам setuid и setgid. Это мера безопасности; например, пользователь с домашней системой GNU/Linux мог бы вручную изготовить гибкий диск с копией исполняемого файла оболочки с setuid, устанавливающей в
root
. Но если система GNU/Linux в офисе или лаборатории монтирует файловые системы с гибкими дисками с опцией
nosuid
, запуск этой оболочки не предоставит доступа с правами
root
[117] .

117

Безопасность для систем GNU/Linux и Unix является глубокой темой сама по себе. Это просто пример. см. раздел 11.9 «Рекомендуемая литература» — Примеч. автора.

Каноническим (и возможно, злоупотребляемым) примером программы с setuid является игровая программа. Представьте, что вы написали по-настоящему крутую игру и хотите позволить пользователям системы играть в нее. Игра содержит файл счета, в котором перечислены высшие достижения.

Если вы не являетесь системным администратором, вы не можете создать отдельную группу только для тех пользователей, которым разрешено играть в игру и тем самым записывать в файл счета. Но если вы сделаете файл доступным для записи любому, чтобы каждый смог поиграть в игру, тогда каждый сможет также сжульничать и поместить наверх любое имя.

Однако, заставив программу устанавливать setuid на вас, пользователи, запускающие игру, получат ваш UID в качестве своего эффективного UID. Игровая программа сможет при этом открывать и обновлять файл счета по мере необходимости, но произвольные пользователи не смогут прийти и отредактировать его. (Вы подвергаете себя также большинству опасностей при программировании setuid; например, если в игровой программе есть дыра, которую можно использовать для запуска оболочки, действующей от вашего имени, все ваши файлы оказываются доступными для удаления или изменения. Это действительно устрашающая мысль.)

Та же логика применяется к программам setgid, хотя на практике программы с setgid используются гораздо реже, чем с setuid (Это также плохо; многие вещи, которые делаются программами с setuid

root
, легко могут быть сделаны программами с setgid или программами, которые вместо этого устанавливают setuid на обычного пользователя [118] ).

11.2. Получение ID пользователя и группы

Получение от системы сведений о UID и GID просто. Функции следующие:

118

Одной из программ, разработанных с этой целью, является GNU userv (

ftp://ftp.gnu.org/gnu/userv/
) — Примеч. автора.

#include <unistd.h> /* POSIX */

uid_t getuid(void); /* Действительный и эффективный UID */

uid_t geteuid(void);

gid_t getgid(void); /* Действительный и эффективный GID */

gid_t getegid(void);

int getgroups(int size, gid_t list[]); /* Список дополнительных групп*/

Функции:

uid_t getuid(void)

Возвращает действительный UID.

uid_t geteuid(void)

Возвращает эффективный UID.

gid_t getgid(void)

Возвращает действительный GID.

gid_t getegid(void)

Возвращает эффективный GID.

int getgroups(int size, gid_t list[])

Заполняет до

size
элементов массива
list
из набора дополнительных групп процесса. Возвращаемое значение является числом заполненных элементов или -1 при ошибке. Включается ли в набор также эффективный GID, зависит от реализации. На системах, совместимых с POSIX, можно передать в size нулевое значение; в этом случае
getgroups
возвращает число групп в наборе групп процесса. Затем можно использовать это значение для динамического выделения массива достаточного размера. На не-POSIX системах константа
NGROUPS_MAX
определяет максимально допустимый размер для массива
list
. Эту константу можно найти в современных системах в
<limits.h>
, а в старых системах в
<sys/param.h>
. Вскоре мы представим пример.

Возможно, вы заметили, что для получения сохраненных значений set-user ID или set-group ID нет вызовов. Это просто первоначальные значения эффективных UID и GID. Таким образом, для получения шести значений в начале программы вы можете использовать код наподобие этого:

uid_t ruid, euid, saved_uid;

gid_t rgid, egid, saved_gid;

int main(int argc, char **argv) {

 ruid = getuid;

 euid = saved_uid = geteuid;

 rgid = getgid;

 egid = saved_gid = getegid;

 /* ...оставшаяся программа... */

}

Вот пример получения набора групп. В качестве расширения

gawk
предоставляет доступ на уровне
awk
к значениям действительных и эффективных UID и GID и дополнительному набору групп. Для этого он должен получить набор групп. Следующая функция из
main.c
в дистрибутиве
gawk
3.1.3:

1080 /* init_groupset --- инициализация набора групп */

1081

1082 static void

1083 init_groupset

1084 {

1085 #if defined(HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0

1086 #ifdef GETGROUPS_NOT_STANDARD

1087 /* Для систем, которые не отвечают стандарту, используйте старый способ */

1088 ngroups = NGROUPS_MAX;

1089 #else

1090 /*

1091 * Если оба аргумента при вызове равны 0, возвращаемое

1092 * значение является общим числом групп.

1093 */

1094 ngroups = getgroups(0, NULL);

1095 #endif

1096 if (ngroups == -1)

1097 fatal(_("could not find groups: %s"), strerror(errno));

1098 else if (ngroups == 0)

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

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

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

Ефрейтор. Назад в СССР. Книга 2

Гаусс Максим
2. Второй шанс
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Ефрейтор. Назад в СССР. Книга 2

Бастард Императора. Том 16

Орлов Андрей Юрьевич
16. Бастард Императора
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 16

Оранжерейный цветок

Ритчи Криста
2. Сёстры Кэллоуэй
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Оранжерейный цветок

Встреча

Видум Инди
7. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Встреча

Кодекс Охотника. Книга XXVI

Винокуров Юрий
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI

Мастер 4

Чащин Валерий
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 4

Эпоха Опустошителя. Том V

Павлов Вел
5. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том V

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Родословная. Том 5

Ткачев Андрей Юрьевич
5. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 5

1941: Время кровавых псов

Золотько Александр Карлович
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
1941: Время кровавых псов