Тема: Apache в chroot

Индеец в резервации или apache в chroot

Преамбула
Появилась необходимость создать, насколько это возможно, защищенный хостинг. Но в то же время не ущемлять пользователя, какими либо ограничениями, такими как safe mode или разные владельцы на файлы созданные апачей и закаченные по ftp.

Версии
Все тестировалось на FreeBSD 5-6 (в jail'е и без него)
apache 1.3.37
mod_ssl 2.8.28
php 5.2.1
php5-extensions

[listo]
[li]Подгатовка пользователя

Создаем пользователя apache (предполагается, что таких пользователей будет потом много, клиентам шелл может понадобится) от которого будет работать вся сборка. Назначаем пользователю стандартную домашнюю директорию /home/apache. Домашняя директория пользователя будет корнем песочницы. Поскольку это у нас пользователь для апачи то шелла ему не даем. [/li]
[li]Помещение апачи в песочницу

Для того чтобы апача нормально работал нужно создать среду окружения. Самая неприятная часть wink Нужно скопирывать все неоходимые файлы и создать нужные директории.
[mono]./apache
|-- bin
|   |-- cat
|   |-- chmod
|   |-- cp
|   |-- csh
|   |-- date
|   |-- echo
|   |-- expr
|   |-- link
|   |-- ln
|   |-- ls
|   |-- mkdir
|   |-- mv
|   |-- ps
|   |-- pwd
|   |-- rm
|   |-- rmdir
|   |-- sh
|   |-- su
|   `-- tcsh
|-- dev
|   |-- null
|   |-- random
|   |-- urandom -> random
|   `-- zero
|-- etc
|   |-- db_gen.sh
|   |-- group
|   |-- hosts
|   |-- manpath.config
|   |-- master.passwd
|   |-- resolv.conf
|   |-- motd
|   |-- passwd
|   |-- pwd.db
|   |-- spwd.db
|   `-- termcap
|-- lib
|   |-- libc.so.6
|   |-- libcrypt.so.3
|   |-- libcrypto.so.4
|   |-- libedit.so.5
|   |-- libipsec.so.2
|   |-- libkvm.so.3
|   |-- libm.so.4
|   |-- libmd.so.3
|   |-- libncurses.so.6
|   |-- libutil.so.5
|   `-- libz.so.3
|-- libexec
|   `-- ld-elf.so.1
|-- sbin
|   |-- ldconfig
|   `-- ping
|-- tmp
|   `-- session
|-- usr
|   |-- X11R6
|   |   `-- lib
|   |       |-- libICE.so.6
|   |       |-- libSM.so.6
|   |       |-- libX11.so.6
|   |       |-- libXext.so.6
|   |       `-- libXpm.so.4
|   |-- bin
|   |   |-- awk
|   |   |-- bzip2
|   |   |-- cc
|   |   |-- diff
|   |   |-- ee
|   |   |-- fetch
|   |   |-- find
|   |   |-- gcc
|   |   |-- grep
|   |   |-- groups
|   |   |-- gunzip
|   |   |-- gzip
|   |   |-- id
|   |   |-- ldd
|   |   |-- less
|   |   |-- limits
|   |   |-- man
|   |   |-- more
|   |   |-- nawk
|   |   |-- openssl
|   |   |-- patch
|   |   |-- perl
|   |   |-- sed
|   |   |-- sort
|   |   |-- ssh
|   |   |-- tail
|   |   |-- tar
|   |   |-- tr
|   |   |-- uname
|   |   `-- vi
|   |-- include
|   |   `-- stdio.h
|   |-- lib
|   |   |-- compat
|   |   |-- libarchive.so.2
|   |   |-- libasn1.so.8
|   |   |-- libbsm.so.1
|   |   |-- libbz2.so.2
|   |   |-- libcom_err.so.3
|   |   |-- libfetch.so.4
|   |   |-- libgnuregex.so.3
|   |   |-- libgssapi.so.8
|   |   |-- libkrb5.so.8
|   |   |-- libpam.so.3
|   |   |-- libroken.so.8
|   |   |-- libssh.so.3
|   |   |-- libssl.so.4
|   |   |-- libstdc++.so.5
|   |   `-- libwrap.so.4
|   |-- libdata
|   |-- libexec
|   |   `-- ld-elf.so.1
|   |-- local
|   |   |-- bin
|   |   |   |-- checkgid
|   |   |   |-- dbmmanage
|   |   |   |-- htdigest
|   |   |   |-- htpasswd
|   |   |   |-- perl
|   |   |   |-- unrar
|   |   |   `-- unzip
|   |   |-- etc
|   |   |   |-- apache
|   |   |   |   |-- access.conf
|   |   |   |   |-- access.conf-dist
|   |   |   |   |-- httpd.conf
|   |   |   |   |-- httpd.conf-dist
|   |   |   |   |-- magic
|   |   |   |   |-- magic-dist
|   |   |   |   |-- mime.types
|   |   |   |   |-- mime.types-dist
|   |   |   |   |-- srm.conf
|   |   |   |   |-- srm.conf-dist
|   |   |   |   |-- ssl.crl
|   |   |   |   |   |-- Makefile
|   |   |   |   |   `-- README.CRL
|   |   |   |   |-- ssl.crt
|   |   |   |   |   |-- 0cf14d7d.0 -> snakeoil-ca-dsa.crt
|   |   |   |   |   |-- 5d8360e1.0 -> snakeoil-dsa.crt
|   |   |   |   |   |-- 82ab5372.0 -> server.crt
|   |   |   |   |   |-- 82ab5372.1 -> snakeoil-rsa.crt
|   |   |   |   |   |-- Makefile
|   |   |   |   |   |-- README.CRT
|   |   |   |   |   |-- ca-bundle.crt
|   |   |   |   |   |-- e52d41d0.0 -> snakeoil-ca-rsa.crt
|   |   |   |   |   |-- server.crt
|   |   |   |   |   |-- snakeoil-ca-dsa.crt
|   |   |   |   |   |-- snakeoil-ca-rsa.crt
|   |   |   |   |   |-- snakeoil-dsa.crt
|   |   |   |   |   `-- snakeoil-rsa.crt
|   |   |   |   |-- ssl.csr
|   |   |   |   |   |-- README.CSR
|   |   |   |   |   `-- server.csr
|   |   |   |   |-- ssl.key
|   |   |   |   |   |-- README.KEY
|   |   |   |   |   |-- server.key
|   |   |   |   |   |-- snakeoil-ca-dsa.key
|   |   |   |   |   |-- snakeoil-ca-rsa.key
|   |   |   |   |   |-- snakeoil-dsa.key
|   |   |   |   |   `-- snakeoil-rsa.key
|   |   |   |   `-- ssl.prm
|   |   |   |       |-- README.PRM
|   |   |   |       |-- snakeoil-ca-dsa.prm
|   |   |   |       `-- snakeoil-dsa.prm
|   |   |   |-- php
|   |   |   |   `-- extensions.ini
|   |   |   |-- php.ini
|   |   |   |-- php.ini-dist
|   |   |   `-- php.ini-recommended
|   |   |-- include
|   |   |   `-- apache
|   |   |       |-- ap.h
|   |   |       |-- ap_alloc.h
|   |   |       |-- ap_compat.h
|   |   |       |-- ap_config.h
|   |   |       |-- ap_config_auto.h
|   |   |       |-- ap_ctx.h
|   |   |       |-- ap_ctype.h
|   |   |       |-- ap_ebcdic.h
|   |   |       |-- ap_hook.h
|   |   |       |-- ap_md5.h
|   |   |       |-- ap_mm.h
|   |   |       |-- ap_mmn.h
|   |   |       |-- ap_sha1.h
|   |   |       |-- buff.h
|   |   |       |-- compat.h
|   |   |       |-- conf.h
|   |   |       |-- explain.h
|   |   |       |-- fnmatch.h
|   |   |       |-- hsregex.h
|   |   |       |-- http_conf_globals.h
|   |   |       |-- http_config.h
|   |   |       |-- http_core.h
|   |   |       |-- http_log.h
|   |   |       |-- http_main.h
|   |   |       |-- http_protocol.h
|   |   |       |-- http_request.h
|   |   |       |-- http_vhost.h
|   |   |       |-- httpd.h
|   |   |       |-- multithread.h
|   |   |       |-- os-inline.c
|   |   |       |-- os.h
|   |   |       |-- rfc1413.h
|   |   |       |-- scoreboard.h
|   |   |       |-- util_date.h
|   |   |       |-- util_md5.h
|   |   |       |-- util_script.h
|   |   |       |-- util_uri.h
|   |   |       `-- xml
|   |   |           |-- asciitab.h
|   |   |           |-- hashtable.h
|   |   |           |-- iasciitab.h
|   |   |           |-- latin1tab.h
|   |   |           |-- nametab.h
|   |   |           |-- utf8tab.h
|   |   |           |-- xmldef.h
|   |   |           |-- xmlparse.h
|   |   |           |-- xmlrole.h
|   |   |           |-- xmltok.h
|   |   |           `-- xmltok_impl.h
|   |   |-- lib
|   |   |   |-- libc-client4.so.8
|   |   |   |-- libexpat.so.6
|   |   |   |-- libfreetype.so.9
|   |   |   |-- libiconv.so.3
|   |   |   |-- libintl.so.8
|   |   |   |-- libjpeg.so.9
|   |   |   |-- libltdl.so.4
|   |   |   |-- libmcrypt.so.8
|   |   |   |-- libmm.so.14
|   |   |   |-- libpcre.so.0
|   |   |   |-- libpdf.so.8
|   |   |   |-- libpng.so.5
|   |   |   |-- libt1.so.5
|   |   |   |-- libxml2.so.5
|   |   |   |-- mysql
|   |   |   |   `-- libmysqlclient.so.15
|   |   |   |-- perl5
|   |   |   |   `-- 5.8.8
|   |   |   |       `-- mach
|   |   |   |           `-- CORE
|   |   |   |               `-- libperl.so
|   |   |   `-- php
|   |   |       |-- 20060613
|   |   |       |   |-- bcmath.so
|   |   |       |   |-- bz2.so
|   |   |       |   |-- calendar.so
|   |   |       |   |-- ctype.so
|   |   |       |   |-- dom.so
|   |   |       |   |-- filter.so
|   |   |       |   |-- ftp.so
|   |   |       |   |-- gd.so
|   |   |       |   |-- gettext.so
|   |   |       |   |-- hash.so
|   |   |       |   |-- iconv.so
|   |   |       |   |-- imap.so
|   |   |       |   |-- json.so
|   |   |       |   |-- mcrypt.so
|   |   |       |   |-- mysql.so
|   |   |       |   |-- openssl.so
|   |   |       |   |-- pcre.so
|   |   |       |   |-- pdf.so
|   |   |       |   |-- pdo.so
|   |   |       |   |-- pdo_sqlite.so
|   |   |       |   |-- posix.so
|   |   |       |   |-- session.so
|   |   |       |   |-- simplexml.so
|   |   |       |   |-- spl.so
|   |   |       |   |-- sqlite.so
|   |   |       |   |-- tokenizer.so
|   |   |       |   |-- xml.so
|   |   |       |   |-- xmlreader.so
|   |   |       |   |-- xmlwriter.so
|   |   |       |   |-- zip.so
|   |   |       |   `-- zlib.so
|   |   |       `-- build
|   |   |           |-- Makefile.global
|   |   |           |-- acinclude.m4
|   |   |           |-- config.guess
|   |   |           |-- config.sub
|   |   |           |-- libtool.m4
|   |   |           |-- ltmain.sh
|   |   |           |-- mkdep.awk
|   |   |           |-- phpize.m4
|   |   |           |-- run-tests.php
|   |   |           |-- scan_makefile_in.awk
|   |   |           `-- shtool
|   |   |-- libexec
|   |   |   `-- apache
|   |   |       |-- httpd.exp
|   |   |       |-- libphp5.so
|   |   |       |-- libproxy.so
|   |   |       |-- libssl.so
|   |   |       |-- mod_access.so
|   |   |       |-- mod_actions.so
|   |   |       |-- mod_alias.so
|   |   |       |-- mod_asis.so
|   |   |       |-- mod_auth.so
|   |   |       |-- mod_auth_anon.so
|   |   |       |-- mod_auth_db.so
|   |   |       |-- mod_autoindex.so
|   |   |       |-- mod_cern_meta.so
|   |   |       |-- mod_cgi.so
|   |   |       |-- mod_define.so
|   |   |       |-- mod_digest.so
|   |   |       |-- mod_dir.so
|   |   |       |-- mod_env.so
|   |   |       |-- mod_expires.so
|   |   |       |-- mod_headers.so
|   |   |       |-- mod_imap.so
|   |   |       |-- mod_include.so
|   |   |       |-- mod_info.so
|   |   |       |-- mod_log_config.so
|   |   |       |-- mod_log_forensic.so
|   |   |       |-- mod_mime.so
|   |   |       |-- mod_mime_magic.so
|   |   |       |-- mod_mmap_static.so
|   |   |       |-- mod_negotiation.so
|   |   |       |-- mod_rewrite.so
|   |   |       |-- mod_setenvif.so
|   |   |       |-- mod_speling.so
|   |   |       |-- mod_status.so
|   |   |       |-- mod_unique_id.so
|   |   |       |-- mod_userdir.so
|   |   |       |-- mod_usertrack.so
|   |   |       `-- mod_vhost_alias.so
|   |   |-- sbin
|   |   |   |-- ab
|   |   |   |-- apachectl
|   |   |   |-- apxs
|   |   |   |-- httpd
|   |   |   |-- logresolve
|   |   |   |-- rotatelogs
|   |   |   |-- sshd2
|   |   |   `-- suexec
|   |   |-- share
|   |   `-- www
|   |       |-- data
|   |       |   `-- 10.0.0.1
|   |       |       |-- http
|   |       |       |   `-- index.php
|   |       |       |-- log
|   |       |       |   |-- access.log
|   |       |       |   `-- error.log
|   |       |       `-- php
|   |       |           |-- php
|   |       |           `-- php.ini
|   |       |-- icons
|   |       |   |-- README
|   |       |   |-- a.gif
|   |       |   |-- a.png
|   |       |   |-- alert.black.gif
|   |       |   |-- alert.black.png
|   |       |   |-- alert.red.gif
|   |       |   |-- alert.red.png
|   |       |   |-- apache_pb.gif
|   |       |   |-- apache_pb.png
|   |       |   |-- back.gif
|   |       |   |-- back.png
|   |       |   |-- ball.gray.gif
|   |       |   |-- ball.gray.png
|   |       |   |-- ball.red.gif
|   |       |   |-- ball.red.png
|   |       |   |-- binary.gif
|   |       |   |-- binary.png
|   |       |   |-- binhex.gif
|   |       |   |-- binhex.png
|   |       |   |-- blank.gif
|   |       |   |-- blank.png
|   |       |   |-- bomb.gif
|   |       |   |-- bomb.png
|   |       |   |-- box1.gif
|   |       |   |-- box1.png
|   |       |   |-- box2.gif
|   |       |   |-- box2.png
|   |       |   |-- broken.gif
|   |       |   |-- broken.png
|   |       |   |-- burst.gif
|   |       |   |-- burst.png
|   |       |   |-- c.gif
|   |       |   |-- c.png
|   |       |   |-- comp.blue.gif
|   |       |   |-- comp.blue.png
|   |       |   |-- comp.gray.gif
|   |       |   |-- comp.gray.png
|   |       |   |-- compressed.gif
|   |       |   |-- compressed.png
|   |       |   |-- continued.gif
|   |       |   |-- continued.png
|   |       |   |-- dir.gif
|   |       |   |-- dir.png
|   |       |   |-- diskimg.gif
|   |       |   |-- diskimg.png
|   |       |   |-- down.gif
|   |       |   |-- down.png
|   |       |   |-- dvi.gif
|   |       |   |-- dvi.png
|   |       |   |-- f.gif
|   |       |   |-- f.png
|   |       |   |-- folder.gif
|   |       |   |-- folder.open.gif
|   |       |   |-- folder.open.png
|   |       |   |-- folder.png
|   |       |   |-- folder.sec.gif
|   |       |   |-- folder.sec.png
|   |       |   |-- forward.gif
|   |       |   |-- forward.png
|   |       |   |-- generic.gif
|   |       |   |-- generic.png
|   |       |   |-- generic.red.gif
|   |       |   |-- generic.red.png
|   |       |   |-- generic.sec.gif
|   |       |   |-- generic.sec.png
|   |       |   |-- hand.right.gif
|   |       |   |-- hand.right.png
|   |       |   |-- hand.up.gif
|   |       |   |-- hand.up.png
|   |       |   |-- icon.sheet.gif
|   |       |   |-- icon.sheet.png
|   |       |   |-- image1.gif
|   |       |   |-- image1.png
|   |       |   |-- image2.gif
|   |       |   |-- image2.png
|   |       |   |-- image3.gif
|   |       |   |-- image3.png
|   |       |   |-- index.gif
|   |       |   |-- index.png
|   |       |   |-- layout.gif
|   |       |   |-- layout.png
|   |       |   |-- left.gif
|   |       |   |-- left.png
|   |       |   |-- link.gif
|   |       |   |-- link.png
|   |       |   |-- movie.gif
|   |       |   |-- movie.png
|   |       |   |-- p.gif
|   |       |   |-- p.png
|   |       |   |-- patch.gif
|   |       |   |-- patch.png
|   |       |   |-- pdf.gif
|   |       |   |-- pdf.png
|   |       |   |-- pie0.gif
|   |       |   |-- pie0.png
|   |       |   |-- pie1.gif
|   |       |   |-- pie1.png
|   |       |   |-- pie2.gif
|   |       |   |-- pie2.png
|   |       |   |-- pie3.gif
|   |       |   |-- pie3.png
|   |       |   |-- pie4.gif
|   |       |   |-- pie4.png
|   |       |   |-- pie5.gif
|   |       |   |-- pie5.png
|   |       |   |-- pie6.gif
|   |       |   |-- pie6.png
|   |       |   |-- pie7.gif
|   |       |   |-- pie7.png
|   |       |   |-- pie8.gif
|   |       |   |-- pie8.png
|   |       |   |-- portal.gif
|   |       |   |-- portal.png
|   |       |   |-- ps.gif
|   |       |   |-- ps.png
|   |       |   |-- quill.gif
|   |       |   |-- quill.png
|   |       |   |-- right.gif
|   |       |   |-- right.png
|   |       |   |-- screw1.gif
|   |       |   |-- screw1.png
|   |       |   |-- screw2.gif
|   |       |   |-- screw2.png
|   |       |   |-- script.gif
|   |       |   |-- script.png
|   |       |   |-- small
|   |       |   |   |-- README.txt
|   |       |   |   |-- back.gif
|   |       |   |   |-- back.png
|   |       |   |   |-- binary.gif
|   |       |   |   |-- binary.png
|   |       |   |   |-- binhex.gif
|   |       |   |   |-- binhex.png
|   |       |   |   |-- blank.gif
|   |       |   |   |-- blank.png
|   |       |   |   |-- broken.gif
|   |       |   |   |-- broken.png
|   |       |   |   |-- burst.gif
|   |       |   |   |-- burst.png
|   |       |   |   |-- comp1.gif
|   |       |   |   |-- comp1.png
|   |       |   |   |-- comp2.gif
|   |       |   |   |-- comp2.png
|   |       |   |   |-- compressed.gif
|   |       |   |   |-- compressed.png
|   |       |   |   |-- continued.gif
|   |       |   |   |-- continued.png
|   |       |   |   |-- dir.gif
|   |       |   |   |-- dir.png
|   |       |   |   |-- dir2.gif
|   |       |   |   |-- dir2.png
|   |       |   |   |-- doc.gif
|   |       |   |   |-- doc.png
|   |       |   |   |-- forward.gif
|   |       |   |   |-- forward.png
|   |       |   |   |-- generic.gif
|   |       |   |   |-- generic.png
|   |       |   |   |-- generic2.gif
|   |       |   |   |-- generic2.png
|   |       |   |   |-- generic3.gif
|   |       |   |   |-- generic3.png
|   |       |   |   |-- image.gif
|   |       |   |   |-- image.png
|   |       |   |   |-- image2.gif
|   |       |   |   |-- image2.png
|   |       |   |   |-- index.gif
|   |       |   |   |-- index.png
|   |       |   |   |-- key.gif
|   |       |   |   |-- key.png
|   |       |   |   |-- movie.gif
|   |       |   |   |-- movie.png
|   |       |   |   |-- patch.gif
|   |       |   |   |-- patch.png
|   |       |   |   |-- ps.gif
|   |       |   |   |-- ps.png
|   |       |   |   |-- rainbow.gif
|   |       |   |   |-- rainbow.png
|   |       |   |   |-- sound.gif
|   |       |   |   |-- sound.png
|   |       |   |   |-- sound2.gif
|   |       |   |   |-- sound2.png
|   |       |   |   |-- tar.gif
|   |       |   |   |-- tar.png
|   |       |   |   |-- text.gif
|   |       |   |   |-- text.png
|   |       |   |   |-- transfer.gif
|   |       |   |   |-- transfer.png
|   |       |   |   |-- unknown.gif
|   |       |   |   |-- unknown.png
|   |       |   |   |-- uu.gif
|   |       |   |   `-- uu.png
|   |       |   |-- sound1.gif
|   |       |   |-- sound1.png
|   |       |   |-- sound2.gif
|   |       |   |-- sound2.png
|   |       |   |-- sphere1.gif
|   |       |   |-- sphere1.png
|   |       |   |-- sphere2.gif
|   |       |   |-- sphere2.png
|   |       |   |-- tar.gif
|   |       |   |-- tar.png
|   |       |   |-- tex.gif
|   |       |   |-- tex.png
|   |       |   |-- text.gif
|   |       |   |-- text.png
|   |       |   |-- transfer.gif
|   |       |   |-- transfer.png
|   |       |   |-- unknown.gif
|   |       |   |-- unknown.png
|   |       |   |-- up.gif
|   |       |   |-- up.png
|   |       |   |-- uu.gif
|   |       |   |-- uu.png
|   |       |   |-- uuencoded.gif
|   |       |   |-- uuencoded.png
|   |       |   |-- world1.gif
|   |       |   |-- world1.png
|   |       |   |-- world2.gif
|   |       |   `-- world2.png
|   |       `-- log
|   |           `-- httpd-error.log
|   |-- sbin
|   |   |-- chown
|   |   `-- mtree
|   `-- share
|       `-- misc
|           `-- termcap.db
`-- var
    |-- cron
    |   `-- tabs
    |-- log
    |   `-- httpd-suexec.log
    |-- run
    |   |-- httpd.mm.41681.sem
    |   |-- httpd.pid
    |   `-- ld-elf.so.hints
    `-- tmp[/mono]

Несколько лирических отступлений.

  • [li]Все права должны пренадлежать root:apache. На папки 755 на файлы 644 за исключением /tmp 777, /tmp/session 777 и /var/tmp 777[/li]
    [li]Теперь про /dev, практически везде написано что их создавать надо при помощи mknod, возможно это и так, но для систем подерживающих devfs
    (таких как FreeBSD) надо использовать несколько другой подход.

    [mono]mount_devfs devfs /home/apache/dev/
    devfs -m /home/apache/dev/ rule apply hide
    devfs -m /home/apache/dev/ rule apply path zero unhide
    devfs -m /home/apache/dev/ rule apply path null unhide
    devfs -m /home/apache/dev/ rule apply path random unhide[/mono][/li]
    [li][mono]# cat ./group
    apache:*:XXXX:
    www:*:80:
    nogroup:*:65533:
    nobody:*:65534:
    user1:*:XXXX:[/mono]

    [mono]# cat ./passwd
    root:*:0:0::/root:/bin/csh
    apache:*:XXXX:XXXX::/nonexistent:/usr/sbin/nologin
    www:*:80:80::/nonexistent:/usr/sbin/nologin
    nobody:*:65534:65534::/nonexistent:/usr/sbin/nologin
    user1:*:XXX:XXX::0:0::/nonexistent:/usr/sbin/nologin[/mono]

    [mono]# cat ./master.passwd
    root::0:0::0:0::/root:/bin/csh
    apache:*:XXXX:XXXX::0:0::/nonexistent:/usr/sbin/nologin
    www:*:80:80::0:0::/nonexistent:/usr/sbin/nologin
    nobody:*:65534:65534::0:0::/nonexistent:/usr/sbin/nologin
    user1:*:XXX:XXX::0:0::/nonexistent:/usr/sbin/nologin[/mono][/li]

[/li]

[li]Настройка апачи

Запускать сервер в песочнице следует так:
[mono]#!/bin/sh
CHROOT=/home/apache
HTTPD=/usr/local/sbin/httpd
PIDFILE=/var/run/httpd.pid
echo -n " apache "
case "$1" in
start)
    echo "start";
    /usr/sbin/chroot $CHROOT $HTTPD
    ;;
stop)
    echo "stop";
    kill `cat ${CHROOT}${PIDFILE}`
    ;;
restart)
    echo "restart";
    kill `cat ${CHROOT}${PIDFILE}`
    /usr/sbin/chroot $CHROOT $HTTPD
    ;;
*)
    echo ""
    echo "Usage: `basename $0` {start|stop|restart}" >&2
    exit 64
    ;;
esac
exit 0[/mono]

Настройка апачи в песочницы ничем не отличается от обычной настройки.
[mono]User www
Group www[/mono]
Я собирал сначала апачу с suexec, запускал, проверял логии, докидывал недостающее файло… Потом пхп (собираем с --enable-force-cgi-redirect), опять докидывал файло, в зависимости от того с какими модулями собиралось. А только потом настраивал уже нормально. Об этом поподробнее.

Начнем с того что будем использовать все прелести suexec:

Отключаем mod_php, натестировались, работает, больше он нам в обычном виде (как модуль) непонадобится.
[mono]<VirtualHost *:80>
    User user1                                                                                     # пользователь от которого выполняем все операции
    Group user1                                                                                   # группа от которой выполняем все операции
    ScriptAlias           /cgi-php/ "/usr/local/www/data/10.0.0.1/php/"         # Путь до cgi-php (как и что опишу ниже)
    AddType             application/x-httpd-php .php .php3
    Action                 application/x-httpd-php /cgi-php/php                       # /cgi-php/php тут php это файл
    DirectoryIndex    index.php index.html index.htm
    Options               -Indexes
    DocumentRoot     /usr/local/www/data/10.0.0.1/http
    ServerName        10.0.0.1
    ErrorLog              /usr/local/www/data/10.0.0.1/log/error.log
    CustomLog          /usr/local/www/data/10.0.0.1/log/access.log combined
</VirtualHost>[/mono]

Несколько пояснений. Suexec позволяет выполнять две нужные нам операции.
1. Защищать файлы других пользователей от несанкционированного доступа (без safe mode)
2. Выполнять Скрипты с правами пользователя (создавать файло, папки и т.д.)
Кстати, по умолчанию файло создается с правами user1:user1 755 и 644, если есть желание исправить на 750 и 640 то это можно сделать при сборки, ключ --suexec-umask, вообщем внимательно изучайте Makefile, там все понятно.

Теперь про cgi-php. Есть два файла в /usr/local/bin php и php-cgi. Это не наши файлы, Для того чтобы скомпилирывать наш файл нужно сделать "/usr/ports/lang/php5 make" и взять его из /usr/ports/lang/php5/work/sapi/cgi/ берем файл php и копируем его к пользователю в /usr/local/www/data/10.0.0.1/php/ тудаже запихиваем и php.ini

Выставляем права (если их выставить неправильно то не заработает)

drwxr-xr-x  5 user1      user1      512 Nov 10 17:58 10.0.0.1

drwxr-xr-x  3 user1  user1  512 Nov 17 20:36 http
drwxr-xr-x  2 user1  user1  512 Nov 11 18:17 log
drwxr-xr-x  2 user1  user1  512 Nov 11 19:34 php

-rwxr-xr-x  1 user1  user1  2242885 Nov 11 17:49 php
-r--r--r--  1 root  user1    47808 Nov 11 18:06 php.ini Обязательно для пользователя тока чтение, не надо ему там лазить и что-то менять!!!

Запускаем и проверяем, если я ничего не перепутал то все должно работать на ура.[/li]
[li]Теперь что мы имеем.

В папки data создаем для кажлого нового пользователя нужные папки http (https если надо) log и php. В пхп копируем наш php файл (он один и тоже) и копируем php.ini (для каждого пользователя он может быть разным). С правами внимательно!

Если даем пользователю пользоваться cgi то защита тут может быть только одна, файло и папки 750 и 640[/li]
[li]П.С.

Так сказать дополнение. Если пользователь хочет шелл, то его сажаем в песочницу и создаем среду окружения, необходимую для работы шелла.
[mono]./user1
|-- bin
|   |-- cat
|   |-- chmod
|   |-- cp
|   |-- csh
|   |-- date
|   |-- echo
|   |-- expr
|   |-- link
|   |-- ln
|   |-- ls
|   |-- mkdir
|   |-- mv
|   |-- ps
|   |-- pwd
|   |-- rm
|   |-- rmdir
|   |-- sh
|   |-- su
|   `-- tcsh
|-- dev
|-- etc
|   |-- group
|   |-- manpath.config
|   |-- master.passwd
|   |-- resolv.conf
|   |-- motd
|   |-- passwd
|   |-- pwd.db
|   |-- spwd.db
|   `-- termcap
|-- lib
|   |-- libc.so.6
|   |-- libcrypt.so.3
|   |-- libcrypto.so.4
|   |-- libedit.so.5
|   |-- libipsec.so.2
|   |-- libkvm.so.3
|   |-- libm.so.4
|   |-- libmd.so.3
|   |-- libncurses.so.6
|   |-- libutil.so.5
|   `-- libz.so.3
|-- libexec
|   `-- ld-elf.so.1
|-- sbin
|   |-- ldconfig
|   `-- ping
|-- tmp
|-- usr
|   |-- bin
|   |   |-- awk
|   |   |-- bzip2
|   |   |-- cc
|   |   |-- diff
|   |   |-- ee
|   |   |-- fetch
|   |   |-- find
|   |   |-- gcc
|   |   |-- grep
|   |   |-- groups
|   |   |-- gunzip
|   |   |-- gzip
|   |   |-- id
|   |   |-- ldd
|   |   |-- less
|   |   |-- man
|   |   |-- nawk
|   |   |-- patch
|   |   |-- perl
|   |   |-- sed
|   |   |-- sort
|   |   |-- ssh
|   |   |-- tail
|   |   |-- tar
|   |   |-- tr
|   |   |-- uname
|   |   `-- vi
|   |-- lib
|   |   |-- libarchive.so.2
|   |   |-- libasn1.so.8
|   |   |-- libbsm.so.1
|   |   |-- libbz2.so.2
|   |   |-- libcom_err.so.3
|   |   |-- libfetch.so.4
|   |   |-- libgnuregex.so.3
|   |   |-- libgssapi.so.8
|   |   |-- libkrb5.so.8
|   |   |-- libpam.so.3
|   |   |-- libroken.so.8
|   |   |-- libssh.so.3
|   |   |-- libssl.so.4
|   |   |-- libstdc++.so.5
|   |   `-- libwrap.so.4
|   |-- libdata
|   |-- libexec
|   |-- local
|   |   |-- bin
|   |   |   |-- perl
|   |   |   |-- unrar
|   |   |   `-- unzip
|   |   |-- etc
|   |   |-- lib
|   |   |   `-- perl5
|   |   |       `-- 5.8.8
|   |   |           `-- mach
|   |   |               `-- CORE
|   |   |                   `-- libperl.so
|   |   |-- sbin
|   |   |   `-- sshd2
|   |   `-- share
|   |-- sbin
|   |   |-- chown
|   |   `-- mtree
|   `-- share
|       `-- misc
|           `-- termcap.db
`-- var
    |-- cron
    |   `-- tabs
    |-- log
    |-- run
    `-- tmp[/mono]
Этого файла за глаза хватит, чтобы управлять сайтом. Мантируем (mount_devfs) его вебдиректорию в домашнюю директорию (можно с логами и всем остальным)[/li]
[/listo]

Дополнения
[listo]
[li]Как заставить работать функцию mail()  https://unix-forum.ru/viewtopic.php?pid=2172#p2172
[/listo]


©2007 www.alan.lt

Хотелось бы услышать замечания. И добавления.

Отредактировано SatanaClause (24-03-2008 18:08:58)

2

Re: Apache в chroot

В общем документ неоспорим.
Отличный мануал!!!

smile

3

Re: Apache в chroot

Кстати, Алан ты не сказал о последней проблеме в невозможности определения hostname (не резольвится).
Чего нибудь сделал?

4

Re: Apache в chroot

Да, действительно, недосмотрел... Апача неопределяет ип по имени домена...

Решается достаточно просто, нужно в chroot в etc скопирывать resolv.conf и все.

5

Re: Apache в chroot

А теперь научим нашего изолированного индейца стать письма при помощи функции mail()

Я бооооольшой привержениц postfix'a, но тут, так сказать облом, с ним сделать неполучится (так просто как это сделал я).

В логах примерно такое

/usr/sbin/sendmail: not found

Так давайте дадим то что он просит, но как у меня заведено, в кастрированном виде wink

Решение удивително простое.

  • [li]качаем mini_sendmail (mini_sendmail-1.3.6.tar.gz)[/li]
    [li]tar -xvf ./mini_sendmail-1.3.6.tar.gz помот make[/li]
    [li]копируем mini_sendmail в chroot в /usr/sbin я не менял название, так как нехотел включать почту всем, а править php.ini мне было лень. У вас есть на выбор 3 действия: оставит как есть, переименовать и сделать симлиньк[/li]
    [li]правим в php.ini sendmail_path = /usr/sbin/mini_sendmail -t -i (или не правим)[/li]
    [li]проверка chroot -g user1 -u user1 /usr/home/user1/ /usr/bin/telnet localhost 25 (показывать как это делается небуду, не малинькие)[/li]
    [li]если п.5 работает то проверяем php mail("[email protected]", "My Subject", "Line 1\nLine 2\nLine 3"); [/li]

Хочу обратить внимание что если постфикс требует авторизацию даже для локальных пользователей (как у меня, я параноик) то его надо соответственно перенастроит, чтобы он принимал письма от 127.0.0.0/8