OpenVZ Dicas · 7 min read · Jan 17, 2026
Algumas Dicas Sobre Implantação do OpenVZ
Algumas Dicas Sobre Implantação do OpenVZ
Eu confio muito no OpenVZ. Neste artigo, gostaria de compartilhar algumas das minhas experiências pessoais na implantação do OpenVZ. Presumo que os leitores já saibam como instalar o OpenVZ e os conceitos básicos do OpenVZ. Este artigo descreve algumas dicas sobre o uso do OpenVZ via linha de comando. Se você prefere GUI a linha de comando, por favor, consulte como instalar o WebVZ.
A configuração descrita aqui segue estas diretrizes:
- o servidor real tem o mínimo de software instalado (eu uso debian Etch com instalação mínima) como ponto de partida. Aplicativos adicionais são instalados conforme necessário ao longo da implantação.
- o servidor real deve ser o mais seguro possível. Por outro lado, quero mantê-lo simples e fácil de configurar/manter. Então eu escolhi um compromisso: confio apenas no que pode ser facilmente implantado com debian e não busco coisas extras de segurança como openwall, selinux, grsecurity, etc.
- cada serviço necessário é implantado em um contêiner separado, para que interfiram o mínimo possível entre si
- Detecção de Intrusão para o servidor real, bem como para os contêineres, é implantada no servidor real usando OSSEC
- o firewall (iptables) é feito no servidor real; os contêineres executam apenas os serviços
- confio no ssh como o único meio de acessar e manter o servidor real e os contêineres.
Segurança Básica
Antes de implantar quaisquer contêineres ovz, faço algumas alterações na configuração do servidor real para torná-lo mais seguro:
- desabilitar a senha do root
- adicionar um usuário admin-user que pode sudo tudo; este usuário tem uma senha simples
- adicionar um usuário ssh-user que pode ssh para o servidor real; após fazer upload da chave ssh para este usuário, eu mudo a linha em .ssh/authorized_keys para ler:
command="/bin/su - admin-user" ssh-rsa AAAA...e mudo /etc/pam.d/su para permitir que apenas este usuário possa su:auth required pam_wheel.so group=ssh-user - para copiar arquivos de/para o servidor real, crio outro usuário sftp-user e instalo MySecureShell
- mudar sshd_config para que: - apenas ssh-user e sftp-user sejam permitidos a se conectar
- autenticação por senha é desabilitada (após fazer upload das chaves ssh para ssh-user e sftp-user)
- sshd roda em uma porta não padrão
O esquema acima funciona da seguinte forma: para conectar ao servidor real, nos conectamos como ssh-user. Então devemos digitar a senha para admin-user. Se alguém obtiver a chave ssh para ssh-user, ele ainda deve saber a senha para admin-user para obter acesso ao servidor (falha de /bin/su - admin gerará imediatamente um alerta por e-mail pelo OSSEC).
Para copiar arquivos de/para o servidor, usamos sftp com a conta sftp-user. Se alguém obtiver a chave ssh para este usuário, isso não é um grande problema, uma vez que ele só pode acessar arquivos sob seu $HOME.
Criando Contêineres OpenVZ
Eu acho mais confortável criar um template para todos os contêineres, para que quando eu precisar de um novo contêiner, eu simplesmente faça um clone do template. Eu uso apenas debian stable para o servidor real, bem como para os contêineres. Então, o primeiro passo é criar um template e ajustá-lo ao meu gosto:
criar um novo contêiner:
vzctl create 2002 --ostemplate debian-4.0-amd64-minimaldefinir alguns parâmetros básicos:
vzctl set 2002 --ipadd 192.168.100.2 --nameserver 1.2.3.4 --hostname host2 --saveiniciar o contêiner:
vzctl start 2002entrar no contêiner:
vzctl enter 2002eu prefiro manter tudo no mínimo e adicionar coisas conforme necessário. Como instalar um pacote com debian é tão fácil, leva muito pouco esforço para instalar qualquer pacote que precisemos. Então faço as seguintes mudanças para o template: - executar aptitude e desmarcar Opções/Tratamento de dependências/Instalar pacotes recomendados automaticamente
remover alguns pacotes que não quero no template:
bsdmainutils ed groff-base info iptables libconsole libgdbm3 man-db manpages nano netcat openssh-client openssh-server quota ssh tracerouteeditar /etc/apt/sources.list para ajustá-lo às minhas preferências
então eu paro o template:
vzctl stop 2002
Então, sempre que eu precisar de um novo contêiner, uso um script vz-clone da seguinte forma:
#!/bin/bash
# script para clonar um openvz VE
set -e
if [ -z "$2" ]; then
echo "Uso: $0 "
exit 1
fi
cfg="/etc/vz/conf/$1.conf"
newcfg="/etc/vz/conf/$2.conf"
if [ ! -e $cfg ]; then
echo $cfg não encontrado!
exit 1
fi
VEID=$1
. $cfg
veprivate="$VE_PRIVATE"
VEID=$2
. $cfg
newveprivate="$VE_PRIVATE"
if [ -e $newcfg ]; then
echo $newcfg já existe!
exit 1
fi
if [ -e $newveprivate ]; then
echo $newveprivate já existe!
exit 1
fi
if vzlist | fgrep -w -q $1
then
vzctl stop $1
fi
echo "Clonando $cfg para $newcfg"
cp -a $cfg $newcfg
echo "Clonando $veprivate para $newveprivate"
mkdir -p $newveprivate
cd $veprivate
tar cf - . | (cd $newveprivate && tar xf -)
echo "Não se esqueça de editar $newcfg (você precisa editar pelo menos HOSTNAME e IP_ADDRESS)"
echo "Também não se esqueça de fazer um alias" Uso:
sudo sh vz-clone 2002 2010Clonando /etc/vz/conf/2002.conf para /etc/vz/conf/2010.conf
Clonando /vz/private/2002 para /vz/private/2010
Não se esqueça de editar /etc/vz/conf/2010.conf (você precisa editar pelo menos HOSTNAME e IP_ADDRESS)
Também não se esqueça de fazer um aliasDependendo do seu /etc/vz/vz.conf, os caminhos acima podem ser diferentes. Eu uso as configurações abaixo:
VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEIDEntão precisamos editar /etc/vz/conf/2010.conf, mudar por exemplo HOSTNAME para host10, IP_ADDRESS para 192.168.100.10 e estamos prontos para usar o novo contêiner. Também faremos um alias para o novo contêiner, que será descrito na próxima seção.
Trabalhando Com Contêineres OpenVZ
Os contêineres ovz são identificados por número. Eu acho mais fácil referir-me a eles pelo nome/alias, para que eu não tenha que lembrar, por exemplo, que 2010 é o id do contêiner que executa o serviço dns. Além disso, também quero me livrar de lembrar os diferentes comandos vzctl, vzlist, vzquota, etc. e seus parâmetros. Então eu crio alguns scripts simples para me ajudar.
- Primeiro eu crio uma lista de aliases /etc/vz-aliases:
# aliases para openvz VE's 2001 teste 2002 template 2010 dns 2020 ldap 2030 mail 2040 web ... - Para traduzir entre IDs e aliases, crio um script /usr/local/bin/vz-get-alias como abaixo e faço vz-get-veid como um symlink para 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 - Então coloco comandos frequentes para manipular contêineres ovz em um script chamado /usr/local/bin/vz-cmd-generic:
#!/bin/sh set -e ## lidar com vz-list primeiro, já que não requer ID/alias 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 ## os outros comandos requerem um ID ou alias if [ -z "$1" ]; then echo "Uso: $0E faço todos os comandos vz-start, vz-stop, vz-exec, etc. como symlinks para este script 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
O uso é então simples:
- para listar todos os contêineres em execução:
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 - para listar todos os contêineres (incluindo aqueles que não estão em execução):
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 - para iniciar/parar/reiniciar um contêiner: -
vz-start dns vz-stop dnsvz-restart dns- para executar um comando dentro de um contêiner:
vz-exec dns aptitude update - para verificar UBC de um contêiner:
vz-ubc dns - para verificar quota de um contêiner:
vz-quota-ls dns - também é possível usar um ID em vez de um alias:
vz-ubc 2010
É também uma boa ideia manter o alias único entre diferentes servidores reais, para que possamos compartilhar /etc/vz-aliases entre eles sem conflitos.
Este artigo já está bastante longo, então vamos parar por aqui. Continuaremos na próxima parte, onde discutiremos questões como como implantar Detecção de Intrusão com OSSEC, como monitorar e definir parâmetros UBC para contêineres, etc.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.