Линукс хамгаалалтын системүүд

Линукс үйлдлийн систем суулгагдсан, хөдөлгөөнт төхөөрөмж, серверүүд дээр асар их амжилтанд хүрсэн шалтгаануудын нэг нь цөм, холбогдох үйлчилгээ, програмуудын аюулгүй байдлын нэлээд өндөр түвшин юм. Гэхдээ хэрэв сайтар ажиглаарай Линуксийн цөмийн архитектурын хувьд аюулгүй байдлыг хариуцах квадратыг олох боломжгүй юм. Линукс аюулгүй байдлын дэд систем хаана нуугдаж байгаа бөгөөд энэ нь юунаас бүрддэг вэ?

Линукс аюулгүй байдлын модулиуд болон SELinux-ийн талаархи суурь мэдээлэл

Security Enhanced Linux нь Линукс системийг болзошгүй аюулаас хамгаалах, уламжлалт Юникс хамгаалалтын систем болох Discretionary Access Control (DAC)-ийн дутагдлыг засах зорилгоор заавал дагаж мөрдөх болон дүрд суурилсан хандалтын загварт суурилсан дүрэм, хандалтын механизмуудын багц юм. Энэхүү төсөл нь АНУ-ын Үндэсний Аюулгүй Байдлын Агентлагийн гүнээс үүссэн бөгөөд голчлон Secure Computing Corporation болон MITER зэрэг гүйцэтгэгчид, мөн хэд хэдэн судалгааны лабораториуд шууд боловсруулсан.

Линукс хамгаалалтын системүүд
Линуксийн аюулгүй байдлын модулиуд

Линус Торвалдс NSA-ийн шинэ хөгжүүлэлтийн талаар хэд хэдэн тайлбар хийсэн бөгөөд ингэснээр тэдгээрийг Линуксийн үндсэн цөмд оруулах боломжтой болсон. Тэрээр объектуудтай хийх үйлдлийг хянах олон тооны интерцепторууд болон холбогдох шинж чанаруудыг хадгалах цөмийн мэдээллийн бүтцэд тодорхой хамгаалалтын талбарууд бүхий ерөнхий орчныг тодорхойлсон. Дараа нь энэ орчныг ачаалах боломжтой цөмийн модулиуд ашиглан хүссэн аюулгүй байдлын загвараа хэрэгжүүлэх боломжтой. LSM нь 2.6 онд Линуксийн цөмийн v2003 хувилбарт бүрэн нэвтэрсэн.

LSM хүрээ нь өгөгдлийн бүтэц дэх хамгаалалтын талбаруудыг багтаасан бөгөөд цөмийн кодын чухал цэгүүд дэх таслан зогсоох функцуудыг удирдах, хандалтын хяналтыг гүйцэтгэхийн тулд дууддаг. Энэ нь мөн хамгаалалтын модулиудыг бүртгэх функцийг нэмдэг. /sys/kernel/security/lsm интерфейс нь систем дээрх идэвхтэй модулиудын жагсаалтыг агуулдаг. LSM дэгээ нь CONFIG_LSM-д заасан дарааллаар дуудагдсан жагсаалтад хадгалагддаг. Дэгээтэй холбоотой нарийвчилсан баримт бичгийг толгой файлд багтаасан болно/linux/lsm_hooks.h.

LSM дэд систем нь тогтвортой Linux цөмийн v2.6 хувилбартай SELinux-ийг бүрэн нэгтгэх боломжийг олгосон. Бараг л тэр даруй SELinux нь Линуксийн аюулгүй орчны де факто стандарт болж, RedHat Enterprise Linux, Fedora, Debian, Ubuntu зэрэг хамгийн алдартай түгээлтүүдэд багтсан.

SELinux толь бичиг

  • Тодорхойлолт — SELinux хэрэглэгч нь ердийн Unix/Linux хэрэглэгчийн id-тэй адилгүй; тэдгээр нь нэг систем дээр зэрэгцэн оршиж болох ч мөн чанартаа огт өөр юм. Стандарт Линукс бүртгэл бүр SELinux-д нэг буюу хэд хэдэн данстай тохирч болно. SELinux таних тэмдэг нь аюулгүй байдлын ерөнхий контекстийн нэг хэсэг бөгөөд энэ нь таныг аль домэйнд нэгдэж болох, болохгүйг тодорхойлдог.
  • Домэйн - SELinux-д домэйн нь субьектийн гүйцэтгэлийн контекст, өөрөөр хэлбэл процесс юм. Домэйн нь процессын хандалтыг шууд тодорхойлдог. Домэйн гэдэг нь үндсэндээ ямар процессууд хийж болох эсвэл процесс нь өөр өөр төрлүүдтэй юу хийж болох жагсаалт юм. Домэйнуудын зарим жишээ нь системийн удирдлагад зориулагдсан sysadm_t ба user_t нь ердийн эрхгүй хэрэглэгчийн домэйн юм. Init систем нь init_t домэйнд, нэрлэсэн процесс нь named_t домэйнд ажилладаг.
  • Үүрэг — Домэйн болон SELinux хэрэглэгчдийн хооронд зуучлагчийн үүрэг гүйцэтгэдэг. Хэрэглэгч ямар домэйнд харьяалагдаж болох, ямар төрлийн объектуудад хандах боломжтойг үүрэг гүйцэтгэдэг. Энэхүү хандалтын хяналтын механизм нь давуу эрх нэмэгдүүлэх халдлагын аюулаас сэргийлдэг. SELinux-д ашигладаг дүрд суурилсан хандалтын хяналтын (RBAC) аюулгүй байдлын загварт дүрүүдийг бичсэн болно.
  • Төрөл — Объектод оноож, түүнд хэн хандах боломжтойг тодорхойлдог Type Enforcement жагсаалтын атрибут. Домэйн тодорхойлолттой адил бөгөөд домэйн нь процесст хамаарах ба төрөл нь лавлах, файл, залгуур гэх мэт объектуудад хамаарна.
  • Субъект ба объектууд - Процессууд нь субьектууд бөгөөд тодорхой контекст эсвэл аюулгүй байдлын домайн дээр ажилладаг. Үйлдлийн системийн нөөцүүд: файлууд, лавлахууд, залгуурууд гэх мэт нь тодорхой төрлийн, өөрөөр хэлбэл нууцлалын түвшингээр хуваарилагдсан объектууд юм.
  • SELinux-ийн бодлого — SELinux нь системийг хамгаалахын тулд олон төрлийн бодлогыг ашигладаг. SELinux-ийн бодлого нь хэрэглэгчдийн үүрэг, домэйны үүрэг, домэйн төрөлд хандах хандалтыг тодорхойлдог. Нэгдүгээрт, хэрэглэгч үүрэг авах эрхтэй, дараа нь үүрэг нь домэйнд хандах эрхтэй. Эцэст нь, домэйн нь зөвхөн тодорхой төрлийн объектод хандах боломжтой.

LSM болон SELinux архитектур

Нэрийг нь үл харгалзан LSM нь ихэвчлэн ачаалах боломжтой Линуксийн модулиуд биш юм. Гэхдээ SELinux-ийн нэгэн адил цөмд шууд нэгтгэгддэг. LSM эх кодыг өөрчлөхөд шинэ цөмийн эмхэтгэл шаардлагатай. Цөмийн тохиргоонд тохирох сонголтыг идэвхжүүлсэн байх ёстой, эс тэгвээс ачаалсны дараа LSM код идэвхжихгүй. Гэхдээ энэ тохиолдолд ч гэсэн үүнийг OS ачаалагчийн сонголтоор идэвхжүүлж болно.

Линукс хамгаалалтын системүүд
LSM шалгах стек

LSM нь үндсэн цөмийн функцүүдийн дэгээгээр тоноглогдсон бөгөөд энэ нь шалгалт хийхэд тохиромжтой. LSM-ийн гол онцлогуудын нэг нь тэдгээрийг давхарласан байдаг. Тиймээс стандарт шалгалтууд хийгдэж байгаа бөгөөд LSM-ийн давхарга бүр зөвхөн нэмэлт хяналт, хяналтыг нэмдэг. Энэ нь хоригийг буцаах боломжгүй гэсэн үг юм. Үүнийг зурагт үзүүлэв; хэрэв байнгын DAC шалгалтын үр дүн бүтэлгүйтсэн бол асуудал LSM дэгээнд ч хүрэхгүй.

SELinux нь Fluke судалгааны үйлдлийн системийн Flask хамгаалалтын архитектур, ялангуяа хамгийн бага давуу эрхийн зарчмыг ашигладаг. Энэхүү үзэл баримтлалын мөн чанар нь нэрнээс нь харахад хэрэглэгчдэд зөвхөн төлөвлөсөн үйлдлийг гүйцэтгэхэд шаардлагатай эрхийг олгох эсвэл боловсруулах явдал юм. Энэ зарчмыг албадан нэвтрэх аргыг ашиглан хэрэгжүүлдэг тул SELinux дахь хандалтын хяналт нь => төрлийн домайн загвар дээр суурилдаг.

Албадан нэвтрэхийн ачаар SELinux нь Unix/Linux үйлдлийн системд ашигладаг уламжлалт DAC загвараас хамаагүй илүү хандалтыг хянах чадвартай. Жишээлбэл, та ftp серверийн холбогдох сүлжээний портын дугаарыг хязгаарлаж, тодорхой хавтсанд файл бичих, өөрчлөхийг зөвшөөрөх боловч устгахгүй байх боломжтой.

SELinux-ийн үндсэн бүрэлдэхүүн хэсгүүд нь:

  • Бодлогын хэрэгжилтийн сервер — Хандалтын хяналтыг зохион байгуулах үндсэн механизм.
  • Системийн аюулгүй байдлын бодлогын мэдээллийн сан.
  • LSM үйл явдлыг таслан зогсоох төхөөрөмжтэй харилцах.
  • Selinuxfs - Pseudo-FS нь /proc-тэй адилхан бөгөөд /sys/fs/selinux-д суурилагдсан. Ажиллах үед Linux цөмөөр динамикаар дүүргэгдсэн бөгөөд SELinux төлөвийн мэдээллийг агуулсан файлуудыг агуулна.
  • Вектор кэш рүү нэвтрэх — Бүтээмжийг нэмэгдүүлэх туслах механизм.

Линукс хамгаалалтын системүүд
SELinux хэрхэн ажилладаг

Энэ бүхэн иймэрхүү байдлаар ажилладаг.

  1. SELinux хэлээр тодорхой субьект нь дээд зурагт үзүүлсэн шиг DAC шалгалтын дараа объект дээр зөвшөөрөгдсөн үйлдлийг гүйцэтгэдэг. Үйлдлийг гүйцэтгэх хүсэлт нь LSM үйл явдал таслагч руу очдог.
  2. Тэндээс хүсэлтийг субьект болон объектын аюулгүй байдлын контекстийн хамт LSM-тэй харилцах үүрэгтэй SELinux Abstraction and Hook Logic модуль руу дамжуулдаг.
  3. Субъектийн объект руу нэвтрэх талаар шийдвэр гаргах эрх мэдэл нь Бодлогын хэрэгжилтийн сервер бөгөөд SELinux AnHL-ээс мэдээлэл хүлээн авдаг.
  4. Хандалт хийх эсвэл татгалзах талаар шийдвэр гаргахын тулд Бодлогын хэрэгжилтийн сервер нь хамгийн их хэрэглэгддэг дүрмийн хувьд Access Vector Cache (AVC) кэшлэх дэд систем рүү шилждэг.
  5. Хэрэв тохирох дүрмийн шийдэл кэшээс олдоогүй бол хүсэлтийг аюулгүй байдлын бодлогын мэдээллийн санд шилжүүлнэ.
  6. Өгөгдлийн сан болон AVC-ийн хайлтын үр дүнг Бодлогын хэрэгжилтийн сервер рүү буцаана.
  7. Хэрэв олсон бодлого нь хүссэн үйлдэлтэй таарч байвал үйлдлийг зөвшөөрнө. Үгүй бол үйл ажиллагаа явуулахыг хориглоно.

SELinux тохиргоог удирдах

SELinux нь гурван горимын аль нэгээр ажилладаг:

  • Хэрэгжүүлэх - Аюулгүй байдлын бодлогыг хатуу мөрдөх.
  • Зөвшөөрөгдсөн - Хязгаарлалтуудыг зөрчихийг зөвшөөрч, журналд холбогдох тэмдэглэлийг хийсэн болно.
  • Идэвхгүй - Аюулгүй байдлын бодлого хүчингүй байна.

Дараах командыг ашиглан SELinux ямар горимд байгааг харж болно.

[admin@server ~]$ getenforce
Permissive

Дахин ачаалахын өмнө горимыг өөрчлөх, тухайлбал түүнийг хэрэгжүүлэх гэж тохируулах, эсвэл 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 - ангилал.

Хандалтын тохиргоог өөрчилж байна

SELinux модулиудыг ачаалах, нэмэх, устгахын тулд semodule ашиглана уу.

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

Эхний баг семанаж нэвтрэх SELinux хэрэглэгчийг үйлдлийн системийн хэрэглэгчтэй холбож, хоёр дахь нь жагсаалтыг харуулна. Эцэст нь, -r шилжүүлэгчтэй сүүлчийн команд нь SELinux хэрэглэгчдийн үйлдлийн систем дэх дансны зураглалыг устгадаг. 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

Командын параметрүүд:

  • -өөрийн дүр зураглалын оруулга нэмэх;
  • -л тохирох хэрэглэгчид болон үүргүүдийн жагсаалт;
  • -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 модулиуд нь Boolean утгыг авах боломжтой параметртэй байдаг. Ийм параметрийн жагсаалтыг бүхэлд нь 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-вэб интерфэйс рүү нэвтрэх

Практик жишээг харцгаая: бид PostgreSQL мэдээллийн санг удирдахын тулд RHEL 7.6 дээр pgadmin4-web суулгасан. Бид бага зэрэг алхсан эрэл хайгуул pg_hba.conf, postgresql.conf болон config_local.py тохиргооны тусламжтайгаар фолдерын зөвшөөрлийг тохируулж, алга болсон Python модулиудыг pip-ээс суулгасан. Бүх зүйл бэлэн байна, бид хөөргөж, хүлээн авна 500 Дотоод серверийн алдаа.

Линукс хамгаалалтын системүүд

Бид /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.

Энэ үед ихэнх Линуксийн администраторууд setencorce 0-г ажиллуулах хүсэл эрмэлзэлтэй байх бөгөөд энэ нь төгсгөл болно. Үнэнийг хэлэхэд, би анх удаа үүнийг хийсэн. Энэ нь мэдээжийн хэрэг гарах гарц боловч хамгийн сайнаас хол байна.

Хэдий төвөгтэй дизайнтай ч SELinux нь хэрэглэгчдэд ээлтэй байж чаддаг. Асуудлыг арилгах багцыг суулгаад системийн бүртгэлийг харна уу.

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

Үйлдлийн системд systemd байгаа хэдий ч аудитын үйлчилгээг systemctl-г ашиглахгүйгээр дахин эхлүүлэх ёстойг анхаарна уу. Системийн бүртгэлд зааж өгөх болно зөвхөн хаах баримтаас гадна шалтгаан болон хоригийг даван туулах арга зам.

Линукс хамгаалалтын системүүд

Бид эдгээр тушаалуудыг гүйцэтгэдэг:

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

Бид pgadmin4-веб хуудсанд хандах хандалтыг шалгадаг, бүх зүйл ажилладаг.

Линукс хамгаалалтын системүүд

Линукс хамгаалалтын системүүд

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх