Ներկառուցված, շարժական սարքերի և սերվերների վրա Linux ՕՀ-ի հսկայական հաջողության պատճառներից մեկը միջուկի, հարակից ծառայությունների և հավելվածների անվտանգության բավականին բարձր աստիճանն է: Բայց եթե
Linux-ի անվտանգության մոդուլների և SELinux-ի նախապատմություն
Անվտանգության ընդլայնված Linux-ը կանոնների և մուտքի մեխանիզմների մի շարք է, որը հիմնված է պարտադիր և դերի վրա հիմնված մուտքի մոդելների վրա՝ Linux համակարգերը պոտենցիալ սպառնալիքներից պաշտպանելու և ավանդական Unix անվտանգության համակարգի՝ Discretionary Access Control (DAC) թերությունները շտկելու համար: Նախագիծը ծագել է ԱՄՆ Ազգային անվտանգության գործակալության խորքերում և ուղղակիորեն մշակվել է հիմնականում Secure Computing Corporation-ի և MITER-ի կապալառուների, ինչպես նաև մի շարք հետազոտական լաբորատորիաների կողմից:
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 տարբերակով։
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 կարգավիճակի տեղեկատվություն պարունակող ֆայլեր:
- Մուտք գործեք վեկտորային քեշ — Արտադրողականության բարձրացման օժանդակ մեխանիզմ:
Ինչպես է աշխատում SELinux-ը
Ամեն ինչ աշխատում է այսպես.
- Որոշ սուբյեկտ, SELinux-ի տերմիններով, DAC-ի ստուգումից հետո կատարում է թույլատրված գործողություն օբյեկտի վրա, ինչպես ցույց է տրված վերևի նկարում: Գործողություն կատարելու այս խնդրանքը գնում է LSM իրադարձությունների ընդհատիչին:
- Այնտեղից հարցումը, թեմայի և օբյեկտի անվտանգության համատեքստի հետ մեկտեղ, փոխանցվում է SELinux Abstraction and Hook Logic մոդուլին, որը պատասխանատու է LSM-ի հետ փոխգործակցության համար:
- Սուբյեկտի կողմից օբյեկտ մուտք գործելու վերաբերյալ որոշում կայացնող մարմինը Քաղաքականության կիրարկման սերվերն է, և այն տվյալներ է ստանում SELinux AnHL-ից:
- Մուտքի կամ մերժման վերաբերյալ որոշումներ կայացնելու համար Policy Enforcement Server-ը դիմում է Access Vector Cache (AVC) քեշավորման ենթահամակարգին՝ առավել օգտագործվող կանոնների համար:
- Եթե քեշում չի գտնվի համապատասխան կանոնի լուծում, ապա հարցումը փոխանցվում է անվտանգության քաղաքականության տվյալների բազա:
- Տվյալների բազայից և ՀՎՀ-ից որոնման արդյունքը վերադարձվում է Policy Enforcement Server-ին:
- Եթե գտնված քաղաքականությունը համապատասխանում է պահանջվող գործողությանը, ապա գործողությունը թույլատրվում է: Հակառակ դեպքում վիրահատությունն արգելված է։
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 տվյալների բազան կառավարելու համար: Մի փոքր քայլեցինք
Մենք սկսում ենք բնորոշ կասկածյալներից՝ ստուգելով /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-ի առկայությանը: Համակարգի մատյանում կնշվեն ոչ միայն արգելափակման փաստը, այլեւ պատճառն ու արգելքը հաղթահարելու միջոց.
Մենք կատարում ենք այս հրամանները.
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Մենք ստուգում ենք մուտքը pgadmin4-վեբ էջ, ամեն ինչ աշխատում է:
Source: www.habr.com