OpenVZ部署中的一些提示
我严重依赖OpenVZ 。 在本文中,我想分享一些在OpenVZ部署中的个人经验。 我假设读者已经知道如何安装OpenVZ和OpenVZ的基础知识。 本文通过命令行介绍OpenVZ使用的一些提示。 如果您喜欢GUI命令行,请转到如何安装WebVZ 。
这里描述的设置遵循以下准则:
- 真正的服务器安装了最少的软件(我使用debian Etch,安装最少)作为起点。 根据需要安装其他应用程序。
- 真正的服务器应尽可能安全。 另一方面,我想保持简单易用的设置/维护。 所以我选择了一个妥协:我只依赖于可以轻松部署debian的东西,不要再采取额外的安全措施,比如openwall,selinux,grsecurity等。
- 每个所需的服务都部署在一个单独的容器中,以使它们尽可能少地互相干扰
- 使用OSSEC在真实服务器上对真实服务器和容器的入侵检测进行脱机检测
- 防火墙(iptables)在真实服务器上完成; 容器仅运行服务
- 我依靠ssh作为访问和维护真实服务器和容器的唯一方法。
基本安全
在部署任何ovz容器之前,我对实际服务器的配置进行了一些更改,使其更加安全:
- 禁用root密码
- 添加一个可以sudo一切的用户
管理员
; 这个用户有一个简单的密码 - 添加一个
ssh用户
谁可以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-user
和sftp-user
上传ssh密钥后) - sshd在非标准端口上运行
- 只允许
上述方案的工作原理如下:连接到真实的服务器,我们连接为ssh-user
。 那么我们必须输入admin-user的
密码。 如果有人为ssh-user
获取ssh密钥,他仍然必须知道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并取消选中
/依赖关系处理/自动安装推荐的包
- 删除我不想在模板中的一些包:
bsdmainutils
ed
groff-base
info
iptables
libconsole
libgdbm3
man-db
manpages
nano
netcat
openssh-client
openssh-server
quota
ssh
traceroute
- 运行aptitude并取消选中
- 编辑
/etc/apt/sources.list
将其调整为我的偏好 - 然后我停止模板:
vzctl stop 2002
那么任何时候我需要一个新的容器,我使用一个脚本vz-clone
如下:
#!/bin/bash # script to clone an openvz VE set -e if [ -z "$2" ]; then echo "Usage: $0 <veid> <new-id>" exit 1 fi cfg="/etc/vz/conf/$1.conf" newcfg="/etc/vz/conf/$2.conf" if [ ! -e $cfg ]; then echo $cfg not found! exit 1 fi VEID=$1 . $cfg veprivate="$VE_PRIVATE" VEID=$2 . $cfg newveprivate="$VE_PRIVATE" if [ -e $newcfg ]; then echo $newcfg already exists! exit 1 fi if [ -e $newveprivate ]; then echo $newveprivate already exists! exit 1 fi if vzlist | fgrep -w -q $1 then vzctl stop $1 fi echo "Cloning $cfg to $newcfg" cp -a $cfg $newcfg echo "Cloning $veprivate to $newveprivate" mkdir -p $newveprivate cd $veprivate tar cf - . | (cd $newveprivate && tar xf -) echo "Do not forget to edit $newcfg (you need to edit at least HOSTNAME and IP_ADDRESS)" echo "Also do not forget to make an alias"
用法:
sudo sh vz-clone 2002 2010
Cloning /etc/vz/conf/2002.conf to /etc/vz/conf/2010.conf
Cloning /vz/private/2002 to /vz/private/2010
Do not forget to edit /etc/vz/conf/2010.conf (you need to edit at least HOSTNAME and IP_ADDRESS)
Also do not forget to make an alias
根据您的/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容器由数字标识。 我发现更容易通过name / alias引用它们,所以我不必记得,例如2010
是运行dns服务的容器的id。 除此之外,我还想释放自己记住不同的命令vzctl
, vzlist
, vzquota
等及其参数。 所以我创建一些简单的脚本来帮助自己。
- 首先我创建一个别名
/ etc / vz-aliases
列表:# aliases for 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 ## handle vz-list first, since it requires no 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 ## the other commands require an ID or alias if [ -z "$1" ]; then echo "Usage: $0 <veid>|<alias> [<args>]" 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-start
,vz-stop
,vz-exec
等作为符号链接到此脚本vz-cmd-generic
。
用法很简单:
- 列出所有正在运行的容器:
vz-list
VEID 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 -a
VEID 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 dns
vz-restart dns
- 在容器内执行一个命令:
vz-exec dns aptitude update
- 检查UBC的容器:
vz-ubc dns
- 检查容器的配额:
vz-quota-ls dns
- 还可以使用ID而不是别名:
vz-ubc 2010
在不同的真实服务器之间保持别名是独一无二的,所以我们可以在它们之间共享/ etc / vz-aliases
,而不会有冲突。
这篇文章已经很久了,所以让我们在这里停下来。 我们将继续在下一部分中讨论如何使用OSSEC部署入侵检测,如何监控和设置容器的UBC参数等问题。