OpenVZ 배포 · 6 min read · Jan 17, 2026
OpenVZ 배포에 대한 몇 가지 팁
OpenVZ 배포에 대한 몇 가지 팁
저는 OpenVZ에 많이 의존하고 있습니다. 이 기사에서는 OpenVZ 배포에 대한 개인적인 경험을 공유하고자 합니다. 독자들은 이미 OpenVZ 설치 방법과 기본 사항을 알고 있다고 가정합니다. 이 기사는 명령줄을 통한 OpenVZ 사용에 대한 몇 가지 팁을 설명합니다. GUI를 선호하신다면 WebVZ 설치 방법으로 돌아가시기 바랍니다.
여기서 설명하는 설정은 다음 지침을 따릅니다:
- 실제 서버에는 최소한의 소프트웨어가 설치되어 있습니다(저는 최소 설치가 포함된 debian Etch를 사용합니다). 배포 과정에서 필요에 따라 추가 애플리케이션이 설치됩니다.
- 실제 서버는 가능한 한 안전해야 합니다. 반면에, 간단하고 쉽게 설정/유지할 수 있도록 하고 싶습니다. 그래서 저는 타협을 선택했습니다: 저는 debian으로 쉽게 배포할 수 있는 것만 의존하고 openwall, selinux, grsecurity와 같은 추가 보안 기능은 사용하지 않습니다.
- 필요한 각 서비스는 별도의 컨테이너에 배포되어 서로 간섭을 최소화합니다.
- 실제 서버와 컨테이너 모두에 대해 OSSEC를 사용하여 침입 탐지를 배포합니다.
- 방화벽(iptables)은 실제 서버에서 설정되며, 컨테이너는 서비스만 실행합니다.
- 저는 실제 서버와 컨테이너에 접근하고 유지 관리하는 유일한 수단으로 ssh를 사용합니다.
기본 보안
OVZ 컨테이너를 배포하기 전에, 저는 실제 서버의 구성을 변경하여 보안을 강화합니다:
- 루트 비밀번호 비활성화
- 모든 것을 sudo할 수 있는 admin-user라는 사용자를 추가합니다; 이 사용자는 간단한 비밀번호를 가지고 있습니다.
- 실제 서버에 ssh로 접속할 수 있는 ssh-user라는 사용자를 추가합니다; 이 사용자의 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-user 계정을 사용하여 sftp를 사용합니다. 만약 누군가 이 사용자의 ssh 키를 얻는다면, 이는 큰 문제가 아닙니다. 왜냐하면 그는 자신의 $HOME 아래의 파일만 접근할 수 있기 때문입니다.
OpenVZ 컨테이너 생성하기
저는 모든 컨테이너에 대한 템플릿을 만드는 것이 더 편리하다고 생각합니다. 그래서 새로운 컨테이너가 필요할 때, 템플릿에서 클론을 만들기만 하면 됩니다. 저는 실제 서버와 컨테이너 모두에 대해 안정적인 debian만 사용합니다. 따라서 첫 번째 단계는 템플릿을 만들고 제 취향에 맞게 조정하는 것입니다:
새 컨테이너 생성:
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 "Usage: $0 "
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 2010Cloning /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 컨테이너는 번호로 식별됩니다. 저는 이름/별칭으로 참조하는 것이 더 쉽다고 생각합니다. 그래서 예를 들어 2010이 dns 서비스가 실행 중인 컨테이너의 ID라는 것을 기억할 필요가 없습니다. 그 외에도 vzctl, vzlist, vzquota 등과 같은 다양한 명령과 그 매개변수를 기억하는 것에서 벗어나고 싶습니다. 그래서 저는 저를 돕기 위해 몇 가지 간단한 스크립트를 만듭니다.
- 먼저 별칭 목록을 /etc/vz-aliases에 생성합니다:
# openvz VE의 별칭 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 "Usage: $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 매개변수를 모니터링하고 설정하는 방법 등에 대해 논의할 것입니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.