Buku "BPF pikeun Linux Monitoring"

Buku "BPF pikeun Linux Monitoring"Halo warga Khabro! Mesin virtual BPF mangrupikeun salah sahiji komponén anu paling penting dina kernel Linux. Pamakéan anu leres bakal ngamungkinkeun insinyur sistem mendakan kasalahan sareng ngarengsekeun masalah anu paling rumit. Anjeun bakal diajar kumaha cara nyerat program anu ngawas sareng ngarobih paripolah kernel, kumaha cara aman nerapkeun kode pikeun ngawas acara dina kernel, sareng seueur deui. David Calavera sareng Lorenzo Fontana bakal ngabantosan anjeun muka konci kakuatan BPF. Kembangkeun pangaweruh anjeun ngeunaan optimasi kinerja, jaringan, kaamanan. - Anggo BPF pikeun ngawas sareng ngarobih paripolah kernel Linux. - Nyuntikkeun kode pikeun ngawaskeun acara kernel sacara aman tanpa kedah nyusun ulang kernel atanapi reboot sistem. - Paké conto kode merenah dina C, Go atawa Python. - Candak kadali ku owning daur hirup program BPF.

Kaamanan Linux Kernel, Fitur sareng Seccomp

BPF nyayogikeun cara anu kuat pikeun manjangkeun kernel tanpa ngorbankeun stabilitas, kaamanan, atanapi kagancangan. Ku sabab kitu, pamekar kernel panginten bakal janten ide anu sae pikeun ngagunakeun versatilitasna pikeun ningkatkeun isolasi prosés di Seccomp ku ngalaksanakeun saringan Seccomp anu dirojong ku program BPF, anu ogé katelah Seccomp BPF. Dina bab ieu kami bakal ngajelaskeun naon Seccomp sareng kumaha éta dianggo. Teras anjeun bakal diajar kumaha nyerat saringan Seccom nganggo program BPF. Saatos éta, urang bakal ningali kait BPF anu diwangun anu kalebet dina kernel pikeun modul kaamanan Linux.

Modul Kaamanan Linux (LSM) mangrupikeun kerangka anu nyayogikeun sakumpulan fungsi anu tiasa dianggo pikeun nerapkeun sababaraha modél kaamanan sacara standar. LSM tiasa dianggo langsung dina tangkal sumber kernel, sapertos Apparmor, SELinux sareng Tomoyo.

Hayu urang mimitian ku ngabahas kamampuan Linux.

kasempetan

Inti tina kamampuan Linux nyaéta anjeun kedah masihan idin prosés anu teu dipikabutuh pikeun ngalaksanakeun tugas anu tangtu, tapi tanpa nganggo suid pikeun tujuan éta, atanapi upami henteu ngajantenkeun prosésna janten hak istimewa, ngirangan kamungkinan serangan sareng ngamungkinkeun prosés ngalaksanakeun tugas-tugas anu tangtu. Contona, upami aplikasi Anjeun kudu muka port husus, sebutkeun 80, tinimbang ngajalankeun prosés salaku root, Anjeun saukur tiasa masihan eta kamampuhan CAP_NET_BIND_SERVICE.

Pertimbangkeun program Go anu namina main.go:

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

Program ieu ngalayanan server HTTP dina port 80 (ieu mangrupikeun port anu istimewa). Biasana urang ngajalankeun éta langsung saatos kompilasi:

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

Nanging, kumargi urang henteu masihan hak istimewa root, kode ieu bakal ngalungkeun kasalahan nalika ngabeungkeut port:

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

capsh (manajer cangkang) mangrupikeun alat anu ngajalankeun cangkang kalayan sakumpulan kamampuan khusus.

Dina hal ieu, sakumaha anu parantos disebatkeun, tinimbang masihan hak root pinuh, anjeun tiasa ngaktipkeun beungkeutan port anu istimewa ku nyayogikeun kamampuan cap_net_bind_service sareng sadayana anu parantos aya dina program éta. Jang ngalampahkeun ieu, urang tiasa ngalampirkeun program urang dina 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"

Hayu urang ngartos tim ieu saeutik.

  • capsh - ngagunakeun capsh salaku cangkang.
  • —caps='cap_net_bind_service+eip cap_setpcap,cap_setuid,cap_setgid+ep' - saprak urang kudu ngarobah pamaké (urang teu hayang ngajalankeun salaku root), urang bakal nangtukeun cap_net_bind_service jeung kamampuhan pikeun sabenerna ngarobah ID pamaké ti root ka euweuh, nyaéta cap_setuid jeung cap_setgid.
  • —keep=1 — urang hoyong ngajaga kamampuan anu dipasang nalika ngalih tina akun root.
  • —user=“nobody” — pamaké ahir nu ngajalankeun program bakal taya sahijieun.
  • —addamb=cap_net_bind_service — nyetél ngabersihkeun kamampuan anu aya hubunganana saatos gentos tina modeu akar.
  • - -c "./capabilities" - ngan ngajalankeun program.

kamampuhan numbu mangrupakeun jenis husus tina kamampuhan anu diwariskeun ku program anak nalika program ayeuna executes aranjeunna ngagunakeun execve (). Ngan kamampuhan nu diwenangkeun pikeun pakait, atawa dina basa sejen, salaku kamampuhan lingkungan, bisa diwariskeun.

Anjeun meureun nuju wondering naon hartina +eip sanggeus nangtukeun kamampuhan dina pilihan --caps. Bandéra ieu dianggo pikeun nangtukeun yén kamampuan:

-kudu diaktipkeun (p);

- sadia pikeun pamakéan (e);

-bisa diwariskeun ku prosés anak (abdi).

Kusabab urang hoyong nganggo cap_net_bind_service, urang kedah ngalakukeun ieu sareng bandéra e. Teras we bakal ngamimitian cangkang dina paréntah. Ieu bakal ngajalankeun kamampuan binér sareng urang kedah ditandaan ku bandéra i. Tungtungna, urang hoyong fitur diaktipkeun (urang ngalakukeun ieu tanpa ngarobah UID) kalawan p. Sigana mah cap_net_bind_service+eip.

Anjeun tiasa pariksa hasilna ngagunakeun ss. Hayu urang pondok kaluaran saeutik pikeun pas dina kaca, tapi bakal nembongkeun port pakait jeung ID pamaké lian ti 0, dina hal ieu 65:

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

Dina conto ieu kami nganggo capsh, tapi anjeun tiasa nyerat cangkang nganggo libcap. Kanggo inpo nu leuwih lengkep, tingali lalaki 3 libcap.

Nalika nyerat program, sering pamekar henteu terang sateuacanna sadaya fitur anu diperyogikeun program dina waktos ngajalankeun; Leuwih ti éta, fitur ieu bisa robah dina versi anyar.

Pikeun langkung ngartos kamampuan program urang, urang tiasa nyandak alat anu sanggup BCC, anu nyetél kprobe pikeun fungsi 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

Urang tiasa ngahontal hal anu sami ku ngagunakeun bpftrace sareng kprobe one-liner dina fungsi kernel 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

Ieu bakal ngahasilkeun hal sapertos kieu upami kamampuan program urang diaktipkeun saatos 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

Kolom kalima nyaéta kamampuhan anu diperlukeun prosés, sarta saprak kaluaran ieu ngawengku acara non-audit, urang tingali sagala cék non-audit sarta tungtungna kamampuhan diperlukeun ku bandéra Inok (panungtungan dina kaluaran) disetel ka 1. Kamampuh. salah sahiji urang museurkeun nyaeta CAP_NET_BIND_SERVICE, eta diartikeun konstanta dina kode sumber kernel dina file ngawengku/uapi/linux/ability.h kalawan identifier 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">

Kamampuhan sering diaktipkeun nalika runtime pikeun wadah sapertos runC atanapi Docker pikeun ngamungkinkeun aranjeunna ngajalankeun dina modeu anu teu dipikabutuh, tapi aranjeunna ngan ukur ngamungkinkeun kamampuan anu diperyogikeun pikeun ngajalankeun kalolobaan aplikasi. Nalika hiji aplikasi butuh kamampuan anu tangtu, Docker tiasa nyayogikeunana nganggo --cap-add:

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

Paréntah ieu bakal masihan wadahna kamampuan CAP_NET_ADMIN, ngamungkinkeun pikeun ngonpigurasikeun tautan jaringan pikeun nambihan antarmuka dummy0.

Bagian salajengna nunjukkeun kumaha ngagunakeun fitur sapertos nyaring, tapi ngagunakeun téknik anu béda anu ngamungkinkeun urang ngalaksanakeun saringan sacara terprogram.

Seccomp

Seccomp nangtung pikeun Secure Computing sareng mangrupikeun lapisan kaamanan anu dilaksanakeun dina kernel Linux anu ngamungkinkeun para pamekar nyaring telepon sistem anu tangtu. Sanaos kamampuan Seccomp tiasa dibandingkeun sareng Linux, kamampuanna pikeun ngatur telepon sistem anu tangtu ngajantenkeun langkung fleksibel dibandingkeun sareng aranjeunna.

Fitur Seccom sareng Linux henteu saling ekslusif sareng sering dianggo babarengan pikeun kauntungan tina duanana pendekatan. Contona, Anjeun meureun hoyong masihan hiji prosés kamampuhan CAP_NET_ADMIN tapi teu ngidinan pikeun nampa sambungan stop kontak, blocking nu narima jeung accept4 panggero sistem.

Metoda nyaring Seccomp dumasar kana saringan BPF operasi dina mode SECCOMP_MODE_FILTER, sarta sistem panggero nyaring dipigawé dina cara nu sarua sakumaha keur pakét.

Saringan Seccomp dimuat nganggo prctl via operasi PR_SET_SECCOMP. Saringan ieu bentukna program BPF anu dieksekusi pikeun tiap pakét Seccomp diwakilan ku struktur seccomp_data. Struktur ieu ngandung arsitéktur rujukan, pointer kana parentah processor dina waktu panggero sistem, sarta maksimum genep argumen panggero sistem, dinyatakeun salaku uint64.

Ieu sapertos struktur seccomp_data tina kode sumber kernel dina file linux/seccomp.h:

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

Sakumaha anjeun tiasa tingali tina struktur ieu, urang tiasa nyaring ku panggero sistem, argumen na, atanapi kombinasi duanana.

Saatos nampi unggal pakét Seccomp, saringan kedah ngalaksanakeun pamrosésan pikeun nyandak kaputusan ahir sareng nyarioskeun ka kernel naon anu kedah dilakukeun salajengna. Kaputusan ahir dinyatakeun ku salah sahiji nilai balik (kode status).

- SECCOMP_RET_KILL_PROCESS - maéhan sakabéh prosés langsung saatos nyaring panggero sistem nu teu dieksekusi kusabab ieu.

- SECCOMP_RET_KILL_THREAD - terminates thread ayeuna langsung saatos nyaring panggero sistem nu teu dieksekusi kusabab ieu.

— SECCOMP_RET_KILL — landian pikeun SECCOMP_RET_KILL_THREAD, ditinggalkeun pikeun kasaluyuan mundur.

- SECCOMP_RET_TRAP - panggero sistem dilarang, sarta sinyal SIGSYS (Bad System Telepon) dikirim ka tugas nu nelepon eta.

- SECCOMP_RET_ERRNO - Sistim panggero teu dieksekusi, sarta bagian tina nilai balik filter SECCOMP_RET_DATA disalurkeun kana spasi pamaké salaku nilai errno. Gumantung kana panyabab kasalahan, nilai errno anu béda dipulangkeun. Daptar nomer kasalahan disadiakeun dina bagian salajengna.

- SECCOMP_RET_TRACE - Dipaké pikeun ngabéjaan tracer ptrace ngagunakeun - PTRACE_O_TRACESECCOMP pikeun intercept nalika panggero sistem dieksekusi pikeun ningali tur kadalikeun prosés éta. Mun tracer a teu disambungkeun, balik kasalahan, errno disetel ka -ENOSYS, sarta panggero sistem teu dieksekusi.

- SECCOMP_RET_LOG - panggero sistem direngsekeun tur asup.

- SECCOMP_RET_ALLOW - panggero sistem ngan diijinkeun.

ptrace nyaéta panggero sistem pikeun nerapkeun mékanisme tracing dina prosés nu disebut tracee, kalawan kamampuhan pikeun ngawas jeung ngadalikeun palaksanaan prosés. Program trace sacara efektif tiasa mangaruhan palaksanaan sareng ngarobih registers mémori tracee. Dina kontéks Seccomp, ptrace dipaké nalika dipicu ku kode status SECCOMP_RET_TRACE, ku kituna tracer bisa nyegah panggero sistem ti executing sarta nerapkeun logika sorangan.

Kasalahan Seccomp

Ti jaman ka jaman, nalika gawé bareng Seccomp, anjeun bakal sapatemon rupa kasalahan, nu dicirikeun ku nilai balik tipe SECCOMP_RET_ERRNO. Pikeun ngalaporkeun kasalahan, panggero sistem seccomp bakal balik -1 tinimbang 0.

Kasalahan di handap ieu mungkin:

- EACCESS - Nu nelepon teu diwenangkeun pikeun nelepon sistem. Ieu biasana kajadian sabab teu boga hak husus CAP_SYS_ADMIN atawa no_new_privs teu diatur maké prctl (urang gé ngobrol ngeunaan ieu engké);

- EFAULT - argumen anu diliwatan (args dina struktur seccomp_data) teu gaduh alamat anu sah;

- EINVAL - tiasa aya opat alesan di dieu:

-operasi anu dipénta henteu dipikanyaho atanapi henteu dirojong ku kernel dina konfigurasi ayeuna;

-bandéra anu ditangtukeun henteu valid pikeun operasi anu dipénta;

-operasi ngawengku BPF_ABS, tapi aya masalah jeung offset dieusian, nu bisa ngaleuwihan ukuran struktur seccomp_data;

-Jumlah parentah disalurkeun kana saringan ngaleuwihan maksimum;

- ENOMEM - teu cukup memori pikeun ngaéksekusi program;

- EOPNOTSUPP - operasi nunjukkeun yén kalawan SECCOMP_GET_ACTION_AVAIL aksi éta sadia, tapi kernel teu ngarojong mulih dina argumen;

- ESRCH - masalah lumangsung nalika nyingkronkeun stream sejen;

- ENOSYS - Taya tracer napel SECCOMP_RET_TRACE Peta.

prctl nyaéta panggero sistem anu ngamungkinkeun program spasi-pamaké pikeun ngamanipulasi (nyetél tur meunangkeun) aspék husus tina hiji prosés, kayaning endianness byte, ngaran thread, mode komputasi aman (Seccomp), hak husus, Perf acara, jsb.

Seccom sigana sapertos téknologi sandbox pikeun anjeun, tapi henteu. Seccomp mangrupikeun utilitas anu ngamungkinkeun para pangguna ngembangkeun mékanisme sandbox. Ayeuna hayu urang tingali kumaha program interaksi pamaké dijieun maké saringan disebut langsung ku panggero sistem Seccomp.

BPF Seccom Filter Conto

Di dieu urang bakal nunjukkeun kumaha ngagabungkeun dua tindakan anu dibahas tadi, nyaéta:

- urang bakal nulis program Seccom BPF, nu bakal dipaké salaku saringan kalayan kode balik béda gumantung kana kaputusan dijieun;

- muatkeun saringan nganggo prctl.

Mimiti anjeun peryogi lulugu tina perpustakaan standar sareng kernel 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>

Sateuacan nyobian conto ieu, urang kedah mastikeun yén kernel disusun sareng CONFIG_SECCOMP sareng CONFIG_SECCOMP_FILTER disetel ka y. Dina mesin anu tiasa dianggo anjeun tiasa pariksa sapertos kieu:

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

Sesa kode nyaéta dua-bagian fungsi install_filter. Bagian kahiji ngandung daptar parentah nyaring BPF kami:

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

Parentah diatur ngagunakeun BPF_STMT na BPF_JUMP macros diartikeun dina file linux / filter.h.
Hayu urang ngaliwatan parentah.

- BPF_STMT (BPF_LD + BPF_W + BPF_ABS (offsetof (struct seccomp_data, arch))) - beban sistem na accumulates tina BPF_LD dina bentuk kecap BPF_W, data pakét lokasina di BPF_ABS tetep offset.

- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, arch, 0, 3) - cék maké BPF_JEQ naha nilai arsitektur dina BPF_K accumulator konstan sarua jeung Arch. Lamun kitu, jumps di offset 0 kana parentah salajengna, disebutkeun jumps di offset 3 (dina hal ieu) pikeun maledog kasalahan sabab Arch teu cocog.

- BPF_STMT (BPF_LD + BPF_W + BPF_ABS (offsetof (struct seccomp_data, nr))) - Beban na accumulates tina BPF_LD dina bentuk kecap BPF_W, nu mangrupakeun nomer telepon sistem dikandung dina offset tetep BPF_ABS.

- BPF_JUMP (BPF_JMP + BPF_JEQ + BPF_K, nr, 0, 1) - ngabandingkeun jumlah panggero sistem jeung nilai variabel nr. Mun aranjeunna sarua, pindah ka parentah salajengna jeung disables panggero sistem, disebutkeun ngamungkinkeun nelepon sistem kalawan SECCOMP_RET_ALLOW.

- BPF_STMT (BPF_RET + BPF_K, SECCOMP_RET_ERRNO | (kasalahan & SECCOMP_RET_DATA)) - terminates program kalawan BPF_RET tur salaku hasilna ngahasilkeun kasalahan SECCOMP_RET_ERRNO kalawan jumlah tina variabel err.

- BPF_STMT (BPF_RET + BPF_K, SECCOMP_RET_ALLOW) - terminates program kalawan BPF_RET sarta ngidinan panggero sistem bisa dieksekusi maké SECCOMP_RET_ALLOW.

SECCOMP nyaeta CBPF
Anjeun bisa jadi wondering naha daptar parentah dipaké gaganti objék ELF disusun atawa program C disusun JIT.

Aya dua alesan pikeun ieu.

• Firstly, Seccomp ngagunakeun cBPF (BPF klasik) teu eBPF, nu hartina: teu boga registers, tapi ngan hiji accumulator pikeun nyimpen hasil itungan panungtungan, sakumaha bisa ditempo dina conto.

• Kadua, Seccomp narima pointer ka Asép Sunandar Sunarya ti parentah BPF langsung jeung sia sejenna. Makro anu kami anggo ngan ukur ngabantosan paréntah ieu dina cara anu ramah-programmer.

Upami anjeun peryogi langkung seueur pitulung pikeun ngartos rakitan ieu, pertimbangkeun pseudocode anu ngalakukeun hal anu sami:

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

Sanggeus nangtukeun kodeu filter dina struktur socket_filter, anjeun kudu nangtukeun hiji sock_fprog ngandung kode jeung panjang diitung filter nu. Struktur data ieu diperlukeun salaku argumen pikeun nyatakeun prosés pikeun ngajalankeun engké:

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

Aya ngan hiji hal ditinggalkeun pikeun ngalakukeun dina fungsi install_filter - beban program sorangan! Jang ngalampahkeun ieu, kami nganggo prctl, nyandak PR_SET_SECCOMP salaku pilihan pikeun asup kana mode komputasi aman. Teras we nyarioskeun modeu pikeun ngamuat saringan nganggo SECCOMP_MODE_FILTER, anu dikandung dina variabel prog jinis sock_fprog:

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

Tungtungna, urang tiasa nganggo fungsi install_filter urang, tapi saméméh éta urang kudu make prctl pikeun set PR_SET_NO_NEW_PRIVS pikeun palaksanaan ayeuna sahingga ulah aya kaayaan dimana prosés anak narima leuwih hak husus ti kolotna. Kalayan ieu, urang tiasa nelepon prctl di handap ieu dina fungsi install_filter tanpa gaduh hak akar.

Ayeuna urang tiasa nyauran fungsi install_filter. Hayu urang meungpeuk sakabeh nelepon Sistim nulis patali jeung arsitektur X86-64 tur saukur masihan idin nu blok sagala usaha . Saatos masang saringan, urang teraskeun palaksanaan nganggo argumen anu munggaran:

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

Hayu urang ngamimitian. Pikeun nyusun program urang tiasa nganggo clang atanapi gcc, boh cara éta ngan ukur nyusun file main.c tanpa pilihan khusus:

clang main.c -o filter-write

Sakumaha anu kacatet, kami parantos ngablokir sadaya éntri dina program éta. Pikeun nguji ieu anjeun peryogi program anu ngahasilkeun hal - ls sigana calon anu saé. Ieu kumaha anjeunna biasana kalakuanana:

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

Éndah! Kieu kumaha ngagunakeun program wrapper kami: Urang ngan saukur lulus program anu urang hoyong uji salaku argumen anu munggaran:

./filter-write "ls -la"

Nalika dieksekusi, program ieu ngahasilkeun kaluaran lengkep kosong. Nanging, urang tiasa nganggo strace pikeun ningali naon anu lumangsung:

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

Hasil pagawéan disingget pisan, tapi bagian anu saluyu nunjukkeun yén rékaman diblokir ku kasalahan EPERM - anu sami sareng anu urang ngonpigurasi. Ieu ngandung harti yén program éta henteu ngaluarkeun nanaon sabab teu tiasa ngaksés sauran sistem nyerat:

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

Ayeuna anjeun ngartos kumaha Seccom BPF jalan sareng gaduh ide anu saé ngeunaan naon anu anjeun tiasa laksanakeun. Tapi naha anjeun henteu hoyong ngahontal hal anu sami sareng eBPF tinimbang cBPF pikeun ngamangpaatkeun kakuatan pinuh na?

Nalika mikir ngeunaan program eBPF, kalolobaan jalma mikir yén aranjeunna ngan saukur nyerat sareng ngamuat aranjeunna ku hak istimewa administrator. Sanaos pernyataan ieu umumna leres, kernel ngalaksanakeun sakumpulan mékanisme pikeun ngajagaan objék eBPF dina sababaraha tingkatan. Mékanisme ieu disebut BPF LSM bubu.

BPF LSM bubu

Pikeun nyadiakeun monitoring arsitéktur-bebas tina acara sistem, LSM implements konsép bubu. A panggero hook téh téhnisna sarupa jeung panggero sistem, tapi sistem bebas sarta terpadu kalayan infrastruktur. LSM nyayogikeun konsép énggal dimana lapisan abstraksi tiasa ngabantosan ngahindarkeun masalah anu disanghareupan nalika ngungkulan sauran sistem dina arsitéktur anu béda.

Dina waktos nyerat, kernel ngagaduhan tujuh kait anu aya hubunganana sareng program BPF, sareng SELinux mangrupikeun hiji-hijina LSM anu diwangun anu ngalaksanakeunana.

Kodeu sumber pikeun bubu aya dina tangkal kernel dina file ngawengku/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);

Tiap di antarana bakal disebut dina tahap béda palaksanaan:

— security_bpf — ngalaksanakeun pamariksaan awal telepon sistem BPF anu dieksekusi;

- security_bpf_map - mariksa nalika kernel mulihkeun deskriptor file pikeun peta;

- security_bpf_prog - cék nalika kernel mulihkeun deskriptor file pikeun program eBPF;

— security_bpf_map_alloc — mariksa naha widang kaamanan di jero peta BPF diinisialisasi;

- security_bpf_map_free - pariksa naha widang kaamanan diberesihan di jero peta BPF;

— security_bpf_prog_alloc — mariksa naha widang kaamanan dimimitian dina program BPF;

- security_bpf_prog_free - pariksa naha widang kaamanan diberesihan di jero program BPF.

Ayeuna, ningali sadayana ieu, urang ngartos: gagasan balik interceptors LSM BPF nyaeta aranjeunna tiasa nyadiakeun panyalindungan ka unggal objék eBPF, mastikeun yén ngan maranéhanana jeung hak husus nu bisa ngalakukeun operasi dina kartu na program.

singgetan

Kaamanan sanes hal anu anjeun tiasa laksanakeun dina hiji-ukuran-sadayana pikeun sadayana anu anjeun hoyong jaga. Penting pikeun tiasa ngajaga sistem dina tingkat anu béda sareng dina cara anu béda. Percanten atanapi henteu, cara anu pangsaéna pikeun ngamankeun sistem nyaéta ngatur tingkat panyalindungan anu béda tina posisi anu béda, ku kituna ngirangan kaamanan hiji tingkat henteu ngamungkinkeun aksés ka sadaya sistem. Pamekar inti parantos ngalaksanakeun tugas anu saé pikeun masihan kami sakumpulan lapisan sareng titik sentuhan anu béda. Kami ngarepkeun anjeun parantos masihan anjeun pamahaman anu hadé ngeunaan lapisan naon sareng kumaha cara ngagunakeun program BPF pikeun dianggo sareng aranjeunna.

Ngeunaan pangarang

David Calavera nyaéta CTO di Netlify. Anjeunna damel di dukungan Docker sareng nyumbang kana pamekaran alat Runc, Go sareng BCC, ogé proyék open source anu sanés. Dipikawanoh pikeun karyana dina proyék Docker sareng pamekaran ékosistem plugin Docker. David pisan gairah ngeunaan grafik seuneu sarta salawasna pilari ngaoptimalkeun kinerja.

Lorenzo Fontana dianggo dina tim open source di Sysdig, dimana anjeunna utamana fokus kana Falco, proyék Cloud Native Computing Foundation nu nyadiakeun kaamanan runtime wadahna sarta deteksi anomali ngaliwatan modul kernel na eBPF. Anjeunna gairah ngeunaan sistem anu disebarkeun, jaringan anu didefinisikeun parangkat lunak, kernel Linux, sareng analisa kinerja.

» Rincian langkung seueur ngeunaan buku tiasa dipendakan di ramatloka penerbit
» daptar eusi
» Intisari

Pikeun Khabrozhiteley diskon 25% ngagunakeun kupon - Linux

Kana mayar versi kertas tina buku, hiji buku éléktronik bakal dikirim ku e-mail.

sumber: www.habr.com

Tambahkeun komentar