Сістэмы абароны Linux

Адна з чыннікаў грандыёзнага поспеху Linux АС на ўбудаваных, мабільных прыладах і серверах складаецца ў досыць высокай ступені бяспекі ядра, спадарожных службаў і прыкладанняў. Але калі прыгледзецца ўважліва да архітэктуры ядра Linux, то нельга ў ім знайсці квадрацік які адказвае за бяспеку, як такую. Дзе ж хаваецца падсістэма бяспекі Linux і з чаго яна складаецца?

Перадгісторыя Linux Security Modules і SELinux

Security Enhanced Linux уяўляе сабой набор правіл і механізмам доступу, заснаваны на мадэлях мандатнага і ролевага доступу, для абароны сістэм Linux ад патэнцыйных пагроз і выпраўленні недахопаў Discretionary Access Control (DAC) - традыцыйнай сістэмы бяспекі Unix. Праект зарадзіўся ў нетрах Агенцтва Нацыянальнай Бяспекі ЗША, непасрэдна распрацоўкай займаліся, у асноўным, падрадчыкі Secure Computing Corporation і MITRE, а таксама шэраг даследчых лабараторый.

Сістэмы абароны Linux
Модулі бяспекі Linux

Лінус Торвальдс занёс шэраг зацемак аб новых распрацоўках АНБ, з тым, каб іх можна было ўлучыць у асноўную галіну ядра 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 user id, яны могуць суіснаваць на адной і той жа сістэме, але зусім розныя па сутнасці. Кожны стандартны ўліковы запіс Linux можа адпавядаць аднаму або некалькім у SELinux. Ідэнтычнасць SELinux з'яўляецца складовай часткай агульнага кантэксту бяспекі, які вызначае ў якія дамены можна ўваходзіць, а ў якія - нельга.
  • Дамены - У SELinux дамен з'яўляецца кантэкстам выканання суб'екта, т. е. працэсу. Дамен напрамую вызначае доступ, які мае працэс. Дамен - гэта ў асноўным спіс таго, што могуць рабіць працэсы або якія дзеянні працэс можа выконваць з рознымі тыпамі. Некаторыя прыклады даменаў: sysadm_t для сістэмнага адміністравання, і user_t, які з'яўляецца звычайным непрывілеяваным даменам карыстальніка. Сістэма ініцыялізацыі init запускаецца ў дамене init_t, а працэс named запускаецца ў дамене named_t.
  • ролі - Тое, што служыць пасярэднікам паміж даменамі і карыстачамі SELinux. Ролі вызначаюць, у якіх дамены можа складацца карыстач і да якіх тыпаў аб'ектаў ён зможа атрымаць доступ. Падобны механізм размежавання доступаў прадухіляе пагрозу ажыццявіць напад павышэння прывілеяў. Ролі ўпісаны ў мадэль бяспекі Role Based Access Control (RBAC), якая выкарыстоўваецца ў SELinux.
  • Тыпы - Атрыбут спісу Type Enforcement, які прызначаецца аб'екту і вызначае, хто атрымае да яго доступ. Падобна на азначэнне дамена, за выключэннем таго, што дамен ужываецца да працэсу, а тып ужываецца да такіх аб'ектаў, як каталогі, файлы, сокеты і т. д.
  • Суб'екты і аб'екты - Працэсы з'яўляюцца суб'ектамі і запускаюцца ў пэўным кантэксце, або дамене бяспекі. Рэсурсы аперацыйнай сістэмы: файлы, дырэкторыі, сокеты і інш., з'яўляюцца аб'ектамі, якім ставіцца ў адпаведнасць вызначаны тып, інакш кажучы - узровень сакрэтнасці.
  • Палітыкі SELinux - Для абароны сістэмы SELinux выкарыстоўвае разнастайныя палітыкі. Палітыка SELinux вызначае доступ карыстачоў да роляў, роляў - да даменаў і даменаў - да тыпаў. У пачатку карыстач аўтарызуецца для атрымання ролі, далей роля аўтарызуецца для доступу да даменаў. Нарэшце дамен можа мець доступ толькі да некаторых тыпаў аб'ектаў.

LSM і архітэктура SELinux

Нягледзячы на ​​назоў LSM увогуле-то не з'яўляюцца загружанымі модулямі Linux. Аднак таксама, як і SELinux, ён непасрэдна інтэграваны ў ядро. Любая змена зыходнага кода LSM патрабуе новай кампіляцыі ядра. Адпаведная опцыя павінна быць уключана ў наладах ядра, інакш код LSM не будзе актываваны пасля загрузкі. Але нават у гэтым выпадку яго можна ўлучыць опцыяй загрузніка АС.

Сістэмы абароны Linux
Стэк праверак LSM

LSM абсталяваны хуками ў асноўных функцый ядра, якія могуць быць рэлевантнымі для праверак. Адна з асноўных асаблівасцяў LSM складаецца ў тым, што яны ўладкованыя па прынцыпе стэка. Такім чынам, стандартныя праверкі па-ранейшаму выконваюцца, і кожны пласт LSM толькі дадае дадатковыя элементы кіравання і кантролю. Гэта азначае, што забарону немагчыма адкаціць назад. Гэта паказана на малюнку, калі вынікам руцінных DAC праверак стане адмова, то справа нават не дойдзе да хукаў LSM.

SELinux пераняў архітэктуру бяспекі Flask даследчай аперацыйнай сістэмы Fluke, у прыватнасці прынцып найменшых прывілеяў. Сутнасць гэтай канцэпцыі, як вынікае іх назвы, у прадастаўленні карыстальніку або працэсу толькі тых правоў, якія неабходны для ажыццяўлення меркаваных дзеянняў. Дадзены прынцып рэалізаваны з дапамогай прымусовай тыпізацыі доступу, такім чынам кантроль допускаў у SELinux грунтуецца на мадэлі дамен => тып.

Дзякуючы прымусовай тыпізацыі доступу SELinux мае значна значнейшыя магчымасці па размежаванні доступу, чым традыцыйная мадэль DAC, выкарыстоўваная ў АС Unix/Linux. Да прыкладу, можна абмежаваць нумар сеткавага порта, які будзе злучаць ftp сервер, дазволіць запіс і змены файлаў у вызначанай тэчцы, але не іх выдаленне.

Асноўныя кампаненты SELinux такія:

  • Policy Enforcement Server - Асноўны механізм арганізацыі кантролю доступу.
  • БД палітык бяспекі сістэмы.
  • Узаемадзеянне з перахопнікам падзей LSM.
  • Selinuxfs - Псеўда-ФС, такая ж, як /proc і прымантаваная ў /sys/fs/selinux. Дынамічна запаўняецца ядром Linux падчас выканання і ўтрымоўвае файлы, утрымоўвальныя звесткі аб статуце SELinux.
  • Access Vector Cache - Дапаможны механізм павышэння прадукцыйнасці.

Сістэмы абароны Linux
Схема працы SELinux

Усё гэта працуе наступным чынам.

  1. Нейкі суб'ект, у тэрмінах SELinux, выконвае над аб'ектам дазволенае дзеянне пасля DAC праверкі, як паказана не верхняй малюнку. Гэты запыт на выкананне аперацыі пападае да перахопніка падзей LSM.
  2. Адтуль запыт разам з кантэкстам бяспекі суб'екта і аб'екта перадаецца на модуль SELinux Abstraction and Hook Logic, адказны за ўзаемадзеянне з LSM.
  3. Інстанцыяй прыняцця рашэння аб доступе суб'екта да аб'екта з'яўляецца Policy Enforcement Server і да яго паступаюць дадзеныя ад SELinux AnHL.
  4. Для прыняцця рашэння аб доступе, або забароне Policy Enforcement Server звяртаецца да падсістэмы кэшавання найболей выкарыстоўваных правіл Access Vector Cache (AVC).
  5. Калі рашэнне для адпаведнага правіла не знойдзены ў кэшы, то запыт перадаецца далей у БД палітык бяспекі.
  6. Вынік пошуку з БД і AVC вяртаецца ў Policy Enforcement Server.
  7. Калі знойдзеная палітыка адпавядае запытаным дзеяннем, то аперацыя дазваляецца. У адваротным выпадку аперацыя забараняецца.

Кіраванне наладамі SELinux

SELinux працуе ў адным з трох рэжымаў:

  • Enforcing - строгае захаванне палітык бяспекі.
  • Permissive - Дапускаецца парушэнне абмежаванняў, у часопісе робіцца адпаведная пазнака.
  • Disabled – Палітыкі бяспекі не дзейнічаюць.

Паглядзець у якім рэжыме знаходзіцца SELinux можна наступнай камандай.

[admin@server ~]$ getenforce
Permissive

Змена рэжыму да перазагрузкі, напрыклад выставіць на enforcing, ці 1. Параметру permissive адпавядае лікавы код 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=targete

Розніца з setenfoce у тым, што пры загрузцы аперацыйнай сістэмы рэжым SELinux будзе выстаўлены ў адпаведнасці са значэннем параметра SELINUX канфігурацыйнага файла. Акрамя таго, змены enforcing <=> disabled уступаюць у сілу толькі праз праўку файла /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 - значнасць, таксама запісваюць інтэрвалам lowlevel-highlevel
  • 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 login звязвае карыстальніка SELinux з карыстальнікам аперацыйнай сістэмы, другая выводзіць спіс. Нарэшце апошняя каманда з ключом -r выдаляе звязак адлюстраванне карыстачоў SELinux на ўліковыя запісы АС. Тлумачэнне сінтаксісу значэнняў MLS/MCS Range знаходзіцца ў папярэдняй частцы.

[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

Каманда semanage user выкарыстоўваецца для кіравання адлюстраванняў паміж карыстальнікамі і ролямі 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

Параметры каманды:

  • -a дадаць карыстацкі запіс адпаведнасці роляў;
  • -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-web

Разгледзім прыклад з практыкі, мы ўстанавілі на RHEL 7.6 pgadmin4-web для адміністравання БД PostgreSQL. Мы прайшлі невялікі квэст з наладай pg_hba.conf, postgresql.conf і config_local.py, выставілі правы на тэчкі, усталявалі з pip адсутнічаюць модулі Python. Усё гатова, запускаем і атрымліваем 500 Internal Server error.

Сістэмы абароны 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

Звярніце ўвагу на тое, што сэрвіс auditd неабходна перазапускаць менавіта так, а не з дапамогай systemctl, нягледзячы на ​​наяўнасць systemd у АС. У сістэмным часопісе будзе пазначаны не толькі факт блакіроўкі, але таксама прычына і спосаб пераадолення забароны.

Сістэмы абароны Linux

Выконваем гэтыя каманды:

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

Правяраем доступ на вэб старонку pgadmin4-web, усё працуе.

Сістэмы абароны Linux

Сістэмы абароны Linux

Крыніца: habr.com

Дадаць каментар