Jails avec FreeBSD 10.1 (3/x)


une jail accessible de l'extérieur

Cette série d’articles sur la mise en place des jails de FreeBSD 10.1 a commencé par la mise en place de l’architecture et la création d’une première jail de test. Puis nous avons vu, dans l’article précédent comment ajouter le réseau à notre jail. IL est temps de voir comment joindre notre jail depuis l’extérieur, c’est à dire sans passer (ou si peu) par l’intermédiaire de l’hôte. Nous allons apprendre dans cet article comment ajouter le réseau à notre jail.

Une jail joignable depuis l’extérieur

Il est temps d’aller plus loin dans notre exploration en faisant en sorte que notre jail soit joignable de l’extérieur, sans passer par une connexion sur l’hôte. Il est nécessaire de changer la configuration de pf, puis de configurer sshd dans la jail pour ce que celui-ci écoute sur un port spécifique (différent de celui de l’hôte).

Configuration de pf

Nous allons commencer par compléter la définition de notre jail. Nous ferrons en sorte que sshd sur notre jail écoute sur le port 4242 :

1
2
sshtest_ip  = 192.168.12.1
sshtest_ports = {4242}

Et nous devons mettre en place la traduction d’adresse (le NAT) pour notre jail.

1
2
3
4
nat on $if from 192.168.12.0/24 to any -> ($if)

# Translations
rdr on $if proto tcp from any to $if port $sshtest_ports -> $sshtest_ip port $sshtest_ports

Ajoutons également une règle pour autoriser l’accès ssh sur le port d’écoute de la jail depuis l’extérieur (la première règle autorise l’accès ssh sur le port d’écoute de l’hôte).

1
2
3
# Allow ssh in
pass in log quick on $if proto tcp from any to any port = 22022 flags S/SA keep state
pass in log quick on $if proto tcp from any to $sshtest_ip port = $sshtest_ports flags S/SA keep state

Il ne faut pas oublier de tester la syntaxe du fichier pf.conf avant de l’activer.

1
2
$ sudo pfctl -vnf /etc/pf.conf
$ sudo pfctl -f /etc/pf.conf

  on me souffle dans l’oreillette que le script /etc/rc.d/pf fait une vérification avant d’appliquer les nouvelles règles. Il est donc inutiles de faire le test.

Configuration de ssh dans la jail

La suite de la configuration se fait sur la jail. Nous allons installer le serveur ssh et le configurer pour qu’il écoute sur le port 4242. Tout comme sur l’hôte, le fichier de configuration est /etc/ssh/sshd_config. Nous allons faire plus simple que sur l’hôte en indiquant simplement le port d’écoute. Nous allons également permettre la connexion de l’utilisateur root.

Attention : cette permission est provisoire et ne doit servir que pour notre test. Il est impératif de changer ce paramètre dès que nous avons prouvé que la connexion fonctionne.

1
2
3
port 4242
...
PermitRootLogin yes

Et nous redémarrons le service ssh :

  dans la même oreillette on me signale que si cette façon de faire est parfaitement correcte, en cas de mise à jour, le fichier /etc/ssh/sshd\_config pourrait être écrasé. En revanche le fichier /etc/rc.conf est garanti de ne point l’être. C’est pourquoi il est préférable de mettre dans celui-ci les options de démarrage de sshd :

1
sshd_flags="-p 4242 -o PermitRootLogin=yes"

Ceci est valable pour les jails, mais également pour l’hôte.

1
# service ssh restart

  sur ma jail ssh était présent, mais il manquait les hosts keys (les clefs du host). Il a fallu que je les génère avec les commandes suivantes :

1
2
# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

  mon oreillette experte m’indique que les clefs en question doivent être crées automatiquement par le script /etc/rc.d/sshd.1

Il est possible de vérifier que notre ssh écoute bien sur le port que nous avons désigné avec la commande sockstat -4 :

1
2
3
4
5
6
# sockstat -4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
smmsp    sendmail   78200 6  tcp4   192.168.12.1:41690    192.168.12.1:25
root     sshd       78128 3  tcp4   192.168.12.1:4242     *:*
root     sendmail   21342 3  tcp4   192.168.12.1:25       *:*
root     syslogd    21259 6  udp4   192.168.12.1:514      *:*

Test de la connexion depuis l’extérieur

Nous devons maintenant tester, depuis une machine externe, la connexion sur notre jail. Nous allons donc utiliser l’adresse IP de l’hôte et le port ssh de la jail. C’est la configuration de pf qui va faire le travail.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ ssh -p 4242 root@203.0.113.48
The authenticity of host '[203.0.113.48]:4242 ([203.0.113.48]:4242)' can't be established.
RSA key fingerprint is 0d:43:48:23:40:38:bd:86:51:4d:bd:c5:33:ad:93:9f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[203.0.113.48]:4242' (RSA) to the list of known hosts.
Password for root@sshtest:
Last login: Tue Nov  3 16:11:03 2015 from 192.168.12.1
FreeBSD 10.1-RELEASE-p19 (GENERIC) #0: Sat Aug 22 03:55:09 UTC 2015

Welcome to FreeBSD!

Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories:   https://www.FreeBSD.org/security/
FreeBSD Handbook:      https://www.FreeBSD.org/handbook/
FreeBSD FAQ:           https://www.FreeBSD.org/faq/
Questions List:   https://lists.FreeBSD.org/mailman/listinfo/freebsd-questions/
FreeBSD Forums:        https://forums.FreeBSD.org/

Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with:  pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.

Show the version of FreeBSD installed:  freebsd-version ; uname -a
Please include that output and any error messages when posting questions.
Introduction to manual pages:  man man
FreeBSD directory layout:      man hier

Edit /etc/motd to change this login announcement.
root@sshtest:~ #

Si vous arrivez là, c’est gagné, nous allons pouvoir aller plus loin.

Partager un dataset entre l’hôte et la jail

Nous allons maintenant partager un dataset ZFS existant (donc présent sur l’hôte) avec notre Jail.

Le travail se fait principalement sur l’hôte.

Il existe un fichier /etc/fstab.jailname (dans notre cas, fstab.sshtest. Celui-ci contient déjà le partage du dataset de la basejail. Nous allons y ajouter le partage d’un nouveau dataset.

  j’ai créé pour cela un dataset zroot/usr/local/www/test, mais vous pouvez partager un dataset existant.

1
/usr/local/www/test /usr/jails/sshtest/usr/local/www/test nullfs rw 0 0

On indique :

  • le chemin du partage (le point de montage du dataset) ;
  • le chemin vers la jail et le point de montage dans celle-ci ;
  • le type de système de ficbier, ici nullfs ;
  • le mode de montage, ici lecture-écritre (rw) 2 ;
  • les options de montage classique, dump et Pass.

Pour que les modifications prennent effet, nous devons arrêter et redémarrer notre jail :

1
2
$ sudo ezjail-admin onestop sshtest
$ sudo ezjail-admin onestart sshtest

Connectons-nous sur la jail (utilisez le moyen que vous préférez, j’utilise la connexion ssh maintenant qu’elle fonctionne).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ ssh -p 22022 root@203.0.113.48
# cd /usr/local/www/test
# df -h .
Filesystem             Size    Used   Avail Capacity  Mounted on
/usr/local/www/test    732G     83M    732G     0%    [restricted]
# echo "foo" > bar
# ls -al
total 2
drwxr-xr-x  2 root  www    3 Dec 28 19:00 .
drwxr-xr-x  3 root  wheel  3 Nov 14 18:54 ..
-rw-r--r--  1 root  www    4 Dec 28 19:00 bar

Retournons sur l’hôte, dans le même répertoire.

1
2
3
4
5
6
7
8
$ cd /usr/local/www/etc
$ ls -al
total 10
drwxr-xr-x   2 root  www   3 Dec 28 20:00 .
drwxrwxr-x  17 www   www  18 Dec  7 09:26 ..
-rw-r--r--   1 root  www   4 Dec 28 20:00 bar
$ more bar
foo

Il semble que nous puissions écrire dans ce système de fichier depuis la jail et que les modifications sont bien visibles sur l’hôte. Et lycée de Versailles !

Conclusion

Nous approchons du but, mais de nombreuses questions restent à résoudre.


  1. je ne sais pas si mon oreillette aimerait être nommée ici, mais quelle sache que je lui suis grandement reconnaissant de sa relecture, de son expérience et de son amitié. ↩︎

  2. notez que le système de fichier de la basejail est lui en mode lecture seule (ro). ↩︎

powered by FreeBSD