Linux անվտանգության համակարգեր

Ներկառուցված, շարժական սարքերի և սերվերների վրա Linux ՕՀ-ի հսկայական հաջողության պատճառներից մեկը միջուկի, հարակից ծառայությունների և հավելվածների անվտանգության բավականին բարձր աստիճանն է: Բայց եթե ավելի ուշադիր նայեք Linux միջուկի ճարտարապետությանը, ապա դրա մեջ անհնար է գտնել անվտանգության համար պատասխանատու քառակուսի, որպես այդպիսին: Որտե՞ղ է թաքնված Linux անվտանգության ենթահամակարգը և ինչից է այն բաղկացած:

Linux-ի անվտանգության մոդուլների և SELinux-ի նախապատմություն

Անվտանգության ընդլայնված Linux-ը կանոնների և մուտքի մեխանիզմների մի շարք է, որը հիմնված է պարտադիր և դերի վրա հիմնված մուտքի մոդելների վրա՝ Linux համակարգերը պոտենցիալ սպառնալիքներից պաշտպանելու և ավանդական Unix անվտանգության համակարգի՝ Discretionary Access Control (DAC) թերությունները շտկելու համար: Նախագիծը ծագել է ԱՄՆ Ազգային անվտանգության գործակալության խորքերում և ուղղակիորեն մշակվել է հիմնականում Secure Computing Corporation-ի և MITER-ի կապալառուների, ինչպես նաև մի շարք հետազոտական ​​լաբորատորիաների կողմից:

Linux անվտանգության համակարգեր
Linux անվտանգության մոդուլներ

Լինուս Տորվալդսը մի շարք մեկնաբանություններ է արել NSA-ի նոր զարգացումների վերաբերյալ, որպեսզի դրանք ներառվեն հիմնական Linux միջուկում: Նա նկարագրել է ընդհանուր միջավայր՝ օբյեկտների հետ գործողությունները վերահսկելու համար նախատեսված ընդհատիչների մի շարքով և միջուկի տվյալների կառուցվածքներում որոշակի պաշտպանիչ դաշտերով՝ համապատասխան ատրիբուտները պահելու համար: Այնուհետև այս միջավայրը կարող է օգտագործվել բեռնվող միջուկի մոդուլների կողմից՝ անվտանգության ցանկացած ցանկալի մոդել իրականացնելու համար: LSM-ն ամբողջությամբ մտավ Linux միջուկ v2.6 2003 թվականին։

LSM շրջանակը ներառում է պահակային դաշտեր տվյալների կառուցվածքներում և միջուկի կոդի կրիտիկական կետերում գաղտնալսման գործառույթներ՝ դրանք շահարկելու և մուտքի վերահսկում իրականացնելու համար: Այն նաև ավելացնում է անվտանգության մոդուլների գրանցման գործառույթ: /sys/kernel/security/lsm ինտերֆեյսը պարունակում է համակարգի ակտիվ մոդուլների ցանկ: LSM կեռիկները պահվում են ցուցակներում, որոնք կանչվում են CONFIG_LSM-ում նշված հերթականությամբ: Կեռիկների վերաբերյալ մանրամասն փաստաթղթերը ներառված են վերնագրի ֆայլում՝ include/linux/lsm_hooks.h:

LSM ենթահամակարգը հնարավորություն տվեց ավարտել SELinux-ի ամբողջական ինտեգրումը Linux-ի կայուն միջուկի նույն տարբերակով v2.6: Գրեթե անմիջապես SELinux-ը դարձավ դե ֆակտո ստանդարտ անվտանգ Linux միջավայրի համար և ընդգրկվեց ամենահայտնի բաշխումների մեջ՝ RedHat Enterprise Linux, Fedora, Debian, Ubuntu:

SELinux բառարան

  • Ինքնություն — SELinux-ի օգտատերը նույնը չէ, ինչ սովորական Unix/Linux օգտագործողի ID-ն, նրանք կարող են գոյակցել նույն համակարգում, բայց ըստ էության բոլորովին տարբեր են: Յուրաքանչյուր ստանդարտ Linux հաշիվ կարող է համապատասխանել SELinux-ում մեկ կամ մի քանիսի: SELinux ինքնությունը ընդհանուր անվտանգության համատեքստի մի մասն է, որը որոշում է, թե որ տիրույթներին կարող եք միանալ և ոչ:
  • Դոմեններ - SELinux-ում տիրույթը առարկայի, այսինքն՝ գործընթացի կատարման համատեքստն է: Դոմենն ուղղակիորեն որոշում է գործընթացի հասանելիությունը: Դոմենը հիմնականում ցուցակ է, թե ինչ կարող է անել գործընթացները կամ ինչ կարող է անել գործընթացը տարբեր տեսակների հետ: Դոմենների որոշ օրինակներ են sysadm_t համակարգի կառավարման համար, և user_t, որը սովորական ոչ արտոնյալ օգտվողի տիրույթ է: Init համակարգն աշխատում է init_t տիրույթում, իսկ անվանված գործընթացը՝ named_t տիրույթում։
  • Դերը — Ինչը ծառայում է որպես միջնորդ տիրույթների և SELinux օգտվողների միջև: Դերերը որոշում են, թե որ տիրույթներին կարող է պատկանել օգտատերը և ինչ տեսակի օբյեկտներ կարող են մուտք գործել: Մուտքի վերահսկման այս մեխանիզմը կանխում է արտոնությունների աճի հարձակումների վտանգը: Դերերը գրված են SELinux-ում օգտագործվող Role Based Access Control (RBAC) անվտանգության մոդելում:
  • Տեսակներ — Type Enforcement list հատկանիշ, որը վերագրվում է օբյեկտին և որոշում, թե ով կարող է մուտք գործել այն: Նման է տիրույթի սահմանմանը, բացառությամբ, որ տիրույթը վերաբերում է գործընթացին, և տեսակը վերաբերում է այնպիսի օբյեկտների, ինչպիսիք են դիրեկտորիաները, ֆայլերը, վարդակները և այլն:
  • Առարկաներ և առարկաներ - Գործընթացները սուբյեկտներ են և գործում են որոշակի համատեքստում կամ անվտանգության տիրույթում: Օպերացիոն համակարգի ռեսուրսները՝ ֆայլերը, գրացուցակները, վարդակները և այլն, օբյեկտներ են, որոնց հատկացվում է որոշակի տեսակ, այլ կերպ ասած՝ գաղտնիության մակարդակ:
  • SELinux-ի քաղաքականություն — SELinux-ը օգտագործում է մի շարք քաղաքականություններ՝ համակարգը պաշտպանելու համար: SELinux քաղաքականությունը սահմանում է օգտատերերի մուտքը դերեր, դերեր՝ տիրույթներ և տիրույթներ՝ տեսակներ: Նախ, օգտվողը լիազորված է ձեռք բերել դեր, ապա դերը լիազորված է մուտք գործել տիրույթներ: Վերջապես, տիրույթը կարող է մուտք ունենալ միայն որոշակի տեսակի օբյեկտների:

LSM և SELinux ճարտարապետություն

Չնայած անվանմանը, LSM-ները հիմնականում բեռնվող Linux մոդուլներ չեն: Այնուամենայնիվ, ինչպես SELinux-ը, այն ուղղակիորեն ինտեգրված է միջուկին: LSM սկզբնական կոդի ցանկացած փոփոխություն պահանջում է միջուկի նոր կոմպիլացիա: Համապատասխան տարբերակը պետք է միացված լինի միջուկի կարգավորումներում, հակառակ դեպքում բեռնումից հետո LSM կոդը չի ակտիվանա։ Բայց նույնիսկ այս դեպքում այն ​​կարելի է միացնել OS bootloader տարբերակով։

Linux անվտանգության համակարգեր
LSM ստուգման բուրգ

LSM-ը հագեցած է միջուկի հիմնական գործառույթների կեռիկներով, որոնք կարող են համապատասխան լինել ստուգումների համար: LSM-ների հիմնական առանձնահատկություններից մեկն այն է, որ դրանք կուտակված են: Այսպիսով, ստանդարտ ստուգումները դեռևս կատարվում են, և LSM-ի յուրաքանչյուր շերտ ավելացնում է միայն լրացուցիչ հսկիչներ և հսկիչներ: Սա նշանակում է, որ արգելքը չի կարող հետ գլորվել։ Սա ցույց է տրված նկարում, եթե սովորական DAC ստուգումների արդյունքը ձախողվի, ապա գործը նույնիսկ LSM կեռիկներին չի հասնի:

SELinux-ն ընդունում է Fluke հետազոտական ​​օպերացիոն համակարգի Flask անվտանգության ճարտարապետությունը, մասնավորապես նվազագույն արտոնության սկզբունքը: Այս հայեցակարգի էությունը, ինչպես հուշում է նրա անվանումը, օգտագործողին տրամադրելն է կամ մշակել միայն այն իրավունքները, որոնք անհրաժեշտ են նախատեսված գործողություններն իրականացնելու համար: Այս սկզբունքն իրականացվում է հարկադիր մուտքի մուտքագրման միջոցով, ուստի մուտքի վերահսկումը SELinux-ում հիմնված է տիրույթի => տեսակի մոդելի վրա:

Հարկադիր մուտքի մուտքագրման շնորհիվ SELinux-ն ունի մուտքի վերահսկման շատ ավելի մեծ հնարավորություններ, քան ավանդական DAC մոդելը, որն օգտագործվում է Unix/Linux օպերացիոն համակարգերում: Օրինակ, դուք կարող եք սահմանափակել ցանցի պորտի համարը, որին միանալու է ftp սերվերը, թույլ տալ գրել և փոխել ֆայլերը որոշակի թղթապանակում, բայց չջնջել դրանք:

SELinux-ի հիմնական բաղադրիչներն են.

  • Քաղաքականության կիրարկման սերվեր — Մուտքի հսկողության կազմակերպման հիմնական մեխանիզմը.
  • Համակարգի անվտանգության քաղաքականության տվյալների բազա:
  • Փոխազդեցություն LSM իրադարձությունների ընդհատիչի հետ:
  • Selinuxfs - Pseudo-FS, նույնը, ինչ /proc-ը և տեղադրված է /sys/fs/selinux-ում: Գործարկման ժամանակ դինամիկորեն բնակեցված է Linux միջուկով և պարունակում է SELinux կարգավիճակի տեղեկատվություն պարունակող ֆայլեր:
  • Մուտք գործեք վեկտորային քեշ — Արտադրողականության բարձրացման օժանդակ մեխանիզմ:

Linux անվտանգության համակարգեր
Ինչպես է աշխատում SELinux-ը

Ամեն ինչ աշխատում է այսպես.

  1. Որոշ սուբյեկտ, SELinux-ի տերմիններով, DAC-ի ստուգումից հետո կատարում է թույլատրված գործողություն օբյեկտի վրա, ինչպես ցույց է տրված վերևի նկարում: Գործողություն կատարելու այս խնդրանքը գնում է LSM իրադարձությունների ընդհատիչին:
  2. Այնտեղից հարցումը, թեմայի և օբյեկտի անվտանգության համատեքստի հետ մեկտեղ, փոխանցվում է SELinux Abstraction and Hook Logic մոդուլին, որը պատասխանատու է LSM-ի հետ փոխգործակցության համար:
  3. Սուբյեկտի կողմից օբյեկտ մուտք գործելու վերաբերյալ որոշում կայացնող մարմինը Քաղաքականության կիրարկման սերվերն է, և այն տվյալներ է ստանում SELinux AnHL-ից:
  4. Մուտքի կամ մերժման վերաբերյալ որոշումներ կայացնելու համար Policy Enforcement Server-ը դիմում է Access Vector Cache (AVC) քեշավորման ենթահամակարգին՝ առավել օգտագործվող կանոնների համար:
  5. Եթե ​​քեշում չի գտնվի համապատասխան կանոնի լուծում, ապա հարցումը փոխանցվում է անվտանգության քաղաքականության տվյալների բազա:
  6. Տվյալների բազայից և ՀՎՀ-ից որոնման արդյունքը վերադարձվում է Policy Enforcement Server-ին:
  7. Եթե ​​գտնված քաղաքականությունը համապատասխանում է պահանջվող գործողությանը, ապա գործողությունը թույլատրվում է: Հակառակ դեպքում վիրահատությունն արգելված է։

SELinux-ի կարգավորումների կառավարում

SELinux-ը գործում է երեք ռեժիմներից մեկով.

  • Պարտադրում - Անվտանգության քաղաքականության խստիվ պահպանում:
  • Թույլատրելի - Սահմանափակումների խախտումը թույլատրվում է, համապատասխան նշում է կատարվում ամսագրում:
  • Հաշմանդամ - Անվտանգության քաղաքականությունը չի գործում:

Դուք կարող եք տեսնել, թե ինչ ռեժիմում է SELinux-ը հետևյալ հրամանով.

[admin@server ~]$ getenforce
Permissive

Ռեժիմի փոփոխություն նախքան վերագործարկումը, օրինակ՝ սահմանելով այն enforcing, կամ 1. Թույլատրելի պարամետրը համապատասխանում է 0 թվային կոդի:

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

Կարող եք նաև փոխել ռեժիմը՝ խմբագրելով ֆայլը՝

[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=թիրախ

Setenfoce-ի տարբերությունն այն է, որ երբ գործարկվում է օպերացիոն համակարգը, SELinux ռեժիմը կսահմանվի կազմաձևման ֆայլում SELINUX պարամետրի արժեքին համապատասխան: Ի լրումն, <=> անջատված պարտադրման փոփոխություններն ուժի մեջ են մտնում միայն /etc/selinux/config ֆայլը խմբագրելով և վերաբեռնումից հետո:

Դիտեք կարճ կարգավիճակի հաշվետվություն.

[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

SELinux ատրիբուտները դիտելու համար որոշ ստանդարտ կոմունալ ծառայություններ օգտագործում են -Z պարամետրը:

[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

Համեմատած ls -l-ի սովորական արդյունքի հետ, կան մի քանի լրացուցիչ դաշտեր հետևյալ ձևաչափով.

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

Վերջին դաշտը նշանակում է անվտանգության դասակարգման նման մի բան և բաղկացած է երկու տարրերի համակցությունից.

  • s0 - նշանակություն, որը գրված է նաև որպես ցածր մակարդակ-բարձր մակարդակի միջակայք
  • c0, c1… c1023 - կատեգորիա:

Մուտքի կոնֆիգուրացիայի փոփոխություն

Օգտագործեք semodule 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 - удалить модуль

Առաջին թիմ semanage մուտք միացնում է SELinux օգտվողին օպերացիոն համակարգի օգտագործողին, երկրորդը ցուցադրում է ցուցակը: Վերջապես, -r անջատիչով վերջին հրամանը հեռացնում է SELinux-ի օգտատերերի OS հաշիվների քարտեզագրումը: MLS/MCS միջակայքի արժեքների շարահյուսության բացատրությունը նախորդ բաժնում է:

[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

Թիմ կառավարել օգտվողին օգտագործվում է 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

Հրամանի պարամետրեր.

  • - ավելացնել հատուկ դերի քարտեզագրման մուտք;
  • - l համապատասխան օգտվողների և դերերի ցուցակ;
  • -d ջնջել օգտվողի դերի քարտեզագրման գրառումը;
  • - Օգտագործողին կցված դերերի R ցուցակ;

Ֆայլեր, պորտեր և բուլյան արժեքներ

Յուրաքանչյուր SELinux մոդուլ տրամադրում է ֆայլերի պիտակավորման կանոնների մի շարք, բայց անհրաժեշտության դեպքում կարող եք նաև ավելացնել ձեր սեփական կանոնները: Օրինակ, մենք ցանկանում ենք, որ վեբ սերվերը ունենա մուտքի իրավունքներ դեպի /srv/www թղթապանակ:

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

Առաջին հրամանը գրանցում է նոր նշագրման կանոններ, իսկ երկրորդը վերակայում է, ավելի ճիշտ՝ սահմանում է ֆայլերի տեսակները՝ գործող կանոններին համապատասխան։

Նմանապես, TCP/UDP նավահանգիստները նշված են այնպես, որ միայն համապատասխան ծառայությունները կարող են լսել դրանք: Օրինակ, որպեսզի վեբ սերվերը լսի 8080 նավահանգստում, դուք պետք է գործարկեք հրամանը:

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

SELinux մոդուլների մի զգալի քանակ ունեն պարամետրեր, որոնք կարող են ընդունել բուլյան արժեքներ: Նման պարամետրերի ամբողջ ցանկը կարելի է տեսնել՝ օգտագործելով getsebool -a: Դուք կարող եք փոխել բուլյան արժեքները՝ օգտագործելով 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

Սեմինար, մուտք գործեք Pgadmin-վեբ ինտերֆեյս

Եկեք նայենք գործնական օրինակին. մենք տեղադրեցինք pgadmin7.6-web-ը RHEL 4-ում՝ PostgreSQL տվյալների բազան կառավարելու համար: Մի փոքր քայլեցինք Որոնել pg_hba.conf, postgresql.conf և config_local.py կարգավորումներով, սահմանել թղթապանակների թույլտվությունները, տեղադրել Python-ի բացակայող մոդուլները pip-ից: Ամեն ինչ պատրաստ է, գործարկում և ստանում ենք 500 Ներքին սերվերի սխալ.

Linux անվտանգության համակարգեր

Մենք սկսում ենք բնորոշ կասկածյալներից՝ ստուգելով /var/log/httpd/error_log: Այնտեղ կան մի քանի հետաքրքիր գրառումներ:

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

Այս պահին Linux-ի ադմինիստրատորների մեծ մասը խիստ գայթակղված կլինի գործարկել setencorce 0-ը, և դա կլինի դրա ավարտը: Անկեղծ ասած, ես հենց դա արեցի առաջին անգամ: Սա, իհարկե, նույնպես ելք է, բայց հեռու լավագույնից։

Չնայած ծանր դիզայնին, SELinux-ը կարող է հարմար լինել օգտագործողի համար: Պարզապես տեղադրեք setroubleshoot փաթեթը և դիտեք համակարգի գրանցամատյանը:

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

Խնդրում ենք նկատի ունենալ, որ աուդիտի ենթարկված ծառայությունը պետք է վերագործարկվի այս կերպ, և չօգտագործվի systemctl, չնայած OS-ում systemd-ի առկայությանը: Համակարգի մատյանում կնշվեն ոչ միայն արգելափակման փաստը, այլեւ պատճառն ու արգելքը հաղթահարելու միջոց.

Linux անվտանգության համակարգեր

Մենք կատարում ենք այս հրամանները.

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

Մենք ստուգում ենք մուտքը pgadmin4-վեբ էջ, ամեն ինչ աշխատում է:

Linux անվտանգության համակարգեր

Linux անվտանգության համակարգեր

Source: www.habr.com

Добавить комментарий