Марк Митчелл - Программирование для Linux. Профессиональный подход
- Название:Программирование для Linux. Профессиональный подход
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2002
- Город:Москва
- ISBN:5-8459-0243-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
seteuid(id);
setreuid(-1, id);
10.4.1. Программы с установленным битом SUID
Выше было показано, как процесс пользователя root
может временно принять на себя права другого пользователя или отказаться от специальных привилегий, изменив свои реальный и эффективный идентификаторы. Но вот загадка: может ли непривилегированный пользователь стать суперпользователем? Это кажется невозможным, но следующий пример свидетельствует об обратном:
% whoami
mitchell
% su
Password: ...
% whoami
root
Команда whoami
аналогична команде id
, но отображает только эффективный идентификатор пользователя. Команда su
позволяет вызвавшему ее пользователю стать суперпользователем, если введен правильный пароль.
Как же работает команда su
? Ведь мы знаем, что интерпретатор команд был запущен с реальным и эффективным идентификаторами, равными mitchell
. Функция setreuid()
не позволит ему поменять ни один из них.
Дело в том, что у программы su
установлен бит смены идентификатора пользователя (SUID, set user identifier). Это значит, что при запуске ее эффективным идентификатором станет идентификатор владельца (реальный идентификатор останется тем же, что у пользователя, запустившего программу). Для установки бита SUID предназначены команда chmod +s
и флаг S_SUID
функции chmod()
. [34] Существует также бит смены идентификатора группы (SGID, set group identifier). Программа c установленным битом SGID при запуске примет эффективный идентификатор группы, которой принадлежит файл.
В качестве примера рассмотрим программу, показанную в листинге 10.3.
#include
#include
int main() {
printf("uid=%d euid=%d\n", (int)getuid(), (int)geteuid());
return 0;
}
Теперь предположим, что у программы установлен бит SUID и она принадлежит пользователю root
. В этом случае вывод команды ls
будет примерно таким:
-rwsrws--x 1 root root 11931 Jan 24 18:25 setuid-test
Буквы s в строке режима означают, что этот файл не только является исполняемым, но для него установлены также биты SUID и SGID. Результат работы программы будет таким:
% whoami
mitchell
% ./setuid-test
uid=501 euid=0
Обратите внимание на то, что эффективный идентификатор стал равным нулю. Устанавливать биты SUID и SGID позволяют команда chmod u+s
и chmod g+s
соответственно. Приведем пример:
% ls -l program
-rwxr-xr-x 1 samuel csl 0 Jan 30 23:38 program
% chmod g+s program
% ls -l program
-rwxr-sr-x 1 samuel csl 0 Jan 30 23:38 program
% chmod u+s program
% ls -l program
-rwsr-sr-x 1 samuel csl 0 Jan 30 23:38 program
Аналогичным целям служат флаги S_ISUID
и S_ISGID
функции chmod()
.
Именно так работает команда su
. Ее эффективный идентификатор пользователя равен нулю. Если введенный пароль совпадает с паролем пользователя root, команда меняет свой реальный идентификатор на root, после чего запускает новый интерпретатор команд. В противном случае ничего не происходит.
Рассмотрим атрибуты программы su
:
% ls -l /bin/su
-rwsr-xr-x 1 root root 14188 Mar 7 2000 /bin/su
Как видите, она принадлежит пользователю root
и для нее установлен бит SUID. Обратите внимание на то, что команда su
не меняет идентификатор интерпретатора команд, в котором она была вызвана, а запускает новый интерпретатор с измененным идентификатором. Первоначальный интерпретатор будет заблокирован до тех пор, пока пользователь не введет exit
.
10.5. Аутентификация пользователей
Программы, у которых установлен бит SUID, не должны запускаться кем попало. Например, программа su
, прежде чем менять идентификатор пользователя, заставляет его ввести пароль. Это называется аутентификацией — программа проверяет, получил ли пользователь права суперпользователя.
Администраторам высоконадежных систем недостаточно, чтобы пользователи просто вводили пароли. У пользователей есть вредная привычка записывать свои пароли на бумажке, приклеенной к монитору, или выбирать пароли, в которых закодирован день рождения, имя любимой собаки, жены и т.п. Все это облегчает задачу злоумышленникам, пытающимся незаконно проникнуть в систему.
Во многих организациях требуется использовать "одноразовые" пароли, генерируемые специальными электронными карточками, которые пользователи хранят при себе. Одни и тот же пароль не может встретиться дважды, а прежде чем получить пароль, требуется ввести личный код. Следовательно, для взлома системы хакеру требуется раздобыть электронную карточку и узнать соответствующий личный код. В сверхсекретных учреждениях используются устройства сканирования сетчатки глаза или другие биометрические приборы.
При написании аутентификационной программы важно позволить системному администратору использовать тот механизм аутентификации, который он считает приемлемым. В Linux этой цели служат подключаемые модули аутентификации (РАМ, pluggable authentication modules). Рассмотрим простейшее приложение (листинг 10.4).
#include
#include
#include
int main() {
pam_handle_t* pamh;
struct pam_conv pamc;
/* Указание диалоговой функции. */
pamc.conv = &misc_conv;
pamc.eppdata_ptr = NULL;
/* Начало сеанса аутентификации. */
pam_start("su", getenv("USER"), &pamc, &pamh);
/* Аутентификация пользователя. */
if (pam_authenticate(pamh, 0) != PAM_SUCCESS)
fprintf(stderr, "Authentication failed!\n");
else
fprintf(stderr, "Authentication OK.\n");
/* Конец сеанса. */
pam_end(pamh, 0);
return 0;
}
Чтобы скомпилировать эту программу, необходимо подключить к ней две библиотеки: libpam
и libpam_misс
:
% gcc -о para pam.c -lpam -lpam_misc
Сначала программа создает объект диалога , который используется библиотекой РАМ, когда ей требуется запросить у пользователя данные. Функция misc_conv()
, адрес которой записывается в объект, — это стандартная диалоговая функция, осуществляющая терминальный ввод-вывод. Можно написать собственную функцию, отображающую всплывающее окно, использующую голосовой ввод-вывод или реализующую другие способы общения с пользователем.
Затем вызывается функция pam_start()
, которая инициализирует библиотеку РАМ. Первый аргумент функции — это имя сервиса. Оно должно уникальным образом идентифицировать приложение. Программа не будет работать, пока системный администратор не настроит систему на использование указанного сервиса. В данном случае задействуется сервис su
, при котором программа аутентифицирует пользователей так же, как это делает команда su
. В реальных программах так поступать не следует. Выберите реальное имя сервиса и создайте сценарий инсталляции, который позволит системному администратору правильно настраивать механизм аутентификации.
Интервал:
Закладка: