有关OpenVZ部署的一些提示

OpenVZ部署中的一些提示

我严重依赖OpenVZ 。 在本文中,我想分享一些在OpenVZ部署中的个人经验。 我假设读者已经知道如何安装OpenVZOpenVZ的基础知识。 本文通过命令行介绍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-usersftp-user进行连接
    • 清除密码认证被禁用(在ssh-usersftp-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
    • 编辑/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更改为host10IP_ADDRESS更改192.168.100.10 ,我们随时可以使用新的容器。 我们还将为新容器做一个别名,这将在下一节中进行描述。

使用OpenVZ容器

ovz容器由数字标识。 我发现更容易通过name / alias引用它们,所以我不必记得,例如2010是运行dns服务的容器的id。 除此之外,我还想释放自己记住不同的命令vzctlvzlistvzquota等及其参数。 所以我创建一些简单的脚本来帮助自己。

  • 首先我创建一个别名/ 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-startvz-stopvz-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参数等问题。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏