spyfox Опубликовано 25 марта, 2006 Жалоба Поделиться Опубликовано 25 марта, 2006 Правильно ли я понимаю, если настроить апач в chroot'e тогда у него не будет доступа к домашним директориям пользователей, т.е. мне директории виртуальных хостов на /home/user/domen.ru/html/ уже не настроить? Или альясы(/var/www/html/mail) на мыло уже не прописать ? все должно будет находится в /chroot/apache ? Тогда пользователям по фтп надо будет открывать доступ к /chroot/apache/htdocs/ ? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Hans R. Steiner Опубликовано 28 марта, 2006 Жалоба Поделиться Опубликовано 28 марта, 2006 Держи, балуйся... хоть я еще не дописал этот текст и повыдирал все, что могло бы указывать на тот сервер, где я это делал и на основе чего все это писал, все достатосно понятно и просто... конесно же, если правильно установлены /dev/head и /dev/hands Apache + MySQL + Proftpd Оглавление 1.Конфигурация 2.Сервисы 3.Настройка 4.Приложение А – массовый ldd с копированием 5.Приложение Б - /etc/rc.d/rc.mysqld 6.Приложение В - /etc/rc.d/rc.httpd Конфигурация На сервер установлена операционная система Slackware Linux 10.2 со стандартным для дистрибутива набором приложений. Сервисы На данный момент, на сервере SERVER.RU, работают следующие сервисы: Apache v. 1.3.33 WEB-сервер MySQL v. 4.1.14 MySQL-сервер ProFTPd v. 1.2.10 FTP-сервер SendMail v. 8.13.4 SMTP-сервер Настройка 1.Перенос Apache в CHROOT 1.Создаем пользователя:группу «www:www» с UID:GID 80:80 2.Создаем каталог /var/chroot/apache 3.Создаем дерево каталогов для Apache mkdir -p /var/chroot/dev mkdir -p /var/chroot/lib mkdir -p /var/chroot/etc mkdir -p /var/chroot/usr/sbin mkdir -p /var/chroot/usr/lib mkdir -p /var/chroot/var/run mkdir -p /var/chroot/var/log/apache; chmod 750 /var/chroot/log/apache mkdir -p /var/chroot/home/www 4.Копируем файлы Apache в CHROOT cp -r /etc/apache /var/chroot/apache/etc/ cp -r /var/www /var/chroot/apache/home/www/ cp /usr/sbin/httpd /var/chroot/apache/usr/sbin/ 5.Создаем /dev/null mknod /var/chroot/apache/dev/null c 1 3 chmod 666 /var/chroot/apache/dev/null 6.Копируем SSL cp -r /etc/ssl/ /var/chroot/apache/etc/ cd /var/chroot/apache/etc/ssl/; chmod 666 * */* 7.Копируем разделяемые библиотеки Для определения разделяемых библиотек, мы будем использовать комманды ldd [filename] и strace -f -e trace=open [filename] cp /lib/libm.so.6 /var/chroot/apache/lib/libm.so.6 cp /lib/libcrypt.so.1 /var/chroot/apache/lib/libcrypt.so.1 cp /lib/libdb-3.3.so /var/chroot/apache/lib/libdb-3.3.so cp /usr/lib/libexpat.so.0 /var/chroot/apache/usr/lib/libexpat.so.0 cp /lib/libdl.so.2 /var/chroot/apache/lib/libdl.so.2 cp /lib/libc.so.6 /var/chroot/apache/lib/libc.so.6 cp /lib/ld-linux.so.2 /var/chroot/apache/lib/ld-linux.so.2 ... и еще некоторые библиотеки cp /lib/libnsl* /var/chroot/apache/lib/ cp /lib/libnss_compat* /var/chroot/apache/lib/ cp /lib/libnss_dns* /var/chroot/apache/lib/ cp /lib/libnss_files* /var/chroot/apache/lib/ ... и /etc/localtime cp /etc/localtime /var/chroot/apache/etc/ 8.Переносим пользователя в CHROOT cat /etc/passwd | grep www > /var/chroot/apache/etc/passwd cat /etc/group | grep www > /var/chroot/apache/etc/group ... и некоторые конфигурационные файлы cp /etc/resolv.conf /var/chroot/apache/etc/ cp /etc/hosts /var/chroot/apache/etc/ cp /etc/nsswitch.conf /var/chroot/apache/etc/ 9.Редактируем syslog Заменяем в /etc/rc.d/rc.syslog строку /usr/sbin/syslogd на /usr/sbin/syslogd -a /var/chroot/apache/dev/log 10.Теперь, переносим файлы Apache из нашего установочного пакета, с учетом тех изменений, которые мы произвели. 11.Пишем скрипт /etc/rc.d/rc.httpd для запуска Apache в CROOT #!/bin/sh DIR="/var/chroot/apache" BIN="/usr/sbin/httpd" PID="/var/run/httpd.pid" ## RESTARTING WEB SERVER restart () { stop sleep 1 start } ## STARTING WEB SERVER start () { chroot "${DIR}" "${BIN}" } ## WEB SERVER STOP stop () { kill -9 `ps -C httpd -o pid=` } case $1 in restart) restart;; start) start;; stop) stop;; esac ## END FILE Стоит заметить, что этот стартовый скрипт предусматривает, что у Вас запущен только один HTTP-сервер. Если у Вас запущено несколько различных HTTP-серверов и все они видны в списке процессов как httpd, Вам прийдется переписать этот скрипт самостоятельно. 12.И так, все файлы перенесены и мы можем приступать к настройке Apache, но для начала, удалим каталог конфигурации /etc/apache и создадим ссылки на то, что мы создали... таким образом, мы сможем настраивать наш WEB-сервер при помощи всяких удобных нам утилит... к примеру, с помощью того же «webmin» ln -s /var/chroot/apache/etc/apache /etc/apache ln -s /var/chroot/apache/home/www /home/www 13.Далее, скриптом из приложения А, проверяем, все ли зависимости соблюдаются и переходим к настройке сервера. 2.Настройка Apache Примечание: Все пути указаны относительно chroot-директории. Будьте внимательны и не попортите файлы реальной системы. 1.Копируем файл /etc/apache/httpd.conf.default в /etc/apache/httpd.conf и одновременно удаляем из него комментарии, что бы нам было проще в нем ориентироваться... все равно мы их читать не будем... потому,что у нас есть свой справочник... cd /etc/apache; cat httpd.conf.default | awk '{ if ($1 != "#") { print $_ }; }' > httpd.conf 2.И так, теперь мы можем перейти к настройке самого Apache Изначально, в нашей конфигурации Apache, как каталог, где будут лежать все сайты, страницы и прочие бяки-документы, установлен каталог /var/www, а пользователь, от имени которого запускается Apache – nobody:nobody Для начала,давайте изменим пользователя-владельца Apache, на ранее созданного нами пользователя www:www и удалим всех остальных пользователей из /etc/passwd и группы из /etc/group и заменяем в конфигурационном файле путь к корню документов на /home/www/htdocs 3.Теперь прикрутим PHP, Perl и Shell. Чтобы меньше возиться с выявлением необходимых файлов, просто берем пакет PHP от нашего дистрибутива, и распаковываем его в chroot-директорию. Копируем разделяемые библиотеки (сразу выводим сформированную комманду для копирования и просто вставляем ее в командную строку) ldd /usr/libexec/apache/libphp4.so | awk '{ if ($3) { print "cp", $3, "/var/chroot/apache" $3 ";" } else { print "cp", $1, "/var/chroot/apache" $1 ";" }; }' Проверяем PHP: кладем в /home/www/htdocs файл index.php с простым содержимым: <? echo «Hello world!» ?>, перезапускаем сервер и в результате, зайдя на него через браузер, мы должны увидеть надпись «Hello world!». Теперь Perl. Так же, как и в случае с PHP, воспользуемся стандартным для нашего дистрибутива пакетом и распакуем его в croot. Для копирования разделяемых библиотек, используем тот же способ, что и в PHP. ldd /usr/libexec/apache/libperl.so | awk '{ if ($3) { print "cp", $3, "/var/chroot/apache" $3 ";" } else { print "cp", $1, "/var/chroot/apache" $1 ";" }; }' И так, проверяем работу Perl: вводим в браузере server.ru/cgi-bin/printenv и... еслиполучаем какой-нибудь результат, значит все работает. Для работоспособности Shell-скриптов, нам надо сделать совсем мало mkdir /var/chroot/apache/bin; cp /bin/bash /var/chroot/apache/bin/ cd /var/chroot/apache/bin; ln -s bash sh cp /lib/libtermcap.so.2 /var/chroot/apache/lib/ и теперь проверяем работу на server.ru/cgi-bin/test-cgi 4.Настройка виртуальных хостов (субдоменов) Я не буду описывать настройку всего сервера Apache, это слишком долго и нудно... да и книг по вылизыванию конфигов, написано достаточно много... я лишь опишу некоторые основные моменты конфигурирования доменов (субдоменов). Для того, чтобы человек, набравший имя нашего домена и не указавший конкретный хост, не попал на первый же указанный в конфигурации виртуальный домен, мы должны настроить главный домен. Для этого, мы создадим первый виртуальный с именем нашего главного домена а все остальные имена, будут располагаться следом за ним. Так же, для облегчения добавления доменов, в корне chroot, лежит файл mkvhost. 3.Перенос MySQL в CHROOT 1.Создаем каталог /var/chroot/mysql 2.Для начала, давайте перенесем в croot shell Для этого, создадим в croot директории необходимые каталоги mkdir /var/chroot/mysql/bin mkdir /var/chroot/mysql/dev mkdir /var/chroot/mysql/etc mkdir /var/chroot/mysql/lib Теперь, мы можем перенести Shell cp /bin/awk /var/chroot/mysql/bin/ cp /bin/bash /var/chroot/mysql/bin/ cp /bin/gawk /var/chroot/mysql/bin/ cp /bin/gawk-3.1.5 /var/chroot/mysql/bin/ cp /bin/sh /var/chroot/mysql/bin/ cp /lib/ld-linux.so.2 /var/chroot/mysql/lib/ cp /lib/libdl.so.2 /var/chroot/mysql/lib/ cp /lib/libnsl-2.3.5.so /var/chroot/mysql/lib/ cp /lib/libnss_compat-2.3.5.so /var/chroot/mysql/lib/ cp /lib/libnss_dns-2.3.5.so /var/chroot/mysql/lib/ cp /lib/libresolv.so.2 /var/chroot/mysql/lib/ cp /lib/libc.so.6 /var/chroot/mysql/lib/ cp /lib/libm.so.6 /var/chroot/mysql/lib/ cp /lib/libnsl.so.1 /var/chroot/mysql/lib/ cp /lib/libnss_compat.so.2 /var/chroot/mysql/lib/ cp /lib/libnss_dns.so.2 /var/chroot/mysql/lib/ cp /lib/libtermcap.so.2 /var/chroot/mysql/lib/ cp/etc/group /var/chroot/mysql/etc/ cp/etc/hosts /var/chroot/mysql/etc/ cp/etc/nsswitch.conf /var/chroot/mysql/etc/ cp/etc/passwd /var/chroot/mysql/etc/ cp/etc/pear.conf /var/chroot/mysql/etc/ cp/etc/resolv.conf /var/chroot/mysql/etc/ 3.Создаем /dev/null mkdir /var/chroot/mysql/dev mknod /var/chroot/mysql/dev/null c 1 3 chmod 666 /var/chroot/mysql/dev/null 4.Установка MySQL Теперь, как и в случае с Apache, возьмем пакет MySQL из нашего дистрибутива и распакуем его в chroot-директорию MySQL. Для того, что бы меньше морочиться со всякими символическими ссылками, мы можем воспользоваться файлом doinst.sh, который идет вместе с пакетом (такой файл есть в каждом пакете для Slackware Linux), но что бы сделать это, мы должны перенести в chroot еще некоторые файлы cp /bin/cp /var/chroot/mysql/bin/ cp /bin/cat /var/chroot/mysql/bin/ cp /bin/rm /var/chroot/mysql/bin/ cp /bin/mv /var/chroot/mysql/bin/ cp /bin/ln /var/chroot/mysql/bin/ cp /usr/bin/md5sum /var/chroot/mysql/usr/bin/ cp /usr/bin/basename /var/chroot/mysql/usr/bin/ cp /usr/bin/dirname /var/chroot/mysql/usr/bin/ 5.Перед запуском для того, что бы нормально запускать MySQL в croot, нам понадобится перенести еще некоторые файлы. cp /usr/bin/sed /var/chroot/mysql/usr/bin/ cp /usr/bin/touch /var/chroot/mysql/usr/bin/ cp /usr/bin/chown /var/chroot/mysql/usr/bin/ cp /usr/bin/date /var/chroot/mysql/usr/bin/ cp /usr/bin/tee /var/chroot/mysql/usr/bin/ cp /lib/libpthread.so.0 /var/chroot/mysql/lib/ cp /lib/librt.so.1 /var/chroot/mysql/lib/ cp /lib/libcrypt.so.1 /var/chroot/mysql/lib/ 6.Теперь, устанавливаем базу данных cp /usr/bin/resolveip /var/chroot/mysql/usr/bin/ cp /usr/bin/mkdir /var/chroot/mysql/usr/bin/ cp /usr/bin/chmod /var/chroot/mysql/usr/bin/ cp /usr/lib/libz.so.1 /var/chroot/mysql/usr/lib/ cp /usr/lib/libssl.so.0 /var/chroot/mysql/usr/lib/ cp /usr/lib/libcrypto.so.0 /var/chroot/mysql/usr/lib/ cp /etc/ld.so.cache /var/chroot/mysql/etc/ cp /lib/libnsl.so.1 /var/chroot/mysql/lib/ cp /lib/libm.so.6 /var/chroot/mysql/lib/ cp /lib/libc.so.6 /var/chroot/mysql/lib/ cp /lib/libnss_files.so.2 /var/chroot/mysql/lib/ 7.Теперь, запускаем MySQL cp /usr/lib/libncurses.so.5 /var/chroot/mysql/usr/lib/ cp /lib/libgpm.so.1 /var/chroot/mysql/lib/ 8.Редактируем файл /etc/rc.d/rc.mysqld комментируем строку SKIP="—skip-networking" для того, чтобы наша база могла работать по сети 9.Далее, скриптом из приложения А, проверяем, все ли зависимости соблюдаются и переходим к настройке сервера. 4.Настройка MySQL 1.Установка базы Заходим в нашу среду chroot и идем в /var/lib/mysql chroot /var/chroot/mysql cd /var/lib/mysql и устанавливаем базу данных и запускаем MySQL mysql_install_db /etc/rc.d/rc.mysqld start и выделяем права пользователю root /usr/bin/mysqladmin -u root password 'new-password' 2.Теперь, для того, чтобы мы могли подключаться к нашей базе, мы должны создать файл /etc/my.cnf в основной файловой системе. Выглядеть этот файл будет так: [client] socket = /var/chroot/mysql/var/run/mysql/mysql.sock [mysqld] socket = /var/run/mysql/mysql.sock Так же, при загрузке сервера, мы должны будем создавать символическую ссылку на соккет MySQL. Сделать это можно с помощью следующей команды: ln -s -f /var/chroot/mysql/var/run/mysql/mysql.sock /var/run/mysql/mysql.sock 3.В приложении Б, приведен не много измененный скрипт для запуска MySQL-сервера не входя в chroot-окружение 5.Перенос ProFTPd в CHROOT Теперь мы добрались до FTP-сервера. В нашем случае, FTP будет использоваться для обновления сайтов, которые лежат у нас на хостинге и по этому, мы поместим ProFTPd в ту же среду, что и Apache. 6.Установка И так, как мы уже делали раньше, воспользуемся стандартным пакетом нашего дистрибутива и распакуем его в среду Apache. 7.Настройка ProFTPd Настройка ProFTPd довольно проста. Все, что нам нужно сейчас сделать это: 1.Изменить пользователя и группу, под которыми будет запускаться сервер на www:www и установить пароль на этого пользователя. 2.Теперь, можно запускать FTP-сервер Для того, что бы ProFTPd запускался автоматически при старте сервера, нам надо написать скрипт, аналогичный тому, что запускает Apache Пример скрипта приведен в приложении Д 8.Настройка SendMail И так, учитывая, что мне никто не давал имена почтовых ящиков, которые надо создать, а почтовый сервер настроить надо то, я предполагаю, что почтовик нам будет нужен для перенаправления всей почты, в том числе и системной, на некий почтовый адрес, за пределами нашего сервера (или просто на другой компьютер). В общем, все что нам надо сделать, это просто создать файл /root/.forward содержащий почтовый адрес, на который надо перенаправлять всю почту. Приложение А #!/bin/sh my_bin () { FILE=`which "${NAME}"` if [ "${1}" != "test" ]; then cp "${FILE}" "${ROOT}${FILE}" fi if ls "${ROOT}${FILE}" 2> /dev/null 1> /dev/null; then NAME=`echo "${FILE}" | sed s/${NAME}//` echo "cp ${FILE} ${ROOT}${NAME}" fi } my_lib () { FILE=`locate "${NAME}" | grep "^/[^var].*${NAME}$"` FILE=`echo ${FILE} | awk '{ print $(NF) }'` if [ "${1}" != "test" ]; then cp "${FILE}" "${ROOT}${FILE}" fi if ls "${ROOT}${FILE}" 2> /dev/null 1> /dev/null; then NAME=`echo "${FILE}" | sed s/"${NAME}"//` echo "cp ${FILE} ${ROOT}${NAME}" fi } for NAME in ${@}; do case "${NAME}" in --bin) TYPE="bin";; --lib) TYPE="lib";; --ldd) TYPE="ldd";; *) PARA="${PARA} ${NAME}";; esac done if [ ! "${TYPE}" ]; then TYPE="bin"; fi if [ "${TYPE}" == "ldd" ]; then PARA=`echo ${PARA} | awk '{ if (NF < 2) { print $_, "*"; }; }'`; fi for NAME in ${PARA}; do if [ ! "${ROOT}" ]; then ROOT="${NAME}" else case "${TYPE}" in bin) my_bin ;; lib) my_lib ;; ldd) PARA=`ls "${ROOT}"` for ITEM in ${PARA}; do LIBS=`ldd "${ROOT}${ITEM}" | awk '{ if ($3) { print $3 } else { print $1 }; }' | awk -F '/' '{ print $(NF) }'` for LIB in ${LIBS}; do FILE=`locate "${LIB}" | grep "^/[^var].*${LIB}$"` FILE=`echo ${FILE} | awk '{ print $(NF) }'` ROOTDIR=`echo "${ROOT}" | awk -F '/' '{ if ($3 == "chroot") { print "/var/chroot/" $4 } else { print $_ }; }'` if ! ls "${ROOTDIR}${FILE}" 1> /dev/null 2> /dev/null; then echo "${ITEM} ==> ${FILE}" echo -ne "Copy needed file? [y/n]: "; read INPUT; if [ "${INPUT}" == "y" ]; then CFILE=`echo "${FILE}" | awk -F '/' '{ print $(NF)}'` CDIRS=`echo "${FILE}" | sed s/"${CFILE}"//` mkdir -p "${ROOTDIR}${CDIRS}" cp "${FILE}" "${ROOTDIR}${CDIRS}" fi fi done done break ;; esac fi done ## END FILE Приложение Б #!/bin/sh ROOT="/var/chroot/mysql" HTTP="/var/chroot/apache" # Start mysqld: mysqld_start() { if [ -x "${ROOT}"/usr/bin/mysqld_safe ]; then # If there is an old PID file (no mysqld running), clean it up: if [ -r "${ROOT}"/var/run/mysql/mysql.pid ]; then if ! ps axc | grep mysqld 1> /dev/null 2> /dev/null ; then echo "Cleaning up old /var/run/mysql/mysql.pid." rm -f "${ROOT}"/var/run/mysql/mysql.pid fi fi chroot "${ROOT}" /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/run/mysql/mysql.pid & ln -s -f /var/chroot/mysql/var/run/mysql/mysql.sock /var/run/mysql/mysql.sock fi } # Stop mysqld: mysqld_stop() { # If there is no PID file, ignore this request... if [ -r "${ROOT}"/var/run/mysql/mysql.pid ]; then killall mysqld # Wait at least one minute for it to exit, as we don't know how big the DB is... for second in 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 60 ; do if [ ! -r "${ROOT}"/var/run/mysql/mysql.pid ]; then break; fi sleep 1 done if [ "$second" = "60" ]; then echo "WARNING: Gave up waiting for mysqld to exit!" sleep 15 fi fi } # Restart mysqld: mysqld_restart() { mysqld_stop mysqld_start } case "$1" in 'start') mysqld_start ;; 'stop') mysqld_stop ;; 'restart') mysqld_restart ;; *) echo "usage $0 start|stop|restart" esac Приложение В #!/bin/sh DIR="/var/chroot/apache" BIN="/usr/sbin/httpd" PID="/var/run/httpd.pid" ## RESTARTING WEB SERVER restart () { stop sleep 1 start } ## STARTING WEB SERVER start () { chroot "${DIR}" "${BIN}" } ## WEB SERVER STOP stop () { kill -9 `ps -C httpd -o pid=` } case $1 in restart) restart;; start) start;; stop) stop;; esac ## END FILE Приложение Д #!/bin/sh DIR="/var/chroot/apache" BIN="/usr/sbin/proftpd" PID="/var/run/proftpd.pid" ## RESTARTING WEB SERVER restart () { stop sleep 1 start } ## STARTING WEB SERVER start () { chroot "${DIR}" "${BIN}" } ## WEB SERVER STOP stop () { kill -9 `ps -C proftpd -o pid=` } case $1 in restart) restart;; start) start;; stop) stop;; esac ## END FILE Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.