unix

  • sslh : https et ssh sur un même port 12 March 2013

    sslh : ssl/ssh multiplexer
    site officiel sslh : rutschle.net

    sslh est un proxy de couche 7 capable de filtrer et différencier les trames.

    Il sait traiter des connections de type HTTP, HTTPS, SSH, OpenVPN, tinc, XMPP ou n’importe quel protocole que l’on peut vérifier avec une expression régulière. Le tout sur le même port.

    But :
    Pouvoir se connecter en SSH en utilisant le port 443 tout en pouvant servir des pages Web en HTTPS, avec une seule adresse IP.
    L’idée est de pouvoir ce connecter sur son serveur en SSH depuis n’importe quel réseau, le port 443 étant rarement bloqué.

    Contexte :
    Je souhaite ici pouvoir accéder à ma jail ‘ssh’ via un ‘ssh monip -p 443′ tout en gardant sur mon autre jail le port 443 pour le http sécurisé.

    sslh

    On vois sur le schéma ci-dessus qu’il est impossible de ce connecter via le réseau ‘orange’ en ssh sur le port 22 (Le réseau orange étant un réseau filtré ne laissant sortir que le http/https/dns).

    Prérequis :

    • installer le paquet net/sslh
    • avoir un sshd
    • avoir un apache sur le port 443
    • quelques règles pf

    Configuration :

    # cat /etc/rc.conf
    #Enable sslh
    sslh_enable="YES"
    sslh_mode="select"                 # select (single-thread) ou fork 
    sslh_listening="x.x.x.x:443"       # mon ip publique
    sslh_sshtarget="192.168.0.1:222"   # ip de mon serveur ssh
    sslh_ssltarget="192.168.0.2:443"   # ip de mon serveur https
    sslh_sshtimeout="4"                # time out bascule https/ssh
      • sslh_listening : l’adresse sur laquelle écoute sslh
      • sslh_sshtarget : l’adresse et port vers qui renvoyer les requêtes ssh
      • sslh_sshtarget : l’adresse et port vers qui renvoyer les requêtes https

    Lancement du daemon :

    # /usr/local/etc/sslh start

    pf.conf coté hôte :

    # cat /etc/pf.conf
    [...]
    nat on $if_publique from $jail_network to !$jail_network -> $ipublique
    rdr on $if_publique proto tcp from any to $ipublique port 80 -> $jailhttp port 80
    [...]
    pass in quick proto tcp from any to ($if) port 443
    pass in on $if proto tcp from any to $jailhttp port 80

    Bilan positif :

    • Deux services accessible à travers d’un seul port.
    • Deux point d’entre ssh distinct sur une seule IP publique (22/443).

    Bilan négatif :

    • L’IP source de visite dans les logs https d’apache est remplacée par celle de l’hôte.
  • Changer le beadm actif d’un FreeBSD via le rescue mode OVH 19 February 2013

    Contexte :

    Nous imaginons ici que suite à une modification, upgrade du système ou erreur dans un paramètre de démarrage, notre machine n’est plus accessible après un reboot.

    Prérequis :

    • Avoir un FreeBSD installé et configuré avec beadm.
    • Avoir plusieurs ‘boot environment’ fonctionnels.

    État avant ‘plantage’ :

    Liste des beadm actuels.

    root@host:/root # beadm list
    BE                   Active Mountpoint  Space Created
    00-first-install     -      -            1.2M 2013-02-08 10:49
    01-disable-ipv6      -      -            1.2M 2013-02-10 13:21
    02-disable-sendmail  -      -            1.1M 2013-02-10 15:57
    03-load-modules      -      -            1.0M 2013-02-10 16:15
    04-jail              -      -            1.1M 2013-02-10 16:26
    05-pkgng             -      -          950.0K 2013-02-10 16:56
    06-minpkg            -      -            3.5M 2013-02-10 17:43
    07-some-pkg-and-jail -      -            6.3M 2013-02-11 08:30
    08-zfs-periodic      -      -            1.3M 2013-02-17 16:19
    new-09               NR     /          838.9M 2013-02-18 10:37
    root@cahost:/root #

    Nous imaginons ici que le ‘boot environment’ new-09 est corrompu et non bootable.

    Liste des volumes zfs dans zroot/ROOT.

    root@host:/root # zfs list | grep ROOT/
    zroot/ROOT/00-first-install       446K  1.77T   637M  legacy
    zroot/ROOT/01-disable-ipv6        486K  1.77T   637M  legacy
    zroot/ROOT/02-disable-sendmail    645K  1.77T   637M  legacy
    zroot/ROOT/03-load-modules        592K  1.77T   637M  legacy
    zroot/ROOT/04-jail                518K  1.77T   637M  legacy
    zroot/ROOT/05-pkgng               586K  1.77T   637M  legacy
    zroot/ROOT/06-minpkg              613K  1.77T   657M  legacy
    zroot/ROOT/07-some-pkg-and-jail   958K  1.77T   814M  legacy
    zroot/ROOT/08-zfs-periodic       1019K  1.77T   814M  legacy
    zroot/ROOT/new-09                 839M  1.77T   814M  legacy
    root@cahost:/root #

    Redémarrage de la machine :

    root@host:/root # shutdown -r now

    Indisponibilité :

    Nous constatons l’indisponibilité de notre machine.

    nomad@client:~$ ping -c 5 host.x.x
    PING host.x.x (x.x.x.x: 56 data bytes
    
    --- host.x.x ping statistics ---
    5 packets transmitted, 0 packets received, 100.0% packet loss

    Reboot en rescue-pro :

    Via le manager OVH, il faut configurer la machine pour booter en mode rescue-pro et demander un reboot hard.

    Reconnexion à la machine en mode rescue.

    Une fois le mail contenant les ‘Paramètres d’accès au mode RESCUE’ reçu, nous pouvons à nouveau nous connecter en ssh.

    nomad@client:~$ ssh root@cahost
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ECDSA key sent by the remote host is
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
    Please contact your system administrator.
    Add correct host key in /home/nomad/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /home/nomad/.ssh/known_hosts:503
    ECDSA host key for cahost.neuronfarm.net has changed and you have requested strict checking.
    Host key verification failed.
    nomad@client:~$

    Afin d’éviter d’effacer la vrai bonne clef dans notre ~/.ssh/known_hosts nous allons nous connecter en demandant à ssh de ne pas en tenir compte :

    nomad@client:~$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@host.x.x
    Warning: Permanently added 'host.x.x' (ECDSA) to the list of known hosts.
    root@host.x.x's password: 
    [...]
    rescue-bsd#

    Importation du zpool :

    rescue-bsd# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
    rescue-bsd# zpool list
    NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
    zroot  1.81T  11.5G  1.80T     0%  3.09x  ONLINE  /mnt
    rescue-bsd#

    On retrouve nos volumes zfs système dans zroot/ROOT :

    rescue-bsd# zfs list | grep ROOT
    zroot/ROOT                        844M  1.77T    31K  none
    zroot/ROOT/00-first-install       446K  1.77T   637M  legacy
    zroot/ROOT/01-disable-ipv6        486K  1.77T   637M  legacy
    zroot/ROOT/02-disable-sendmail    504K  1.77T   637M  legacy
    zroot/ROOT/03-load-modules        413K  1.77T   637M  legacy
    zroot/ROOT/04-jail                514K  1.77T   637M  legacy
    zroot/ROOT/05-pkgng               384K  1.77T   637M  legacy
    zroot/ROOT/06-minpkg              389K  1.77T   657M  legacy
    zroot/ROOT/07-some-pkg-and-jail   784K  1.77T   814M  legacy
    zroot/ROOT/08-zfs-periodic        714K  1.77T   814M  legacy
    zroot/ROOT/new-09                 839M  1.77T   814M  legacy
    rescue-bsd#

    Volume actuellement utilisé au boot :

    rescue-bsd# zpool get bootfs zroot
    NAME   PROPERTY  VALUE              SOURCE
    zroot  bootfs    zroot/ROOT/new-09  local
    rescue-bsd#

    On change le volume de boot :

    rescue-bsd# zpool set bootfs=zroot/ROOT/03-load-modules zroot
    rescue-bsd# zpool get bootfs zroot
    NAME   PROPERTY  VALUE                       SOURCE
    zroot  bootfs    zroot/ROOT/08-zfs-periodic  local
    rescue-bsd#

    Repasser en boot ‘hard-drive’ via le manager et rebooter la machine :

    rescue-bsd# shutdown -r now

    On repasse sur la machine : Elle est de nouveau fonctionnelle.

    nomad@client:~$ ssh root@host.x.x
    root@host:/root # beadm list
    BE                   Active Mountpoint  Space Created
    00-first-install     -      -            1.2M 2013-02-08 10:49
    01-disable-ipv6      -      -            1.2M 2013-02-10 13:21
    02-disable-sendmail  -      -            1.3M 2013-02-10 15:57
    03-load-modules      NR     /            1.2M 2013-02-10 16:15
    04-jail              -      -          640.2M 2013-02-10 16:26
    05-pkgng             -      -          950.0K 2013-02-10 16:56
    06-minpkg            -      -            3.5M 2013-02-10 17:43
    07-some-pkg-and-jail -      -            6.3M 2013-02-11 08:30
    08-zfs-periodic      -      -            1.5M 2013-02-17 16:19
    new-09               -      -          200.2M 2013-02-18 10:37
    root@host:/root # 
  • Mettre en place une jail www pour une jail poudriere 15 January 2013

    Il n’est plus recommandé pour le moment de faire tourner poudrière dans une jail ! : Tant que les FileSystèmes fdescfs tmpfs linprocfs … ne seront pas ‘jailable’.

    Prérequis :

    But : Obtenir dans deux jails distinctes, une pour poudrière et une autre pour serveur web, un ‘fournisseur’ de pkg pour d’autres jails sur ce même hôte.

    Le how to précédent traitant de poudrière nous a amené à la structure zfs suivante :

    root@host # zfs list -o name,mountpoint,jailed
    NAME                              MOUNTPOINT              JAILED
    [...]
    zroot/pkgng-repo                  none                    on
    zroot/pkgng-repo/data             none                    on
    zroot/pkgng-repo/jails            /poudre/jails           on
    zroot/pkgng-repo/jails/[...]      /poudre/jails/[...]     on
    zroot/pkgng-repo/ports            /poudre/ports           on
    zroot/pkgng-repo/ports/default    /poudre/ports/default   on
    zroot/prison                      none                    off
    zroot/prison/www                  /prison/webserver       off
    zroot/prison/poudre               /prison/poudre          off

    Les packages pkgng étant générés dans le volume zroot/pkgng-repo/data par la jail ‘poudre’, il est nécessaire de le partager avec la jail ‘www’.

    Comme nous ne pouvons attribuer notre volume zfs à deux jails distinctes, nous allons changer la façon d’accéder à ces données.

    Désactivation mode jailed, puis montage nullfs :

    root@host # zfs get jailed zroot/pkgng-repo
    NAME              PROPERTY  VALUE   SOURCE
    zroot/pkgng-repo  jailed    on      local
    root@host # zfs set jailed=off zroot/pkgng-repo
    root@host # zfs get jailed zroot/pkgng-repo
    NAME              PROPERTY  VALUE   SOURCE
    zroot/pkgng-repo  jailed    off     local

    Montage des dataset sur l’hôte :

    root@host # zfs set mountpoint=/poudre zroot/pkgng-repo
    root@host # zfs set mountpoint=/poudre/data zroot/pkgng-repo/data
    root@host # zfs mount -a

    Création des point de montage nullfs pour les jails :

    root@host # mkdir /prison/poudre/data
    root@host # mkdir /prison/apache/data

    Monter en nullfs dans les jails :

    root@host # mount -t nullfs /poudre/data/ /prison/poudre/data/
    root@host # mount -o ro -t nullfs /poudre/data/ /prison/apache/data/

    Montages définitif déclaré sur l’hôte :

    root@host # grep nullfs /etc/fstab
    /poudre/data /prison/poudre/data nullfs rw 0 0
    /poudre/data /prison/apache/data nullfs ro 0 0
    root@host # mount | grep nullfs
    /poudre/data on /prison/poudre/data (nullfs, local)
    /poudre/data on /prison/apache/data (nullfs, local, read-only)

    Configuration poudrière :

    On spécifie ici directement le repertoire de travail pour éviter le montage zfs lié à ${BASEFS}/data .

    root@host # cd /prison/poudre/usr/local/etc
    root@host # cat poudriere.conf | grep POUDRIERE_DATA
    POUDRIERE_DATA=/data

    Remettre zfs jailled on sur les autres dataset :

    root@host # zfs set jailed=on zroot/pkgng-repo/jails
    root@host # zfs set jailed=on zroot/pkgng-repo/ports

    Lancement de la jail poudrière :

    La procédure de lancement de la jail poudrière a de fait forcément changé.

    root@host # zfs jail `jls -q -j poudre jid` zroot/pkgng-repo/jails
    root@host # zfs jail `jls -q -j poudre jid` zroot/pkgng-repo/ports
    root@host # jexec -U root poudre zfs mount -a

    Conclusion :

    Nous avons maintenant deux jails distinctes:

    • une jail ‘poudre’ de construction de repositorie pkgng
    • une jail ‘www’ servant le précédant repositorie et pouvant également servir d’autre pages…
    root@host # jls
       JID  IP Address      Hostname      Path
       268  -               poudre        /prison/poudre
       270  -               www           /prison/webserver
older post

Comments are closed.