Дата: 2010-05-30 14:37:47
Комментариев: 0
Для увеличения безопасности своего сервера изолируем apache и php от родительской системы, для этого будем использовать chroot. Даже если взломают такую систему хакер получит доступ только к файловой системе ограниченной chroot и не будет иметь доступ к родительской системе. Итак, начнём:
1. Для начала установим пакет debootstrap:
$sudo apt-get install debootstrap

debootstrap — используется для создания базовой системы Debian с нуля, не требуя для этого наличия dpkg или APT. Пакеты .deb загружаются из репозиториев, распаковываются в каталог, который затем можно использовать в качестве корня системы для команды chroot.
2 .Создаём директорию для chroot окружения:
$sudo mkdir -p /home/srv/example.ru

3. Устанавливаем базовую системы в chroot окружение:
$sudo debootstrap --variant=buildd --arch i386 lucid /home/srv/example.ru http://archive.ubuntu.com/ubuntu/

4 .Настроим резолвер и конфигурацию apt, для этого скопируем их из своей основной системы:
$sudo cp /etc/resolv.conf /home/srv/example.ru/etc/resolv.conf
$sudo cp /etc/apt/sources.list /home/srv/example.ru/etc/apt/

5 .С созданием chroot законченно, теперь необходимо настроить chroot. Для этого нам необходимо войти в chroot окружение:
$sudo chroot /home/srv/example.ru

6 .Пробрасываем в chroot окружение системные ФС, в /etc/fstab основной системы прописываем:
/proc /home/srv/example.ru/proc none rbind 0 0
/dev /home/srv/example.ru/dev none rbind 0 0
/sys /home/srv/example.ru/sys none rbind 0 0

И выполним:
$sudo mount -a

Далее все команды вводятся относительно chroot-окружения.
Обновим пакеты:
#apt-get update
#apt-get upgrade

Настраиваем локаль:
#apt-get install locales dialog
#locale-gen ru_RU.UTF-8

Настройка chroot закончена. Теперь можно переходить к установке нужных нам сервисов.
7 .Устанавливаем apache и php5:
#apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 libapache2-mod-ruby libapache2-mod-rpaf php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl nano

8 . Включаем модули apache:
#a2enmod rewrite
#a2enmod suexec
#a2enmod include

9 .Настраиваем apache:
#nano /etc/apache2/ports.conf
NameVirtualHost *:88
Listen 88

10. Добавим нового пользователя и необходимые ему каталоги, для этого в основной системе создадим скрипт:
$cat addwwwuser
#!/bin/bash
: ${1?"Usage: $0 example.com"}
 
host=$1;
 
useradd --home-dir /home/srv/$host/var/www --shell /bin/false $host
mkdir -p /home/srv/$host/var/www/htdocs /home/srv/$host/var/www/logs /home/srv/$host/var/www/tmp
chown -R $host:$host /home/srv/$host/var/www/ 
chmod 700 /home/srv/$host/var/www/
setfacl -m user:www-data:--x /home/srv/$host/var/www
setfacl -R -m d:u:www-data:rX /home/srv/$host/var/www/htdocs
Последние две стоки необходимы, чтобы nginx смог читать файлы юзера example.ru

Выполним его:
$sudo ./addwwwuser example.ru

И установим пароль для нового пользователя (он понадобится для доступа по ftp):
$sudo passwd example.ru

11. Создадим виртуальный хост, для этого создадим такой скрипт:
$cat apacheadd
#!/bin/bash
: ${1?"Usage: $0 example.com"}
 
hosts=$1;
 
cat > /home/srv/$hosts/etc/apache2/sites-available/$hosts <<EOF
<VirtualHost *:88>
DocumentRoot "/var/www/htdocs/"
ServerName $hosts
ErrorLog "/var/log/apache2/$hosts.error.log"
CustomLog "/var/log/apache2/$hosts.access.log" common
ErrorDocument 404 /404.html
ErrorDocument 500 /50x.html
ErrorDocument 502 /50x.html
ErrorDocument 503 /50x.html
ErrorDocument 504 /50x.html
</VirtualHost>
EOF
 
chroot /home/srv/$hosts /bin/ln -s /etc/apache2/sites-available/$hosts /etc/apache2/sites-enabled/
chroot /home/srv/$hosts /etc/init.d/apache2 restart

Выполним его:
$sudo ./apacheadd example.ru

Главная проблема при этом — следить за тем, чтобы сервисы в разных chroot’ах не конфликтовали, пытаясь занять порт на одном IP-адресе.
12. Осталось добавить виртуальный хост для nginx:
$cat nginxadd
#!/bin/bash
: ${1?"Usage: $0 example.com"}
 
hosts=$1;
 
cat > /etc/nginx/sites-available/$hosts <<EOF
server {
listen 80;
server_name $hosts;
access_log  /var/log/nginx/$hosts.access.log;
error_log /var/log/nginx/$hosts.error.log;
 
location / {
root /home/srv/$hosts/var/www/htdocs/;
index index.php index.html index.htm;
}
 
error_page  404  /404.html;
error_page   500 502 503 504  /50x.html;
error_page  403  /403.html;
 
location ~ \.php {
proxy_pass http://127.0.0.1:88;
}
}
EOF
 
ln -s /etc/nginx/sites-available/$hosts /etc/nginx/sites-enabled/
/etc/init.d/nginx reload

Выполним его:
$sudo ./nginxadd example.ru

13. Последний штрих, для того чтобы был доступ к mysql из chroot необходимо подправить my.cnf:
$sudo nano /etc/mysql/my.cnf
[...]
bind-address = 0.0.0.0
[...]

И в php скриптах для подключения к БД нужно писать 127.0.0.1 вместо localhost.
теги: nginx, apache, php, chroot

0 комментариев

Оставить комментарий: