Читаем Linux API. Исчерпывающее руководство полностью

check_password_caps = cap_dac_read_search+p

$ ./check_password_caps

Username: mtk

Password:

Successfully authenticated: UID=1000

Листинг 39.1. Программа для аутентификации пользователей с поддержкой системы возможностей

cap/check_password_caps.c

#define _BSD_SOURCE /* Получаем объявление getpass()

из заголовочного файла */

#define _XOPEN_SOURCE /* Получаем объявление crypt()

из заголовочного файла */

#include

#include

#include

#include

#include

#include "tlpi_hdr.h"

/* Меняем параметры возможностей в действующем наборе вызывающего процесса */

static int

modifyCap(int capability, int setting)

{

cap_t caps;

cap_value_t capList[1];

/* Получаем текущие возможности вызывающего процесса */

caps = cap_get_proc();

if (caps == NULL)

return –1;

/* Меняем параметры 'capability' в действующем наборе 'caps'.

Третий аргумент, 1 — это количество элементов в массиве 'capList'. */

capList[0] = capability;

if (cap_set_flag(caps, CAP_EFFECTIVE, 1, capList, setting) == –1) {

cap_free(caps);

return –1;

}

/* Возвращаем ядру измененные наборы возможностей, чтобы они

вступили в силу для вызывающего процесса */

if (cap_set_proc(caps) == –1) {

cap_free(caps);

return –1;

}

/* Удаляем структуру, выделенную интерфейсом libcap */

if (cap_free(caps) == –1)

return –1;

return 0;

}

static int /* Включаем возможность в действующий набор вызывающего процесса */

raiseCap(int capability)

{

return modifyCap(capability, CAP_SET);

}

/* Аналогичная функция dropCap() (не нужна в этой программе)

может быть определена как modifyCap(capability, CAP_CLEAR); */

static int /* Удаляем все возможности из всех наборов */

dropAllCaps(void)

{

cap_t empty;

int s;

empty = cap_init();

if (empty == NULL)

return –1;

s = cap_set_proc(empty);

if (cap_free(empty) == –1)

return –1;

return s;

}

int

main(int argc, char *argv[])

{

char *username, *password, *encrypted, *p;

struct passwd *pwd;

struct spwd *spwd;

Boolean authOk;

size_t len;

long lnmax;

lnmax = sysconf(_SC_LOGIN_NAME_MAX);

if (lnmax == –1) /* Если невозможно определить ограничение, */

lnmax = 256; /* берем значение наугад */

username = malloc(lnmax);

if (username == NULL)

errExit("malloc");

printf("Username: ");

fflush(stdout);

if (fgets(username, lnmax, stdin) == NULL)

exit(EXIT_FAILURE); /* Выходим при обнаружении символа EOF */

len = strlen(username);

if (username[len — 1] == '\n')

username[len — 1] = '\0'; /* Удаляем символ '\n' в конце */

pwd = getpwnam(username);

if (pwd == NULL)

fatal("couldn't get password record");

/* Включаем возможность CAP_DAC_READ_SEARCH только на период, когда она нам нужна */

if (raiseCap(CAP_DAC_READ_SEARCH) == –1)

fatal("raiseCap() failed");

spwd = getspnam(username);

if (spwd == NULL && errno == EACCES)

fatal("no permission to read shadow password file");

/* На этом этапе нам больше не нужны никакие возможности, поэтому очищаем все наборы */

if (dropAllCaps() == –1)

fatal("dropAllCaps() failed");

if (spwd!= NULL) /* Если запись в файле с паролями существует, */

pwd->pw_passwd = spwd->sp_pwdp; /* используем пароль */

password = getpass("Password: ");

/* Шифруем пароль и сразу же удаляем незашифрованную версию */

encrypted = crypt(password, pwd->pw_passwd);

for (p = password; *p!= '\0';)

*p++ = '\0';

if (encrypted == NULL)

errExit("crypt");

authOk = strcmp(encrypted, pwd->pw_passwd) == 0;

if (!authOk) {

printf("Incorrect password\n");

exit(EXIT_FAILURE);

}

printf("Successfully authenticated: UID=%ld\n", (long) pwd->pw_uid);

/* Теперь выполняем аутентификацию… */

exit(EXIT_SUCCESS);

}

cap/check_password_caps.c

39.8. Создание среды, в которой возможности являются единственным механизмом повышения привилегий

Ранее были описаны различные механизмы, благодаря которым привилегии пользователя с идентификатором 0 (администратор) зависят от системы возможностей.

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

• Если поменять действующий идентификатор пользователя, который изначально был равен 0, на ненулевое значение, процесс потеряет все свои действующие возможности. При обратном действии разрешенные возможности копируются в действующий набор. Похожая процедура выполняется для подмножества возможностей, когда UID файловой системы переключается между 0 и ненулевым значением (см. раздел 39.6).

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных