Перейти к содержанию

chroot и apache


Рекомендуемые сообщения

Правильно ли я понимаю, если настроить апач в chroot'e тогда у него не будет доступа к домашним директориям пользователей, т.е. мне директории виртуальных хостов на /home/user/domen.ru/html/ уже не настроить? Или альясы(/var/www/html/mail) на мыло уже не прописать ? все должно будет находится в /chroot/apache ? Тогда пользователям по фтп надо будет открывать доступ к /chroot/apache/htdocs/ ?

Ссылка на комментарий
Поделиться на другие сайты

Держи, балуйся...

хоть я еще не дописал этот текст и повыдирал все, что могло бы

указывать на тот сервер, где я это делал и на основе чего все

это писал, все достатосно понятно и просто...

конесно же, если правильно установлены /dev/head и /dev/hands Wink

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...