Възможностите позволяват оценката на някои важни системни привилегии в отделна нишка, различна от текущия процес. По този начин не е необходимо да стартирате програма като root, за да има достъп до определени части на системата.

Като решение, произтичащо от нужди, раздел 25 от POSIX.1e е за този проблем. Разработването на привилегиите, дефинирани в този раздел и други, приключи с пускането на версия на ядрото на Linux 2.6.26. Ето всичко, което трябва да знаете за възможностите в ядрото на Linux.

Разбиране на логиката на API за възможности

Контролът на авторизацията в Unix-базирани системи се състои от две стъпки:

  • Ако текущият собственик (действителен потребителски идентификатор, EUID) на работещото приложение е нула, тогава системата не проверява за оторизация
  • Ако стойността на EUID е различна от нула, системата изпълнява контролния процес в съответствие с оторизациите на ефективния потребител и група на съответното приложение

Някои приложения трябва да имат по-широки привилегии (SUID, SGIT битове), докато работят. Като най-типичен пример можете да се сетите

instagram viewer
приложението passwd. С това потребителите в системата могат да променят паролите си. Въпреки това, да пиша на /etc/shadow файл, където се съхраняват криптираните пароли, е необходимо да се работи с root потребителски права (т.е. user ID = 0).

За да разреши този проблем, приложението passwd има SUID бит. Който и потребител да стартира това приложение, активният собственик (EUID) винаги ще бъде root:

ls -l /usr/bin/passwd

# Изход
-rwsr-xr-x. 1 root root 32552 23 юли 2021 г. /usr/bin/passwd

Възможността за стартиране на SUID приложения в традиционния модел за удостоверяване на Unix изглежда е решила проблема. Въпреки това, критичните грешки в приложения с SUID битове отварят вратата за стартиране на нежелани кодове за потребители с пълна власт в системата. Идеалното приложение трябва да може да работи, без да има нужда от root потребителски права, ако е възможно.

Проблемът не свършва само с бита SUID. Вие също трябва да имате root потребителски права, когато искате да слушате a привилегирован TCP или UDP порт по-малко от 1024 на Unix-базирани системи. Например, за да можете да слушате TCP 80 порта на уеб сървър, трябва да стартирате приложението като root потребител.

През годините се разбра колко опустошително е да се стартира софтуер, който предоставя услуги на мрежовата среда с напълно оторизиран потребителски акаунт. Като временно решение беше прието, че само определена и по-малка част от програмата слуша на привилегирования порт като root, и след това променя активния потребителски идентификатор на друг потребител за последващи процеси (например никой потребител с ограничени права).

Тази система, която се използва от години, работи добре със своята простота и все още се използва ефективно. Въпреки това, в днешно време е възможно да получите някои допълнителни възможности, специфични за приложението, чрез API за възможности на Linux, без да са необходими root права, освен гореспоменатите система.

Моделът за възможности на Linux, обяснено!

Можете да намерите най-изчерпателната реализация на API за възможности в ядрото на Linux. Съвременните дистрибуции на Linux също се опитват да използват този нов модел в цялата система колкото е възможно повече.

Например, за да работи ping приложението, то трябва да може да отваря RAW сокети, които обикновено са запазени само за root потребители. В старите дистрибуции на Linux проблемът е да се даде бит SUID на приложението, така че нормалните потребители да могат да го използват. В тези версии, когато премахнете бита SUID от приложението и се опитате да стартирате приложението като нормален потребител, получавате следната грешка:

пинг 8.8.8.8

# Изход
ping: icmp open socket: Операцията не е разрешена

Докато в съвременните дистрибуции на Linux приложението ping вероятно няма бит SUID:

ls -l /bin/ping 

# Изход
-rwxr-xr-x. 1 root root 95232 25 юли 2021 г. /bin/ping

Въпреки това можете да стартирате приложението успешно като обикновен потребител. Механизмът, който прави това възможно е, че приложението за пинг има специалната способност CAP_NET_RAW.

Можете да научите допълнителните възможности на приложението с getcap команда, както следва:

sudo getcap /bin/ping

# Изход
/bin/ping cap_net_raw=ep

Ако командата getcap върне празен отговор, можете ръчно да зададете тази стойност с:

sudo setcap cap_net_raw+ep /bin/ping

Моделът на капацитета на процеса

При внедряването на Linux възможностите на всеки процес са групирани в три заглавия:

Възможност Изявление
разрешено В този клъстер има списък с разрешени допълнителни възможности за съответния процес. Даването на разрешение не означава, че то може да се използва активно по това време. Възможно е да се включат разрешенията тук в ефективния набор от възможности с допълнително действие.
ефективен Показва текущо активния списък с възможности на свързания процес. С помощните функции, които регулират системата от умения, е възможно да се откажете или да си върнете умението. Във всеки случай обаче това може да се направи само сред вече упълномощените в разрешената група.
наследствени Когато дадено приложение стартира нов процес, току-що стартиралият процес показва списъка с възможности, които ще наследи от разрешения списък.

Списъкът с разрешени, ефективни и наследствени възможности за стартиране на процеси по всяко време се показва като битмаска на редовете CapPrm, CapEff, и CapInh във файла /proc//status. В допълнение, на CapBnd ред съдържа битовата маска, използвана в операцията за контрол на границата на възможностите.

Например, опитайте да прочетете стойностите на вашето работещо шел приложение от /proc/self/status файл:

котка /proc/себе си/състояние | grep Cap

# Изход
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Моделът на възможностите за файлове в Linux

Работата на системата за възможности за файлове зависи от предпоставката тези свойства да могат да се съхраняват в слоя на виртуалната файлова система (VFS). Подобно на модела на процеса, възможностите за файлове попадат в три заглавия:

1. Разрешено

Системата определя разрешените възможности на процеса, когато съответният изпълним файл се изпълнява в този клъстер.

2. Ефективно

За разлика от модела на възможностите на процеса, този хедър съхранява само един бит: активен или неактивен. Ако битът е активен, възможностите, дефинирани в разрешения списък на файла, са автоматично се прехвърля към списъка с ефективни възможности на съответния процес, когато този файл се изпълнява и процесът е създадена. Ако битът не е активен, автоматичното прехвърляне на разрешените възможности на файла към работещия процес не се извършва.

Въпреки това, ако кодът на съответното приложение е интегриран със системата за възможности, той може да активира разрешенията в разрешения набор на файла със системни повиквания. Основната цел на това поведение е да гарантира, че старите приложения, които не включват специфични за системата възможности код, разработката на ниво софтуерен код може да работи със системата за възможности без нужда от какъвто и да е изходен код промени.

Може да си помислите, че по-добре написаните приложения ще използват възможности само когато е необходимо. Ако битът е активен, всички възможности в разрешения списък стават активни при стартиране на приложението.

3. Наследствена

Както в модела на процеса, съответният файл се изпълнява и възниква процес. Ако друго приложение стартира от процеса след това, то се включва в разрешения списък на новия процес. За да обобщим, той посочва списък с способности за наследяване.

Ролята на възможностите в Linux система

Когато стартирате определен процес като нормален потребител, нямате никакви привилегии. В резултат на това имате достъп само до дяловете, които системата позволява за нормални потребители. Основната причина за това е засилването на сигурността на системата и прилагането на такива мерки.

Разрешаването на всички потребители за достъп до всички ресурси може да създаде сериозна уязвимост в сигурността. За хората, които използват системата за злонамерени цели, ще бъде много лесно да експлоатират системните уязвимости. Възможностите на Linux са полезни в такива въпроси. Можете лесно да подобрите сигурността на вашите приложения с API за възможности, захранвани от ядрото.

Възможностите на Linux са само един от проблемите, които трябва да се обмислят, за да се правят много мощни методи като разделяне на root потребителя разрешения, присвояване на различни разрешения на непривилегировани потребители и предприемане на различни предпазни мерки относно отворените портове в интернет услугите с Linux сървъри.

Подобрете сигурността на вашия Linux сървър с тези 7 стъпки за втвърдяване

Прочетете Следващото

ДялтуитДялелектронна поща

Свързани теми

  • Linux
  • Програмиране
  • Linux ядро
  • Операционна система

За автора

Фатих Кючуккаракурт (Публикувани 8 статии)

Инженер и разработчик на софтуер, който е фен на математиката и технологиите. Винаги е харесвал компютрите, математиката и физиката. Той е разработил проекти на двигатели за игри, както и машинно обучение, изкуствени невронни мрежи и библиотеки с линейна алгебра. Освен това продължава да работи върху машинно обучение и линейни матрици.

Още от Fatih Küçükkarakurt

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, ревюта, безплатни електронни книги и ексклузивни оферти!

Щракнете тук, за да се абонирате