Књига "БПФ за праћење Линука"

Књига "БПФ за праћење Линука"Здраво, становници Кхабро! БПФ виртуелна машина је једна од најважнијих компоненти Линук кернела. Његова правилна употреба омогућиће системским инжењерима да пронађу грешке и реше чак и најсложеније проблеме. Научићете како да пишете програме који надгледају и мењају понашање кернела, како да безбедно примените код за праћење догађаја у кернелу и још много тога. Давид Калавера и Лоренцо Фонтана ће вам помоћи да откључате моћ БПФ-а. Проширите своје знање о оптимизацији перформанси, умрежавању, безбедности. - Користите БПФ да надгледате и мењате понашање Линук кернела. - Убаците код за безбедно надгледање догађаја језгра без потребе за поновном компајлирањем кернела или рестартовањем система. — Користите погодне примере кода у Ц, Го или Питхон-у. - Преузмите контролу поседовањем животног циклуса БПФ програма.

Безбедност Линук кернела, његове карактеристике и Сеццомп

БПФ пружа моћан начин за проширење кернела без жртвовања стабилности, сигурности или брзине. Из тог разлога, програмери кернела су сматрали да би била добра идеја да искористе његову свестраност да побољшају изолацију процеса у Сеццомпу имплементацијом Сеццомп филтера које подржавају БПФ програми, такође познатих као Сеццомп БПФ. У овом поглављу ћемо објаснити шта је Сеццомп и како се користи. Затим ћете научити како да напишете Сеццомп филтере користећи БПФ програме. Након тога, погледаћемо уграђене БПФ куке које су укључене у кернел за Линук безбедносне модуле.

Линук безбедносни модули (ЛСМ) су оквир који обезбеђује скуп функција које се могу користити за имплементацију различитих безбедносних модела на стандардизован начин. ЛСМ се може користити директно у изворном стаблу кернела, као што су Аппармор, СЕЛинук и Томоио.

Почнимо са расправом о могућностима Линук-а.

Могућности

Суштина Линук-ових могућности је да морате да дате непривилегованом процесу дозволу за обављање одређеног задатка, али без употребе суида у ту сврху, или на други начин да процес учините привилегованим, смањујући могућност напада и дозвољавајући процесу да изврши одређене задатке. На пример, ако ваша апликација треба да отвори привилеговани порт, рецимо 80, уместо да покренете процес као роот, можете јој једноставно дати могућност ЦАП_НЕТ_БИНД_СЕРВИЦЕ.

Размотрите Го програм под називом маин.го:

package main
import (
            "net/http"
            "log"
)
func main() {
     log.Fatalf("%v", http.ListenAndServe(":80", nil))
}

Овај програм служи ХТТП серверу на порту 80 (ово је привилеговани порт). Обично га покрећемо одмах након компилације:

$ go build -o capabilities main.go
$ ./capabilities

Међутим, пошто не додељујемо роот привилегије, овај код ће приказати грешку приликом повезивања порта:

2019/04/25 23:17:06 listen tcp :80: bind: permission denied
exit status 1

цапсх (менаџер љуске) је алатка која покреће љуску са одређеним скупом могућности.

У овом случају, као што је већ поменуто, уместо да дате потпуна роот права, можете да омогућите привилеговано везивање порта тако што ћете обезбедити цап_нет_бинд_сервице могућност заједно са свим осталим што је већ у програму. Да бисмо то урадили, можемо да приложимо наш програм великим словима:

# capsh --caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' 
   --keep=1 --user="nobody" 
   --addamb=cap_net_bind_service -- -c "./capabilities"

Хајде да мало разумемо овај тим.

  • цапсх - користите цапсх као шкољку.
  • —цапс='цап_нет_бинд_сервице+еип цап_сетпцап,цап_сетуид,цап_сетгид+еп' - пошто морамо да променимо корисника (не желимо да се покрећемо као роот), навешћемо цап_нет_бинд_сервице и могућност да заправо променимо ИД корисника са роот никоме, наиме цап_сетуид и цап_сетгид.
  • —кееп=1 — желимо да задржимо инсталиране могућности приликом преласка са основног налога.
  • —усер=“нободи” — крајњи корисник који покреће програм биће нико.
  • —аддамб=цап_нет_бинд_сервице — подесите брисање сродних могућности након преласка са основног режима.
  • - -ц "./цапабилитиес" - само покрените програм.

Повезане могућности су посебна врста способности које наслеђују подређени програми када их тренутни програм извршава помоћу екецве(). Само способности којима је дозвољено да се придруже, или другим речима, као способности окружења, могу се наследити.

Вероватно се питате шта значи +еип након што сте навели могућност у опцији --цапс. Ове заставице се користе да би се утврдило да ли је способност:

-мора бити активиран (п);

- доступно за употребу (е);

-може се наследити дечјим процесима (и).

Пошто желимо да користимо цап_нет_бинд_сервице, то треба да урадимо са е заставицом. Затим ћемо покренути љуску у команди. Ово ће покренути бинарни систем могућности и морамо га означити са заставицом и. На крају, желимо да функција буде омогућена (то смо урадили без промене УИД-а) са стр. Изгледа као цап_нет_бинд_сервице+еип.

Можете проверити резултат користећи сс. Хајде да скратимо мало излаз да стане на страницу, али ће приказати повезани порт и кориснички ИД који није 0, у овом случају 65:

# ss -tulpn -e -H | cut -d' ' -f17-
128 *:80 *:*
users:(("capabilities",pid=30040,fd=3)) uid:65534 ino:11311579 sk:2c v6only:0

У овом примеру смо користили цапсх, али можете написати љуску користећи либцап. За више информација погледајте ман 3 либцап.

Приликом писања програма, програмер често не зна унапред све функције које су потребне програму током рада; Штавише, ове функције се могу променити у новим верзијама.

Да бисмо боље разумели могућности нашег програма, можемо да узмемо алатку способну за БЦЦ, која поставља кпробе за функцију језгра цап_цапабле:

/usr/share/bcc/tools/capable
TIME      UID  PID   TID   COMM               CAP    NAME           AUDIT
10:12:53 0 424     424     systemd-udevd 12 CAP_NET_ADMIN         1
10:12:57 0 1103   1101   timesync        25 CAP_SYS_TIME         1
10:12:57 0 19545 19545 capabilities       10 CAP_NET_BIND_SERVICE 1

Исту ствар можемо постићи коришћењем бпфтрацеа са кпробе од једног реда у функцији језгра цап_цапабле:

bpftrace -e 
   'kprobe:cap_capable {
      time("%H:%M:%S ");
      printf("%-6d %-6d %-16s %-4d %dn", uid, pid, comm, arg2, arg3);
    }' 
    | grep -i capabilities

Ово ће дати нешто попут следећег ако су могућности нашег програма омогућене након кпробе:

12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 21 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 12 0
12:01:56 1000 13524 capabilities 10 1

Пета колона су могућности које су потребне процесу, а пошто овај излаз укључује догађаје који нису ревизијски, видимо све неревизијске провере и на крају потребну способност са заставицом ревизије (последња у излазу) постављеном на 1. Способност. један који нас занима је ЦАП_НЕТ_БИНД_СЕРВИЦЕ, дефинисан је као константа у изворном коду кернела у датотеци инцлуде/уапи/линук/абилити.х са идентификатором 10:

/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */
#define CAP_NET_BIND_SERVICE 10<source lang="go">

Могућности су често омогућене у току извршавања за контејнере као што су рунЦ или Доцкер како би им се омогућило да раде у непривилегованом режиму, али су им дозвољене само могућности потребне за покретање већине апликација. Када апликација захтева одређене могућности, Доцкер може да их обезбеди помоћу --цап-адд:

docker run -it --rm --cap-add=NET_ADMIN ubuntu ip link add dummy0 type dummy

Ова команда ће контејнеру дати могућност ЦАП_НЕТ_АДМИН, омогућавајући му да конфигурише мрежну везу за додавање думми0 интерфејса.

Следећи одељак показује како да користите функције као што је филтрирање, али користећи другу технику која нам омогућава да програмски имплементирамо сопствене филтере.

Сеццомп

Сеццомп је скраћеница за Сецуре Цомпутинг и представља безбедносни слој имплементиран у језгро Линука који омогућава програмерима да филтрирају одређене системске позиве. Иако је Сеццомп по могућностима упоредив са Линуком, његова способност управљања одређеним системским позивима га чини много флексибилнијим у поређењу са њима.

Сеццомп и Линук функције се међусобно не искључују и често се користе заједно како би се користила оба приступа. На пример, можда желите да дате процесу могућност ЦАП_НЕТ_АДМИН, али му не дозволите да прихвата везе утичнице, блокирајући системске позиве аццепт и аццепт4.

Сеццомп метод филтрирања је заснован на БПФ филтерима који раде у режиму СЕЦЦОМП_МОДЕ_ФИЛТЕР, а филтрирање системских позива се врши на исти начин као и за пакете.

Сеццомп филтери се учитавају користећи прцтл кроз операцију ПР_СЕТ_СЕЦЦОМП. Ови филтери имају облик БПФ програма који се извршава за сваки Сеццомп пакет представљен структуром сеццомп_дата. Ова структура садржи референтну архитектуру, показивач на инструкције процесора у време системског позива и највише шест аргумената системског позива, изражених као уинт64.

Овако изгледа структура сеццомп_дата из изворног кода кернела у датотеци линук/сеццомп.х:

struct seccomp_data {
int nr;
      __u32 arch;
      __u64 instruction_pointer;
      __u64 args[6];
};

Као што видите из ове структуре, можемо филтрирати према системском позиву, његовим аргументима или комбинацији обоје.

Након што прими сваки Сеццомп пакет, филтер мора да изврши обраду да би донео коначну одлуку и рекао кернелу шта даље да ради. Коначна одлука се изражава једном од повратних вредности (кодова статуса).

- СЕЦЦОМП_РЕТ_КИЛЛ_ПРОЦЕСС - убија цео процес одмах након филтрирања системског позива који се због тога не извршава.

- СЕЦЦОМП_РЕТ_КИЛЛ_ТХРЕАД - прекида тренутну нит одмах након филтрирања системског позива који се због тога не извршава.

— СЕЦЦОМП_РЕТ_КИЛЛ — алиас за СЕЦЦОМП_РЕТ_КИЛЛ_ТХРЕАД, лево за компатибилност уназад.

- СЕЦЦОМП_РЕТ_ТРАП - системски позив је забрањен, а сигнал СИГСИС (Лош системски позив) се шаље задатку који га позива.

- СЕЦЦОМП_РЕТ_ЕРРНО - Системски позив се не извршава, а део повратне вредности филтера СЕЦЦОМП_РЕТ_ДАТА се прослеђује корисничком простору као еррно вредност. У зависности од узрока грешке, враћају се различите еррно вредности. Листа бројева грешака је дата у следећем одељку.

- СЕЦЦОМП_РЕТ_ТРАЦЕ - Користи се за обавештавање птраце трацер користећи - ПТРАЦЕ_О_ТРАЦЕСЕЦЦОМП за пресретање када се системски позив изврши да би се видео и контролисао тај процес. Ако трагач није повезан, враћа се грешка, еррно се поставља на -ЕНОСИС и системски позив се не извршава.

- СЕЦЦОМП_РЕТ_ЛОГ - системски позив је решен и евидентиран.

- СЕЦЦОМП_РЕТ_АЛЛОВ - системски позив је једноставно дозвољен.

птраце је системски позив за имплементацију механизама праћења у процесу који се зове трацее, са могућношћу праћења и контроле извршења процеса. Програм праћења може ефикасно утицати на извршење и модификовати меморијске регистре трага. У Сеццомп контексту, птраце се користи када га покрене статусни код СЕЦЦОМП_РЕТ_ТРАЦЕ, тако да трагач може да спречи извршавање системског позива и имплементира сопствену логику.

Сеццомп грешке

С времена на време, док радите са Сеццомпом, наићи ћете на разне грешке које се идентификују повратном вредношћу типа СЕЦЦОМП_РЕТ_ЕРРНО. Да би пријавио грешку, системски позив сеццомп ће вратити -1 уместо 0.

Могуће су следеће грешке:

- ЕАЦЦЕСС - Позиваоцу није дозвољено да упути системски позив. Ово се обично дешава зато што нема привилегије ЦАП_СИС_АДМИН или но_нев_привс није подешен помоћу прцтл-а (о томе ћемо касније);

— ЕФАУЛТ — прослеђени аргументи (аргови у структури сеццомп_дата) немају исправну адресу;

— ЕИНВАЛ — овде могу бити четири разлога:

-тражена операција је непозната или није подржана од стране кернела у тренутној конфигурацији;

-наведене заставице нису важеће за тражену операцију;

-операција укључује БПФ_АБС, али постоје проблеми са наведеним офсетом, који може премашити величину структуре сеццомп_дата;

-број инструкција прослеђених филтеру премашује максимум;

— ЕНОМЕМ — нема довољно меморије за извршавање програма;

- ЕОПНОТСУПП - операција је показала да је са СЕЦЦОМП_ГЕТ_АЦТИОН_АВАИЛ акција била доступна, али кернел не подржава враћање у аргументима;

— ЕСРЦХ — дошло је до проблема при синхронизацији другог тока;

- ЕНОСИС - За акцију СЕЦЦОМП_РЕТ_ТРАЦЕ не постоји никакав трагач.

прцтл је системски позив који омогућава програму у корисничком простору да манипулише (подеси и добије) специфичне аспекте процеса, као што су ендианнесс бајтова, имена нити, безбедни режим израчунавања (Сеццомп), привилегије, Перф догађаји, итд.

Сеццомп вам може изгледати као технологија сандбок-а, али није. Сеццомп је услужни програм који омогућава корисницима да развију сандбок механизам. Сада погледајмо како се креирају програми за интеракцију корисника помоћу филтера који се директно позива Сеццомп системским позивом.

Пример БПФ Сеццомп филтера

Овде ћемо показати како да комбинујемо две акције о којима смо раније говорили, наиме:

— написаћемо Сеццомп БПФ програм, који ће се користити као филтер са различитим повратним кодовима у зависности од донетих одлука;

— учитајте филтер користећи прцтл.

Прво су вам потребна заглавља из стандардне библиотеке и Линук кернела:

#include <errno.h>
#include <linux/audit.h>
#include <linux/bpf.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <unistd.h>

Пре него што покушамо са овим примером, морамо се уверити да је кернел компајлиран са ЦОНФИГ_СЕЦЦОМП и ЦОНФИГ_СЕЦЦОМП_ФИЛТЕР постављеним на и. На радној машини ово можете проверити овако:

cat /proc/config.gz| zcat | grep -i CONFIG_SECCOMP

Остатак кода је дводелна функција инсталл_филтер. Први део садржи нашу листу упутстава за филтрирање БПФ-а:

static int install_filter(int nr, int arch, int error) {
  struct sock_filter filter[] = {
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, arch))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3),
    BPF_STMT(BPF_LD + BPF_W + BPF_ABS, (offsetof(struct seccomp_data, nr))),
    BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (error & SECCOMP_RET_DATA)),
    BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW),
  };

Инструкције се постављају коришћењем макроа БПФ_СТМТ и БПФ_ЈУМП дефинисаних у датотеци линук/филтер.х.
Хајде да прођемо кроз упутства.

- БПФ_СТМТ(БПФ_ЛД + БПФ_В + БПФ_АБС (оффсетоф(струцт сеццомп_дата, арцх))) - систем се учитава и акумулира из БПФ_ЛД у облику речи БПФ_В, пакетни подаци се налазе на фиксном офсету БПФ_АБС.

- БПФ_ЈУМП(БПФ_ЈМП + БПФ_ЈЕК + БПФ_К, арцх, 0, 3) - проверава помоћу БПФ_ЈЕК да ли је вредност архитектуре у константи акумулатора БПФ_К једнака арцх. Ако је тако, скаче на помаку 0 на следећу инструкцију, у супротном скаче на помак 3 (у овом случају) да би довео до грешке јер се арцх не поклапа.

- БПФ_СТМТ(БПФ_ЛД + БПФ_В + БПФ_АБС (оффсетоф(струцт сеццомп_дата, нр))) - Учитава и акумулира из БПФ_ЛД у облику речи БПФ_В, што је број системског позива садржан у фиксном померању БПФ_АБС.

— БПФ_ЈУМП(БПФ_ЈМП + БПФ_ЈЕК + БПФ_К, нр, 0, 1) — упоређује број системског позива са вредношћу променљиве нр. Ако су једнаки, прелази се на следећу инструкцију и онемогућава системски позив, у супротном дозвољава системски позив са СЕЦЦОМП_РЕТ_АЛЛОВ.

- БПФ_СТМТ(БПФ_РЕТ + БПФ_К, СЕЦЦОМП_РЕТ_ЕРРНО | (еррор & СЕЦЦОМП_РЕТ_ДАТА)) - завршава програм са БПФ_РЕТ и као резултат производи грешку СЕЦЦОМП_РЕТ_ЕРРНО са бројем из променљиве ерр.

- БПФ_СТМТ(БПФ_РЕТ + БПФ_К, СЕЦЦОМП_РЕТ_АЛЛОВ) - завршава програм са БПФ_РЕТ и дозвољава да се системски позив изврши помоћу СЕЦЦОМП_РЕТ_АЛЛОВ.

СЕЦЦОМП ЈЕ ЦБПФ
Можда се питате зашто се листа инструкција користи уместо преведеног ЕЛФ објекта или ЈИТ компајлираног Ц програма.

Два су разлога за ово.

• Прво, Сеццомп користи цБПФ (класични БПФ) а не еБПФ, што значи: нема регистре, већ само акумулатор за чување последњег резултата прорачуна, као што се може видети у примеру.

• Друго, Сеццомп директно прихвата показивач на низ БПФ инструкција и ништа друго. Макрои које смо користили једноставно помажу у одређивању ових инструкција на начин који је погодан за програмере.

Ако вам је потребна додатна помоћ у разумевању овог склопа, размотрите псеудокод који ради исту ствар:

if (arch != AUDIT_ARCH_X86_64) {
    return SECCOMP_RET_ALLOW;
}
if (nr == __NR_write) {
    return SECCOMP_RET_ERRNO;
}
return SECCOMP_RET_ALLOW;

Након дефинисања кода филтера у структури соцкет_филтер, потребно је да дефинишете соцк_фпрог који садржи код и израчунату дужину филтера. Ова структура података је потребна као аргумент за декларисање процеса за касније покретање:

struct sock_fprog prog = {
   .len = (unsigned short)(sizeof(filter) / sizeof(filter[0])),
   .filter = filter,
};

У функцији инсталл_филтер остаје само једна ствар - учитати сам програм! Да бисмо то урадили, користимо прцтл, узимајући ПР_СЕТ_СЕЦЦОМП као опцију за улазак у режим безбедног рачунара. Затим кажемо режиму да учита филтер користећи СЕЦЦОМП_МОДЕ_ФИЛТЕР, који се налази у прог променљивој типа соцк_фпрог:

  if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog)) {
    perror("prctl(PR_SET_SECCOMP)");
    return 1;
  }
  return 0;
}

Коначно, можемо да користимо нашу функцију инсталл_филтер, али пре тога морамо да употребимо прцтл да поставимо ПР_СЕТ_НО_НЕВ_ПРИВС за тренутно извршавање и на тај начин избегнемо ситуацију у којој дечји процеси добијају више привилегија од својих родитеља. Са овим можемо извршити следеће прцтл позиве у функцији инсталл_филтер без роот права.

Сада можемо позвати функцију инсталл_филтер. Хајде да блокирамо све системске позиве за писање у вези са архитектуром Кс86-64 и једноставно дамо дозволу која блокира све покушаје. Након инсталирања филтера, настављамо са извршавањем користећи први аргумент:

int main(int argc, char const *argv[]) {
  if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
   perror("prctl(NO_NEW_PRIVS)");
   return 1;
  }
   install_filter(__NR_write, AUDIT_ARCH_X86_64, EPERM);
  return system(argv[1]);
 }

Хајде да почнемо. За компајлирање нашег програма можемо користити или цланг или гцц, у сваком случају то је само компајлирање маин.ц датотеке без посебних опција:

clang main.c -o filter-write

Као што је наведено, блокирали смо све уносе у програму. Да бисте ово тестирали, потребан вам је програм који нешто даје - лс изгледа као добар кандидат. Овако се она обично понаша:

ls -la
total 36
drwxr-xr-x 2 fntlnz users 4096 Apr 28 21:09 .
drwxr-xr-x 4 fntlnz users 4096 Apr 26 13:01 ..
-rwxr-xr-x 1 fntlnz users 16800 Apr 28 21:09 filter-write
-rw-r--r-- 1 fntlnz users 19 Apr 28 21:09 .gitignore
-rw-r--r-- 1 fntlnz users 1282 Apr 28 21:08 main.c

Предивна! Ево како изгледа коришћење нашег програма омотача: Једноставно прослеђујемо програм који желимо да тестирамо као први аргумент:

./filter-write "ls -la"

Када се изврши, овај програм производи потпуно празан излаз. Међутим, можемо користити страце да видимо шта се дешава:

strace -f ./filter-write "ls -la"

Резултат рада је знатно скраћен, али одговарајући део показује да су записи блокирани са ЕПЕРМ грешком - истом оном коју смо конфигурисали. То значи да програм не исписује ништа јер не може приступити позиву система за писање:

[pid 25099] write(2, "ls: ", 4) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "write error", 11) = -1 EPERM (Operation not permitted)
[pid 25099] write(2, "n", 1) = -1 EPERM (Operation not permitted)

Сада разумете како функционише Сеццомп БПФ и имате добру идеју шта можете да урадите са њим. Али зар не бисте желели да постигнете исту ствар са еБПФ-ом уместо цБПФ-ом да бисте искористили његову пуну снагу?

Када размишљају о еБПФ програмима, већина људи мисли да их они једноставно пишу и учитавају им администраторске привилегије. Иако је ова изјава генерално тачна, кернел имплементира скуп механизама за заштиту еБПФ објеката на различитим нивоима. Ови механизми се називају БПФ ЛСМ замке.

БПФ ЛСМ замке

Да би се обезбедило праћење системских догађаја независно од архитектуре, ЛСМ имплементира концепт замки. Прекид позива је технички сличан системском позиву, али је независан од система и интегрисан је са инфраструктуром. ЛСМ пружа нови концепт у коме слој апстракције може помоћи да се избегну проблеми који се јављају када се ради са системским позивима на различитим архитектурама.

У време писања, кернел има седам кукица повезаних са БПФ програмима, а СЕЛинук је једини уграђени ЛСМ који их имплементира.

Изворни код за замке се налази у стаблу кернела у датотеци инцлуде/линук/сецурити.х:

extern int security_bpf(int cmd, union bpf_attr *attr, unsigned int size);
extern int security_bpf_map(struct bpf_map *map, fmode_t fmode);
extern int security_bpf_prog(struct bpf_prog *prog);
extern int security_bpf_map_alloc(struct bpf_map *map);
extern void security_bpf_map_free(struct bpf_map *map);
extern int security_bpf_prog_alloc(struct bpf_prog_aux *aux);
extern void security_bpf_prog_free(struct bpf_prog_aux *aux);

Сваки од њих ће бити позван у различитим фазама извршења:

— сецурити_бпф — врши почетну проверу извршених БПФ системских позива;

- сецурити_бпф_мап - проверава када кернел враћа дескриптор датотеке за мапу;

- сецурити_бпф_прог - проверава када кернел враћа дескриптор датотеке за еБПФ програм;

— сецурити_бпф_мап_аллоц — проверава да ли је безбедносно поље унутар БПФ мапа иницијализовано;

- сецурити_бпф_мап_фрее - проверава да ли је безбедносно поље очишћено унутар БПФ мапа;

— сецурити_бпф_прог_аллоц — проверава да ли је безбедносно поље иницијализовано унутар БПФ програма;

- сецурити_бпф_прог_фрее - проверава да ли је безбедносно поље очишћено унутар БПФ програма.

Сада, када видимо све ово, разумемо: идеја иза ЛСМ БПФ пресретача је да они могу да обезбеде заштиту сваком еБПФ објекту, обезбеђујући да само они са одговарајућим привилегијама могу да обављају операције на картицама и програмима.

Резиме

Безбедност није нешто што можете применити на јединствен начин за све што желите да заштитите. Важно је бити у стању да заштитите системе на различитим нивоима и на различите начине. Веровали или не, најбољи начин да се обезбеди систем је организовање различитих нивоа заштите са различитих позиција, тако да смањење безбедности једног нивоа не омогући приступ целом систему. Главни програмери су урадили одличан посао дајући нам скуп различитих слојева и додирних тачака. Надамо се да смо вам добро разумели шта су слојеви и како да користите БПФ програме за рад са њима.

О ауторима

Давид Цалавера је ЦТО у Нетлифају. Радио је у подршци за Доцкер и допринео развоју Рунц, Го и БЦЦ алата, као и других пројеката отвореног кода. Познат по свом раду на Доцкер пројектима и развоју екосистема додатака Доцкер. Давид је веома страствен за графове пламена и увек жели да оптимизује перформансе.

Лорензо Фонтана ради у тиму отвореног кода у Сисдиг-у, где је првенствено фокусиран на Фалцо, пројекат Цлоуд Нативе Цомпутинг Фоундатион који обезбеђује сигурност током извршавања контејнера и откривање аномалија кроз модул кернела и еБПФ. Он је страствен за дистрибуиране системе, софтверски дефинисано умрежавање, Линук кернел и анализу перформанси.

» Више детаља о књизи можете пронаћи на веб-сајт издавача
» Преглед садржаја
» Извод

За Кхаброзхителеи 25% попуста користећи купон - линук

По уплати папирне верзије књиге, електронска књига ће бити послата на е-маил.

Извор: ввв.хабр.цом

Додај коментар