Difference between revisions of "Vserver administration"
m (→Errors) |
m |
||
Line 1: | Line 1: | ||
+ | ==Introduction== |
||
+ | Official homepage: [http://linux-vserver.org/ Linux VServer Project] |
||
+ | |||
+ | Good introduction: |
||
+ | * [http://linux-vserver.org/index.php?page=Linux-VServer-Paper Linux-VServer Technology] |
||
+ | * [http://linux-vserver.org/index.php?page=Linux-VServer-Paper-French La Technologie Linux-VServer] |
||
+ | |||
+ | Debian support: |
||
+ | apt-cache search vserver |
||
+ | kernel-patch-vserver - context switching virtual private servers - kernel patch |
||
+ | [http://www.nongnu.org/util-vserver/ util-vserver] - tools for Virtual private servers and context switching |
||
+ | vserver-debiantools - Tools to manage debian virtual servers |
||
+ | |||
+ | Misc: |
||
+ | * [http://www.lri.fr/~fragile/IMG/pdf/Quetier.pdf Benchmark Comparisons between UML, VMWare, vserver and Xen (pdf)] |
||
+ | |||
+ | ==Kernel compilation== |
||
+ | ===The Debian way=== |
||
+ | I followed instructions given in |
||
+ | * /usr/share/doc/kernel-patch-vserver/README.Debian |
||
+ | * [http://linux-vserver.org/Step-by-Step+Guide+2.6 Step-by-step 2.6] |
||
+ | * [http://deb.riseup.net/vserver/preparing/ Debian vservers] |
||
+ | * [http://arnofear.free.fr/linux/vserver-1.php Debian and vserver, french howto] |
||
+ | * [http://lena.franken.de/linux/debian_and_vserver/ Debian and vserver] |
||
+ | <pre> |
||
+ | apt-get install kernel-patch-vserver linux-source-2.6.16 kernel-package fakeroot |
||
+ | cd /usr/src |
||
+ | tar xjf linux-source-2.6.16.tar.bz2 |
||
+ | cd /usr/src/linux-source-2.6.16 |
||
+ | cp config-2.6.16-1-amd64-k8 .config |
||
+ | export PATCH_THE_KERNEL=YES |
||
+ | make-kpkg --rootcmd fakeroot \ |
||
+ | --revision custom01 \ |
||
+ | --added-patches vserver \ |
||
+ | --append-to-version +vserver \ |
||
+ | --initrd \ |
||
+ | binary-arch |
||
+ | "Virtual root device support" -> **y** |
||
+ | "Legacy kernel API" -> y |
||
+ | "Show a Legacy Version ID" -> n |
||
+ | "Disable Legacy Networking Kernel API" -> n |
||
+ | "Enable Proc Security" -> y |
||
+ | "Enable Hard CPU Limits" -> y |
||
+ | "Limit the IDLE task" -> n |
||
+ | "Persistent Inode Context Tagging" -> UID24/GID24 (32/32 probably not yet supported on Reiserfs) |
||
+ | "Tag NFSD User Auth and Files" -> n |
||
+ | "VServer Debugging Code" -> n |
||
+ | </pre> |
||
+ | Install kernel and reboot |
||
+ | ===Vanilla with GrSec, still the Debian way=== |
||
+ | I used linux-2.6.17.14.tar.bz2 + patch-2.6.17.14-vs2.0.2.1-grsec2.1.9.diff |
||
+ | <br>and the config of the Debian kernel config-2.6.17-2-vserver-amd64 |
||
+ | make oldconfig |
||
+ | I activated HARDCPU limits and misc PAX & GRSEC stuff ([http://people.linux-vserver.org/~harry/_README_ this page] can help): |
||
+ | <pre> |
||
+ | CONFIG_VSERVER_HARDCPU=y |
||
+ | CONFIG_VSERVER_HARDCPU_IDLE=y |
||
+ | CONFIG_PAX=y |
||
+ | CONFIG_PAX_SOFTMODE=y |
||
+ | CONFIG_PAX_PT_PAX_FLAGS=y |
||
+ | CONFIG_PAX_HAVE_ACL_FLAGS=y |
||
+ | CONFIG_PAX_NOEXEC=y |
||
+ | CONFIG_PAX_PAGEEXEC=y |
||
+ | CONFIG_PAX_MPROTECT=y |
||
+ | CONFIG_PAX_ASLR=y |
||
+ | CONFIG_PAX_RANDUSTACK=y |
||
+ | CONFIG_PAX_RANDMMAP=y |
||
+ | CONFIG_PAX_MEMORY_SANITIZE=y |
||
+ | CONFIG_GRKERNSEC=y |
||
+ | CONFIG_GRKERNSEC_CUSTOM=y |
||
+ | CONFIG_GRKERNSEC_KMEM=y |
||
+ | CONFIG_GRKERNSEC_IO=y |
||
+ | CONFIG_GRKERNSEC_PROC_MEMMAP=y |
||
+ | CONFIG_GRKERNSEC_BRUTE=y |
||
+ | CONFIG_GRKERNSEC_MODSTOP=y |
||
+ | CONFIG_GRKERNSEC_ACL_HIDEKERN=y |
||
+ | CONFIG_GRKERNSEC_ACL_MAXTRIES=3 |
||
+ | CONFIG_GRKERNSEC_ACL_TIMEOUT=30 |
||
+ | CONFIG_GRKERNSEC_PROC=y |
||
+ | CONFIG_GRKERNSEC_PROC_USER=y |
||
+ | CONFIG_GRKERNSEC_PROC_ADD=y |
||
+ | CONFIG_GRKERNSEC_LINK=y |
||
+ | CONFIG_GRKERNSEC_FIFO=y |
||
+ | CONFIG_GRKERNSEC_CHROOT=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_PIVOT=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_CHDIR=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_FCHDIR=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_MKNOD=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_SHMAT=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_UNIX=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_NICE=y |
||
+ | CONFIG_GRKERNSEC_CHROOT_SYSCTL=y |
||
+ | CONFIG_GRKERNSEC_RESLOG=y |
||
+ | CONFIG_GRKERNSEC_SIGNAL=y |
||
+ | CONFIG_GRKERNSEC_FORKFAIL=y |
||
+ | CONFIG_GRKERNSEC_PROC_IPADDR=y |
||
+ | CONFIG_GRKERNSEC_EXECVE=y |
||
+ | CONFIG_GRKERNSEC_SHM=y |
||
+ | CONFIG_GRKERNSEC_DMESG=y |
||
+ | CONFIG_GRKERNSEC_RANDPID=y |
||
+ | CONFIG_GRKERNSEC_RANDNET=y |
||
+ | CONFIG_GRKERNSEC_SYSCTL=y |
||
+ | CONFIG_GRKERNSEC_FLOODTIME=10 |
||
+ | CONFIG_GRKERNSEC_FLOODBURST=4 |
||
+ | </pre> |
||
+ | make-kpkg --rootcmd fakeroot --us --uc --initrd kernel-image |
||
+ | And I got a linux-image-2.6.17.14-grsec2.1.9-vs2.0.2.1_2.6.17.14-grsec2.1.9-vs2.0.2.1-10.00.Custom_amd64.deb |
||
+ | ==Host preparation== |
||
+ | <pre> |
||
+ | apt-get install util-vserver vserver-debiantools |
||
+ | wget http://vserver.13thfloor.at/Stuff/SCRIPT/testme.sh |
||
+ | chmod +x testme.sh |
||
+ | ./testme.sh |
||
+ | dd bs=1024k count=1024 if=/dev/zero of=1gb.test |
||
+ | modprobe loop |
||
+ | losetup /dev/loop0 ./1gb.test |
||
+ | ./testfs.sh [ -F reiser ] -D /dev/loop0 -M /mnt |
||
+ | losetup -d /dev/loop0 |
||
+ | modprobe -r loop |
||
+ | </pre> |
||
+ | There is no error at this point but as I'm using Reiserfs, I have to activate manually the extended attributes (for lsattr/chattr) by adding the following option to /etc/fstab lines: "attrs" (?? also option acl ??) |
||
+ | <br>Test: lsattr <mount point of a Reiserfs> |
||
+ | ===Change the vserver base path=== |
||
+ | * /etc/vservers/.defaults/vdirbase -> /var/lib/vservers |
||
+ | * I change it to /home/vservers, fix the above symlink |
||
+ | * Re-create the "chroot barrier": %%%setattr --barrier /home/vservers%%%showattr /home -> B for vservers |
||
+ | * Some tools could have /var/lib/vservers hardcoded, for safety I create a symlink /var/lib/vservers pointing to /home/vservers |
||
+ | ==Manipulating vservers== |
||
+ | ===Create a vserver=== |
||
+ | Edit /etc/vservers/newvserver-vars: |
||
+ | <pre> |
||
+ | # cf http://amd64.debian.net/README.mirrors.html |
||
+ | MIRROR="http://ftp.belnet.be/debian-amd64/debian" |
||
+ | INTERFACE="<my_if>" |
||
+ | ARCH="amd64" |
||
+ | </pre> |
||
+ | Create a vserver with 64bits: |
||
+ | LANG=C newvserver --hostname template64 --domain teuwen.org --ip <new_ip>/24 --dist etch |
||
+ | Create a vserver with 32bits emulation: |
||
+ | LANG=C newvserver --hostname template32 --domain teuwen.org --ip <new_ip>/24 --dist etch --arch i386 --mirror "http://<i386_debian_mirror>" |
||
+ | Tuning: |
||
+ | * take care of the config duplication! |
||
+ | * enter the vserver and run tzconfig to choose the proper timezone |
||
+ | * fix /etc/apt/sources.list |
||
+ | * delete rcX.d links to umountroot |
||
+ | * Warning! If you use newvserver as such, it will overwrite the host /etc/motd due to a symlink |
||
+ | * See [Vserver tools] for a patch for newvserver |
||
+ | Removing unnecessary progs (check if you really don't need them!!): |
||
+ | * aptitude apt-utils base-config cpio dselect tasksel libncursesw5 libsigc++-1.2-5c2 libsigc++-2.0-0c2a |
||
+ | * dmidecode laptop-detect module-init-tools |
||
+ | * bsdmainutils ed nano nvi |
||
+ | * groff-base man-db manpages info libgdbm3 |
||
+ | * netcat traceroute wget libssl0.9.8 |
||
+ | * gettext-base libconsole libgnutls11 liblzo2-2 libtasn1-2-bin |
||
+ | |||
+ | ===Automatic start at bootup=== |
||
+ | echo default > /etc/vservers/<my_vserver>/apps/init/mark |
||
+ | Note that at shotdown all vservers will be stopped |
||
+ | ===Delete a vserver=== |
||
+ | Remove dirs /home/vservers/<my_vserver> (depends on the setting of vdirbase, cf. above), /etc/vservers/<my_vserver> and /var/run/vservers/<my_vserver> and the corresponding symlink in /var/run/vservers.rev |
||
+ | ===Config of a vserver=== |
||
+ | ''TODO'' |
||
+ | ?? /etc/vservers/<my_vserver>.conf |
||
+ | ?? S_CAPS |
||
+ | see [http://www.nongnu.org/util-vserver/doc/conf/configuration.html Detailed config page (better choosing boring CSS...)] |
||
+ | ===Run a vserver=== |
||
+ | vserver <my_vserver> start |
||
+ | vserver <my_vserver> enter |
||
+ | If you get "mesg: /dev/pts/1: Operation not permitted", be root on the host with "su -" |
||
+ | vserver <my_vserver> stop |
||
+ | ===Other tools=== |
||
+ | vserver <my_vserver> status |
||
+ | vserver-stat |
||
+ | vtop, vps, vpstree, vkill |
||
+ | /etc/rc.d/init.d/rebootmgr is a daemon which can be called from vservers via vreboot and vhalt to stop/restart the vserver from inside |
||
+ | |||
+ | See also [http://www.nongnu.org/util-vserver/doc/conf/compatibility.html compatibility of util-vserver alpha branch] |
||
+ | |||
+ | See [[Vserver tools]] for my own/modified scripts |
||
+ | |||
+ | ===Duplicate a vserver=== |
||
+ | vserver <my_vserver1> stop |
||
+ | dupvserver --from <my_vserver1> --to <my_vserver2> --ip <new_ip> |
||
+ | dupvserver is broken with the new configuration structure /etc/vservers/<my_vserver>/ |
||
+ | <br>See [[Vserver tools]] for a patch for dupvserver |
||
+ | ===Move/copy a vserver=== |
||
+ | Basically stop the vserver and copy /etc/vservers/<my_vserver> and /home/vservers/<my_vserver> |
||
+ | <br>E.g. rsync -e ssh -avHl /vservers/XX new-server:/vserver/XX |
||
+ | ==Share directories== |
||
+ | To mount a directory from one vserver into another from the host: |
||
+ | vnamespace -e <vserver> mount --rbind /directory/to/mount/somewhere /where/to/mount/it |
||
+ | vnamespace -e <vserver> umount /where/it/was/mounted |
||
+ | |||
+ | or |
||
+ | mount --bind /home /var/lib/vservers/vserver1/home |
||
+ | mount --bind /home /var/lib/vservers/vserver2/home |
||
+ | The second method had the disavantage to require a reboot of the vserver |
||
+ | ==Apt-get== |
||
+ | LANG=C vapt-get <my_vserver1> <my_vserver2> <...> -- install <pkg1> <pkg2> |
||
+ | ==Unify== |
||
+ | cf immutable-linkage-invert flag |
||
+ | |||
+ | Preparation: |
||
+ | mkdir /etc/vservers/template64/apps/vunify |
||
+ | mkdir /etc/vservers/<my_vserver>/apps/vunify |
||
+ | ln -s /etc/vservers/template64 /etc/vservers/<my_vserver>/apps/vunify/refserver.template64 |
||
+ | Unification: |
||
+ | <br>Be sure both vservers are running |
||
+ | vserver <my_vserver> unify [-n] [-R] |
||
+ | -n for dry run, no change |
||
+ | <br>-R for de-unifying |
||
+ | |||
+ | When using tar, add option -U to unlink & recreate files instead of overwriting. |
||
+ | <br>Manual set/unset of the immutable-linkage-invert flag: |
||
+ | setattr --iunlink /my/file |
||
+ | setattr --~iunlink /my/file |
||
+ | ==Disk limits== |
||
+ | cf http://linux-vserver.org/Disk+Limits |
||
+ | |||
+ | * Assign static contexts for the vservers (i.e. have a value between 2 and 49151 in /etc/vservers/<name>/context) |
||
+ | * Mount the filesystem holding the vserver(s) with the tagxid option |
||
+ | ** Check if this is mounted properly: use cat /proc/mounts<br>Ex.: /dev/mapper/Zeus-home /home reiserfs rw,tagxid 0 0 |
||
+ | ** WARNING: if the filesystem is already in use with vservers, nothing prevent you to umount the filesystem while the vservers are still running, which is VERY BAD! Be careful. |
||
+ | ** I could only get the tagxid taken properly into account after a reboot |
||
+ | * Change the xid of already existing files: |
||
+ | chxid -c <my_vserver> -R /home/vservers/<my_vserver> |
||
+ | * Set limits, first method: here limit to 5Gb, 100000 inodes and 5% for the root user<br>For info as I could not get it working properly yet |
||
+ | mkdir /var/cache/vservers |
||
+ | ln -s /var/cache/vservers /etc/vservers/.defaults/cachebase |
||
+ | mkdir /etc/vservers/.defaults/cachebase/<my_server> |
||
+ | ln -s /etc/vservers/.defaults/cachebase/<my_server> /etc/vservers/<my_server>/cache |
||
+ | mkdir -p /etc/vservers/<my_vserver>/dlimits/0 |
||
+ | echo /home/vservers/<my_vserver> > /etc/vservers/<my_vserver>/dlimits/0/directory |
||
+ | echo $(( 5 * 1024 * 1024 )) > /etc/vservers/<my_vserver>/dlimits/0/space_total |
||
+ | echo 100000 > /etc/vservers/<my_vserver>/dlimits/0/inodes_total |
||
+ | echo 5 > /etc/vservers/<my_vserver>/dlimits/0/reserved |
||
+ | * Set limits, second method: |
||
+ | ** Install my vdlimit_ script in /usr/local/sbin: [[Vserver tools]] |
||
+ | ln -s /usr/local/sbin/vdlimit_ /etc/vservers/<my_vserver>/scripts/post-start.d/vdlimit_$((5*1024)) |
||
+ | ==Network== |
||
+ | ===Intern network=== |
||
+ | For pure loopback, use dummy interface, cf http://mirabellug.org/wikini/wakka.php?wiki=VServers |
||
+ | |||
+ | For usable dummy interface, us permanent taps as the uml tools allow: |
||
+ | apt-get install uml-utilities |
||
+ | * Create a pseudo-interface: |
||
+ | <pre> |
||
+ | auto tap0 |
||
+ | iface tap0 inet static |
||
+ | address 192.168.2.1 |
||
+ | netmask 255.255.255.0 |
||
+ | tunctl_user uml-net |
||
+ | </pre> |
||
+ | And configure vservers with the same dev=tap0 |
||
+ | |||
+ | Update: to check but actually all traffic with private or public IP will anyway be done through lo so this is probably not required |
||
+ | ===Configure daemons to listen only to the IP-address of the mothersystem=== |
||
+ | * ''openbsd-inetd:'' (not netkit-inetd) in file /etc/inetd.conf:<br>Prepend the service with <IP pub>:<br>Example |
||
+ | <IP pub>:cvspserver stream tcp nowait root /usr/sbin/tcpd /usr/sbin/cvs-pserver |
||
+ | * ''xinetd:'' (not inetd) in file /etc/xinetd.conf: |
||
+ | defaults |
||
+ | { bind = <IP pub> } |
||
+ | |||
+ | /etc/init.d/xinetd restart |
||
+ | * ''sshd:'' in file /etc/ssh/sshd_config: |
||
+ | ListenAddress <IP pub> |
||
+ | |||
+ | /etc/init.d/ssh restart |
||
+ | * ''exim4:'' in file /etc/exim4/update-exim4.conf.conf: |
||
+ | dc_local_interfaces='<IP pub>' |
||
+ | |||
+ | /etc/init.d/exim4 restart |
||
+ | Better to do it through debconf to avoid surprises at update time: dpkg-reconfigure exim4-config |
||
+ | * ''courier-imap:'' in file /etc/courier/imapd: |
||
+ | ADDRESS=<IP pub> |
||
+ | |||
+ | /etc/init.d/courier-imap restart |
||
+ | * ''courier-imap-ssl:'' in file /etc/courier-ssl/imapd: |
||
+ | ADDRESS=<IP pub> |
||
+ | |||
+ | /etc/init.d/courier-imap-ssl restart |
||
+ | * ''imapproxy:'' in file /etc/imapproxy.conf: |
||
+ | listen_address <IP pub> |
||
+ | Within a vserver, you'll probably hav to reduce the cache_size or give capability to the vserver to raise the setrlimit. |
||
+ | * ''mysql:'' in file /etc/mysql/my.cnf: |
||
+ | bind-address = <IP pub> |
||
+ | * ''vsFtpd:'' in file /etc/vsftpd.conf: |
||
+ | listen_address=<IP pub> |
||
+ | * ''postgresql:'' in file /etc/postgresql/postgresql.conf: |
||
+ | virtual_host = '<IP pub>' |
||
+ | * ''apache2:'' in file /etc/apache2/ports.conf: |
||
+ | Listen <IP pub>:80 |
||
+ | * ''zope2.9:'' in file /etc/zope2.9/<instance>/zope.conf: |
||
+ | ip-address <IP pub> |
||
+ | * ''portmap:'' in file /etc/default/portmap: |
||
+ | OPTIONS="-i <IP pub/loopback>" |
||
+ | * ''dnsmasq:'' in file /etc/dnsmasq.conf: |
||
+ | listen-address=<IP pub> |
||
+ | bind-interfaces |
||
+ | * netstat -lp -> other greedy daemons? |
||
+ | * Seems that this is possible via another method, here it will bind the daemon to the first IP of the interface:<br>exec /usr/sbin/chbind --ip eth0 /path/to/daemon |
||
+ | ===Add an interface without rebooting the vserver=== |
||
+ | * add the ip to the host (ip addr add ...) |
||
+ | * add the ip to the guest's network context |
||
+ | # naddress --add --nid <nid> --ip <ip>/<mask> |
||
+ | * enter the guest (best via ssh) |
||
+ | * restart the services if required<br>(most services will automatically start using the new addresses) |
||
+ | * update the config to reflect the changes for the next guest restart (if desired) |
||
+ | Thanks Herbert! |
||
+ | ==Understanding vservers== |
||
+ | ===Security contextes=== |
||
+ | * Find security context of process N: |
||
+ | chcontext --ctx 1 cat /proc/N/status|grep s_context |
||
+ | * Be in the same context: |
||
+ | chcontext --ctx X /bin/sh |
||
+ | * Master context: 1, example to get all listening ports: |
||
+ | chcontext --ctx 1 netstat -lpn |
||
+ | See also [http://www.solucorp.qc.ca/miscprj/s_context.hc Virtual private servers and security contexts] |
||
+ | ===Ceiling capabilities=== |
||
+ | * As non-root, check capBset: |
||
+ | cat /proc/self/status |
||
+ | * Reduce ceiling caps: |
||
+ | reducecap --secure /bin/sh |
||
+ | * Now capBset is reduced: |
||
+ | cat /proc/self/status |
||
+ | su |
||
+ | * capEff raised a bit but not enough to do for example /sbin/ifconfig eth0 down |
||
+ | * See also [Capabilities in Linux|http://www.lids.org/lids-howto/node34.html] |
||
+ | |||
+ | ==Security== |
||
+ | Not necessarily related to vserver but always useful to consider :-) |
||
+ | *ssh |
||
+ | **Use the AllowUsers option to give ssh rights only to those who need it. |
||
+ | **Brute-force protection: apt-get install denyhosts |
||
+ | *iptables (on the host) |
||
+ | **cf --uid-owner and other --XXX-owner options<br>on OUTPUT table to avoid download of malicious code<br>on INPUT table to avoid bindshells |
||
+ | *resource limits |
||
+ | ** cpu/mem |
||
===GrSec=== |
===GrSec=== |
||
* http://people.linux-vserver.org/~harry/_README_ |
* http://people.linux-vserver.org/~harry/_README_ |
||
− | + | ==Iptables Proxy== |
|
* http://www.virtuaserver.com.br/forum/viewtopic.php?t=130 |
* http://www.virtuaserver.com.br/forum/viewtopic.php?t=130 |
||
+ | |||
+ | ===Other tricks=== |
||
+ | * For other tweaks, see http://deb.riseup.net/vserver/usage/ : |
||
+ | ** What if I accidentally removed a vserver while it was running? |
||
+ | ** Howto convert legacy vservers to the new format |
||
+ | ** Howto add an IP to a running vserver, without restarting it? |
||
+ | ** Howto make the host interface and IP available in a vserver |
||
+ | ** Howto impose disk limits in each vserver |
||
+ | * http://www.paul.sladen.org/vserver/faq |
||
+ | * [http://linux-vserver.org/ProblematicPrograms Problematic programs] |
||
+ | |||
+ | ==TODO== |
||
+ | * http://www.nongnu.org/util-vserver/doc/conf/compatibility.html |
||
+ | * http://linux-vserver.derjohn.de/ |
||
+ | * [VServer wiki|http://vserver.strahlungsfrei.de/tiki-index.php] |
||
+ | * [Administrator Guide|http://linux-vserver.org/linux-vserver_administrators_gide] |
||
+ | * [Debian newvserver|http://www.paul.sladen.org/vserver/debian/] |
||
+ | * [Howto Debian vserver|http://www.howtoforge.com/linux_vserver_debian] |
||
+ | * ?? apt-get install vlan |
||
+ | * ?? ipac-ng |
||
+ | * With grsecurity? |
||
+ | ** http://linux-vserver.org/grsecurityHowto |
||
+ | ** http://team.lea-linux.org/bgigon/vserver/mirror/ChangeLog |
||
+ | ** http://pax.grsecurity.net/ apparently not yet stable for 2.6 and not yet available for amd64 |
||
+ | ** Interessant: http://ludit.kuleuven.be/software/vserver/_README_ |
||
+ | * CPU limit |
||
+ | ** http://linux-vserver.org/Linux-VServer-Paper-06 |
||
+ | ** http://list.linux-vserver.org/archive/vserver/msg08134.html |
||
+ | * BW limit |
||
+ | ** http://lartc.org/howto/ |
||
+ | * http://linux-vserver.org/HowTo+Read+ProcFS |
||
+ | * http://linux-vserver.org/HistoryList?full=1 |
||
+ | * Publish Munin scripts |
||
+ | * http://linux-vserver.org/VServer+installation+Fedora+Core+5 |
||
+ | * http://vserver.13thfloor.at/Experimental/ |
||
+ | * http://www.archivesat.com/Linux-VServer/ |
||
+ | * http://www.solucorp.qc.ca/miscprj/s_context.hc?s1=1&s2=0&s3=0&s4=0&full=0&prjstate=1&nodoc=0 |
||
+ | * (fr) http://fr.wikibooks.org/wiki/Vserver |
Revision as of 21:24, 17 February 2007
Introduction
Official homepage: Linux VServer Project
Good introduction:
Debian support:
apt-cache search vserver kernel-patch-vserver - context switching virtual private servers - kernel patch util-vserver - tools for Virtual private servers and context switching vserver-debiantools - Tools to manage debian virtual servers
Misc:
Kernel compilation
The Debian way
I followed instructions given in
- /usr/share/doc/kernel-patch-vserver/README.Debian
- Step-by-step 2.6
- Debian vservers
- Debian and vserver, french howto
- Debian and vserver
apt-get install kernel-patch-vserver linux-source-2.6.16 kernel-package fakeroot cd /usr/src tar xjf linux-source-2.6.16.tar.bz2 cd /usr/src/linux-source-2.6.16 cp config-2.6.16-1-amd64-k8 .config export PATCH_THE_KERNEL=YES make-kpkg --rootcmd fakeroot \ --revision custom01 \ --added-patches vserver \ --append-to-version +vserver \ --initrd \ binary-arch "Virtual root device support" -> **y** "Legacy kernel API" -> y "Show a Legacy Version ID" -> n "Disable Legacy Networking Kernel API" -> n "Enable Proc Security" -> y "Enable Hard CPU Limits" -> y "Limit the IDLE task" -> n "Persistent Inode Context Tagging" -> UID24/GID24 (32/32 probably not yet supported on Reiserfs) "Tag NFSD User Auth and Files" -> n "VServer Debugging Code" -> n
Install kernel and reboot
Vanilla with GrSec, still the Debian way
I used linux-2.6.17.14.tar.bz2 + patch-2.6.17.14-vs2.0.2.1-grsec2.1.9.diff
and the config of the Debian kernel config-2.6.17-2-vserver-amd64
make oldconfig
I activated HARDCPU limits and misc PAX & GRSEC stuff (this page can help):
CONFIG_VSERVER_HARDCPU=y CONFIG_VSERVER_HARDCPU_IDLE=y CONFIG_PAX=y CONFIG_PAX_SOFTMODE=y CONFIG_PAX_PT_PAX_FLAGS=y CONFIG_PAX_HAVE_ACL_FLAGS=y CONFIG_PAX_NOEXEC=y CONFIG_PAX_PAGEEXEC=y CONFIG_PAX_MPROTECT=y CONFIG_PAX_ASLR=y CONFIG_PAX_RANDUSTACK=y CONFIG_PAX_RANDMMAP=y CONFIG_PAX_MEMORY_SANITIZE=y CONFIG_GRKERNSEC=y CONFIG_GRKERNSEC_CUSTOM=y CONFIG_GRKERNSEC_KMEM=y CONFIG_GRKERNSEC_IO=y CONFIG_GRKERNSEC_PROC_MEMMAP=y CONFIG_GRKERNSEC_BRUTE=y CONFIG_GRKERNSEC_MODSTOP=y CONFIG_GRKERNSEC_ACL_HIDEKERN=y CONFIG_GRKERNSEC_ACL_MAXTRIES=3 CONFIG_GRKERNSEC_ACL_TIMEOUT=30 CONFIG_GRKERNSEC_PROC=y CONFIG_GRKERNSEC_PROC_USER=y CONFIG_GRKERNSEC_PROC_ADD=y CONFIG_GRKERNSEC_LINK=y CONFIG_GRKERNSEC_FIFO=y CONFIG_GRKERNSEC_CHROOT=y CONFIG_GRKERNSEC_CHROOT_PIVOT=y CONFIG_GRKERNSEC_CHROOT_CHDIR=y CONFIG_GRKERNSEC_CHROOT_FCHDIR=y CONFIG_GRKERNSEC_CHROOT_MKNOD=y CONFIG_GRKERNSEC_CHROOT_SHMAT=y CONFIG_GRKERNSEC_CHROOT_UNIX=y CONFIG_GRKERNSEC_CHROOT_NICE=y CONFIG_GRKERNSEC_CHROOT_SYSCTL=y CONFIG_GRKERNSEC_RESLOG=y CONFIG_GRKERNSEC_SIGNAL=y CONFIG_GRKERNSEC_FORKFAIL=y CONFIG_GRKERNSEC_PROC_IPADDR=y CONFIG_GRKERNSEC_EXECVE=y CONFIG_GRKERNSEC_SHM=y CONFIG_GRKERNSEC_DMESG=y CONFIG_GRKERNSEC_RANDPID=y CONFIG_GRKERNSEC_RANDNET=y CONFIG_GRKERNSEC_SYSCTL=y CONFIG_GRKERNSEC_FLOODTIME=10 CONFIG_GRKERNSEC_FLOODBURST=4
make-kpkg --rootcmd fakeroot --us --uc --initrd kernel-image
And I got a linux-image-2.6.17.14-grsec2.1.9-vs2.0.2.1_2.6.17.14-grsec2.1.9-vs2.0.2.1-10.00.Custom_amd64.deb
Host preparation
apt-get install util-vserver vserver-debiantools wget http://vserver.13thfloor.at/Stuff/SCRIPT/testme.sh chmod +x testme.sh ./testme.sh dd bs=1024k count=1024 if=/dev/zero of=1gb.test modprobe loop losetup /dev/loop0 ./1gb.test ./testfs.sh [ -F reiser ] -D /dev/loop0 -M /mnt losetup -d /dev/loop0 modprobe -r loop
There is no error at this point but as I'm using Reiserfs, I have to activate manually the extended attributes (for lsattr/chattr) by adding the following option to /etc/fstab lines: "attrs" (?? also option acl ??)
Test: lsattr <mount point of a Reiserfs>
Change the vserver base path
- /etc/vservers/.defaults/vdirbase -> /var/lib/vservers
- I change it to /home/vservers, fix the above symlink
- Re-create the "chroot barrier": %%%setattr --barrier /home/vservers%%%showattr /home -> B for vservers
- Some tools could have /var/lib/vservers hardcoded, for safety I create a symlink /var/lib/vservers pointing to /home/vservers
Manipulating vservers
Create a vserver
Edit /etc/vservers/newvserver-vars:
# cf http://amd64.debian.net/README.mirrors.html MIRROR="http://ftp.belnet.be/debian-amd64/debian" INTERFACE="<my_if>" ARCH="amd64"
Create a vserver with 64bits:
LANG=C newvserver --hostname template64 --domain teuwen.org --ip <new_ip>/24 --dist etch
Create a vserver with 32bits emulation:
LANG=C newvserver --hostname template32 --domain teuwen.org --ip <new_ip>/24 --dist etch --arch i386 --mirror "http://<i386_debian_mirror>"
Tuning:
- take care of the config duplication!
- enter the vserver and run tzconfig to choose the proper timezone
- fix /etc/apt/sources.list
- delete rcX.d links to umountroot
- Warning! If you use newvserver as such, it will overwrite the host /etc/motd due to a symlink
- See [Vserver tools] for a patch for newvserver
Removing unnecessary progs (check if you really don't need them!!):
- aptitude apt-utils base-config cpio dselect tasksel libncursesw5 libsigc++-1.2-5c2 libsigc++-2.0-0c2a
- dmidecode laptop-detect module-init-tools
- bsdmainutils ed nano nvi
- groff-base man-db manpages info libgdbm3
- netcat traceroute wget libssl0.9.8
- gettext-base libconsole libgnutls11 liblzo2-2 libtasn1-2-bin
Automatic start at bootup
echo default > /etc/vservers/<my_vserver>/apps/init/mark
Note that at shotdown all vservers will be stopped
Delete a vserver
Remove dirs /home/vservers/<my_vserver> (depends on the setting of vdirbase, cf. above), /etc/vservers/<my_vserver> and /var/run/vservers/<my_vserver> and the corresponding symlink in /var/run/vservers.rev
Config of a vserver
TODO
?? /etc/vservers/<my_vserver>.conf ?? S_CAPS
see Detailed config page (better choosing boring CSS...)
Run a vserver
vserver <my_vserver> start vserver <my_vserver> enter
If you get "mesg: /dev/pts/1: Operation not permitted", be root on the host with "su -"
vserver <my_vserver> stop
Other tools
vserver <my_vserver> status vserver-stat vtop, vps, vpstree, vkill
/etc/rc.d/init.d/rebootmgr is a daemon which can be called from vservers via vreboot and vhalt to stop/restart the vserver from inside
See also compatibility of util-vserver alpha branch
See Vserver tools for my own/modified scripts
Duplicate a vserver
vserver <my_vserver1> stop dupvserver --from <my_vserver1> --to <my_vserver2> --ip <new_ip>
dupvserver is broken with the new configuration structure /etc/vservers/<my_vserver>/
See Vserver tools for a patch for dupvserver
Move/copy a vserver
Basically stop the vserver and copy /etc/vservers/<my_vserver> and /home/vservers/<my_vserver>
E.g. rsync -e ssh -avHl /vservers/XX new-server:/vserver/XX
To mount a directory from one vserver into another from the host:
vnamespace -e <vserver> mount --rbind /directory/to/mount/somewhere /where/to/mount/it vnamespace -e <vserver> umount /where/it/was/mounted
or
mount --bind /home /var/lib/vservers/vserver1/home mount --bind /home /var/lib/vservers/vserver2/home
The second method had the disavantage to require a reboot of the vserver
Apt-get
LANG=C vapt-get <my_vserver1> <my_vserver2> <...> -- install <pkg1> <pkg2>
Unify
cf immutable-linkage-invert flag
Preparation:
mkdir /etc/vservers/template64/apps/vunify mkdir /etc/vservers/<my_vserver>/apps/vunify ln -s /etc/vservers/template64 /etc/vservers/<my_vserver>/apps/vunify/refserver.template64
Unification:
Be sure both vservers are running
vserver <my_vserver> unify [-n] [-R]
-n for dry run, no change
-R for de-unifying
When using tar, add option -U to unlink & recreate files instead of overwriting.
Manual set/unset of the immutable-linkage-invert flag:
setattr --iunlink /my/file setattr --~iunlink /my/file
Disk limits
cf http://linux-vserver.org/Disk+Limits
- Assign static contexts for the vservers (i.e. have a value between 2 and 49151 in /etc/vservers/<name>/context)
- Mount the filesystem holding the vserver(s) with the tagxid option
- Check if this is mounted properly: use cat /proc/mounts
Ex.: /dev/mapper/Zeus-home /home reiserfs rw,tagxid 0 0 - WARNING: if the filesystem is already in use with vservers, nothing prevent you to umount the filesystem while the vservers are still running, which is VERY BAD! Be careful.
- I could only get the tagxid taken properly into account after a reboot
- Check if this is mounted properly: use cat /proc/mounts
- Change the xid of already existing files:
chxid -c <my_vserver> -R /home/vservers/<my_vserver>
- Set limits, first method: here limit to 5Gb, 100000 inodes and 5% for the root user
For info as I could not get it working properly yet
mkdir /var/cache/vservers ln -s /var/cache/vservers /etc/vservers/.defaults/cachebase mkdir /etc/vservers/.defaults/cachebase/<my_server> ln -s /etc/vservers/.defaults/cachebase/<my_server> /etc/vservers/<my_server>/cache mkdir -p /etc/vservers/<my_vserver>/dlimits/0 echo /home/vservers/<my_vserver> > /etc/vservers/<my_vserver>/dlimits/0/directory echo $(( 5 * 1024 * 1024 )) > /etc/vservers/<my_vserver>/dlimits/0/space_total echo 100000 > /etc/vservers/<my_vserver>/dlimits/0/inodes_total echo 5 > /etc/vservers/<my_vserver>/dlimits/0/reserved
- Set limits, second method:
- Install my vdlimit_ script in /usr/local/sbin: Vserver tools
ln -s /usr/local/sbin/vdlimit_ /etc/vservers/<my_vserver>/scripts/post-start.d/vdlimit_$((5*1024))
Network
Intern network
For pure loopback, use dummy interface, cf http://mirabellug.org/wikini/wakka.php?wiki=VServers
For usable dummy interface, us permanent taps as the uml tools allow:
apt-get install uml-utilities
- Create a pseudo-interface:
auto tap0 iface tap0 inet static address 192.168.2.1 netmask 255.255.255.0 tunctl_user uml-net
And configure vservers with the same dev=tap0
Update: to check but actually all traffic with private or public IP will anyway be done through lo so this is probably not required
Configure daemons to listen only to the IP-address of the mothersystem
- openbsd-inetd: (not netkit-inetd) in file /etc/inetd.conf:
Prepend the service with <IP pub>:
Example
<IP pub>:cvspserver stream tcp nowait root /usr/sbin/tcpd /usr/sbin/cvs-pserver
- xinetd: (not inetd) in file /etc/xinetd.conf:
defaults { bind = <IP pub> }
/etc/init.d/xinetd restart
- sshd: in file /etc/ssh/sshd_config:
ListenAddress <IP pub>
/etc/init.d/ssh restart
- exim4: in file /etc/exim4/update-exim4.conf.conf:
dc_local_interfaces='<IP pub>'
/etc/init.d/exim4 restart
Better to do it through debconf to avoid surprises at update time: dpkg-reconfigure exim4-config
- courier-imap: in file /etc/courier/imapd:
ADDRESS=<IP pub>
/etc/init.d/courier-imap restart
- courier-imap-ssl: in file /etc/courier-ssl/imapd:
ADDRESS=<IP pub>
/etc/init.d/courier-imap-ssl restart
- imapproxy: in file /etc/imapproxy.conf:
listen_address <IP pub>
Within a vserver, you'll probably hav to reduce the cache_size or give capability to the vserver to raise the setrlimit.
- mysql: in file /etc/mysql/my.cnf:
bind-address = <IP pub>
- vsFtpd: in file /etc/vsftpd.conf:
listen_address=<IP pub>
- postgresql: in file /etc/postgresql/postgresql.conf:
virtual_host = '<IP pub>'
- apache2: in file /etc/apache2/ports.conf:
Listen <IP pub>:80
- zope2.9: in file /etc/zope2.9/<instance>/zope.conf:
ip-address <IP pub>
- portmap: in file /etc/default/portmap:
OPTIONS="-i <IP pub/loopback>"
- dnsmasq: in file /etc/dnsmasq.conf:
listen-address=<IP pub> bind-interfaces
- netstat -lp -> other greedy daemons?
- Seems that this is possible via another method, here it will bind the daemon to the first IP of the interface:
exec /usr/sbin/chbind --ip eth0 /path/to/daemon
Add an interface without rebooting the vserver
- add the ip to the host (ip addr add ...)
- add the ip to the guest's network context
# naddress --add --nid <nid> --ip <ip>/<mask>
- enter the guest (best via ssh)
- restart the services if required
(most services will automatically start using the new addresses) - update the config to reflect the changes for the next guest restart (if desired)
Thanks Herbert!
Understanding vservers
Security contextes
- Find security context of process N:
chcontext --ctx 1 cat /proc/N/status|grep s_context
- Be in the same context:
chcontext --ctx X /bin/sh
- Master context: 1, example to get all listening ports:
chcontext --ctx 1 netstat -lpn
See also Virtual private servers and security contexts
Ceiling capabilities
- As non-root, check capBset:
cat /proc/self/status
- Reduce ceiling caps:
reducecap --secure /bin/sh
- Now capBset is reduced:
cat /proc/self/status su
- capEff raised a bit but not enough to do for example /sbin/ifconfig eth0 down
- See also [Capabilities in Linux|http://www.lids.org/lids-howto/node34.html]
Security
Not necessarily related to vserver but always useful to consider :-)
- ssh
- Use the AllowUsers option to give ssh rights only to those who need it.
- Brute-force protection: apt-get install denyhosts
- iptables (on the host)
- cf --uid-owner and other --XXX-owner options
on OUTPUT table to avoid download of malicious code
on INPUT table to avoid bindshells
- cf --uid-owner and other --XXX-owner options
- resource limits
- cpu/mem
GrSec
Iptables Proxy
Other tricks
- For other tweaks, see http://deb.riseup.net/vserver/usage/ :
- What if I accidentally removed a vserver while it was running?
- Howto convert legacy vservers to the new format
- Howto add an IP to a running vserver, without restarting it?
- Howto make the host interface and IP available in a vserver
- Howto impose disk limits in each vserver
- http://www.paul.sladen.org/vserver/faq
- Problematic programs
TODO
- http://www.nongnu.org/util-vserver/doc/conf/compatibility.html
- http://linux-vserver.derjohn.de/
- [VServer wiki|http://vserver.strahlungsfrei.de/tiki-index.php]
- [Administrator Guide|http://linux-vserver.org/linux-vserver_administrators_gide]
- [Debian newvserver|http://www.paul.sladen.org/vserver/debian/]
- [Howto Debian vserver|http://www.howtoforge.com/linux_vserver_debian]
- ?? apt-get install vlan
- ?? ipac-ng
- With grsecurity?
- http://linux-vserver.org/grsecurityHowto
- http://team.lea-linux.org/bgigon/vserver/mirror/ChangeLog
- http://pax.grsecurity.net/ apparently not yet stable for 2.6 and not yet available for amd64
- Interessant: http://ludit.kuleuven.be/software/vserver/_README_
- CPU limit
- BW limit
- http://linux-vserver.org/HowTo+Read+ProcFS
- http://linux-vserver.org/HistoryList?full=1
- Publish Munin scripts
- http://linux-vserver.org/VServer+installation+Fedora+Core+5
- http://vserver.13thfloor.at/Experimental/
- http://www.archivesat.com/Linux-VServer/
- http://www.solucorp.qc.ca/miscprj/s_context.hc?s1=1&s2=0&s3=0&s4=0&full=0&prjstate=1&nodoc=0
- (fr) http://fr.wikibooks.org/wiki/Vserver