Tags

arm arpaname bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp diffusion dns dnsmasq domU dovecot fail-over fail2ban firefox fossil freebsd ftp git guruplug install ipv6 jail kernel kimsufi lex libre linutop liste makefile mikrotik ml150 mohawk nanojail netbook netbsd nginx ntp ntp.org openbsd openntpd openrd opensmtpd openwrt orke pkgng poudriere privee proxy python rescue reverse rmll route rrdcgi sendmail sieve sjail sl2009 ssd sshd symon unbound update usb var_empty vimperator world xen yacc zfs

Powered by

blOg
maRkdown
awK
shEll

03/07/2014

[ fossil sshd sjail ]

201407032300 fossil sshd sjail

Fossil, ssh et nanojail

Aimant avoir le contrôle de mes développements, je n'ai pas succombé aux sirènes des forges et préfère utiliser fossil.

Ce système de contrôle de version fournit, au sein d'un unique binaire, tout ce qu'on peut attendre de ce type d'outil et réussit le tour de force d'intéger un wiki et un gestionnaire de ticket.

Voyons comment mettre en place ce service à partir des ingrédients suivant:

Fixons les objectifs:

Commençons par créer une jail à l'aide de sjail:

$ cd $HOME && mkdir -p tmp/sjail && fetch -o sjail.tar.gz 'http://fossil.bsdsx.fr/sjail/tarball/sjail.tar.gz?uuid=trunk'
$ alias sjail $HOME/tmp/sjail/sjail
$ cd $HOME && mkdir -p tmp/fossil && cd tmp && sjail fossil init
If you need log, don't forget to add '-l /usr/home/dsx/tmp/fossil/var/run/logpriv'
on syslogd_flags and restart (not reload) syslogd

You could edit /usr/home/dsx/tmp/fossil/usr/local/etc/pkg/repos/sjail.conf before adding any package to match your configuration

Avant d'ajouter /usr/sbin/sshd les plus curieux iront regarder $HOME/tmp/sjail/_sjail_usr_sbin_sshd:

$ sjail fossil /usr/sbin/sshd

Un soupçon de configuration (à adapter suivant vos goûts):

$ cat >> fossil/etc/ssh/sshd_config
UseDNS no
UsePAM no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
StrictModes no
AuthorizedKeysFile /etc/ssh/authorized_keys
AllowGroups src
^D

Pour faire court: j'interdis un maximum de chose et je centralise les clefs des utilisateurs. De toute façon, leur $HOME sera en lecture seule, aucune raison qu'ils y déposent quoi que ce soit.

ATTENTION à StrictModes ! L'arborescence générale de mes jails n'est pas créée par root et cela peut poser problème avec sshd. Sans cette directive, fossil/etc/ssh doit appartenir à root ce qui n'est pas le cas chez moi. Ce n'est pas une faille de sécurité mais un contrôle supplémentaire. L'objectif est de pouvoir manipuler le fichier des clefs depuis l'hôte.

Je rajoute à cette jail /usr/sbin/daemon afin que fossil tourne en temps qu'utilisateur non privilégié:

$ sjail fossil /usr/sbin/daemon
$ sjail fossil pkg install fossil

Passons à la configuration desdits utilisateurs:

$ cat >> fossil/etc/pw.conf
defaultpasswd no
home /repos
homemode 500
shells sh
defaultshell sh
defaultgroup src
minuid 30000
maxuid 31000
^D

Il est temps de créer ce fameux groupe src:

$ sudo chroot fossil pw groupadd src -g 30000

Et un utilisateur toto:

$ sudo chroot fossil pw useradd toto -c 'toto commiter' -m
Password for 'toto' is: 3bzM/cNT
$ grep ^toto fossil/etc/passwd
toto:*:30000:30000:toto commiter:/home/toto:/bin/sh
$ ls -la fossil/home/
total 12
drwxr-xr-x  3 root   wheel  512 Jul  1 22:03 .
drwxr-xr-x  6 dsx    wheel  512 Jul  1 22:00 ..
dr-x------  2 30001  30000  512 Jul  1 22:03 toto

Le service fossil sera exécuté (froidement) par l'utilisateur nobody, je crée le répertoire /repos avec les droits kivonbien:

$ mkdir fossil/repos && sudo chown -R nobody:30000 fossil/repos && sudo chmod -R 775 fossil/repos

La configuration de la jail (attention à la configuration réseau à adapter):

$ cat /etc/jail.conf
exec.clean;
mount.devfs;
exec.jail_user = "root";
exec.consolelog = "/var/log/jails/$name";

fossil {
        path = "/home/dsx/tmp/fossil";
        host.hostname = "fossil.bsdsx.fr";
        ip4.addr = lo1|10.30.12.2;
        exec.start = "/usr/sbin/sshd -e";
        exec.start += "/usr/sbin/daemon -c -u nobody /usr/local/bin/fossil server --files *.json,*.html,*.js,*.css,*.txt --notfound /index.html /repos";
}
$ sudo jail -c fossil
fossil: created

Il me faut une clef pour mon utilisateur toto afin de tester l'accès par ssh:

$ ssh-keygen -q -t rsa -N "" -C "toto's rsa key" -f toto
$ cat toto.pub >> fossil/etc/ssh/authorized_keys
$ ssh -F /dev/null toto@10.30.12.2 -i toto
The authenticity of host '10.30.12.2 (10.30.12.2)' can't be established.
RSA key fingerprint is 2f:e7:02:1c:cc:65:00:06:1b:4d:75:6c:f0:11:e8:cf.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.30.12.2' (RSA) to the list of known hosts.
$ echo /*bin/*  /usr/*bin/* /usr/local/*bin/*
/bin/sh /sbin/ldconfig /usr/sbin/daemon /usr/sbin/nologin /usr/sbin/pw /usr/sbin/pwd_mkdb /usr/sbin/sshd /usr/local/bin/fossil
$ ls
ls: not found
$ echo pouet > toto
cannot create toto: Permission denied

Fervent adepte de chroot, je pensais pouvoir utiliser la commande suivante pour créer un premier projet:

$ sudo chroot -u nobody fossil /usr/local/bin/fossil init /repos/systemd.fossil
invalid home directory: /root

Après avoir essayer:

J'en suis arrivé à la conclusion suivante: on ferait mieux de commencer par le commencement.

$ sudo chroot -u nobody fossil/ /bin/sh 
$ echo $HOME
/root

Tout s'explique. Je disais donc, initialisons un projet de domination du monde:

$ sudo chroot -u nobody fossil /bin/sh -c 'HOME=/repos; /usr/local/bin/fossil init /repos/systemd.fossil'
project-id: 7e8592bc69fbccb40162ef6a17235b8945ed6225
server-id:  c59ad0fe02d3f67d11d2406a951d53602d4cd027
admin-user: root (initial password is "1abd87")

C'est pas encore ça. Mêmes maux, mêmes remèdes:

$ sudo chroot -u nobody fossil /bin/sh -c 'HOME=/repos; USER=nobody; /usr/local/bin/fossil init /repos/systemd.fossil'
project-id: a8581c262d2925e760718319cf5e65287afe60d0
server-id:  22dca47163f6911ba39aba051643418e11364db0
admin-user: nobody (initial password is "4ae1c5")

Est-ce que notre utilisateur toto peut commiter ?

$ cat ~/.ssh/config
Host fossil
    User toto
    IdentityFile ~/.ssh/toto
    IdentitiesOnly yes
$ cd && mkdir -p src/toto && cd src/toto && mkdir src fossils
$ fossil clone ssh://fossil//repos/systemd.fossil fossils/systemd.fossil

ATTENTION !!! Le double / devant repos n'est pas une typo !

Round-trips: 2   Artifacts sent: 0  received: 3
Clone finished with 543 bytes sent, 1044 bytes received
Rebuilding repository meta-data...
  100.0% complete...
project-id: a8581c262d2925e760718319cf5e65287afe60d0
admin-user: dsx (password is "077a9a")
$ cd src/
$ fossil open ../fossils/systemd.fossil 
project-name: <unnamed>
repository:   /usr/home/dsx/src/toto/src/../fossils/systemd.fossil
local-root:   /usr/home/dsx/src/toto/src/
config-db:    /home/dsx/.fossil
project-code: a8581c262d2925e760718319cf5e65287afe60d0
checkout:     8c1b91007ea057d7e9d1a7fbddde1f88b7c4ef45 2014-07-03 19:05:16 UTC
leaf:         open
tags:         trunk
comment:      initial empty check-in (user: nobody)
checkins:     1
$ touch neuneu && fossil add neuneu && fossil commit -m 'add neuneu' neuneu
ADDED  neuneu
Autosync:  ssh://fossil//repos/systemd.fossil
Round-trips: 1   Artifacts sent: 0  received: 0
Pull finished with 319 bytes sent, 228 bytes received
New_Version: 4fcf2e727ba9e86eb64d5dc9ea1c967a7fe9ff59
Autosync:  ssh://fossil//repos/systemd.fossil
Round-trips: 1   Artifacts sent: 2  received: 0
Sync finished with 518 bytes sent, 282 bytes received

Cerise(s) sur le gâteau

Qui dit ssh pense aussitôt FORCE_COMMAND

$ cat fossil/etc/ssh/authorized_keys
command="/usr/local/bin/fossil http /repos/systemd.fossil" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCsZv7o9FjGBW8hpLcCuqE2EC8Togg01M7b5B7k2ogYz+ZnntIwiQcRy9MEUMfY7rK0fhnKiJNd7lg1jUwoZMjbkIOuc/AKe8V3HLALDY/1609IzAb243sVgRGEG6Ezfi2l/PT6Ej2mldwx99L7plXgIZwA5JEdjiaz2SczxtZDAJoBJm1R/lmBc7Min0shV4hzXRcUZ0ncPs84OAfd8hiKbbSOSvhLyqebBmHpUHRiMX6AZkQaUv/JHxl/gPoL996DAPdWso1G0vpniYWw/EFqGVb0D+8omnccpJ/q0hXF/SsuZbeaTcNZX1H8DRgL5+7Bs/ZHZb1Kuhj3iucs8kV toto's rsa key
$ fossil clone ssh://fossil//repos/systemd.fossil fossils/systemd.fossil
Round-trips: 2   Artifacts sent: 0  received: 3
Clone finished with 543 bytes sent, 1045 bytes received
Rebuilding repository meta-data...
  100.0% complete...
project-id: 816a46cf938e770be7dde7323969efdb6e13eb70
admin-user: dsx (password is "cbfaa5")
$ ssh fossil
^CConnection to fossil.bsdsx.fr closed.

Avantages:

Est-ce qu'on peut encore faire mieux ? Je pense que oui:

Ombre(s) sur le gâteau

fossil est lancé en tant qu'utilisateur nobody, il ne peut donc pas écouter sur un port inférieur à 1024 (ce qui tombe bien car par défaut il écoute sur 8080). Mais comment accéder à l'interface web ? La raréfaction des adresses ipv4 impose bien souvent l'utilisation d'un reverse proxy tel que nginx. Pour l'ipv6, il faudra jouer de la redirection de port (80 -> 8080).

Retours

Remarque pertinente (comme à son habitude :) de Natacha: définir le HOME des utilisateurs à /repos. Premier effet kisskool:

$ fossil clone ssh://fossil//repos/systemd.fossil fossils/systemd.fossil
# devient
$ fossil clone ssh://fossil/systemd.fossil fossils/systemd.fossil

Deuxième effet kisskool: inutile de créer des répertoires pour les utilisateurs:

$ sudo chroot fossil pw useradd toto -c 'toto commiter' -m
# devient
$ sudo chroot fossil pw useradd toto -c 'toto commiter'

et

$ cat >> fossil/etc/pw.conf
defaultpasswd random
home /home
homemode 500
shells sh
defaultshell sh
defaultgroup src
minuid 30000
maxuid 31000
^D
# devient
$ cat >> fossil/etc/pw.conf
defaultpasswd random
home /repos
shells sh
defaultshell sh
defaultgroup src
minuid 30000
maxuid 31000
^D

Contre effet kisskool: le $HOME des utilisateurs devient accessible en écriture mais contre contre effet kisskool avec la commande forcée par la clef.

Merci Natacha !

Retour bis

Les perfectionnistes pourront:


Lien vers ce billet

29/03/2014

[ sjail opensmtpd dovecot ]

201403290800 sjail opensmtpd dovecot

Une nanojail pour le courriel

Jusqu'à présent, je confiais les courriels à destination de mon domaine à sendmail. Mais depuis ce message et un précédent billet, je dois me rendre à l'évidence: bapt@ va bien finir par virer sendmail et opensmtpd est quand même drôlement convivial.

Ce (long) billet va détailler l'installation pas à pas d'opensmtpd et de dovecot, le tout dans une nanojail.

sjail et opensmtpd

Pour commencer, je crée une nanojail mx2 et je lui ajoute opensmtpd:

dsx@blade>mkdir mx2
dsx@blade>sjail mx2 init
If you need log, don't forget to add '-l /usr/home/dsx/_jails/mx2/var/run/logpriv'
on syslogd_flags and restart (not reload) syslogd

You could edit do_init_pkg() function before adding any package to match your configuration
dsx@blade>sjail mx2 pkg install opensmtpd
Updating repository catalogue
digests.txz                                                                                                    100% 1868     1.8KB/s   1.8KB/s   00:00    
packagesite.txz                                                                                                100%   11KB  10.8KB/s  10.8KB/s   00:00    
Incremental update completed, 32 packages processed:
0 packages updated, 0 removed and 32 added.
The following 3 packages will be installed:

        Installing ca_root_nss: 3.15.4
        Installing libevent: 1.4.14b_3
        Installing opensmtpd: 5.4.2,1

The installation will require 3 MB more space

721 KB to be downloaded
ca_root_nss-3.15.4.txz                                                                                         100%  296KB 295.7KB/s 295.7KB/s   00:00    
libevent-1.4.14b_3.txz                                                                                         100%  123KB 123.5KB/s 123.5KB/s   00:00    
opensmtpd-5.4.2,1.txz                                                                                          100%  302KB 302.1KB/s 302.1KB/s   00:00    
Checking integrity... done
[1/3] Installing ca_root_nss-3.15.4... done
[2/3] Installing libevent-1.4.14b_3... done
[3/3] Installing opensmtpd-5.4.2,1...===> Creating users and/or groups.
Creating group '_smtpd' with gid '257'.
Creating user '_smtpd' with uid '257'.
Creating user '_smtpq' with uid '258'.
sed: not found
cannot create /etc/mail/mailer.conf: No such file or directory
 done
If you are upgrading from OpenSMTPD version 201303011853 or earlier, please 
follow the procedure below to update the permissions on the OpenSMTPD
spool directories:

  1. Stop 'smtpd' service:

     # /usr/local/etc/rc.d/smtpd stop

  2. Update permissions:

     # chown -R _smtpq:wheel /var/spool/smtpd/corrupt
     # chown -R _smtpq:wheel /var/spool/smtpd/purge
     # chown -R _smtpq:wheel /var/spool/smtpd/queue
     # chown -R _smtpq:wheel /var/spool/smtpd/temporary

  3. Start 'smtpd' service:

     # /usr/local/etc/rc.d/smtpd start

Je peux passer outre le message d'erreur concernant sed: je n'ai nul besoin du fichier /etc/mail/mailer.conf. En effet, je ne compte pas envoyer de courriel directement depuis cette jail (à l'aide de /usr/bin/mail par exemple). sjail est livré avec un script _sjail_opensmtpd, exécuté après l'installation d'opensmtpd et qui va créer les répertoires et fichiers manquant à son bon fonctionnement.

Passons au fichier de configuration. Sa limpidité ne mérite (à mon avis) aucun commentaire:

dsx@blade>cat mx2/etc/mail/smtpd.conf
listen on localhost
table aliases "/etc/mail/aliases"
accept for local alias <aliases> deliver to maildir
accept from any for domain "bsdsx.fr" alias <aliases> deliver to maildir
accept for any relay

Je crée mon utilisateur:

dsx@blade>sudo chroot mail pw groupadd users -g 1000
dsx@blade>echo 'bar' | sudo chroot mx2 pw useradd dsx -c 'Moi personnellement' -g users -m -s /usr/sbin/nologin -h 0

Je fais exprès d'afficher le mot de passe de mon utilisateur car avec la syntaxe suivante:

dsx@blade>sudo chroot mx2 pw useradd bar -c 'bar user' -g users -m -s /usr/sbin/nologin -h 0
password for user bar:

on ne peut pas vérifier la saisie. Il est temps de faire un premier essai:

dsx@blade>sudo chroot mail /usr/local/sbin/smtpd -n -f /etc/mail/smtpd.conf
configuration OK
dsx@blade>sudo chroot mail /usr/local/sbin/smtpd -d -f /etc/mail/smtpd.conf
info: OpenSMTPD 5.4.2p1 starting
info: startup

Depuis un autre terminal:

dsx@blade>telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 blade.bsdsx.fr ESMTP OpenSMTPD
EHLO localhost
250-blade.bsdsx.fr Hello localhost [127.0.0.1], pleased to meet you
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SIZE 36700160
250-DSN
250 HELP
MAIL FROM: <dsx@localhost>
250 2.0.0: Ok
RCPT TO: <dsx@localhost>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: first try with telnet and localhost

Ok
.
250 2.0.0: 3f78e126 Message accepted for delivery
QUIT
221 2.0.0: Bye
Connection closed by foreign host.

Côté serveur:

smtp-in: New session 36daa667726edf1e from host localhost [127.0.0.1]
smtp-in: Accepted message 3f78e126 on session 36daa667726edf1e: from=<dsx@localhost>, to=<dsx@localhost>, size=49, ndest=1, proto=ESMTP
delivery: Ok for 3f78e126aa0adf4c: from=<dsx@localhost>, to=<dsx@localhost>, user=dsx, method=maildir, delay=16s, stat=Delivered
smtp-in: Closing session 36daa667726edf1e

Un petit tour dans mx2/home/dsx me confirme qu'un répertoire Maildir a bien été créé et peuplé:

dsx@blade>sudo ls -Rl mx2/home/dsx/Maildir/
total 24
drwx------  2 2001  1000  512 Apr  2 21:51 cur
drwx------  2 2001  1000  512 Apr  2 21:51 new
drwx------  2 2001  1000  512 Apr  2 21:51 tmp

mx2/home/dsx/Maildir/cur:
total 0

mx2/home/dsx/Maildir/new:
total 8
-rw-------  1 2001  1000  270 Apr  2 21:51 1396468291.63662.blade.bsdsx.fr

mx2/home/dsx/Maildir/tmp:
total 0

Les essais avec localhost sont concluant, qu'en est-il de mon domaine ?

dsx@blade>telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 blade.bsdsx.fr ESMTP OpenSMTPD
EHLO localhost
250-blade.bsdsx.fr Hello localhost [127.0.0.1], pleased to meet you
[ snip ]
MAIL FROM: <dsx@bsdsx.fr>
250 2.0.0: Ok
RCPT TO: <dsx@bsdsx.fr>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: second try with telnet and domain

Ok
.
250 2.0.0: eb6d735f Message accepted for delivery
quit
221 2.0.0: Bye
Connection closed by foreign host.

Côté serveur:

smtp-in: New session d399dbeabc35b0b2 from host localhost [127.0.0.1]
smtp-in: Accepted message eb6d735f on session d399dbeabc35b0b2: from=<dsx@bsdsx.fr>, to=<dsx@bsdsx.fr>, size=47, ndest=1, proto=ESMTP
delivery: Ok for eb6d735f96e20eca: from=<dsx@bsdsx.fr>, to=<dsx@bsdsx.fr>, user=dsx, method=maildir, delay=20s, stat=Delivered
smtp-in: Closing session d399dbeabc35b0b2

Une fois mx2/etc/mail/aliases renseigné, on peut faire un dernier test:

dsx@blade>echo 'root: dsx' >> mx2/etc/mail/aliases
dsx@blade>telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 blade.bsdsx.fr ESMTP OpenSMTPD
EHLO localhost
250-blade.bsdsx.fr Hello localhost [127.0.0.1], pleased to meet you
[ snip ]
MAIL FROM: <root@localhost>
250 2.0.0: Ok
RCPT TO: <root@bsdsx.fr>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: third try with aliases

Ok
.
250 2.0.0: de45e7b5 Message accepted for delivery
quit
221 2.0.0: Bye
Connection closed by foreign host.

Côté serveur:

smtp-in: New session c4d1141eb43fc66f from host localhost [127.0.0.1]
smtp-in: Accepted message 9bce8fd7 on session c4d1141eb43fc66f: from=<root@localhost>, to=<root@bsdsx.fr>, size=36, ndest=1, proto=ESMTP
delivery: Ok for 9bce8fd7d74d5f77: from=<root@localhost>, to=<root@bsdsx.fr>, user=root, method=maildir, delay=31s, stat=Delivered
smtp-in: Closing session c4d1141eb43fc66f

Le fichier d'alias n'a pas été pris en compte (user=root) car, comme expliqué dans le fichier de configuration livré par défaut, je n'ai pas lancé la commande kivabien:

dsx@blade>sudo chroot mx2 /usr/local/sbin/smtpctl update table aliases
command succeeded

Côté serveur:

info: Table "aliases" successfully updated

Un dernier test pour la route:

dsx@blade>echo 'pouet: dsx' >> mx2/etc/mail/aliases
dsx@blade>sudo chroot mx2 /usr/local/sbin/smtpctl update table aliases
command succeeded
dsx@blade>telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 blade.bsdsx.fr ESMTP OpenSMTPD
EHLO localhost
250-blade.bsdsx.fr Hello localhost [127.0.0.1], pleased to meet you
[ snip ]
MAIL FROM: <dsx@localhost>
250 2.0.0: Ok
RCPT TO: <root@bsdsx.fr>
250 2.1.5 Destination address valid: Recipient ok
RCPT TO: <pouet@localhost>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: test alias

OK
.
250 2.0.0: 14a350bf Message accepted for delivery
quit
221 2.0.0: Bye
Connection closed by foreign host.

Côté serveur:

info: Table "aliases" successfully updated
smtp-in: New session cf35c16799b69887 from host localhost [127.0.0.1]
smtp-in: Accepted message 14a350bf on session cf35c16799b69887: from=<dsx@localhost>, to=<root@bsdsx.fr>, size=24, ndest=1, proto=ESMTP
smtp-in: Accepted message 14a350bf on session cf35c16799b69887: from=<dsx@localhost>, to=<pouet@localhost>, size=24, ndest=1, proto=ESMTP
delivery: Ok for 14a350bf0e11c49d: from=<dsx@localhost>, to=<root@bsdsx.fr>, user=dsx, method=maildir, delay=32s, stat=Delivered
delivery: Ok for 14a350bfceec2d5a: from=<dsx@localhost>, to=<pouet@localhost>, user=dsx, method=maildir, delay=21s, stat=Delivered
smtp-in: Closing session cf35c16799b69887

Voila mon opensmtpd fonctionnel (pas tout à fait, lire Update 3 en fin de billet). Il est temps de passer à dovecot.

sjail et dovecot

Je commence par installer dovecot (en version 2)

dsx@blade>sjail mx2 pkg install dovecot2
Updating repository catalogue
The following 1 packages will be installed:

        Installing dovecot2: 2.2.10

The installation will require 14 MB more space

3 MB to be downloaded
dovecot2-2.2.10.txz                                                                                            100% 2704KB   2.6MB/s   2.6MB/s   00:00    
Checking integrity... done
[1/1] Installing dovecot2-2.2.10...===> Creating users and/or groups.
Creating group 'dovecot' with gid '143'.
Creating group 'dovenull' with gid '144'.
Creating user 'dovecot' with uid '143'.
Creating user 'dovenull' with uid '144'.
 done
---------------------------------------------------------------------
 
 You can get basic IMAP and POP3 services running by enabling
 dovecot in the /etc/rc.conf file.

        dovecot_enable
                (bool) If set to ``YES'', run the dovecot command
                at boot time.

 In the basic configuration Dovecot will authenticate users against
 the system's passwd file and use the default /var/mail/$USER mbox
 files.

        dovecot_config
                (str) Path to dovecot configuration file(s).
                Default /usr/local/etc/dovecot/dovecot.conf.

 To start multiple instances of dovecot set dovecot_config to
 a space separated list of configuration files.

---------------------------------------------------------------------

Je ne vais pas utiliser l'emplacement par défaut du fichier de configuration. L'objectif est d'avoir un unique fichier qui ne définit que ce dont j'ai besoin. opensmtpd place mes courriels dans $HOME/Maildir, charge à dovecot de me les fournir.

dsx@blade>touch mx2/etc/mail/dovecot.conf
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -n
# 2.2.10: /etc/mail/dovecot.conf
# OS: FreeBSD 10.0-RELEASE amd64  
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -F

Côté client:

dsx@blade>telnet 127.0.0.1 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

Radical. En lisant mx2/usr/local/share/doc/dovecot/dovecont.conf, je me dis que mx2/usr/local/share/doc/dovecot/conf.d va devenir le dernier salon où l'on cause (cause == grep / less) Un peu de log ne me fera pas de mal. Côté client, je persiste avec telnet 127.0.0.1 143

dsx@blade>echo 'log_path = /dev/stderr' >> mx2/etc/mail/dovecot.conf
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -F
Apr 04 16:34:46 master: Info: Dovecot v2.2.10 starting up for imap, pop3, lmtp
Apr 04 16:54:35 imap-login: Fatal: /dev/urandom doesn't exist, currently we require it
Apr 04 16:54:35 master: Error: service(imap-login): command startup failed, throttling for 2 secs

Si pour l'instant j'utilise un chroot, je sais qu'avec une jail le répertoire dev sera peuplé. Pour l'instant, je passe en manuel:

dsx@blade>sudo mount -t devfs devfs mx2/dev/
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -F
Apr 04 16:57:47 master: Info: Dovecot v2.2.10 starting up for imap, pop3, lmtp
Apr 04 16:34:50 imap-login: Fatal: Couldn't parse private ssl_key: error:0906D06C:PEM routines:PEM_read_bio:no start line: Expecting: ANY PRIVATE KEY
Apr 04 16:34:50 master: Error: service(imap-login): command startup failed, throttling for 2 secs

C'est un peu tôt pour le ssl, je le désactive pour l'instant.

dsx@blade>echo 'ssl = no' >> mx2/etc/mail/dovecot.conf
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -n
# 2.2.10: /etc/mail/dovecot.conf
# OS: FreeBSD 10.0-RELEASE amd64  
log_path = /dev/stderr
ssl = no
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -F
Apr 04 16:39:34 master: Info: Dovecot v2.2.10 starting up for imap, pop3, lmtp
Apr 04 16:39:37 auth: Fatal: No passdbs specified in configuration file. PLAIN mechanism needs one
Apr 04 16:39:37 master: Error: service(auth): command startup failed, throttling for 2 secs
Apr 04 16:39:37 imap-login: Info: Disconnected: Auth process broken (disconnected before auth was ready, waited 0 secs): user=<>, rip=127.0.0.1, lip=127.0.0.1, secured, session=<mT+yfDj27QB/AAAB>

Hum, de l'authentification.

dsx@blade>cat <<EOF >> mx2/etc/mail/dovecot.conf 
? userdb {
?   driver = passwd
? }
? EOF
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -n
# 2.2.10: /etc/mail/dovecot.conf
# OS: FreeBSD 10.0-RELEASE amd64  
log_path = /dev/stderr
ssl = no
userdb {
  driver = passwd
}
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -F
Apr 04 16:46:36 master: Info: Dovecot v2.2.10 starting up for imap, pop3, lmtp
Apr 04 16:46:42 auth: Fatal: No passdbs specified in configuration file. PLAIN mechanism needs one
Apr 04 16:46:42 master: Error: service(auth): command startup failed, throttling for 2 secs
Apr 04 16:46:42 imap-login: Info: Disconnected: Auth process broken (disconnected before auth was ready, waited 0 secs): user=<>, rip=127.0.0.1, lip=127.0.0.1, secured, session=<q2cMljj2pAB/AAAB>

Et maintenant ça cause passdb

dsx@blade>cat << EOF >> mx2/etc/mail/dovecot.conf
? passdb {
?   driver = pam
? }
? EOF
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -n
# 2.2.10: /etc/mail/dovecot.conf
# OS: FreeBSD 10.0-RELEASE amd64  
log_path = /dev/stderr
ssl = no
userdb {
  driver = passwd
}
passdb {
  driver = pam
}
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -F
Apr 04 16:49:14 master: Info: Dovecot v2.2.10 starting up for imap, pop3, lmtp

Côté client:

dsx@blade>telnet 127.0.0.1 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
a0 LOGIN dsx mon_super_mot_de_passe
a0 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in
a1 select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 113 EXISTS
* 110 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1396496805] UIDs valid
* OK [UIDNEXT 114] Predicted next UID
a1 OK [READ-WRITE] Select completed (0.007 secs).
a2 logout
* BYE Logging out
a2 OK Logout completed.
Connection closed by foreign host.

Côté serveur:

Apr 04 17:05:41 imap-login: Info: Login: user=<dsx>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, mpid=83228, secured, session=<llLk2Tj20wB/AAAB>
Apr 04 17:05:52 imap(dsx): Info: Disconnected: Logged out in=26 out=724

Je pense que le plus dur est fait.

ssl

Les tests en local avec les mots de passe en clair, c'est pratique mais une mise en production nécessite un peu plus de sécurité.

dovecot

Je force l'utilisation de ssl et je définis l'emplacement de mon certificat et de sa clef (préalablement copiés). Cette dernière nécessitant un mot de passe, je dois passer l'option -p à dovecot:

dsx@blade>cat mx2/etc/mail/dovecot.conf
log_path = /dev/stderr
userdb {
  driver = passwd
}
passdb {
  driver = pam
}
ssl = required
ssl_cert = </etc/mail/mx2.bsdsx.fr.pem
ssl_key = </etc/mail/mx2.bsdsx.fr.key

service imap-login {
  inet_listener imaps {
    ssl = yes
  }
}
dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -p -F
Give the password for SSL keys: 
Apr 04 18:18:05 master: Info: Dovecot v2.2.10 starting up for imap, lmtp

A partir de maintenant, le service imaps disponible sur le port 993 requiert l'utilisation de ssl. Il est temps d'abandonner telnet et de passer à openssl s_client:

dsx@blade>openssl s_client -connect localhost:993
[snip des trucs ssl / x509 / toussa ]
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
a0 login dsx mon_super_mot_de_passe
a0 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in
a1 select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 113 EXISTS
* 0 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1396496805] UIDs valid
* OK [UIDNEXT 114] Predicted next UID
a1 OK [READ-WRITE] Select completed (0.000 secs).
a2 logout
* BYE Logging out
a2 OK Logout completed.
closed

C'est terminé pour dovecot, passons à opensmtpd.

opensmtpd

Je modifie légèrement mx2/etc/mail/smtpd.cnf:

pki bsdsx.fr certificate "/etc/mail/mx2.bsdsx.fr.pem"
pki bsdsx.fr key "/etc/mail/mx2.bsdsx.fr.key"

listen on localhost
listen on localhost smtps pki bsdsx.fr auth

table aliases "/etc/mail/aliases"

accept for local alias <aliases> deliver to maildir
accept from any for domain "bsdsx.fr" alias <aliases> deliver to maildir
accept for any relay

Côté serveur:

dsx@blade>sudo chroot mx2 /usr/local/sbin/smtpd -d -f /etc/mail/smtpd.conf
passphrase for bsdsx.fr: 
info: OpenSMTPD 5.4.2p1 starting
info: startup

Côté client:

dsx@blade>netstat -an -f inet | awk ' $4 ~ /(25|465)$/ { print }'
tcp4       0      0 127.0.0.1.25           *.*                    LISTEN
tcp4       0      0 127.0.0.1.465          *.*                    LISTEN
dsx@blade>netstat -an -f inet6 | awk ' $4 ~ /(25|465)$/ { print }'
tcp6       0      0 ::1.25                 *.*                    LISTEN
tcp6       0      0 ::1.465                *.*                    LISTEN
dsx@blade>telnet 127.0.0.1 465
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
EHLO localhost
Connection closed by foreign host.

Côté serveur:

smtp-in: New session fe52eb243336f4ef from host localhost [127.0.0.1]
smtp-in: Disconnecting session fe52eb243336f4ef: IO error: error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol

Côté client (l'encodage du login et du mot de passe sont fait à l'aide de perl -MMIME::Base64 -e 'print encode_base64("machin_a_encoder");'):

dsx@blade>openssl s_client -connect localhost:465
[ snip des trucs ssl / certificat / clef / ... ]
220 blade.bsdsx.fr ESMTP OpenSMTPD
EHLO localhost 
250-blade.bsdsx.fr Hello localhost [127.0.0.1], pleased to meet you
[ snip ]
250 HELP
AUTH LOGIN
334 VXNlcm5hbWU6
ZHN4
334 UGFzc3dvcmQ6
ABCDEFGHIJK=
235 2.0.0: Authentication succeeded
MAIL FROM: <dsx@bsdsx.fr> auth=<dsx@bsdsx.fr>
250 2.0.0: Ok
rcpt to: <root@localhost>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: test ssl

Ok
.
250 2.0.0: d378415c Message accepted for delivery
quit
221 2.0.0: Bye
read:errno=0

Le 'rcpt to' en minuscule n'est pas une typo, 'R' est une commande pour openssl s_client comme indiqué ici:

Pressing "R" in an s_client session causes openssl to renegotiate. Try entering "rcpt to:" instead of "RCPT TO".

opensmtpd et dovecot

Il reste à relier le tout. On trouvera sur le nain ternet moultes exemples à base de

deliver to mda "/usr/local/libexec/dovecot/dovecot-lda -f %{sender} -d %{dest}"

C'est pourquoi je vais choisir une configuration basée sur le protocol lmtp. Pour dovecot, c'est assez simple:

dsx@blade>cat mx2/etc/mail/dovecot.conf
log_path = /dev/stderr
userdb {
  driver = passwd
}
passdb {
  driver = pam
}
ssl = required
ssl_cert = </etc/mail/mx2.bsdsx.fr.pem
ssl_key = </etc/mail/mx2.bsdsx.fr.key

protocols = imap lmtp

service imap-login {
  inet_listener imaps {
    ssl = yes
  }
}

service lmtp {
  unix_listener lmtp {
    mode = 0666
  }
}

Reste à trouver la socket:

dsx@blade>sudo chroot mx2 /usr/local/sbin/dovecot -F
Apr 03 22:15:32 master: Info: Dovecot v2.2.10 starting up for imap, lmtp

Et dans un autre terminal:

dsx@blade>sudo find mx2/ -type s -name lmtp
mx2/var/run/dovecot/lmtp

Pour opensmtpd c'est carrément trivial:

pki bsdsx.fr certificate "/etc/mail/mx2.bsdsx.fr.pem"
pki bsdsx.fr key "/etc/mail/mx2.bsdsx.fr.key"

listen on localhost
listen on localhost smtps pki bsdsx.fr auth

table aliases "/etc/mail/aliases"

accept for local alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
accept from any for domain "bsdsx.fr" alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
accept for any relay

Mise en production

La jail:

[ extrait /etc/jail.conf ]
mx2 {
    host.hostname = "$name.bsdsx.fr";
    ip4.addr = lo0|127.0.0.1; #Ne JAMAIS faire ça
    ip6.addr = lo2|2a02:27d0:100:f205:a642::9;
    exec.start  = "/usr/local/sbin/smtpd -f /etc/mail/smtpd.conf";
    exec.start += "/usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -p";
}
dsx@blade>sudo jail -c mx2
mx2: created
passphrase for bsdsx.fr:

Update 2:

Allez à la fin de ce billet pour obtenir la configuration définitive !!!

J'assume parfaitement le fait de devoir saisir 2 fois (malgré le prompt qui n'apparait qu'une fois) le mot de passe de ma clef.

dsx@blade>jls -j mx2
   JID  IP Address      Hostname                      Path
   175  127.0.0.1       mx2.bsdsx.fr                  /usr/home/dsx/_jails/mx2
dsx@blade>netstat -an -f inet | awk ' $4 ~ /(25|465|993|143)$/ { print }'
tcp4       0      0 127.0.0.1.993          *.*                    LISTEN
tcp4       0      0 127.0.0.1.143          *.*                    LISTEN
tcp4       0      0 127.0.0.1.25           *.*                    LISTEN
tcp4       0      0 127.0.0.1.465          *.*                    LISTEN
dsx@blade>netstat -an -f inet6 | awk ' $4 ~ /(25|465|993|143)$/ { print }'
tcp6       0      0 2a02:27d0:100:f2.993   *.*                    LISTEN
tcp6       0      0 2a02:27d0:100:f2.143   *.*                    LISTEN
tcp6       0      0 2a02:27d0:100:f2.25    *.*                    LISTEN
tcp6       0      0 2a02:27d0:100:f2.465   *.*                    LISTEN

Inutile d'écouter sur une adresse ipv4 publique, mon ami pf est là pour ça:

[ extrait ]
mx4 = 127.0.0.1
mx6 = une:adresse::ipv6
mon_ip_publique = 1.2.3.4
rdr pass on $ext_if inet proto tcp to $mon_ip_publique port { smtp, smtps, imaps } -> $mx4
pass in quick on $ext_if inet6 proto tcp from any to $mx6 port { smtp, smtps, imaps }

Au prochain épisode

En espérant être un peu moins long :)

Update:

Si on utilise l'imap sur localhost, il va y avoir un problème de correspondance avec le certificat (pour mx2.bsdsx.fr et le nom d'hôte (localhost). Pour éviter un message d'avertissement il suffit de rajouter une section local:

dsx@blade>cat mx2/etc/mail/dovecot.conf
userdb {
  driver = passwd
}
passdb {
  driver = pam
}

ssl = required
ssl_cert = </etc/mail/mx2.bsdsx.fr.pem
ssl_key = </etc/mail/mx2.bsdsx.fr.key

protocols = imap lmtp

service imap-login {
  inet_listener imap {
    ssl = no
  }
  inet_listener imaps {
    ssl = yes
  }
}

service lmtp {
  unix_listener lmtp {
    mode = 0666
  }
}

local localhost {
  protocol imap {
    ssl_cert = </etc/mail/localhost.pem
    ssl_key = </etc/mail/_localhost.key
  }
}

Ici par contre, la clef n'est pas protégée par un mot de passe.

Update 2:

Quand on utilise les jails, ne JAMAIS faire:

ip4.addr = lo0|127.0.0.1;

Car lors de suppression de la jail, l'adresse 127.0.0.1 sera considérée comme un alias et retirée de l'interface lo0 Je vous laisse imaginer le torrent de chokapik que peut entrainer un système où 127.0.0.1 n'est plus joignable.

Voici donc la configuration en production à ce jour:

La jail:

mx2 {
    host.hostname = "$name.bsdsx.fr";
    ip4 = inherit;
    ip6.addr = "lo2|2a02:27d0:100:f205:a642::9";
    exec.start  = "/usr/local/sbin/smtpd -f /etc/mail/smtpd.conf";
    exec.start += "/usr/local/sbin/dovecot -c /etc/mail/dovecot.conf -p";
}

dovecot:

listen = 127.0.0.1, ::

openstmpd:

listen on localhost
listen on localhost smtps pki bsdsx.fr auth

La configuration de pf reste inchangée.

Update 3:

La configuration d'opensmtpd est sujette au problème décrit ici: la jail mx2 ne considère pas les adresses "@blade.bsdsx.fr" comme étant locales et tente de les relayer, ce qui provoque une boucle. Ma configuration finale:

pki bsdsx.fr certificate "/etc/mail/mx2.bsdsx.fr.pem"
pki bsdsx.fr key "/etc/mail/mx2.bsdsx.fr.key"

listen on localhost
listen on localhost smtps pki bsdsx.fr auth

table aliases "/etc/mail/aliases"

accept for local alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
accept from any for domain "*.bsdsx.fr" alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
accept for any relay

En espérant en finir avec les mises à jour, toutes mes excuses par avance à ceux qui auraient eu la mauvaise idée de suivre mes indications.

Update 4:

J'aurais pu tricher et modifier 'Update 3' mais je ne mange pas de ce pain là:

pki bsdsx.fr certificate "/etc/mail/mx2.bsdsx.fr.pem"
pki bsdsx.fr key "/etc/mail/mx2.bsdsx.fr.key"

listen on localhost
listen on localhost smtps pki bsdsx.fr auth

table aliases "/etc/mail/aliases"
table domains { bsdsx.fr, blade.bsdsx.fr }

accept for local alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
accept from any for domain <domains> alias <aliases> deliver to lmtp "/var/run/dovecot/lmtp"
accept for any relay

La der des der ?


Lien vers ce billet

28/03/2014

[ sjail ]

201403280800 sjail

Les nanojails facile avec sjail

Nouvelle année, nouvelle machine. J'ai troqué mon ml150 contre une lame HP ProLiant BL460c G1 d'un HP BladeSystem C3000. Avec 8 coeurs et 32 Go de RAM, c'est poudriere qui est content :)

Nouvelle année, nouvelles résolutions: la chasse au gaspillage. Je n'utilise plus ZFS car à la réflexion, je n'ai pas besoin de toutes ses fonctionnalités. Les lames ne sont pas prévues pour faire du stockage (une carte Smart Array E200i et 2 disques au format 2.5 de 146 Go en RAID1), je n'ai pas d'autres machines supportant ZFS et poudriere peut s'en passer depuis bien longtemps.

Mes jails traditionnelles:

Mon nouveau projet de domination du monde découle d'un précédent billet et se nomme sjail. Il se trouve à l'adresse http://fossil.bsdsx.fr/sjail.

Ce script shell de moins de 300 lignes a pour but de créer un chroot minimaliste:

dsx@blade>du -hc foo/
4.0K    foo/dev
236K    foo/etc
2.1M    foo/lib
116K    foo/libexec
4.0K    foo/var/db
4.0K    foo/var/log
4.0K    foo/var/run
4.0K    foo/var/empty
 20K    foo/var
4.0K    foo/usr/local/etc
8.0K    foo/usr/local
536K    foo/usr/sbin
548K    foo/usr
8.0K    foo/.sjail
4.0K    foo/tmp
144K    foo/bin
 28K    foo/sbin
3.2M    foo/
3.2M    total

Les seuls outils disponibles dans ce chroot sont:

Exemple d'utilisation de sjail:

dsx@blade>cd /tmp; mkdir finger
dsx@blade>sjail finger/ init
If you need log, don't forget to add '-l /tmp/finger/var/run/logpriv'
on syslogd_flags and restart (not reload) syslogd

You could edit do_init_pkg() function before adding any package to match your configuration
dsx@blade>sjail -v finger /usr/sbin/inetd /usr/libexec/fingerd
Process ldd '/usr/sbin/inetd'
a usr/sbin/inetd
a lib/libc.so.7
a lib/libipsec.so.4
a lib/libutil.so.9
a usr/lib/libwrap.so.6
Process ldd '/usr/libexec/fingerd'
a usr/libexec/fingerd
a lib/libc.so.7
a lib/libutil.so.9
dsx@blade>grep fingerd /etc/inetd.conf | tr -d '#' | tee finger/etc/inetd.conf
finger  stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -k -s
finger  stream  tcp6    nowait/3/10 nobody /usr/libexec/fingerd fingerd -k -s

Pour tester le bon fonctionnement du chroot, rien ne vaut le mode debug:

dsx@blade>sudo chroot finger/ /usr/sbin/inetd -d
inetd[87763]: unknown rpc/udp or rpc/tcp

Un peu trop minimaliste le chroot ? Les sections FILES et ERROR MESSAGES de man inetd nous donne la solution:

dsx@blade>cp /etc/netconfig finger/etc/
dsx@blade>sudo chroot finger/ /usr/sbin/inetd -d
ADD : finger proto=tcp accept=1 max=3 user=nobody group=(null)class=daemon builtin=0x0 server=/usr/libexec/fingerd policy=""
inetd: finger/tcp: ipsec initialization failed; in entrust
inetd: finger/tcp: ipsec initialization failed; out entrust
inetd: enabling finger, fd 4
inetd: registered /usr/libexec/fingerd on 4
ADD : finger proto=tcp accept=1 max=3 user=nobody group=(null)class=daemon builtin=0x0 server=/usr/libexec/fingerd policy=""
inetd: finger/tcp: ipsec initialization failed; in entrust
inetd: finger/tcp: ipsec initialization failed; out entrust
inetd: enabling finger, fd 5
inetd: registered /usr/libexec/fingerd on 5
^C

Au tour de fingerd

dsx@blade>sudo chroot finger/ /usr/libexec/fingerd -d
nobody
/usr/bin/finger finger -- nobody
/usr/bin/finger: cannot execute
^C
dsx@blade>sjail finger/ /usr/bin/finger
dsx@blade>sudo chroot finger/ /usr/libexec/fingerd -d
nobody
/usr/bin/finger finger -- nobody
Login: nobody                           Name: Unprivileged user
Directory: /nonexistent                 Shell: /usr/sbin/nologin
No Mail.
No Plan.

Il ne reste plus qu'à configurer la jail:

dsx@blade>cat /etc/jail.conf
exec.clean;
mount.devfs;
exec.jail_user = "root";
exec.consolelog = "/var/log/jails/$name";
path = "/tmp/$name";

finger {
    host.hostname = "$name.example.com";
    ip4.addr = interface|une.adresse.ip.v4;
    ip6.addr = interface|une:adresse:ip::v6;
    exec.start = "/usr/sbin/inetd -wW -C 60";
    depend = "ns";
}

sjail permet aussi l'installation de package:

dsx@blade>sjail finger pkg install mohawk
Updating repository catalogue
digests.txz                                                                                                    100% 1868     1.8KB/s   1.8KB/s   00:00    
packagesite.txz                                                                                                100%   11KB  10.8KB/s  10.8KB/s   00:00    
Incremental update completed, 32 packages processed:
0 packages updated, 0 removed and 32 added.
The following 2 packages will be installed:

        Installing libevent2: 2.0.21
        Installing mohawk: 2.0.10

The installation will require 2 MB more space

304 KB to be downloaded
libevent2-2.0.21.txz                                                                                           100%  270KB 269.5KB/s 269.5KB/s   00:00    
mohawk-2.0.10.txz                                                                                              100%   35KB  34.6KB/s  34.6KB/s   00:00    
Checking integrity... done
[1/2] Installing libevent2-2.0.21... done
[2/2] Installing mohawk-2.0.10... done

Pour accéder à la documentation des packages:

dsx@blade>sjail finger man -k mohawk                                                                                                                       
mohawk(8)                - HTTP server, based on libevent2
mohawk.conf(5)           - mohawk(8) configuration file

Cette commande est nécessaire car les pages de manuel ne sont disponibles qu'à l'intérieur du chroot. Elle ne fait que positionner l'option -M de la commande man.

Mes prochains billets porteront, entre autre, sur l'installation et la configuration de mes services (dns, mail, fossil, www) avec sjail, bien entendu :)


Lien vers ce billet