Ktieb "BPF għall-Monitoraġġ tal-Linux"

Ktieb "BPF għall-Monitoraġġ tal-Linux"Hello, residenti Khabro! Il-magna virtwali BPF hija waħda mill-aktar komponenti importanti tal-qalba tal-Linux. L-użu xieraq tiegħu se jippermetti lill-inġiniera tas-sistema jsibu ħsarat u jsolvu anke l-aktar problemi kumplessi. Int ser titgħallem kif tikteb programmi li jimmonitorjaw u jimmodifikaw l-imġieba tal-qalba, kif timplimenta b'mod sikur kodiċi biex tissorvelja l-avvenimenti fil-qalba, u ħafna aktar. David Calavera u Lorenzo Fontana se jgħinuk tiftaħ il-qawwa ta 'BPF. Tespandi l-għarfien tiegħek dwar l-ottimizzazzjoni tal-prestazzjoni, in-netwerking, is-sigurtà. - Uża BPF biex tissorvelja u timmodifika l-imġieba tal-qalba tal-Linux. - Injetta l-kodiċi biex timmonitorja b'mod sigur l-avvenimenti tal-qalba mingħajr ma jkollok għalfejn tikkompila mill-ġdid il-qalba jew terġa 'tibda s-sistema. — Uża eżempji ta’ kodiċi konvenjenti f’C, Go jew Python. - Ħu l-kontroll billi tippossjedi ċ-ċiklu tal-ħajja tal-programm BPF.

Linux Kernel Security, il-Karatteristiċi tiegħu u Seccomp

BPF jipprovdi mod qawwi biex testendi l-qalba mingħajr ma tiġi sagrifikata l-istabbiltà, is-sigurtà jew il-veloċità. Għal din ir-raġuni, l-iżviluppaturi tal-qalba ħasbu li tkun idea tajba li tuża l-versatilità tagħha biex ittejjeb l-iżolament tal-proċess f'Seccomp billi timplimenta filtri Seccomp appoġġjati minn programmi BPF, magħrufa wkoll bħala Seccomp BPF. F'dan il-kapitlu se nispjegaw x'inhu Seccomp u kif jintuża. Imbagħad int titgħallem kif tikteb filtri Seccomp billi tuża programmi BPF. Wara dan, inħarsu lejn il-ganċijiet BPF integrati li huma inklużi fil-qalba għall-moduli tas-sigurtà tal-Linux.

Linux Security Modules (LSM) huma qafas li jipprovdi sett ta 'funzjonijiet li jistgħu jintużaw biex jimplimentaw diversi mudelli ta' sigurtà b'mod standardizzat. LSM jista 'jintuża direttament fis-siġra tas-sors tal-qalba, bħal Apparmor, SELinux u Tomoyo.

Nibdew billi niddiskutu l-kapaċitajiet tal-Linux.

Kapaċitajiet

L-essenza tal-kapaċitajiet tal-Linux hija li għandek bżonn tagħti permess ta 'proċess mhux privileġġjat biex twettaq ċertu kompitu, iżda mingħajr ma tuża suid għal dak il-għan, jew inkella tagħmel il-proċess privileġġjat, tnaqqas il-possibbiltà ta' attakk u tippermetti lill-proċess iwettaq ċerti kompiti. Pereżempju, jekk l-applikazzjoni tiegħek teħtieġ tiftaħ port privileġġjat, ngħidu aħna 80, minflok ma tħaddem il-proċess bħala root, tista 'sempliċement tagħtiha l-kapaċità CAP_NET_BIND_SERVICE.

Ikkunsidra programm Go bl-isem main.go:

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

Dan il-programm iservi server HTTP fuq il-port 80 (dan huwa port privileġġjat). Normalment inħaddmuha immedjatament wara l-kumpilazzjoni:

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

Madankollu, peress li mhux qed nagħtu privileġġi tal-għeruq, dan il-kodiċi se jarmi żball meta jorbot il-port:

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

capsh (maniġer tal-qoxra) hija għodda li tmexxi qoxra b'sett speċifiku ta 'kapaċitajiet.

F'dan il-każ, kif diġà ssemma, minflok ma tagħti drittijiet tal-għeruq sħaħ, tista 'tippermetti l-irbit tal-port privileġġjat billi tipprovdi l-kapaċità cap_net_bind_service flimkien ma' kull ħaġa oħra li diġà tinsab fil-programm. Biex nagħmlu dan, nistgħu nehmeż il-programm tagħna f'capsh:

# 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"

Ejja nifhmu ftit lil dan it-tim.

  • capsh - uża capsh bħala qoxra.
  • —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - peress li rridu nbiddlu l-utent (ma rridux nibdlu bħala root), aħna ser nispeċifikaw cap_net_bind_service u l-abbiltà li fil-fatt nibdlu l-ID tal-utent minn għerq lil ħadd, jiġifieri cap_setuid u cap_setgid.
  • —keep=1 — irridu nżommu l-kapaċitajiet installati meta naqleb mill-kont root.
  • —user="nobody" — l-utent finali li jmexxi l-programm se jkun ħadd.
  • —addamb=cap_net_bind_service — issettja l-ikklerjar tal-kapaċitajiet relatati wara li taqleb mill-modalità root.
  • - -c "./capabilities" - mexxi biss il-programm.

Il-kapaċitajiet marbuta huma tip speċjali ta' kapaċitajiet li jintirtu minn programmi tfal meta l-programm attwali jesegwixxihom bl-użu ta' execve(). Jistgħu jintirtu biss il-kapaċitajiet li jitħallew jiġu assoċjati, jew fi kliem ieħor, bħala kapaċitajiet ambjentali.

Probabbilment qed tistaqsi xi tfisser +eip wara li tispeċifika l-kapaċità fl-għażla --caps. Dawn il-bnadar jintużaw biex jiddeterminaw li l-kapaċità:

-għandu jiġi attivat (p);

- disponibbli għall-użu (e);

-jistgħu jintirtu minn proċessi tfal (i).

Peress li rridu nużaw cap_net_bind_service, irridu nagħmlu dan bil-bandiera e. Imbagħad se nibdew il-qoxra fil-kmand. Dan se jmexxi l-kapaċitajiet binarji u għandna bżonn li jimmarkawh bil-bandiera i. Fl-aħħarnett, irridu li l-karatteristika tkun attivata (għamilna dan mingħajr ma nbiddlu l-UID) b'p. Jidher qisu cap_net_bind_service+eip.

Tista 'tiċċekkja r-riżultat billi tuża ss. Ejja nqassru ftit l-output biex toqgħod fuq il-paġna, iżda se juri l-port assoċjat u l-ID tal-utent minbarra 0, f'dan il-każ 65:

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

F'dan l-eżempju użajna capsh, imma tista' tikteb qoxra billi tuża libcap. Għal aktar informazzjoni, ara man 3 libcap.

Meta tikteb programmi, ħafna drabi l-iżviluppatur ma jkunx jaf minn qabel il-karatteristiċi kollha li l-programm jeħtieġ fil-ħin tat-tħaddim; Barra minn hekk, dawn il-karatteristiċi jistgħu jinbidlu f'verżjonijiet ġodda.

Biex nifhmu aħjar il-kapaċitajiet tal-programm tagħna, nistgħu nieħdu l-għodda kapaċi BCC, li tistabbilixxi l-kprobe għall-funzjoni tal-kernel cap_capable:

/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

Nistgħu niksbu l-istess ħaġa billi nużaw bpftrace b'kprobe b'linja waħda fil-funzjoni tal-qalba cap_capable:

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

Dan joħroġ xi ħaġa bħal dan li ġej jekk il-kapaċitajiet tal-programm tagħna jkunu attivati ​​wara kprobe:

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

Il-ħames kolonna hija l-kapaċitajiet li jeħtieġ il-proċess, u peress li dan l-output jinkludi avvenimenti mhux tal-awditjar, naraw il-kontrolli kollha mhux tal-awditjar u finalment il-kapaċità meħtieġa bil-bandiera tal-verifika (l-aħħar fl-output) issettjata għal 1. Kapaċità wieħed li aħna interessati fih huwa CAP_NET_BIND_SERVICE, huwa definit bħala kostanti fil-kodiċi tas-sors tal-kernel fil-fajl include/uapi/linux/ability.h bl-identifikatur 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">

Ħafna drabi l-kapaċitajiet huma attivati ​​waqt ir-runtime għal kontenituri bħal runC jew Docker biex jippermettulhom jaħdmu f'modalità mhux privileġġata, iżda huma permessi biss il-kapaċitajiet meħtieġa biex imexxu l-biċċa l-kbira tal-applikazzjonijiet. Meta applikazzjoni teħtieġ ċerti kapaċitajiet, Docker jista’ jipprovdihom billi juża --cap-add:

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

Dan il-kmand jagħti lill-kontenitur il-kapaċità CAP_NET_ADMIN, li jippermettilu jikkonfigura link tan-netwerk biex iżżid l-interface dummy0.

It-taqsima li jmiss turi kif tuża karatteristiċi bħall-iffiltrar, iżda tuża teknika differenti li tippermettilna nimplimentaw b'mod programmatiku l-filtri tagħna stess.

Seccomp

Seccomp tfisser Secure Computing u huwa saff ta 'sigurtà implimentat fil-kernel Linux li jippermetti lill-iżviluppaturi biex jiffiltraw ċerti sejħiet tas-sistema. Għalkemm Seccomp huwa komparabbli fil-kapaċitajiet għal Linux, il-kapaċità tiegħu li jamministra ċerti sejħiet tas-sistema tagħmilha ħafna aktar flessibbli meta mqabbla magħhom.

Il-karatteristiċi ta' Seccomp u Linux mhumiex esklussivi lil xulxin u ħafna drabi jintużaw flimkien biex jibbenefikaw miż-żewġ approċċi. Pereżempju, tista 'tkun trid tagħti proċess il-kapaċità CAP_NET_ADMIN iżda ma tħallihx jaċċetta konnessjonijiet tas-socket, billi timblokka l-aċċettazzjoni u taċċetta4 sejħiet tas-sistema.

Il-metodu ta 'filtrazzjoni Seccomp huwa bbażat fuq filtri BPF li joperaw fil-mod SECCOMP_MODE_FILTER, u l-iffiltrar tas-sejħiet tas-sistema jitwettaq bl-istess mod bħal għall-pakketti.

Il-filtri Seccomp huma mgħobbija bl-użu ta' prctl permezz tal-operazzjoni PR_SET_SECCOMP. Dawn il-filtri jieħdu l-forma ta' programm BPF li jiġi esegwit għal kull pakkett Seccomp rappreżentat mill-istruttura seccomp_data. Din l-istruttura fiha l-arkitettura ta’ referenza, pointer għall-istruzzjonijiet tal-proċessur fil-ħin tas-sejħa tas-sistema, u massimu ta’ sitt argumenti tas-sejħa tas-sistema, espressi bħala uint64.

Dan huwa kif tidher l-istruttura seccomp_data mill-kodiċi tas-sors tal-kernel fil-fajl linux/seccomp.h:

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

Kif tistgħu taraw minn din l-istruttura, nistgħu niffiltraw mis-sejħa tas-sistema, l-argumenti tagħha, jew taħlita tat-tnejn.

Wara li jirċievi kull pakkett Seccomp, il-filtru għandu jwettaq l-ipproċessar biex jieħu deċiżjoni finali u jgħid lill-qalba x'għandu jagħmel wara. Id-deċiżjoni finali hija espressa b'wieħed mill-valuri tar-ritorn (kodiċijiet tal-istatus).

- SECCOMP_RET_KILL_PROCESS - joqtol il-proċess kollu immedjatament wara li jiffiltra sejħa tas-sistema li ma tiġix eżegwita minħabba dan.

- SECCOMP_RET_KILL_THREAD - itemm il-ħajt kurrenti immedjatament wara li tiffiltra sejħa tas-sistema li ma tiġix eżegwita minħabba dan.

— SECCOMP_RET_KILL — alias għal SECCOMP_RET_KILL_THREAD, ħalla għal kompatibilità b'lura.

- SECCOMP_RET_TRAP - is-sistema tas-sejħa hija pprojbita, u s-sinjal SIGSYS (Bad System Call) jintbagħat lill-kompitu li jsejjaħlu.

- SECCOMP_RET_ERRNO - Is-sejħa tas-sistema mhix eżegwita, u parti mill-valur tar-ritorn tal-filtru SECCOMP_RET_DATA tiġi mgħoddija lill-ispazju tal-utent bħala l-valur errno. Skont il-kawża tal-iżball, jiġu rritornati valuri differenti ta 'errno. Lista ta 'numri ta' żball hija pprovduta fit-taqsima li jmiss.

- SECCOMP_RET_TRACE - Użat biex jinnotifika lill-ptrace tracer billi juża - PTRACE_O_TRACESECCOMP biex jinterċetta meta ssir sejħa tas-sistema biex tara u tikkontrolla dak il-proċess. Jekk tracer ma jkunx konness, jiġi rritornat żball, errno jiġi ssettjat għal -ENOSYS, u s-sejħa tas-sistema ma tiġix eżegwita.

- SECCOMP_RET_LOG - is-sejħa tas-sistema tiġi solvuta u illoggjata.

- SECCOMP_RET_ALLOW - is-sejħa tas-sistema hija sempliċement permessa.

ptrace hija sejħa tas-sistema biex timplimenta mekkaniżmi ta 'traċċar fi proċess imsejjaħ tracee, bil-kapaċità li tissorvelja u tikkontrolla l-eżekuzzjoni tal-proċess. Il-programm ta 'traċċa jista' jinfluwenza b'mod effettiv l-eżekuzzjoni u jimmodifika r-reġistri tal-memorja ta 'tracee. Fil-kuntest Seccomp, ptrace jintuża meta attivat mill-kodiċi tal-istatus SECCOMP_RET_TRACE, sabiex it-tracer jista 'jipprevjeni lis-sejħa tas-sistema milli tesegwixxi u timplimenta l-loġika tagħha stess.

Seccomp żbalji

Minn żmien għal żmien, waqt li taħdem ma 'Seccomp, tiltaqa' ma 'diversi żbalji, li huma identifikati b'valur ta' ritorn tat-tip SECCOMP_RET_ERRNO. Biex tirrapporta żball, is-sejħa tas-sistema seccomp se tirritorna -1 minflok 0.

L-iżbalji li ġejjin huma possibbli:

- EACCESS - Min iċempel mhuwiex permess li jagħmel sejħa tas-sistema. Dan is-soltu jiġri minħabba li m'għandux privileġġi CAP_SYS_ADMIN jew no_new_privs ma jkunx issettjat bl-użu ta' prctl (nitkellmu dwar dan aktar tard);

— EFAULT — l-argumenti mgħoddija (args fl-istruttura seccomp_data) m'għandhomx indirizz validu;

— EINVAL — jista' jkun hemm erba' raġunijiet hawn:

-l-operazzjoni mitluba mhix magħrufa jew mhux appoġġjata mill-qalba fil-konfigurazzjoni attwali;

-il-bnadar speċifikati mhumiex validi għall-operazzjoni mitluba;

-operazzjoni tinkludi BPF_ABS, iżda hemm problemi bl-offset speċifikat, li jista 'jaqbeż id-daqs tal-istruttura seccomp_data;

-in-numru ta 'struzzjonijiet mgħoddija lill-filtru jaqbeż il-massimu;

— ENOMEM — mhux biżżejjed memorja biex tesegwixxi l-programm;

- EOPNOTSUPP - l-operazzjoni indikat li b'SECCOMP_GET_ACTION_AVAIL l-azzjoni kienet disponibbli, iżda l-kernel ma jappoġġjax ir-ritorni fl-argumenti;

— ESRCH — seħħet problema meta tiġi sinkronizzata fluss ieħor;

- ENOSYS - M'hemm l-ebda traċċatur imwaħħal mal-azzjoni SECCOMP_RET_TRACE.

prctl hija sejħa tas-sistema li tippermetti programm tal-ispazju tal-utent biex jimmanipula (jistabbilixxi u jikseb) aspetti speċifiċi ta 'proċess, bħal byte endianness, ismijiet tal-ħajt, mod ta' komputazzjoni sigur (Seccomp), privileġġi, avvenimenti Perf, eċċ.

Seccomp jista 'jidher bħala teknoloġija sandbox għalik, iżda mhuwiex. Seccomp hija utilità li tippermetti lill-utenti jiżviluppaw mekkaniżmu ta 'sandbox. Issa ejja nħarsu lejn kif il-programmi ta 'interazzjoni tal-utent huma maħluqa bl-użu ta' filtru msejjaħ direttament mis-sejħa tas-sistema Seccomp.

BPF Seccomp Filter Eżempju

Hawnhekk se nuru kif ngħaqqdu ż-żewġ azzjonijiet diskussi qabel, jiġifieri:

— se niktbu programm Seccomp BPF, li se jintuża bħala filtru b’kodiċijiet ta’ ritorn differenti skont id-deċiżjonijiet meħuda;

— tagħbija l-filtru billi tuża prctl.

L-ewwel għandek bżonn headers mil-librerija standard u l-kernel tal-Linux:

#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>

Qabel ma tipprova dan l-eżempju, irridu niżguraw li l-qalba hija kkumpilata b'CONFIG_SECCOMP u CONFIG_SECCOMP_FILTER issettjati għal y. Fuq magna li taħdem tista 'tiċċekkja dan bħal dan:

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

Il-bqija tal-kodiċi hija funzjoni install_filter f'żewġ partijiet. L-ewwel parti fiha l-lista tagħna ta 'struzzjonijiet ta' filtrazzjoni BPF:

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),
  };

L-istruzzjonijiet huma stabbiliti bl-użu tal-macros BPF_STMT u BPF_JUMP definiti fil-fajl linux/filter.h.
Ejja ngħaddu mill-istruzzjonijiet.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, arch))) - is-sistema tgħabbi u takkumula minn BPF_LD fil-forma tal-kelma BPF_W, id-data tal-pakkett tinsab f'offset fiss BPF_ABS.

- BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - jiċċekkja bl-użu ta 'BPF_JEQ jekk il-valur tal-arkitettura fil-kostanti tal-akkumulatur BPF_K huwiex ugwali għal arch. Jekk iva, jaqbeż f'offset 0 għall-istruzzjoni li jmiss, inkella jaqbeż f'offset 3 (f'dan il-każ) biex tarmi żball minħabba li l-arch ma jaqbilx.

- BPF_STMT(BPF_LD + BPF_W + BPF_ABS (offsetof(struct seccomp_data, nr))) - Tagħbija u takkumula minn BPF_LD fil-forma tal-kelma BPF_W, li hija n-numru tas-sejħa tas-sistema li jinsab fl-offset fiss ta' BPF_ABS.

— BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) — iqabbel in-numru tas-sejħa tas-sistema mal-valur tal-varjabbli nr. Jekk huma ugwali, jimxi fuq l-istruzzjoni li jmiss u tiddiżattiva s-sejħa tas-sistema, inkella tippermetti s-sejħa tas-sistema b'SECCOMP_RET_ALLOW.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (żball & SECCOMP_RET_DATA)) - itemm il-programm b'BPF_RET u bħala riżultat jipproduċi żball SECCOMP_RET_ERRNO bin-numru mill-varjabbli err.

- BPF_STMT(BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - itemm il-programm b'BPF_RET u jippermetti li s-sejħa tas-sistema tiġi esegwita bl-użu ta' SECCOMP_RET_ALLOW.

SECCOMP HUWA CBPF
Jista' jkun li qed tistaqsi għaliex tintuża lista ta' struzzjonijiet minflok oġġett ELF ikkumpilat jew programm C ikkumpilat JIT.

Hemm żewġ raġunijiet għal dan.

• L-ewwelnett, Seccomp juża cBPF (BPF klassiku) u mhux eBPF, li jfisser: m'għandux reġistri, iżda biss akkumulatur biex jaħżen l-aħħar riżultat tal-kalkolu, kif jidher fl-eżempju.

• It-tieni, Seccomp jaċċetta pointer għal firxa ta 'struzzjonijiet BPF direttament u xejn aktar. Il-macros li użajna sempliċement jgħinu biex jispeċifikaw dawn l-istruzzjonijiet b'mod faċli għall-programmatur.

Jekk għandek bżonn aktar għajnuna biex tifhem dan l-assemblaġġ, ikkunsidra l-psewdocode li jagħmel l-istess ħaġa:

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

Wara li tiddefinixxi l-kodiċi tal-filtru fl-istruttura socket_filter, trid tiddefinixxi sock_fprog li jkun fih il-kodiċi u t-tul ikkalkulat tal-filtru. Din l-istruttura tad-dejta hija meħtieġa bħala argument biex jiġi ddikjarat li l-proċess jitwettaq aktar tard:

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

Fadal biss ħaġa waħda x'tagħmel fil-funzjoni install_filter - tagħbija l-programm innifsu! Biex nagħmlu dan, nużaw prctl, billi nieħdu PR_SET_SECCOMP bħala għażla biex tidħol fil-mod ta 'kompjuters sigur. Imbagħad ngħidu lill-mod biex jgħabbi l-filtru billi juża SECCOMP_MODE_FILTER, li jinsab fil-varjabbli prog tat-tip sock_fprog:

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

Fl-aħħarnett, nistgħu nużaw il-funzjoni install_filter tagħna, iżda qabel dan irridu nużaw prctl biex nissettjaw PR_SET_NO_NEW_PRIVS għall-eżekuzzjoni attwali u b'hekk nevitaw is-sitwazzjoni fejn il-proċessi tat-tfal jirċievu aktar privileġġi mill-ġenituri tagħhom. B'dan, nistgħu nagħmlu s-sejħiet prctl li ġejjin fil-funzjoni install_filter mingħajr ma jkollna drittijiet tal-għeruq.

Issa nistgħu nsejħu l-funzjoni install_filter. Ejja nibblukkaw is-sejħiet kollha tas-sistema tal-kitba relatati mal-arkitettura X86-64 u sempliċement nagħtu permess li jimblokka t-tentattivi kollha. Wara l-installazzjoni tal-filtru, inkomplu l-eżekuzzjoni billi tuża l-ewwel argument:

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]);
 }

Ejja nibdew. Biex niġbru l-programm tagħna nistgħu nużaw jew clang jew gcc, jew il-mod huwa biss jikkompila l-fajl main.c mingħajr għażliet speċjali:

clang main.c -o filter-write

Kif innutat, aħna bblokkajna l-entrati kollha fil-programm. Biex tittestja dan għandek bżonn programm li joħroġ xi ħaġa - ls tidher bħala kandidat tajjeb. Dan huwa kif normalment iġib ruħu:

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

Sabiħ! Hawn kif jidher l-użu tal-programm tal-ippakkjar tagħna: Aħna sempliċement ngħaddu l-programm li rridu nittestjaw bħala l-ewwel argument:

./filter-write "ls -la"

Meta jiġi esegwit, dan il-programm jipproduċi output kompletament vojt. Madankollu, nistgħu nużaw strace biex naraw x'inhu jiġri:

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

Ir-riżultat tax-xogħol huwa mqassar ħafna, iżda l-parti korrispondenti tagħha turi li r-rekords huma mblukkati bl-iżball EPERM - l-istess wieħed li kkonfigurajna. Dan ifisser li l-programm ma joħroġ xejn minħabba li ma jistax jaċċessa s-sejħa tas-sistema tal-kitba:

[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)

Issa tifhem kif jaħdem Seccomp BPF u għandek idea tajba ta’ x’tista’ tagħmel biha. Imma ma tixtieqx tikseb l-istess ħaġa b'eBPF minflok b'cBPF biex tisfrutta l-qawwa kollha tagħha?

Meta taħseb dwar programmi eBPF, ħafna nies jaħsbu li sempliċement jiktbuhom u jgħabbuhom bi privileġġi ta 'amministratur. Filwaqt li din id-dikjarazzjoni hija ġeneralment vera, il-kernel jimplimenta sett ta 'mekkaniżmi biex jipproteġi oġġetti eBPF f'diversi livelli. Dawn il-mekkaniżmi jissejħu nases BPF LSM.

nases BPF LSM

Biex jipprovdi monitoraġġ indipendenti mill-arkitettura tal-avvenimenti tas-sistema, LSM jimplimenta l-kunċett tan-nases. Sejħa ganċ hija teknikament simili għal sejħa tas-sistema, iżda hija indipendenti mis-sistema u integrata mal-infrastruttura. LSM jipprovdi kunċett ġdid li fih saff ta' astrazzjoni jista' jgħin biex jiġu evitati problemi li jiltaqgħu magħhom meta jiġu ttrattati sejħiet tas-sistema fuq arkitetturi differenti.

Fiż-żmien tal-kitba, il-qalba għandha seba 'ganċijiet assoċjati ma' programmi BPF, u SELinux huwa l-uniku LSM integrat li jimplimentahom.

Il-kodiċi tas-sors għan-nases jinsab fis-siġra tal-qalba fil-fajl include/linux/security.h:

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);

Kull wieħed minnhom se jissejjaħ fi stadji differenti ta 'eżekuzzjoni:

— security_bpf — iwettaq verifika inizjali tas-sejħiet tas-sistema BPF esegwiti;

- security_bpf_map - jiċċekkja meta l-kernel jirritorna deskrittur tal-fajl għall-mappa;

- security_bpf_prog - jiċċekkja meta l-kernel jirritorna deskrittur tal-fajl għall-programm eBPF;

— security_bpf_map_alloc — jiċċekkja jekk il-qasam tas-sigurtà ġewwa l-mapep BPF huwiex inizjalizzat;

- security_bpf_map_free - jiċċekkja jekk il-qasam tas-sigurtà huwiex imneħħi fil-mapep BPF;

— security_bpf_prog_alloc — jiċċekkja jekk il-qasam tas-sigurtà huwiex inizjalizzat fi ħdan programmi BPF;

- security_bpf_prog_free - jiċċekkja jekk il-qasam tas-sigurtà huwiex imneħħi fil-programmi BPF.

Issa, meta naraw dan kollu, nifhmu: l-idea wara l-interċetturi LSM BPF hija li jistgħu jipprovdu protezzjoni għal kull oġġett eBPF, u jiżguraw li dawk biss bil-privileġġi xierqa jistgħu jwettqu operazzjonijiet fuq karti u programmi.

Sommarju

Is-sigurtà mhix xi ħaġa li tista' timplimenta b'mod wieħed għal kulħadd għal dak kollu li trid tipproteġi. Huwa importanti li tkun tista' tipproteġi s-sistemi f'livelli differenti u b'modi differenti. Jemmnu jew le, l-aħjar mod biex tiġi żgurata sistema huwa li jiġu organizzati livelli differenti ta 'protezzjoni minn pożizzjonijiet differenti, sabiex it-tnaqqis tas-sigurtà ta' livell wieħed ma jippermettix aċċess għas-sistema kollha. L-iżviluppaturi ewlenin għamlu xogħol tajjeb biex tawna sett ta 'saffi u touchpoints differenti. Nittamaw li tajnikom fehim tajjeb ta' x'inhuma s-saffi u kif tuża l-programmi BPF biex taħdem magħhom.

Dwar l-awturi

David Calavera huwa s-CTO f'Netlify. Ħadem fl-appoġġ ta’ Docker u kkontribwixxa għall-iżvilupp ta’ għodod Runc, Go u BCC, kif ukoll proġetti oħra ta’ sors miftuħ. Magħruf għax-xogħol tiegħu fuq proġetti Docker u l-iżvilupp tal-ekosistema tal-plugin Docker. David huwa passjonat ħafna dwar il-grafiċi tal-fjammi u dejjem qed ifittex li jottimizza l-prestazzjoni.

Lorenzo Fontana jaħdem fuq it-tim tas-sors miftuħ f'Sysdig, fejn huwa ffokat primarjament fuq Falco, proġett tal-Cloud Native Computing Foundation li jipprovdi sigurtà tal-kontejner runtime u skoperta ta 'anomalija permezz ta' modulu tal-kernel u eBPF. Huwa passjonat dwar is-sistemi distribwiti, in-netwerking definit minn softwer, il-kernel tal-Linux, u l-analiżi tal-prestazzjoni.

» Għal aktar informazzjoni dwar il-ktieb, jekk jogħġbok żur websajt tal-pubblikatur
» Tabella tal-kontenut
» Silta

Għal Khabrozhiteli 25% skont fuq il-kupun - Linux

Mal-ħlas tal-verżjoni stampata tal-ktieb, jintbagħat ktieb elettroniku lill-email.

Sors: www.habr.com

Żid kumment