Model distribusi kredensial hak dalam FreeBSD v.2.0

pengantar


Dalam publikasi ini, kita akan berbicara tentang model kredensial bsdextended, pada buku pegangan itu digambarkan sebagai firewall sistem file. Keuntungan dari pendekatan ini dibandingkan dengan yang saya jelaskan dalam panduan ini adalah kenyataan bahwa tidak masalah sistem file mana yang digunakan, karena pembatasan akan terjadi bukan oleh label pada file, tetapi oleh pengguna dan pengguna.

Latihan


Semua tindakan akan dilakukan di penjara , jadi Anda harus mengkonfigurasi penjara pada awalnya. Panduan ini ditulis dengan jail terinstal di direktori / jails / famp. Pertama-tama, instal modul yang diperlukan di "autorun", dan jalankan juga (tindakan ini harus dilakukan tidak di penjara) dan mengatur kemampuan untuk menggunakan port 80, 443 dari pengguna www tanpa hak root:

echo 'mac_portacl_load="YES"' >>/boot/loader.conf
echo 'mac_bsdextended_load="YES"' >> /boot/loader.conf

kldload mac_portacl.ko
kldload mac_bsdextended.ko

sysctl net.inet.ip.portrange.reservedlow=0 
sysctl net.inet.ip.portrange.reservedhigh=0
sysctl security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443

echo 'net.inet.ip.portrange.reservedlow=0' >> /etc/sysctl.conf 
echo 'net.inet.ip.portrange.reservedhigh=0' >> /etc/sysctl.conf
echo 'security.mac.portacl.rules=uid:80:tcp:80,uid:80:tcp:443' >> /etc/sysctl.conf


Selanjutnya, di penjara, Anda perlu menginstal dependensi untuk membangun apache dan php, serta menginstal port:

pkg install apr autoconf autoconf-wrapper automake ca_root_nss cmake curl db5 dialog4ports expat fontconfig freetype2 gdbm gettext-runtime gettext-tools giflib gmake gmp gperf help2man indexinfo jbigkit jpeg-turbo jsoncpp libarchive libargon2 libffi libgcrypt libgd libgpg-error libiconv liblz4 libnghttp2 libtextstyle libtool libuv libxml2 libxslt libzip lzo2 m4 meson nasm ninja oniguruma p5-Locale-gettext p5-Locale-libintl p5-Text-Unidecode p5-Unicode-EastAsianWidth pcre pcre2 perl5 pkgconf png py37-Babel py37-Jinja2 py37-MarkupSafe py37-alabaster py37-asn1crypto py37-certifi py37-cffi py37-chardet py37-cryptography py37-cython py37-docutils py37-idna py37-imagesize py37-openssl py37-pycparser py37-pygments py37-pysocks py37-pystemmer py37-pytz py37-requests py37-setuptools py37-six py37-snowballstemmer py37-sphinx py37-sphinx_rtd_theme py37-sphinxcontrib-websupport py37-urllib3 python37 re2c readline rhash sqlite3 texinfo tiff webp openssl wget

portsnap fetch extract

Majelis


Mari kita pergi ke direktori port apache, dalam direktori ini Anda perlu "mengkonfigurasi" port sehingga diinstal di direktori / famp:

mkdir /famp
cd /usr/ports/www/apache24
make config
make configure
cd work
cd httpd-2.4.43
./configure --prefix=/famp
cd ..//..
make BATCH=yes PREFIX=/famp install clean

Setelah manipulasi ini, apache akan diinstal di direktori / famp, php tidak dapat diinstal dengan cara ini, jadi kami akan menginstalnya dari kode sumber:

cd /
wget https://www.php.net/distributions/php-7.4.5.tar.xz
xz -d php-7.4.5.tar.xz
tar -xvf php-7.4.5.tar
cd php-7.4.5

Setelah manipulasi ini, Anda perlu membangun php yang menentukan jalur yang benar ke apxs:

./configure --prefix=/famp --with-apxs2=/famp/sbin/apxs --with-openssl --with-zlib --with-curl --enable-mbstring --with-zip --enable-mysqlnd --enable-maintainer-zts --with-mysqli

gmake install

Kustomisasi


Langkah selanjutnya adalah konfigurasi yang benar dari httpd.conf (serta sisa "config" yang diperlukan), menyalin direktori rc.d dan membuat direktori yang diperlukan:

mkdir /famp/log
mkdir /famp/run

cp -R /famp/etc/rc.d/ /usr/local/etc/rc.d
#   /usr/local/etc/rc.d/apache24    ,    pid` 
_pidprefix="/famp/run/httpd"

# httpd.conf   

Mutex default:/famp/run
PidFile "/famp/run/httpd.pid"
ErrorLog "/famp/log/httpd-error.log"
CustomLog "/famp/log/httpd-access.log

#httpd-ssl.conf (     )
SSLSessionCache        "shmcb:/famp/run/ssl_scache(512000)"
DocumentRoot "/famp/www/apache24/data"
ErrorLog "/famp/log/httpd-error.log"
TransferLog "/famp/log/httpd-access.log"
CustomLog "/famp/log/httpd-ssl_request.log"
<Directory "/famp/www/apache24/cgi-bin">

Agar semua proses apache dimulai dari bawah nama www, perlu untuk mengatur bit setuid pada file httpd, dan juga perlu mengatur pemiliknya secara rekursif ke direktori famp ke pengguna www dan menjalankan apache:

chown -R www:www /famp
chmod 4755 /famp/sbin/httpd

Setelah apache diluncurkan dan file log yang diperlukan dibuat, Anda dapat mengubah hak ke direktori dan file yang diperlukan, tetapi sebelum itu Anda perlu mengedit ldconfig. Utilitas ini bertanggung jawab atas jalur ke direktori dengan berbagai pustaka, setelah mengubah hak ke direktori / lib, / usr / lib, usr / local / lib, utilitas ldconfig akan menganggap direktori ini tidak sah, karena alasan ini utilitas ini harus dijalankan dalam mode yang tidak dilindungi. Untuk melihat jalur, Anda harus menjalankan perintah:

ldconfig -r

Untuk menjalankan ldconfig dalam mode yang tidak dilindungi, Anda harus menjalankan utilitas ini dengan tombol i:

ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE

Juga perlu menyalin file /usr/local/lib/libnghttp2.so.14 ke direktori / usr / lib (tidak jelas mengapa apache tidak melihatnya di direktori / usr / local / lib)

cp /usr/local/lib/libnghttp2.so.14 /usr/lib/libnghttp2.so.14

Ubah hak atas direktori dan file yang diperlukan agar apache berfungsi dengan benar:

#    jail
chflags noschg /jails/famp/lib/libcrypt.so.5
chflags noschg /jails/famp/lib/libc.so.7
chflags noschg /jails/famp/lib/libthr.so.3
chflags noschg /jails/famp/usr/lib/librt.so.1

#   jail
chown www:wheel /
chown -R www:www /famp
chown www:wheel /etc
chown www:wheel /tmp
chown -R www:wheel /dev
chown www:wheel /etc/passwd
chown www:wheel /etc/group
chown www:wheel /etc/pwd.db
chown www:wheel /lib
chown www:wheel /usr
chown www:wheel /usr/lib
chown www:wheel /usr/local
chown www:wheel /usr/local/lib
chown -R www:wheel /lib
chown -R www:wheel /usr/lib
chown -R www:wheel /usr/local/lib

sysrc apache24_enable="YES"
service apache24 start

Setelah manipulasi ini, apache akan memiliki akses ke semua file yang diperlukan untuk operasinya di lingkungan yang terisolasi, tetapi menurut saya itu tidak sepenuhnya benar bahwa semua file ini milik pengguna www, untuk alasan ini flag yang tidak dapat diubah dapat digunakan, flag ini tidak boleh disetel dan flag dari penjara, karena secara default penjara dimulai dengan hak terbatas:

chflags schg /jails/famp
chflags schg /jails/famp/etc
chflags schg /jails/famp/etc/passwd
chflags schg /jails/famp/etc/group
chflags schg /jails/famp/etc/pwd.db

chflags schg /jails/famp/lib
chflags schg /jails/famp/usr
chflags schg /jails/famp/usr/lib
chflags schg /jails/famp/usr/local
chflags schg /jails/famp/usr/local/lib

chflags -R schg /jails/famp/lib
chflags -R schg /jails/famp/usr/lib
chflags -R schg /jails/famp/usr/local/lib

chflags -R schg /jails/famp/famp
#       ,         
chflags -R noschg /jails/famp/famp/log
chflags -R noschg /jails/famp/famp/run
chflags -R noschg /jails/famp/famp/www/apache24/data/cache

# sunlink   ,   (    tmp, cache, log, run    ,     apache      ) 
chflags sunlink /jails/famp/dev
chflags sunlink /jails/famp/tmp
chflags sunlink /jails/famp/famp/www/apache24/data/cache
chflags -R sunlink /jails/famp/famp/log
chflags sunlink /jails/famp/famp/run

#  sappend     , ..   apache    ,      .
chflags -R sappend /jails/famp/famp/log

Sentuhan kedua dari belakang akan menjadi pembuatan file yang dapat dieksekusi untuk mengatur hak yang diperlukan dan memulai apache, serta memulai ldconfig dalam mode yang tidak dilindungi (dieksekusi di penjara):

touch /etc/rc.d/0
chmod +x /etc/rc.d/0
#      
ldconfig -iR /lib /usr/lib /usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg /usr/local/lib/perl5/5.30/mach/CORE
#    /dev          sysctl   pid`   ssl
chown -R www:wheel /dev
service apache24 start

Akhirnya, sentuhan terakhir akan mengatur parameter untuk bsdextended, Anda juga perlu membuat file yang dapat dieksekusi sehingga pembatasan ini berfungsi setiap kali sistem boot (tidak di penjara):

touch /etc/rc.d/0
chmod +x /etc/rc.d/0
#    
ugidfw set 2 subject uid www object ! uid www mode n
#      
ugidfw set 2 subject uid www object ! uid www mode n

Opsi ini akan mencegah pengguna www dari mengakses file dan direktori yang tidak dimiliki oleh pengguna www.

Kesimpulan


Seperti yang dapat dilihat dari publikasi ini, metode seperti itu untuk membatasi proses akan mengarah pada tingkat keamanan yang tinggi untuk server web (serta tumpukan lainnya yang menerapkan metode ini).

Daftar sumber yang banyak membantu saya dalam menulis publikasi ini.
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-bsdextended.html
www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac-portacl.html

All Articles