OpenVZ · 6 min read · Jan 17, 2026
Некоторые советы по развертыванию OpenVZ
Некоторые советы по развертыванию OpenVZ
Я сильно полагаюсь на OpenVZ. В этой статье я хотел бы поделиться некоторыми из моих личных впечатлений о развертывании OpenVZ. Я предполагаю, что читатели уже знают, как установить OpenVZ и основы OpenVZ. Эта статья описывает некоторые советы по использованию OpenVZ через командную строку. Если вы предпочитаете GUI командной строке, пожалуйста, обратитесь к тому, как установить WebVZ.
Настройка, описанная здесь, следует этим рекомендациям:
- реальный сервер имеет минимальное количество установленного программного обеспечения (я использую debian Etch с минимальной установкой) в качестве отправной точки. Дополнительные приложения устанавливаются по мере необходимости в процессе развертывания.
- реальный сервер должен быть максимально безопасным. С другой стороны, я хочу, чтобы он оставался простым и легким в настройке/обслуживании. Поэтому я выбрал компромисс: я полагаюсь только на то, что можно легко развернуть с помощью debian и не использую дополнительные средства безопасности, такие как openwall, selinux, grsecurity и т.д.
- каждая необходимая служба развертывается в отдельном контейнере, чтобы они как можно меньше мешали друг другу
- Обнаружение вторжений для реального сервера, а также для контейнеров развернуто на реальном сервере с использованием OSSEC
- файрвол (iptables) настроен на реальном сервере; контейнеры запускают только службы
- я полагаюсь на ssh как единственное средство доступа и обслуживания реального сервера и контейнеров.
Основная безопасность
Перед развертыванием любых ovz контейнеров я вношу некоторые изменения в конфигурацию реального сервера, чтобы сделать его более безопасным:
- отключить пароль root
- добавить пользователя admin-user, который может выполнять sudo для всего; у этого пользователя простой пароль
- добавить пользователя ssh-user, который может ssh на реальный сервер; после загрузки ssh-ключа для этого пользователя я изменяю строку в .ssh/authorized_keys на:
command="/bin/su - admin-user" ssh-rsa AAAA...и изменяю /etc/pam.d/su, чтобы разрешить только этому пользователю выполнять su:auth required pam_wheel.so group=ssh-user - чтобы копировать файлы с/на реальный сервер, я создаю другого пользователя sftp-user и устанавливаю MySecureShell
- изменить sshd_config так, чтобы: - только ssh-user и sftp-user могли подключаться
- отключена аутентификация по паролю (после загрузки ssh-ключей для ssh-user и sftp-user)
- sshd работает на нестандартном порту
Вышеуказанная схема работает следующим образом: чтобы подключиться к реальному серверу, мы подключаемся как ssh-user. Затем мы должны ввести пароль для admin-user. Если кто-то получит ssh-ключ для ssh-user, он все равно должен знать пароль для admin-user, чтобы получить доступ к серверу (неудача /bin/su - admin немедленно сгенерирует уведомление по электронной почте от OSSEC).
Чтобы копировать файлы с/на сервер, мы используем sftp с учетной записью sftp-user. Если кто-то получит ssh-ключ для этого пользователя, это не такая большая проблема, так как он может получить доступ только к файлам в своем $HOME.
Создание контейнеров OpenVZ
Мне удобнее создать шаблон для всех контейнеров, чтобы, когда мне нужен новый контейнер, я просто сделал клон из шаблона. Я использую только debian stable как для реального сервера, так и для контейнеров. Итак, первый шаг - создать шаблон и настроить его по своему вкусу:
создать новый контейнер:
vzctl create 2002 --ostemplate debian-4.0-amd64-minimalустановить некоторые основные параметры:
vzctl set 2002 --ipadd 192.168.100.2 --nameserver 1.2.3.4 --hostname host2 --saveзапустить контейнер:
vzctl start 2002войти в контейнер:
vzctl enter 2002Я предпочитаю держать все на минимуме и добавлять по мере необходимости. Поскольку установка пакета с помощью debian так проста, требуется очень мало усилий, чтобы установить любой необходимый пакет. Поэтому я вношу следующие изменения для шаблона: - запустить aptitude и снять отметку с Options/Dependency handling/Install Recommended packages automatically
удалить некоторые пакеты, которые я не хочу в шаблоне:
bsdmainutils ed groff-base info iptables libconsole libgdbm3 man-db manpages nano netcat openssh-client openssh-server quota ssh tracerouteотредактировать /etc/apt/sources.list, чтобы настроить его по своим предпочтениям
затем я останавливаю шаблон:
vzctl stop 2002
Затем, когда мне нужен новый контейнер, я использую скрипт vz-clone следующим образом:
#!/bin/bash
# скрипт для клонирования openvz VE
set -e
if [ -z "$2" ]; then
echo "Использование: $0 "
exit 1
fi
cfg="/etc/vz/conf/$1.conf"
newcfg="/etc/vz/conf/$2.conf"
if [ ! -e $cfg ]; then
echo $cfg не найден!
exit 1
fi
VEID=$1
. $cfg
veprivate="$VE_PRIVATE"
VEID=$2
. $cfg
newveprivate="$VE_PRIVATE"
if [ -e $newcfg ]; then
echo $newcfg уже существует!
exit 1
fi
if [ -e $newveprivate ]; then
echo $newveprivate уже существует!
exit 1
fi
if vzlist | fgrep -w -q $1
then
vzctl stop $1
fi
echo "Клонирование $cfg в $newcfg"
cp -a $cfg $newcfg
echo "Клонирование $veprivate в $newveprivate"
mkdir -p $newveprivate
cd $veprivate
tar cf - . | (cd $newveprivate && tar xf -)
echo "Не забудьте отредактировать $newcfg (вам нужно отредактировать как минимум HOSTNAME и IP_ADDRESS)"
echo "Также не забудьте сделать псевдоним" Использование:
sudo sh vz-clone 2002 2010Клонирование /etc/vz/conf/2002.conf в /etc/vz/conf/2010.conf
Клонирование /vz/private/2002 в /vz/private/2010
Не забудьте отредактировать /etc/vz/conf/2010.conf (вам нужно отредактировать как минимум HOSTNAME и IP_ADDRESS)
Также не забудьте сделать псевдонимВ зависимости от вашего /etc/vz/vz.conf, пути в приведенном выше могут отличаться. Я использую следующие настройки:
VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEIDЗатем нам нужно отредактировать /etc/vz/conf/2010.conf, изменить, например, HOSTNAME на host10, IP_ADDRESS на 192.168.100.10 и мы готовы к новому контейнеру. Мы также создадим псевдоним для нового контейнера, который будет описан в следующем разделе.
Работа с контейнерами OpenVZ
Контейнеры ovz идентифицируются по номеру. Мне удобнее ссылаться на них по имени/псевдониму, чтобы не нужно было запоминать, например, что 2010 - это идентификатор контейнера, работающего с dns службой. Кроме того, я также хочу освободить себя от запоминания различных команд vzctl, vzlist, vzquota и т.д. и их параметров. Поэтому я создаю несколько простых скриптов, чтобы помочь себе.
- Сначала я создаю список псевдонимов /etc/vz-aliases:
# псевдонимы для openvz VE's 2001 test 2002 template 2010 dns 2020 ldap 2030 mail 2040 web ... - Чтобы переводить между ID и псевдонимами, я создаю скрипт /usr/local/bin/vz-get-alias следующим образом и делаю vz-get-veid символической ссылкой на vz-get-alias:
#!/bin/sh vz_alias_file="/etc/vz-aliases" case $0 in *vz-get-alias) cat $vz_alias_file | egrep "^[[:space:]]*$1[[:space:]]" | awk '{print $2}' ;; *vz-get-veid) cat $vz_alias_file | egrep "[[:space:]]$1[[:space:]]*$" | awk '{print $1}' ;; esac - Затем я помещаю частые команды для манипуляции контейнерами ovz в скрипт, называемый /usr/local/bin/vz-cmd-generic:
#!/bin/sh set -e ## сначала обрабатываем vz-list, так как он не требует ID/псевдонима case $0 in *vz-list) sedfile=`mktemp` cat /etc/vz-aliases | egrep '^[0-9]' | \ sed 's/\([0-9]*\) *\([a-zA-Z0-9-]*\)/s,\1 .*,\&\2,/' > $sedfile sudo vzlist "$@" | sed 's/ $//' | \ sed -f $sedfile | \ sed '1s/$/ALIAS/' exit ;; esac ## другие команды требуют ID или псевдоним if [ -z "$1" ]; then echo "Использование: $0И сделать все команды vz-start, vz-stop, vz-exec и т.д. символическими ссылками на этот скрипт vz-cmd-generic.|<псевдоним> [<аргументы>]" exit 1 fi veid=`/root/bin/vz-get-veid $1` if [ -z "$veid" ]; then veid=$1 fi shift case $0 in *vz-start) sudo vzctl start $veid ;; *vz-restart) sudo vzctl restart $veid ;; *vz-stop) sudo vzctl stop $veid ;; *vz-enter) sudo vzctl enter $veid ;; *vz-exec) sudo vzctl exec $veid "$@" ;; *vz-edit) sudo vi /etc/vz/conf/$veid.conf ;; *vz-quota-ls) sudo vzquota stat $veid ;; *vz-ubc) sudo head -2 /proc/user_beancounters sudo cat /proc/user_beancounters | egrep -A23 "^[[:space:]]+${veid}:" ;; esac
Использование тогда просто:
- чтобы перечислить все работающие контейнеры:
vz-listVEID NPROC STATUS IP_ADDR HOSTNAME ALIAS 2010 15 running 192.168.100.10 host10 dns 2020 8 running 192.168.100.20 host20 ldap 2030 23 running 192.168.100.30 host30 mail 2040 11 running 192.168.100.40 host40 web - чтобы перечислить все контейнеры (включая те, которые не работают):
vz-list -aVEID NPROC STATUS IP_ADDR HOSTNAME ALIAS 2002 - stopped 192.168.100.2 host2 template 2010 15 running 192.168.100.10 host10 dns 2020 8 running 192.168.100.20 host20 ldap 2030 23 running 192.168.100.30 host30 mail 2040 11 running 192.168.100.40 host40 web - чтобы запустить/остановить/перезапустить контейнер: -
vz-start dns vz-stop dnsvz-restart dns- чтобы выполнить команду внутри контейнера:
vz-exec dns aptitude update - чтобы проверить UBC контейнера:
vz-ubc dns - чтобы проверить квоту контейнера:
vz-quota-ls dns - также возможно использовать ID вместо псевдонима:
vz-ubc 2010
Также хорошо, чтобы псевдоним был уникальным на разных реальных серверах, чтобы мы могли делиться /etc/vz-aliases между ними без конфликтов.
Эта статья уже довольно длинная, так что давайте остановимся здесь. Мы продолжим в следующей части, где обсудим такие вопросы, как развертывание обнаружения вторжений с OSSEC, как мониторить и устанавливать параметры UBC для контейнеров и т.д.
Get new posts in your inbox
No spam. Unsubscribe anytime.