Linukso-sekurecaj sistemoj

Unu el la kialoj de la enorma sukceso de la Linux OS sur enigitaj, porteblaj aparatoj kaj serviloj estas la sufiĉe alta grado de sekureco de la kerno, rilataj servoj kaj aplikoj. Sed se rigardu pli proksime al la arkitekturo de la Linukso-kerno, tiam estas neeble trovi en ĝi kvadraton respondecan pri sekureco kiel tia. Kie kaŝiĝas la Linukso-sekureca subsistemo kaj el kio ĝi konsistas?

Fono pri Linuksaj Sekurecaj Moduloj kaj SELinux

Sekureco Plibonigita Linukso estas aro de reguloj kaj alirmekanismoj bazitaj sur devigaj kaj rol-bazitaj alirmodeloj por protekti Linuksajn sistemojn kontraŭ eblaj minacoj kaj korekti la mankojn de Diskretionary Access Control (DAC), la tradicia Unikso-sekureca sistemo. La projekto originis en la internaĵoj de la Usona Nacia Sekurec-Agentejo, kaj estis rekte evoluigita plejparte fare de entreprenistoj Secure Computing Corporation kaj MITRE, same kiel kelkaj esplorlaboratorioj.

Linukso-sekurecaj sistemoj
Linukso-Sekurecaj Moduloj

Linus Torvalds faris kelkajn komentojn pri novaj NSA-evoluoj por ke ili estu inkluzivitaj en la ĉeftendenca Linukso-kerno. Li priskribis ĝeneralan medion, kun aro de interkaptistoj por kontroli operaciojn kun objektoj kaj aro de certaj protektaj kampoj en kernaj datumstrukturoj por stoki la respondajn atributojn. Ĉi tiu medio tiam povas esti uzata per ŝarĝeblaj kernaj moduloj por efektivigi ajnan deziratan sekurecmodelon. LSM plene eniris la Linuksan kernon v2.6 en 2003.

La LSM-kadro inkluzivas gardajn kampojn en datumstrukturoj kaj vokoj al interkaptfunkcioj ĉe kritikaj punktoj en la kernkodo por manipuli ilin kaj plenumi alirkontrolon. Ĝi ankaŭ aldonas funkciojn por registri sekurecajn modulojn. La /sys/kernel/security/lsm-interfaco enhavas liston de aktivaj moduloj en la sistemo. LSM-hokoj estas konservitaj en listoj, kiuj estas nomitaj en la ordo specifita en CONFIG_LSM. Detala dokumentaro pri hokoj estas inkluzivita en la kapdosiero include/linux/lsm_hooks.h.

La LSM-subsistemo ebligis kompletigi la plenan integriĝon de SELinux kun la sama versio de la stabila Linukso-kerno v2.6. Preskaŭ tuj, SELinux iĝis la fakta normo por sekura Linukso-medio kaj estis inkluzivita en la plej popularaj distribuoj: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinukso Glosaro

  • Identeco — La SELinukso-uzanto ne estas la sama kiel la kutima Unikso/Linuksa uzantidentigilo; ili povas kunekzisti en la sama sistemo, sed estas tute malsamaj esence. Ĉiu norma Linuksa konto povas respondi al unu aŭ pli en SELinux. La SELinux-identeco estas parto de la ĝenerala sekureca kunteksto, kiu determinas al kiuj domajnoj vi povas kaj ne povas aliĝi.
  • Domajnoj - En SELinux, domajno estas la ekzekutkunteksto de subjekto, t.e. procezo. La domajno rekte determinas la aliron kiun procezo havas. Domajno estas esence listo de kion procezoj povas fari aŭ kion procezo povas fari kun malsamaj tipoj. Kelkaj ekzemploj de domajnoj estas sysadm_t por sistemadministrado, kaj user_t kiu estas normala ne-privilegia uzantdomajno. La init-sistemo funkcias en la domajno init_t, kaj la nomita procezo funkcias en la domajno named_t.
  • Roloj — Kio servas kiel peranto inter domajnoj kaj uzantoj de SELinux. Roloj determinas al kiuj domajnoj uzanto povas aparteni kaj kiajn specojn de objektoj ili povas aliri. Ĉi tiu alirkontrolmekanismo malhelpas la minacon de privilegiaj eskalado-atakoj. Roloj estas skribitaj en la sekurecan modelon de Role Based Access Control (RBAC) uzata en SELinux.
  • Tipoj — Atributo de listo de Type Enforcement kiu estas asignita al objekto kaj determinas kiu povas aliri ĝin. Simila al la domajna difino, krom ke domajno validas por procezo, kaj tipo validas por objektoj kiel dosierujoj, dosieroj, ingoj ktp.
  • Subjektoj kaj objektoj - Procezoj estas subjektoj kaj funkcias en specifa kunteksto, aŭ sekureca domajno. Rimedoj de operaciumo: dosieroj, dosierujoj, ingoj ktp., estas objektoj, al kiuj oni atribuas certan tipon, alivorte, privatecan nivelon.
  • SELinux Politikoj — SELinux uzas diversajn politikojn por protekti la sistemon. La SELinux-politiko difinas la aliron de uzantoj al roloj, roloj al domajnoj, kaj domajnoj al tipoj. Unue, la uzanto estas rajtigita por akiri rolon, tiam la rolo estas rajtigita por aliri domajnojn. Fine, domajno povas nur havi aliron al certaj specoj de objektoj.

LSM kaj SELinux-arkitekturo

Malgraŭ la nomo, LSMoj ne estas ĝenerale ŝarĝeblaj Linuksaj moduloj. Tamen, kiel SELinux, ĝi estas rekte integrita en la kernon. Ĉiu ŝanĝo al la fontkodo de LSM postulas novan kernan kompilon. La responda opcio devas esti ebligita en la kernaj agordoj, alie la LSM-kodo ne estos aktivigita post ekŝargo. Sed eĉ en ĉi tiu kazo, ĝi povas esti ebligita per la opcio de la OS-ŝargilo.

Linukso-sekurecaj sistemoj
LSM-kontrola stako

LSM estas ekipita per hokoj en kernaj funkcioj, kiuj povas esti gravaj por ĉekoj. Unu el la ĉefaj trajtoj de LSMoj estas, ke ili estas stakigitaj. Tiel, la normaj kontroloj daŭre estas faritaj, kaj ĉiu tavolo de LSM nur aldonas kromajn kontrolojn kaj kontrolojn. Ĉi tio signifas, ke la malpermeso ne povas esti nuligita. Tio estas montrita en la figuro; se la rezulto de rutinaj DAC-kontroloj estas fiasko, tiam la afero eĉ ne atingos la LSM-hokojn.

SELinux adoptas la Flask-sekurecan arkitekturon de la Fluke-esplora operaciumo, precipe la principon de malplej privilegio. La esenco de ĉi tiu koncepto, kiel ĝia nomo sugestas, estas doni al la uzanto aŭ prilabori nur tiujn rajtojn, kiuj estas necesaj por efektivigi la celitajn agojn. Ĉi tiu principo estas efektivigita per deviga aliro tajpado, tiel alirkontrolo en SELinux estas bazita sur la domajno => tipmodelo.

Danke al deviga alirtajpado, SELinux havas multe pli grandajn alirkontrolajn kapablojn ol la tradicia DAC-modelo uzata en Unikso/Linukso operaciumoj. Ekzemple, vi povas limigi la retan havenon al kiu la ftp-servilo konektos, permesi skribi kaj ŝanĝi dosierojn en certa dosierujo, sed ne forigi ilin.

La ĉefaj komponantoj de SELinux estas:

  • Servilo pri Politiko-Devigo — La ĉefa mekanismo por organizi alirkontrolon.
  • Sistemo-sekureca politika datumbazo.
  • Interagado kun la LSM-okazaĵinterkaptisto.
  • Selinuxfs - Pseŭdo-FS, sama kiel /proc kaj muntita en /sys/fs/selinux. Dinamike loĝita de la Linukso-kerno ĉe rultempo kaj enhavantaj dosierojn enhavantajn statusajn informojn de SELinux.
  • Aliru Vektora Cache — Helpa mekanismo por pliigi produktivecon.

Linukso-sekurecaj sistemoj
Kiel SELinux funkcias

Ĉio funkcias tiel.

  1. Certa temo, laŭ SELinukso, faras permesitan agon sur objekto post DAC-kontrolo, kiel montrite en la supra bildo. Ĉi tiu peto fari operacion iras al la LSM-okazaĵinterkaptisto.
  2. De tie, la peto, kune kun la subjekta kaj objekta sekureckunteksto, estas pasita al la modulo SELinux Abstraktado kaj Hook Logic, kiu respondecas pri interagado kun la LSM.
  3. La decida aŭtoritato pri la aliro de subjekto al objekto estas la Policy Enforcement Server kaj ĝi ricevas datumojn de SELinux AnHL.
  4. Por fari decidojn pri aliro aŭ neo, Policy Enforcement Server turnas sin al la Access Vector Cache (AVC) kaŝmemorsubsistemo por la plej uzataj reguloj.
  5. Se solvo por la responda regulo ne troviĝas en la kaŝmemoro, tiam la peto estas transdonita al la datumbazo pri sekureca politiko.
  6. La serĉrezulto de la datumbazo kaj AVC estas resendita al la Policy Enforcement Server.
  7. Se la trovita politiko kongruas kun la petita ago, tiam la operacio estas permesita. Alie, la operacio estas malpermesita.

Administri SELinux-Agordojn

SELinux funkcias en unu el tri reĝimoj:

  • Devigo - Strikta sekvado al sekurecaj politikoj.
  • Permesa - Malobservo de restriktoj estas permesita; responda noto estas farita en la ĵurnalo.
  • Malŝaltita—Sekurecpolitikoj ne validas.

Vi povas vidi en kia reĝimo estas SELinux per la sekva komando.

[admin@server ~]$ getenforce
Permissive

Ŝanĝi la reĝimon antaŭ rekomenco, ekzemple, agordi ĝin al devigo, aŭ 1. La permesa parametro respondas al la nombra kodo 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

Vi ankaŭ povas ŝanĝi la reĝimon redaktante la dosieron:

[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=celo

La diferenco kun setenfoce estas, ke kiam la operaciumo ekfunkciigas, la SELinux-reĝimo estos agordita laŭ la valoro de la SELINUX-parametro en la agorda dosiero. Krome, ŝanĝoj al devigado de <=> malŝaltita efektiviĝas nur per redaktado de la /etc/selinux/config dosiero kaj post rekomenco.

Rigardu mallongan statusraporton:

[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

Por vidi SELinux-atributojn, iuj normaj iloj uzas la -Z parametron.

[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

Kompare kun la normala eligo de ls -l, ekzistas pluraj kromaj kampoj en la sekva formato:

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

La lasta kampo indikas ion kiel sekurecan klasifikon kaj konsistas el kombinaĵo de du elementoj:

  • s0 - signifo, ankaŭ skribita kiel malaltnivela-altnivela intervalo
  • c0, c1... c1023 - kategorio.

Ŝanĝante alirkonfiguracion

Uzu semodulon por ŝargi, aldoni kaj forigi SELinux-modulojn.

[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 - удалить модуль

Unua teamo semajna ensaluto ligas la uzanton de SELinux al la uzanto de operaciumo, la dua montras liston. Fine, la lasta komando per la -r-ŝaltilo forigas la mapadon de SELinux-uzantoj al OS-kontoj. Klarigo pri la sintakso por MLS/MCS Range-valoroj estas en la antaŭa sekcio.

[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

teamo semanage uzanto uzata por administri mapadojn inter uzantoj kaj roloj de 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

Komandaj parametroj:

  • -a aldoni kutiman rolmapan eniron;
  • -l listo de kongruaj uzantoj kaj roloj;
  • -d forigi uzantan rol-mapadon;
  • -R listo de roloj ligitaj al la uzanto;

Dosieroj, Havenoj kaj Buleaj Valoroj

Ĉiu SELinux-modulo disponigas aron de dosieretikedaj reguloj, sed vi ankaŭ povas aldoni viajn proprajn regulojn se necese. Ekzemple, ni volas, ke la retservilo havu alirrajtojn al la dosierujo /srv/www.

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

La unua komando registras novajn markregulojn, kaj la dua rekomencigas, aŭ pli ĝuste fiksas, la dosiertipojn konforme al la nunaj reguloj.

Same, TCP/UDP-havenoj estas markitaj tiel, ke nur la taŭgaj servoj povas aŭskulti sur ili. Ekzemple, por ke la retservilo aŭskultu sur la haveno 8080, vi devas ruli la komandon.

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

Signifa nombro da SELinux-moduloj havas parametrojn, kiuj povas preni buleajn valorojn. La tuta listo de tiaj parametroj povas esti vidita uzante getsebool -a. Vi povas ŝanĝi buleajn valorojn per 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

Laborrenkontiĝo, akiru aliron al la Pgadmin-retinterfaco

Ni rigardu praktikan ekzemplon: ni instalis pgadmin7.6-web sur RHEL 4 por administri la PostgreSQL-datumbazon. Ni iom marŝis serĉo kun la agordoj de pg_hba.conf, postgresql.conf kaj config_local.py, starigis dosierujojn permesojn, instalis la mankantajn Python-modulojn de pip. Ĉio estas preta, ni lanĉas kaj ricevas 500 Eraro de Interna Servilo.

Linukso-sekurecaj sistemoj

Ni komencas kun la tipaj suspektatoj, kontrolante /var/log/httpd/error_log. Estas kelkaj interesaj enskriboj tie.

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

Je ĉi tiu punkto, plej multaj Linukso-administrantoj estos forte tentataj ruli setencorce 0, kaj tio estos la fino de ĝi. Sincere, mi faris ĝuste tion la unuan fojon. Ĉi tio kompreneble ankaŭ estas elirejo, sed malproksime de la plej bona.

Malgraŭ la maloportunaj dezajnoj, SELinux povas esti uzebla afabla. Nur instalu la setroubleshoot-pakaĵon kaj rigardu la sisteman protokolon.

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

Bonvolu noti, ke la auditd-servo devas esti rekomencita tiel, kaj ne uzante systemctl, malgraŭ la ĉeesto de systemd en la OS. En la sistema protokolo estos indikita ne nur la fakto de blokado, sed ankaŭ la kialo kaj maniero venki la malpermeson.

Linukso-sekurecaj sistemoj

Ni plenumas ĉi tiujn komandojn:

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

Ni kontrolas aliron al la retpaĝo pgadmin4-ret, ĉio funkcias.

Linukso-sekurecaj sistemoj

Linukso-sekurecaj sistemoj

fonto: www.habr.com

Aldoni komenton