Mga sistema ng seguridad ng Linux

Ang isa sa mga dahilan para sa napakalaking tagumpay ng Linux OS sa naka-embed, mga mobile device at server ay ang medyo mataas na antas ng seguridad ng kernel, mga kaugnay na serbisyo at application. Ngunit kung tingnang mabuti sa arkitektura ng Linux kernel, kung gayon imposibleng makahanap sa loob nito ng isang parisukat na responsable para sa seguridad tulad nito. Saan nagtatago ang subsystem ng seguridad ng Linux at ano ang binubuo nito?

Background sa Linux Security Modules at SELinux

Ang Security Enhanced Linux ay isang hanay ng mga panuntunan at mekanismo ng pag-access batay sa mandatory at role-based na mga modelo ng pag-access upang protektahan ang mga Linux system mula sa mga potensyal na banta at itama ang mga pagkukulang ng Discretionary Access Control (DAC), ang tradisyonal na Unix security system. Ang proyekto ay nagmula sa bituka ng US National Security Agency, at direktang binuo pangunahin ng mga kontratista na Secure Computing Corporation at MITRE, gayundin ng ilang laboratoryo ng pananaliksik.

Mga sistema ng seguridad ng Linux
Mga Module ng Seguridad ng Linux

Gumawa ng ilang komento si Linus Torvalds tungkol sa mga bagong pagpapaunlad ng NSA upang maisama sila sa pangunahing linya ng Linux kernel. Inilarawan niya ang isang pangkalahatang kapaligiran, na may isang hanay ng mga interceptor upang kontrolin ang mga operasyon sa mga bagay at isang hanay ng ilang mga proteksiyon na field sa mga istruktura ng data ng kernel upang mag-imbak ng mga kaukulang katangian. Ang kapaligirang ito ay maaaring gamitin ng mga na-load na kernel module upang ipatupad ang anumang nais na modelo ng seguridad. Ang LSM ay ganap na pumasok sa Linux kernel v2.6 noong 2003.

Kasama sa framework ng LSM ang mga guard field sa mga istruktura ng data at mga tawag sa mga function ng interception sa mga kritikal na punto sa kernel code upang manipulahin ang mga ito at magsagawa ng access control. Nagdaragdag din ito ng pag-andar para sa pagrerehistro ng mga module ng seguridad. Ang /sys/kernel/security/lsm interface ay naglalaman ng listahan ng mga aktibong module sa system. Ang mga LSM hook ay nakaimbak sa mga listahan na tinatawag sa pagkakasunud-sunod na tinukoy sa CONFIG_LSM. Ang detalyadong dokumentasyon sa mga kawit ay kasama sa header file kasama ang/linux/lsm_hooks.h.

Ginawang posible ng LSM subsystem na kumpletuhin ang buong integrasyon ng SELinux sa parehong bersyon ng stable Linux kernel v2.6. Halos kaagad, ang SELinux ay naging de facto na pamantayan para sa isang ligtas na kapaligiran ng Linux at isinama sa mga pinakasikat na pamamahagi: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glossary ng SELinux

  • Pagkakakilanlan β€” Ang gumagamit ng SELinux ay hindi katulad ng karaniwang Unix/Linux user id; maaari silang magkakasamang mabuhay sa parehong sistema, ngunit ganap na naiiba sa esensya. Ang bawat karaniwang Linux account ay maaaring tumugma sa isa o higit pa sa SELinux. Ang pagkakakilanlan ng SELinux ay bahagi ng pangkalahatang konteksto ng seguridad, na tumutukoy kung aling mga domain ang maaari at hindi maaaring salihan.
  • Domains - Sa SELinux, ang isang domain ay ang konteksto ng pagpapatupad ng isang paksa, ibig sabihin, isang proseso. Direktang tinutukoy ng domain ang access na mayroon ang isang proseso. Ang isang domain ay karaniwang isang listahan ng kung ano ang maaaring gawin ng mga proseso o kung ano ang magagawa ng isang proseso sa iba't ibang uri. Ang ilang mga halimbawa ng mga domain ay sysadm_t para sa pangangasiwa ng system, at user_t na isang normal na domain ng user na hindi may pribilehiyo. Ang init system ay tumatakbo sa init_t domain, at ang pinangalanang proseso ay tumatakbo sa named_t domain.
  • Mga tungkulin β€” Ano ang nagsisilbing tagapamagitan sa pagitan ng mga domain at mga gumagamit ng SELinux. Tinutukoy ng mga tungkulin kung aling mga domain ang maaaring pag-aari ng isang user at kung anong mga uri ng mga bagay ang maaari nilang ma-access. Pinipigilan ng mekanismong ito ng access control ang banta ng mga pag-atake sa pagtaas ng pribilehiyo. Ang mga tungkulin ay nakasulat sa Role Based Access Control (RBAC) na modelo ng seguridad na ginagamit sa SELinux.
  • Mga Uri β€” Isang attribute ng listahan ng Type Enforcement na itinalaga sa isang bagay at tinutukoy kung sino ang makaka-access dito. Katulad ng kahulugan ng domain, maliban na ang domain ay nalalapat sa isang proseso, at ang uri ay nalalapat sa mga bagay tulad ng mga direktoryo, file, socket, atbp.
  • Mga paksa at bagay - Ang mga proseso ay mga paksa at tumatakbo sa isang partikular na konteksto, o domain ng seguridad. Mga mapagkukunan ng operating system: ang mga file, direktoryo, socket, atbp., ay mga bagay na itinalaga sa isang partikular na uri, sa madaling salita, isang antas ng privacy.
  • Mga Patakaran ng SELinux β€” Gumagamit ang SELinux ng iba't ibang mga patakaran upang protektahan ang system. Tinutukoy ng patakaran ng SELinux ang pag-access ng mga user sa mga tungkulin, mga tungkulin sa mga domain, at mga domain sa mga uri. Una, pinapahintulutan ang user na kumuha ng tungkulin, pagkatapos ay awtorisado ang tungkulin na i-access ang mga domain. Sa wakas, ang isang domain ay maaari lamang magkaroon ng access sa ilang mga uri ng mga bagay.

LSM at SELinux na arkitektura

Sa kabila ng pangalan, ang mga LSM ay hindi karaniwang mai-load na mga module ng Linux. Gayunpaman, tulad ng SELinux, ito ay direktang isinama sa kernel. Ang anumang pagbabago sa source code ng LSM ay nangangailangan ng bagong kernel compilation. Ang kaukulang opsyon ay dapat paganahin sa mga setting ng kernel, kung hindi, ang LSM code ay hindi maa-activate pagkatapos ng boot. Ngunit kahit na sa kasong ito, maaari itong paganahin ng opsyon ng OS bootloader.

Mga sistema ng seguridad ng Linux
LSM check stack

Ang LSM ay nilagyan ng mga kawit sa mga pangunahing kernel function na maaaring may kaugnayan para sa mga pagsusuri. Ang isa sa mga pangunahing tampok ng mga LSM ay ang mga ito ay nakasalansan. Kaya, ang mga karaniwang pagsusuri ay ginagawa pa rin, at ang bawat layer ng LSM ay nagdaragdag lamang ng mga karagdagang kontrol at kontrol. Nangangahulugan ito na ang pagbabawal ay hindi maaaring ibalik. Ito ay ipinapakita sa figure; kung ang resulta ng mga nakagawiang pagsusuri sa DAC ay isang pagkabigo, kung gayon ang bagay ay hindi makakarating sa LSM hooks.

Pinagtibay ng SELinux ang arkitektura ng seguridad ng Flask ng Fluke research operating system, lalo na ang prinsipyo ng hindi bababa sa pribilehiyo. Ang kakanyahan ng konseptong ito, gaya ng ipinahihiwatig ng pangalan nito, ay upang bigyan ang gumagamit o iproseso lamang ang mga karapatang iyon na kinakailangan upang maisagawa ang mga nilalayong aksyon. Ang prinsipyong ito ay ipinatupad gamit ang sapilitang pag-type ng access, kaya ang kontrol sa pag-access sa SELinux ay batay sa domain => type na modelo.

Salamat sa sapilitang pag-type ng pag-access, ang SELinux ay may mas malaking kakayahan sa pagkontrol sa pag-access kaysa sa tradisyonal na modelo ng DAC na ginagamit sa mga operating system ng Unix/Linux. Halimbawa, maaari mong limitahan ang numero ng network port kung saan ikokonekta ng ftp server, payagan ang pagsulat at pagbabago ng mga file sa isang partikular na folder, ngunit hindi tanggalin ang mga ito.

Ang mga pangunahing bahagi ng SELinux ay:

  • Server sa Pagpapatupad ng Patakaran β€” Ang pangunahing mekanismo para sa pag-aayos ng kontrol sa pag-access.
  • Database ng patakaran sa seguridad ng system.
  • Pakikipag-ugnayan sa LSM event interceptor.
  • Selinuxfs - Pseudo-FS, kapareho ng /proc at naka-mount sa /sys/fs/selinux. Dynamically populated ng Linux kernel sa runtime at naglalaman ng mga file na naglalaman ng SELinux status information.
  • I-access ang Vector Cache β€” Isang pantulong na mekanismo para sa pagtaas ng produktibidad.

Mga sistema ng seguridad ng Linux
Paano gumagana ang SELinux

Ang lahat ng ito ay gumagana tulad nito.

  1. Ang isang partikular na paksa, sa mga termino ng SELinux, ay nagsasagawa ng pinahihintulutang pagkilos sa isang bagay pagkatapos ng pagsusuri sa DAC, tulad ng ipinapakita sa larawan sa itaas. Ang kahilingang ito na magsagawa ng operasyon ay napupunta sa LSM event interceptor.
  2. Mula doon, ang kahilingan, kasama ang paksa at konteksto ng seguridad ng bagay, ay ipinapasa sa module ng SELinux Abstraction at Hook Logic, na responsable sa pakikipag-ugnayan sa LSM.
  3. Ang awtoridad sa paggawa ng desisyon sa pag-access ng isang paksa sa isang bagay ay ang Policy Enforcement Server at tumatanggap ito ng data mula sa SELinux AnHL.
  4. Upang gumawa ng mga desisyon tungkol sa pag-access o pagtanggi, ang Server ng Pagpapatupad ng Patakaran ay bumaling sa Access Vector Cache (AVC) na caching subsystem para sa mga pinakamadalas na ginagamit na panuntunan.
  5. Kung ang isang solusyon para sa kaukulang panuntunan ay hindi nakita sa cache, ang kahilingan ay ipapasa sa database ng patakaran sa seguridad.
  6. Ang resulta ng paghahanap mula sa database at AVC ay ibinalik sa Server ng Pagpapatupad ng Patakaran.
  7. Kung ang nahanap na patakaran ay tumutugma sa hiniling na pagkilos, pinapayagan ang operasyon. Kung hindi, ang operasyon ay ipinagbabawal.

Pamamahala ng Mga Setting ng SELinux

Gumagana ang SELinux sa isa sa tatlong mga mode:

  • Pagpapatupad - Mahigpit na pagsunod sa mga patakaran sa seguridad.
  • Permissive - Ang paglabag sa mga paghihigpit ay pinapayagan; isang kaukulang tala ay ginawa sa journal.
  • Naka-disableβ€”Walang bisa ang mga patakaran sa seguridad.

Makikita mo kung anong mode ang SELinux gamit ang sumusunod na command.

[admin@server ~]$ getenforce
Permissive

Ang pagpapalit ng mode bago mag-reboot, halimbawa, ang pagtatakda nito sa pagpapatupad, o 1. Ang permissive na parameter ay tumutugma sa numeric code 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #Ρ‚ΠΎ ΠΆΠ΅ самоС

Maaari mo ring baguhin ang mode sa pamamagitan ng pag-edit ng file:

[admin@server ~]$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

SELINUXTYPE=target

Ang pagkakaiba sa setenfoce ay kapag nag-boot ang operating system, ang SELinux mode ay itatakda alinsunod sa halaga ng SELINUX parameter sa configuration file. Bilang karagdagan, ang mga pagbabago sa pagpapatupad ng <=> disabled ay magkakabisa lamang sa pamamagitan ng pag-edit sa /etc/selinux/config file at pagkatapos ng reboot.

Tingnan ang isang maikling ulat sa katayuan:

[admin@server ~]$ sestatus

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31

Upang tingnan ang mga katangian ng SELinux, ginagamit ng ilang karaniwang mga utility ang -Z na parameter.

[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL                             PID TTY          TIME CMD
system_u:system_r:httpd_t:s0     2914 ?        00:00:04 httpd
system_u:system_r:httpd_t:s0     2915 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2916 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2917 ?        00:00:00 httpd
...
system_u:system_r:httpd_t:s0     2918 ?        00:00:00 httpd

Kung ikukumpara sa normal na output ng ls -l, mayroong ilang karagdagang mga field sa sumusunod na format:

<user>:<role>:<type>:<level>

Ang huling field ay nagpapahiwatig ng isang bagay tulad ng isang pag-uuri ng seguridad at binubuo ng isang kumbinasyon ng dalawang elemento:

  • s0 - kahalagahan, isinulat din bilang lowlevel-highlevel interval
  • c0, c1... c1023 - kategorya.

Pagbabago ng configuration ng access

Gumamit ng semodule upang i-load, magdagdag, at alisin ang mga module ng SELinux.

[admin@server ~]$ semodule -l |wc -l #список всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ
408
[admin@server ~]$ semodule -e abrt #enable - Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
[admin@server ~]$ semodule -d accountsd #disable - ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ
[admin@server ~]$ semodule -r avahi #remove - ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Unang koponan semanage login nagkokonekta sa gumagamit ng SELinux sa gumagamit ng operating system, ang pangalawa ay nagpapakita ng isang listahan. Sa wakas, ang huling command na may -r switch ay nag-aalis ng pagmamapa ng mga gumagamit ng SELinux sa mga OS account. Ang isang paliwanag ng syntax para sa mga halaga ng MLS/MCS Range ay nasa nakaraang seksyon.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol

Koponan gumagamit ng semanage ginagamit upang pamahalaan ang mga pagmamapa sa pagitan ng mga gumagamit at tungkulin ng SELinux.

[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Mga parameter ng command:

  • -isang magdagdag ng pasadyang entry sa pagmamapa ng tungkulin;
  • -l listahan ng mga tumutugmang user at tungkulin;
  • -d tanggalin ang entry sa pagmamapa ng tungkulin ng gumagamit;
  • -R listahan ng mga tungkulin na naka-attach sa user;

Mga File, Port at Boolean Value

Ang bawat module ng SELinux ay nagbibigay ng isang set ng mga panuntunan sa pag-tag ng file, ngunit maaari ka ring magdagdag ng sarili mong mga panuntunan kung kinakailangan. Halimbawa, gusto naming magkaroon ang web server ng mga karapatan sa pag-access sa folder na /srv/www.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

Ang unang utos ay nagrerehistro ng mga bagong panuntunan sa pagmamarka, at ang pangalawa ay nagre-reset, o sa halip ay nagtatakda, ang mga uri ng file alinsunod sa kasalukuyang mga panuntunan.

Gayundin, ang mga TCP/UDP port ay minarkahan sa paraang ang mga naaangkop na serbisyo lamang ang makakarinig sa kanila. Halimbawa, para makinig ang web server sa port 8080, kailangan mong patakbuhin ang command.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Ang isang makabuluhang bilang ng mga module ng SELinux ay may mga parameter na maaaring kumuha ng mga halaga ng Boolean. Ang buong listahan ng mga naturang parameter ay makikita gamit ang getsebool -a. Maaari mong baguhin ang mga halaga ng boolean gamit ang setsebool.

[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off

Workshop, makakuha ng access sa Pgadmin-web interface

Tingnan natin ang isang praktikal na halimbawa: nag-install kami ng pgadmin7.6-web sa RHEL 4 upang pangasiwaan ang database ng PostgreSQL. Naglakad kami ng konti pakikipagsapalaran gamit ang mga setting ng pg_hba.conf, postgresql.conf at config_local.py, itakda ang mga pahintulot sa folder, na-install ang nawawalang mga module ng Python mula sa pip. Handa na ang lahat, inilunsad at tinatanggap namin 500 Internal Server error.

Mga sistema ng seguridad ng Linux

Nagsisimula kami sa mga karaniwang suspek, sinusuri ang /var/log/httpd/error_log. Mayroong ilang mga kagiliw-giliw na mga entry doon.

[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690] [timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.

Sa puntong ito, ang karamihan sa mga administrador ng Linux ay matinding matutukso na patakbuhin ang setencorce 0, at iyon na ang magwawakas. Sa totoo lang, ginawa ko lang iyon sa unang pagkakataon. Ito ay siyempre isang paraan din, ngunit malayo sa pinakamahusay.

Sa kabila ng masalimuot na disenyo, ang SELinux ay maaaring maging user-friendly. I-install lang ang setroubleshoot package at tingnan ang system log.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Pakitandaan na ang serbisyo ng auditd ay dapat na i-restart sa ganitong paraan, at hindi gumagamit ng systemctl, sa kabila ng pagkakaroon ng systemd sa OS. Sa log ng system ay ipahiwatig hindi lamang ang katotohanan ng pagharang, kundi pati na rin ang dahilan at paraan upang malampasan ang pagbabawal.

Mga sistema ng seguridad ng Linux

Isinasagawa namin ang mga utos na ito:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

Sinusuri namin ang pag-access sa pgadmin4-web web page, gumagana ang lahat.

Mga sistema ng seguridad ng Linux

Mga sistema ng seguridad ng Linux

Pinagmulan: www.habr.com

Magdagdag ng komento