Hyrje
Për të siguruar një nivel shtesë sigurie të serverit, mund të përdorni e shpërndarjes së qasjes. Në këtë publikim do të përshkruhet se si mund të lanconi apache në jail me qasje vetëm në ato komponime që janë të nevojshme për punën e duhur të apache dhe php. Sipas këtij principi mund të kufizoni jo vetëm apache, por gjithashtu çdo stak tjetër.
Përgatitja
Ky metod do t'i përshtatet vetëm sistemit të skedarëve ufs, në këtë shembull në sistemin kryesor do të përdoret zfs, dhe në jail përkatësisht ufs. E para që duhet të bëni është të rindërtoni bërthamën, gjatë instalimit të FreeBSD instaloni burimin e kodit.
Pasi që sistemi të jetë instaluar, redaktoni skedarin:
/usr/src/sys/amd64/conf/GENERIC
Në këtë skedar duhet të shtoni vetëm një rresht:
options MAC_MLS
Shenja mls/high do të ketë një status dominues mbi shenjën mls/low, aplikacionet që do të lancohen me shenjën mls/low nuk do të mund të aksesojnë skedarët që kanë shenjën mls/high. Më shumë rreth të gjitha etiketimeve të disponueshme në sistemin FreeBSD mund të lexoni në këtë .
Më pas kaloni në katalogun /usr/src:
cd /usr/src
Për të nisur ndërtimin e bërthamës ekzekutoni (në çelësin j tregoni numrin e bërthamave në sistem):
make -j 4 buildkernel KERNCONF=GENERIC
Pasi që bërthama të jetë ndërtuar, duhet ta instaloni:
make installkernel KERNCONF=GENERIC
Pasi të instalohet bërthama, mos u nxito të rinisni sistemin, sepse është e nevojshme të kaloni përdoruesit në klasën e login, duke e konfigurua paraprakisht atë. Redaktoni skedarin /etc/login.conf, në këtë skedar duhet të redaktoni klasën e login default, duke e sjellë në formën:
default:
:passwd_format=sha512:
:copyright=/etc/COPYRIGHT:
:welcome=/etc/motd:
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K:
:path=/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin ~/bin:
:nologin=/var/run/nologin:
:cputime=unlimited:
:datasize=unlimited:
:stacksize=unlimited:
:memorylocked=64K:
:memoryuse=unlimited:
:filesize=unlimited:
:coredumpsize=unlimited:
:openfiles=unlimited:
:maxproc=unlimited:
:sbsize=unlimited:
:vmemoryuse=unlimited:
:swapuse=unlimited:
:pseudoterminals=unlimited:
:kqueues=unlimited:
:umtxp=unlimited:
:priority=0:
:ignoretime@:
:umask=022:
:label=mls/equal:
Rreshti :label=mls/equal do t'i japë mundësinë përdoruesve që janë në këtë klasë të kenë qasje në skedarët që janë të shënuara me çdo etiketë (mls/low, mls/high). Pas këtyre manovrave, është e nevojshme të rinndërtohet baza e të dhënave dhe të vendosni përdoruesin root (si dhe ata që e kanë nevojshme) në këtë klasë login:
cap_mkdb /etc/login.conf
pw usermod root -L default
Për të bërë që politika të ndikohet vetëm në skedarë, duhet të redaktoni skedarin /etc/mac.conf, duke lënë vetëm një rresht:
default_labels file ?mls
Gjithashtu, është e nevojshme të shtoni modulon mac_mls.ko në fillimin automatik:
echo 'mac_mls_load="YES"' >> /boot/loader.conf
Pas kësaj, mund të rinisni sistemin pa asnjë problem. Si të krijoni mund të lexoni në një nga publikimet e mia. Por para se të krijoni jail, duhet të shtoni një disk të ngurtë dhe të krijoni një sistem skedarësh mbi të dhe të aktivizoni multilabel, krijoni një sistem skedarësh ufs2 me madhësi klasteri 64kb:
newfs -O 2 -b 64kb /dev/ada1
tunefs -l enable /dev/ada1
Pas krijimit të sistemit të skedarëve dhe shtimit të multilabel, duhet të shtoni diskun e ngurtë në /etc/fstab, shtoni rreshtin në këtë skedar:
/dev/ada1 /jail ufs rw 0 1
Në Mountpoint përcaktoni katalogun ku do të montoni diskun e ngurtë, në Pass sigurohuni të vendosni 1 (në cilin rend do të bëhet kontrolli i këtij disku) — kjo është e nevojshme, pasi sistemi i skedarëve ufs është i ndjeshëm ndaj ndërprerjeve të papritura të energjisë. Pas këtyre veprimeve, montoni diskun:
mount /dev/ada1 /jail
Në këtë katalog instaloni jail. Pas aktivizimit të jail, duhet të bëni të njëjtat manipulime që bëni në sistemin kryesor me përdoruesit dhe skedarët /etc/login.conf, /etc/mac.conf.
Configuration
Para se të vendosni etiketat e nevojshme, rekomandoj të instaloni të gjithë paketat e nevojshme, në rastin tim etiketat do të vendosen duke marrë parasysh këto paketa:
mod_php73-7.3.4_1 Gjuha e Skriptimit PHP
php73-7.3.4_1 Gjuha e Skriptimit PHP
php73-ctype-7.3.4_1 Zgjatja e ndarë ctype për php
php73-curl-7.3.4_1 Zgjatja e ndarë curl për php
php73-dom-7.3.4_1 Zgjatja e ndarë dom për php
php73-extensions-1.0 "meta-port" për të instaluar zgjatje PHP
php73-filter-7.3.4_1 Zgjatja e ndarë filter për php
php73-gd-7.3.4_1 Zgjatja e ndarë gd për php
php73-gettext-7.3.4_1 Zgjatja e ndarë gettext për php
php73-hash-7.3.4_1 Zgjatja e ndarë hash për php
php73-iconv-7.3.4_1 Zgjatja e ndarë iconv për php
php73-json-7.3.4_1 Zgjatja e ndarë json për php
php73-mysqli-7.3.4_1 Zgjatja e ndarë mysqli për php
php73-opcache-7.3.4_1 Zgjatja e ndarë opcache për php
php73-openssl-7.3.4_1 Zgjatja e ndarë openssl për php
php73-pdo-7.3.4_1 Zgjatja e ndarë pdo për php
php73-pdo_sqlite-7.3.4_1 Zgjatja e ndarë pdo_sqlite për php
php73-phar-7.3.4_1 Zgjatja e ndarë phar për php
php73-posix-7.3.4_1 Zgjatja e ndarë posix për php
php73-session-7.3.4_1 Zgjatja e ndarë session për php
php73-simplexml-7.3.4_1 Zgjatja e ndarë simplexml për php
php73-sqlite3-7.3.4_1 Zgjatja e ndarë sqlite3 për php
php73-tokenizer-7.3.4_1 Zgjatja e ndarë tokenizer për php
php73-xml-7.3.4_1 Zgjatja e ndarë xml për php
php73-xmlreader-7.3.4_1 Zgjatja e ndarë xmlreader për php
php73-xmlrpc-7.3.4_1 Zgjatja e ndarë xmlrpc për php
php73-xmlwriter-7.3.4_1 Zgjatja e ndarë xmlwriter për php
php73-xsl-7.3.4_1 Zgjatja e ndarë xsl për php
php73-zip-7.3.4_1 Zgjatja e ndarë zip për php
php73-zlib-7.3.4_1 Zgjatja e ndarë zlib për php
apache24-2.4.39
Në këtë shembull, etiketat do të vendosen duke marrë parasysh varësitë e këtyre pakove. Sigurisht, mund të procedohet më thjesht, për dosjen /usr/local/lib dhe dosjet që ndodhen në këtë katalog, të vendosen etiketat mls/low dhe paketat e mëpasshme (p.sh. zgjatje shtesë për php) do të kenë qasje në bibliotekat në këtë katalog, por më duket më mirë të ofrojmë qasje vetëm në ato dosje që janë të nevojshme. Ndaloje jail dhe vendos etiketat mls/high për të gjitha dosjet:
setfmac -R mls/high /jail
Kur vendosen etiketat, procesi do të ndalohet nëse setfmac haset me lidhje të forta, në shembullin tim unë hiqja lidhjet e forta në këto katalogë:
/var/db/etcupdate/current/
/var/db/etcupdate/current/etc
/var/db/etcupdate/current/usr/share/openssl/man/en.ISO8859-15
/var/db/etcupdate/current/usr/share/man/en.ISO8859-15
/var/db/etcupdate/current/usr/share/man/en.UTF-8
/var/db/etcupdate/current/usr/share/nls
/etc/ssl
/usr/local/etc
/usr/local/etc/fonts/conf.d
/usr/local/openssl
Pas vendosjes së etiketave, është e nevojshme të vendosen etiketat mls/low për apache, së pari duhet të zbulohet se cilat dosje janë të nevojshme për të nisur apache:
ldd /usr/local/sbin/httpd
Pas kryerjes së kësaj komande, do të shfaqen varësitë në ekran, por vetëm të vendosni etiketat e nevojshme për këto skedarë nuk do të mjaftojë, pasi katalogët ku ndodhen këto skedarë kanë etiketën mls/high, prandaj është gjithashtu e nevojshme të vendoset etiketë mls/low për këta katalogë. Kur të nisni apache, gjithashtu do të shihni skedarët e nevojshëm për nisjen e tij, dhe për php, këto varësi mund të merren në log-un httpd-error.log.
setfmac mls/low /
setfmac mls/low /usr/local/lib/libpcre.so.1
setfmac mls/low /usr/local/lib/libaprutil-1.so.0
setfmac mls/low /usr/local/lib/libdb-5.3.so.0
setfmac mls/low /usr/local/lib/libgdbm.so.6
setfmac mls/low /usr/local/lib/libexpat.so.1
setfmac mls/low /usr/local/lib/libapr-1.so.0
setfmac mls/low /lib/libcrypt.so.5
setfmac mls/low /lib/libthr.so.3
setfmac mls/low /lib/libc.so.7
setfmac mls/low /usr/local/lib/libintl.so.8
setfmac mls/low /var
setfmac mls/low /var/run
setfmac mls/low /var/log
setfmac mls/low /var/log/httpd-access.log
setfmac mls/low /var/log/httpd-error.log
setfmac mls/low /var/run/httpd.pid
setfmac mls/low /lib
setfmac mls/low /lib/libcrypt.so.5
setfmac mls/low /usr/local/lib/db5/libdb-5.3.so.0
setfmac mls/low /usr/local/lib/db5/libdb-5.3.so.0.0.0
setfmac mls/low /usr/local/lib/db5
setfmac mls/low /usr/local/lib
setfmac mls/low /libexec
setfmac mls/low /libexec/ld-elf.so.1
setfmac mls/low /dev
setfmac mls/low /dev/random
setfmac mls/low /usr/local/libexec
setfmac mls/low /usr/local/libexec/apache24
setfmac mls/low /usr/local/libexec/apache24/*
setfmac mls/low /etc/pwd.db
setfmac mls/low /etc/passwd
setfmac mls/low /etc/group
setfmac mls/low /etc/
setfmac mls/low /usr/local/etc
setfmac -R mls/low /usr/local/etc/apache24
setfmac mls/low /usr
setfmac mls/low /usr/local
setfmac mls/low /usr/local/sbin
setfmac mls/low /usr/local/sbin/*
setfmac -R mls/low /usr/local/etc/rc.d/
setfmac mls/low /usr/local/sbin/htcacheclean
setfmac mls/low /var/log/httpd-access.log
setfmac mls/low /var/log/httpd-error.log
setfmac -R mls/low /usr/local/www
setfmac mls/low /usr/lib
setfmac mls/low /tmp
setfmac -R mls/low /usr/local/lib/php
setfmac -R mls/low /usr/local/etc/php
setfmac mls/low /usr/local/etc/php.conf
setfmac mls/low /lib/libelf.so.2
setfmac mls/low /lib/libm.so.5
setfmac mls/low /usr/local/lib/libxml2.so.2
setfmac mls/low /lib/libz.so.6
setfmac mls/low /usr/lib/liblzma.so.5
setfmac mls/low /usr/local/lib/libiconv.so.2
setfmac mls/low /usr/lib/librt.so.1
setfmac mls/low /lib/libthr.so.3
setfmac mls/low /usr/local/lib/libpng16.so.16
setfmac mls/low /usr/lib/libbz2.so.4
setfmac mls/low /usr/local/lib/libargon2.so.0
setfmac mls/low /usr/local/lib/libpcre2-8.so.0
setfmac mls/low /usr/local/lib/libsqlite3.so.0
setfmac mls/low /usr/local/lib/libgd.so.6
setfmac mls/low /usr/local/lib/libjpeg.so.8
setfmac mls/low /usr/local/lib/libfreetype.so
setfmac mls/low /usr/local/lib/libfontconfig.so.1
setfmac mls/low /usr/local/lib/libtiff.so.5
setfmac mls/low /usr/local/lib/libwebp.so.7
setfmac mls/low /usr/local/lib/libjbig.so.2
setfmac mls/low /usr/lib/libssl.so.8
setfmac mls/low /lib/libcrypto.so.8
setfmac mls/low /usr/local/lib/libzip.so.5
setfmac mls/low /etc/resolv.conf
Në këtë listë vendosen etiketat mls/low për të gjitha skedarët që janë të nevojshëm për funksionimin e saktë të lidhjes apache dhe php (për paketat që janë instaluar në shembullin tim).
Hapi i fundit do të jetë konfigurimi i nisjes së jail në nivelin mls/equal, dhe apache në nivelin mls/low. Për të nisur jail duhet të bëni ndryshime në skriptin /etc/rc.d/jail, gjeni në këtë skript funksionin jail_start, dhe ruani variablem command në formën:
command="setpmac mls/equal $jail_program"
Komanda setpmac nis skedarin ekzekutiv në nivelin e nevojshëm të mandatit, në këtë rast mls/equal, për të pasur qasje në të gjitha etiketat. Të nevojshme është të redaktoni skriptin e nisjes në /usr/local/etc/rc.d/apache24. Bëni ndryshime në funksionin apache24_prestart:
apache24_prestart() {
apache24_checkfib
apache24_precmd
eval "setpmac mls/low" ${command} ${apache24_flags}
}
Në në udhëzimin është dhënë një shembull tjetër, por nuk arrita ta përdor këtë pasi pemë e ndihmës për ta përdorur komandën setpmac vazhdimisht dilte një mesazh që nuk ishte e mundur.
Përfundimi
Ky mënyrë ndarjeje të aksesit do të shtojë një shtresë shtesë mbrojtjeje për apache (në të vërtetë ky mënyrë do të përmbushte çdo stak tjetër), që gjithashtu nis në jail, kurse për administratorin gjithçka do të ndodhë transparencë dhe pa bërë vërejtje.
Lista e burimeve që më ndihmuan në shkrimin e këtij publikimi:
Burimi: habr.com
