Tags

freebsd install jail kimsufi symon var_empty

Powered by

blOg
maRkdown
awK
shEll

24/06/2008

[ jail symon var_empty ]

200806240800 jail symon var_empty

Jail et symon

Ou comment ne pas casser son ssh.

J'ai décidé d'utiliser symon pour monitorer mon kimsufi. Le principe: sur l'hôte faire tourner la partie cliente (symon) qui envoie les données vers le collecteur (symux) dans une jail.

Je commence donc par installer symon dans la jail:

jail$ sudo pkg_add -r symon

Les rrdtools font partie du voyage et c'est tant mieux. Le package a créé un utilisateur _symon aux droits limités. Afin de garder un hôte le plus minimaliste possible, je copie uniquement la partie symon :

kimsufi# cp /zfs/jail/www/usr/local/bin/symon /usr/local/bin
kimsufi# cp /zfs/jail/www/usr/local/etc/rc.d/symon /usr/local/etc/rc.d/
kimsufi# cp /zfs/jail/www/usr/local/share/examples/symon/symon.conf /usr/local/etc/

Il ne me reste plus qu'à ajouter mon utilisateur _symon :

kimsufi# grep _symon /zfs/jail/www/etc/passwd
_symon:*:115:1:Symon Account:/var/empty:/usr/sbin/nologin
kimsufi# adduser

Et là c'est le drame. La grosse feign que je suis va ajouter un utilisateur dont le $HOME correspond à /var/empty. Pour bien comprendre le problème, je décide tout à coup de bien pourrir mon terminal avec un zcat /var/log/pflo.0.bz2. Une déconnexion plus tard et quelques reset, je me reconnecte au kimsufi:

maison# ssh kimsufi
ssh_exchange_identification: Connection closed by remote host
maison#

Sueurs froides, panique. Plus d'accès au kimsufi. Ké passa ? Un coup de netboot (FreeBSD 6.2: heureusement que mon / n'est pas en ZFS :), montage de la racine et direction les logs:

netboot# tail /mnt/var/log/auth.log
sshd[96744]: fatal: /var/empty must be owned by root and not group or world-writable

Et ben voila ! chmod 555 /var/empty, reboot sur hd et c'est reparti ! Conclusion: à trop vouloir faire le malin, on oublie les commandes essentielles:

jail$ pkg_info -i symon-2.75
Information for symon-2.75:

Install script:
#!/bin/sh

PATH=/bin:/usr/sbin

USER=_symon
GROUP=daemon
UID=115

case $2 in
  PRE-INSTALL)
  if pw user show "${USER}" 2>/dev/null; then
    echo "You already have a user \"${USER}\", so I will use it."
  else
    if pw useradd ${USER} -u ${UID} -g ${GROUP} -h - \
      -s /usr/sbin/nologin -L daemon -d /var/empty -c "Symon Account"
    then
      echo "Added user \"${USER}\"."
    else
      echo "Adding user \"${USER}\" failed..."
      exit 1
    fi
  fi
  ;;
esac

A venir: je ne veux pas installer syweb (pas de php dans cette jail) pour afficher mes jolis graphes. rrcgi n'est pas encore mon ami mais je ne désespère pas :)


Lien vers ce billet

16/06/2008

[ freebsd kimsufi install jail ]

200806160800 freebsd kimsufi install jail

Mon premier billet

Prélude

Pour mon premier billet, je vais décrire l'installation de mon serveur. Après avoir pris un domaine chez gandi.net, j'ai commandé mon serveur dédié chez ovh (livré avec un peu de retard :) avec FreeBSD 7.0. Installation de la version 32 bits par défaut et un partitionnement des plus simple:

ks34581# cat /etc/fstab 
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad4s1a             /               ufs             rw      1       1
/dev/ad4s1b             /home           ufs             rw      2       2
/dev/ad4s1d             swap            swap            sw      0       0
proc                    /proc           procfs  rw              0       0

Depuis le manager je réinstalle la version 64 bits. J'en profite pour activer mon compte de backup.

Configuration de base

Modification du mot de passe root

ks34581# passwd

Suppression des getty inutiles

ks34581# grep "getty Pc" /etc/ttys
ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv1   "/usr/libexec/getty Pc"         cons25  off secure
ttyv2   "/usr/libexec/getty Pc"         cons25  off secure
ttyv3   "/usr/libexec/getty Pc"         cons25  off secure
ttyv4   "/usr/libexec/getty Pc"         cons25  off secure
ttyv5   "/usr/libexec/getty Pc"         cons25  off secure
ttyv6   "/usr/libexec/getty Pc"         cons25  off secure
ttyv7   "/usr/libexec/getty Pc"         cons25  off secure
ks34581# kill -HUP 1

Heure locale

ks34581# cp /usr/share/zoneinfo/Europe/Paris /etc/localtime

Désactivation du module linux

ks34581# kldunload linux
ks34581# echo 'linux_enable="NO"' >> /etc/rc.conf

Activation de ZFS

ks34581# kldload zfs
ks34581# echo 'zfs_enable="YES"' >> /etc/rc.conf

Activation de lo1 (pour les jails)

ks34581# ifconfig lo1 create
ks34581# ifconfig lo1 inet 172.16.0.254 netmask 255.255.255.0
ks34581# echo 'network_interfaces="lo0 vr0 lo1"'
ks34581# echo '/sbin/ifconfig lo1 create' > /etc/start_if.lo1
ks34581# echo 'ifconfig_lo1="inet 172.16.0.254 netmask 255.255.255.0"' >> /etc/rc.conf
ks34581# echo '172.16.0.254 kimsufi.mondomaine.tld' >> /etc/hosts

ssh sur interface publique

ks34581# echo 'sshd_flags="-o ListenAddress=mon.ip.publique"' >> /etc/rc.conf

syslog en mode local

ks34581# echo 'syslogd_flags="-ss"' >> /etc/rc.conf

named ip v4 only

ks34581# echo 'named_flags="-4"' >> /etc/rc.conf

named sur interface privée

ks34581# grep 172.16.0.254 /etc/named/named.conf
listen-on       { 127.0.0.1; 172.16.0.254; };

Sauvegarde

Pour l'instant, un simple backup ftp fera l'affaire. Je commence par automatiser l'accès au backup:

ks34581# cat >> /root/.netrc
machine backup
login votre_login
password votre_mot_de_passe
^D
ks34581# chmod 600 /root/.netrc
ks34581# echo "adresse.ip.du.backup backup" >> /etc/hosts

Un script sans prétention:

ks34581# cat /root/bin/backup.sh
#!/bin/sh
set -- $(date "+%Y%m%d")
TBZ=kimsufi-$1.tbz
tar cjf $HOME/tmp/$TBZ -T $HOME/etc/backup.cfg 2>/dev/null
cd $HOME/tmp
echo "put $TBZ" | ftp -V backup

Un fichier de configuration minimal:

ks34581# cat /root/etc/backup.cfg
/etc/rc.conf
/etc/ttys
/etc/start_if.lo1
/etc/namedb/named.conf
/root/.netrc
/root/etc/backup.cfg
/root/bin/backup.sh

Tous les jours à 2h45 du matin:

ks34581# echo '45 2 * * *  $HOME/bin/backup.sh' >> /root/.crontab
ks34581# crontab .crontab
ks34581# echo '/root/.crontab' >> /root/etc/backup.cfg

Courriel

Pour l'instant, l'installation de base de FreeBSD me permet d'envoyer des courriels. J'ajuste la configuration de sendmail pour que les jails puissent en profiter. Une jail smtp est prévue pour plus tard.

ks34581# cd /etc/mail
ks34581# echo 'root: une.adresse@email.valide' >> aliases
ks34581# make aliases

Pour pouvoir être utilisé par les jails, sendmail doit écouter sur 172.16.0.254:

ks34581# sed -I'.orig' -e 's/^DS/DS[172.16.0.254]/' /etc/mail/submit.cf
ks34581# echo 'sendmail_submit_flags="-L sm-mta -bd -q30m -ODaemonPortOptions=Addr=172.16.0.254"' >> /etc/rc.conf
ks34581# echo '/etc/mail/submit.cf' >> $HOME/etc/backup.cfg

Il doit aussi accepter de relayer les jails:

ks34581# cat /etc/mail/relay-domains
ks34581.kimsufi.com
localhost
127.0.0.1
.mondomaine.tld

ks34581# make restart
ks34581# echo '/etc/mail/relay-domains' >> /root/etc/backup.cfg

Packet filter

Les jails seront sur le réseau 172.16.0.x, interface lo1. Pour accèder à ces jails du NAT s'impose:

ks34581# echo 'pf_enable="YES"' >> /etc/rc.conf
ks34581# echo 'pflog_enable="YES"' >> /etc/rc.conf

Un (trop) simple /etc/pf.conf:

ext_if="vr0"
int_if="lo1"
set block-policy return
set loginterface $ext_if
set skip on lo0
scrub in
nat on $ext_if from !($ext_if) -> ($ext_if:0)
block log on $ext_if
antispoof quick for { lo0 $int_if }
pass in on $ext_if inet proto tcp from any to ($ext_if) port ssh
pass quick on $int_if
pass out on $ext_if

Seul le ssh du kimsufi est accessible. Je rajouterai les règles rdr et pass au fur et à mesure. Je croise les doigts (un pf.conf qui bloque est si vite arrivé :) et hop:

ks34581# pfctl -n -f /etc/pf.conf
ks34581# /etc/rc.d/pf start
ks34581# echo '/etc/pf.conf' >> /root/etc/backup.cfg

Jail et Zfs

J'utilise Zfs pour définir les partitions de mes jails. N'ayant qu'une seule partition physique à ma disposition, je ne peux pas utiliser les fonctions mirror, raid, raidz ... Je ne compte que sur mes backup !

ks34581# umount /home
ks34581# cat /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad4s1a             /               ufs             rw      1       1
#/dev/ad4s1b            /home           ufs             rw      2       2
/dev/ad4s1d             swap            swap            sw      0       0
proc                    /proc           procfs  rw              0       0

ks34581# zpool create zfs /dev/ad4s1b
ks34581# zfs create zfs/jail

J'active les jails. jail_list est volontairement vide afin de ne pas démarer automatiquement une jail tant qu'elle n'est pas validée (un reboot du serveur est si vite arrivé :)

ks34581# cat >> /etc/rc.conf
jail_enable="YES"
jail_list=""
jail_set_hostname_allow="NO"
# pour postgresql et symon
jail_sysvipc_allow="YES"
^D

Un script pour simplifier l'installation d'une jail:

ks34581# cat /root/bin/mk_jail.sh
 1  #!/bin/sh
 2  
 3  JROOT=zfs/jail
 4  FTP=ftp://ftp.fr.freebsd.org/pub/FreeBSD
 5  CFG=$HOME/tmp/sysinstall.cfg
 6  IFNAME=lo1
 7  
 8  NAME=$1
 9  SIZE=$2
10  HOSTNAME=$3
11  IP=$4
12  
13  zfs create -o quota=${SIZE}M $JROOT/$NAME
14  zfs create -o quota=512M $JROOT/$NAME/tmp
15  zfs create -o quota=512M $JROOT/$NAME/var
16  
17  cat <<EOF > $CFG
18  installRoot=/$JROOT/$NAME
19  _ftpPath=$FTP
20  mediaSetFTP
21  dists=base
22  distSetCustom
23  installCommit
24  EOF
25  
26  sysinstall configFile=$CFG loadConfig
27  
28  cat <<EOF >> /etc/rc.conf
29  jail_${NAME}_rootdir=/$JROOT/$NAME
30  jail_${NAME}_hostname=$HOSTNAME
31  jail_${NAME}_ip=$IP
32  jail_${NAME}_interface=$IFNAME
33  jail_${NAME}_devfs_enable="YES"
34  jail_${NAME}_devfs_ruleset="devfsrules_jail"
35  EOF
36  
37  echo "$IP $HOSTNAME" >> /etc/hosts
38  
39  cat <<EOF > /$JROOT/$NAME/etc/rc.conf
40  sshd_enable="YES"
41  sshd_flags="-o ListenAddress=$IP"
42  syslogd_flags="-ss"
43  sendmail_enable="NONE"
44  EOF
45  
46  cat <<EOF >> /$JROOT/$NAME/etc/hosts
47  $IP $HOSTNAME
48  213.251.173.2 backup
49  172.16.0.254 kimsufi.mondomaine.tld
50  EOF
51  
52  cat <<EOF > /$JROOT/$NAME/etc/resolv.conf
53  nameserver 172.16.0.254
54  EOF
55  
56  sed -I'.orig' -e 's/^DS/DS[172.16.0.254]/' /$JROOT/$NAME/etc/mail/submit.cf
57  
58  cp /etc/localtime /$JROOT/$NAME/etc

Et c'est parti:

ks34581# /root/bin/mk_jail.sh toto 4096 toto.mondomaine.tld 172.16.0.1

Je vérifie que tout se passe bien à coup de:

Tout est OK, je peux activer cette jail au démarrage du serveur:

ks34581# grep jail_list /etc/rc.conf
jail_list="toto"

Si toto.mondomaine.tld pointe bien vers l'adresse publique du serveur, il ne reste plus que la configuration de pf:

ks34581# cat /etc/pf.conf
[ snip ]

rdr pass on $ext_if proto tcp to port 65080 -> 172.16.0.1 port ssh
rdr pass on $ext_if proto tcp to port http -> 172.16.0.1 port http

pass quick on $ext_if inet proto tcp from any to 172.16.0.1 port ssh
pass quick on $ext_if inet proto tcp from any to 172.16.0.1 port http
[ snip ]

Ici la jail ayant pour ip 172.16.0.1 fait tourner un serveur web et son serveur ssh est accessible depuis ip.publique.du.kimsufi port 65080

A faire


Lien vers ce billet