====== lg - looking glass ====== lg est une machine virtuelle sous OpenBSD et met à disposition des administrateurs réseau et curieux un looking-glass bgp qui permet de consulter la table de routage internet vue par le réseau de grifon. Le looking-glass est disponible en web sur https://lg.grifon.fr et également en ssh (ssh -l rviews lg.grifon.fr). ===== Administrateurs ===== * alarig * gizmo * nemo * petrus ===== Services ===== * bgpd : 2x full view IPv4 + IPv6 de chacun des asbr * httpd : pour l'interface web du looking-glass * sshd : interne + public ===== Setup ===== lg doit récupérer une full view bgp des deux ASBR grifon, et les fournir à [[https://man.openbsd.org/bgplg|bgplg]] via un socket __restreint__. bgplg peut ensuite être utilisé en tant que cgi sur [[https://lg.grifon.fr/|l'interface web]], ou bien en tant que shell via [[https://man.openbsd.org/bgplgsh|bgplgsh]] en ssh. Les pages de man de [[https://man.openbsd.org/bgplg|bgplg]] et de [[https://man.openbsd.org/bgplgsh|bgplgsh]] décrivent presque toute la configuration nécessaire au looking-glass. ==== config réseau ==== em0 est l'interface privée qui permet l'administration en ssh ainsi que la supervision de la machine. Elle se trouve dans une table de routage ([[https://man.openbsd.org/rdomain|rdomain]]) particulière, afin de faire tourner un sshd dans cette dernière. em1 est l'interface publique. rdomain 1 inet 172.17.0.35/24 inet6 fd00:1e02:40::c/64 inet 89.234.186.9/27 inet6 2a00:5884::a/64 lg$ ifconfig em0: flags=8843 rdomain 1 mtu 1500 lladdr 8e:92:b4:c4:a3:78 index 1 priority 0 llprio 3 media: Ethernet autoselect (1000baseT full-duplex) status: active inet 172.17.0.35 netmask 0xffffff00 broadcast 172.17.0.255 inet6 fe80::8dcc:ae61:ef77:7eb2%em0 prefixlen 64 scopeid 0x1 inet6 fd00:1e02:40::c prefixlen 64 em1: flags=8843 mtu 1500 lladdr d6:06:c0:fa:a0:5f index 2 priority 0 llprio 3 groups: egress media: Ethernet autoselect (1000baseT full-duplex) status: active inet 89.234.186.9 netmask 0xffffffe0 broadcast 89.234.186.31 inet6 fe80::8ac5:854b:3556:6d18%em1 prefixlen 64 scopeid 0x2 inet6 2a00:5884::a prefixlen 64 ==== sshd ==== Deux daemons ssh tournent sur la machine : un sur em0 dans le rdomain/rtable 1 qui permet l'administration de la machine, et l'autre sur em1 / rdomain 0 (oui je sais...) qui permet de se connecter avec l'utilisateur rviews pour consulter le looking-glass. * sshd coté privé (em0) : lg$ doas cp /etc/ssh/sshd_config /etc/ssh/sshd_config_private lg$ doas cp /etc/rc.d/sshd /etc/rc.d/sshd_private lg$ doas rcctl enable sshd_private lg$ doas rcctl set sshd_private flags -f /etc/ssh/sshd_config_private lg$ doas rcctl set sshd_private rtable 1 lg$ diff -u /etc/ssh/sshd_config.orig /etc/ssh/sshd_config_private --- /etc/ssh/sshd_config.orig Mon Mar 18 11:37:47 2019 +++ /etc/ssh/sshd_config_private Mon Mar 18 10:21:06 2019 @@ -10,8 +10,8 @@ #Port 22 #AddressFamily any -#ListenAddress 0.0.0.0 -#ListenAddress :: +ListenAddress 172.17.0.35 +ListenAddress fd00:1e02:40::c #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_ecdsa_key @@ -91,3 +91,6 @@ # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server + +# config pour verrouillage +AllowGroups wheel lg$ doas rcctl start sshd_private * sshd coté public (em1) : lg$ doas mv /etc/rc.d/sshd /etc/rc.d/sshd_public # pour ne pas se tromper lg$ doas rcctl enable sshd_public lg$ doas rcctl disable sshd lg$ diff -u /etc/ssh/sshd_config.orig /etc/ssh/sshd_config --- /etc/ssh/sshd_config.orig Mon Mar 18 11:37:47 2019 +++ /etc/ssh/sshd_config Mon Mar 18 20:49:20 2019 @@ -10,8 +10,8 @@ #Port 22 #AddressFamily any -#ListenAddress 0.0.0.0 -#ListenAddress :: +ListenAddress 89.234.186.9 +ListenAddress 2a00:5884::a #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_ecdsa_key @@ -27,7 +27,7 @@ # Authentication: #LoginGraceTime 2m -PermitRootLogin prohibit-password +PermitRootLogin no #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 @@ -52,7 +52,7 @@ #IgnoreRhosts yes # To disable tunneled clear text passwords, change to no here! -PasswordAuthentication no +PasswordAuthentication yes #PermitEmptyPasswords no # Change to no to disable s/key passwords @@ -91,3 +91,5 @@ # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server + +AllowUsers rviews lg$ doas rcctl start sshd_public Si l'on se trouve dans le shell lancé depuis le sshd qui tourne dans le rdomain 1 il faut spécifier le rdomain 0 pour le sshd public : lg$ doas route -T0 exec rcctl restart sshd_public Ainsi deux daemons tournent en parallèle sur la machine : lg$ ps aux | grep /sbin/sshd root 19295 0.0 0.1 984 840 ?? Ss Thu05PM 0:04.47 /usr/sbin/sshd root 28986 0.0 0.1 1000 1168 ?? Is 10:22AM 0:00.00 /usr/sbin/sshd -f /etc/ssh/sshd_config_private Dans la table de routage par défaut, rdomain 0 : lg$ netstat -nat | grep *.22 tcp 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN Et dans le rdomain 1 : lg$ netstat -T1 -nat | grep .22 tcp 0 0 172.17.0.35.22 *.* LISTEN tcp6 0 0 fd00:1e02:40::c.22 *.* LISTEN lg$ route -T1 exec netstat -nat | grep .22 tcp 0 0 172.17.0.35.22 *.* LISTEN tcp6 0 0 fd00:1e02:40::c.22 *.* LISTEN On voit ici qu'il y a deux méthodes pour spécifier la table de routage dans laquelle on se trouve. Soit l'utilitaire, comme netstat, ping, telnet, offre la possibilité de spécifier la rtable, soit il faut passer par 'route -T$id exec '. ==== bgpd ==== bgpd doit donc recevoir les full view. Pas de filtrage en in, tout interdit en out. Pas d'installation des routes reçue dans la table de forwarding, on garde juste les routes en mémoire pour interrogation. Le socket est restricted afin d'interdire toute modification de configuration via ce dernier. router-id 89.234.186.9 AS 204092 fib-update no # permet de ne pas installer en table de routage # (inutile pou un lg) socket "/var/www/run/bgpd.rsock" restricted # le socket est dans le chroot de httpd pour bgplg cgi # restricted pour interdire les modifs (cf bgplg(8)) group grifon { remote-as 204092 neighbor 89.234.186.7 { descr "asbr01_v4" } neighbor 2a00:5884::1 { descr "asbr01_v6" } neighbor 89.234.186.6 { descr "asbr02_v4" } neighbor 2a00:5884::6 { descr "asbr02_v6" } } deny to any allow from group grifon inet allow from group grifon inet6 Démarrer ensuite bgpd ==== httpd ==== Cf principalement [[https://man.openbsd.org/bgplg | la page de man de bgplg]]. Ne pas oublier d'activer et démarrer httpd(8) et slowcgi(8). lg$ doas chmod 0555 /var/www/cgi-bin/bgplg lg$ doas chmod 0555 /var/www/bin/bgpctl lg$ doas mkdir /var/www/etc lg$ doas cp /etc/resolv.conf /var/www/etc logdir "/var/log/httpd" server "default" { listen on * port 80 location "/" { block return 301 "https://$HTTP_HOST/cgi-bin/bgplg" } location "/cgi-bin/*" { block return 301 "https://$HTTP_HOST$REQUEST_URI" root "" } location "/.well-known/acme-challenge/*" { root "/acme" request strip 2 } } server "lg.grifon.fr" { listen on * tls port 443 tls certificate "/etc/ssl/httpd/lg.grifon.fr.chained.crt" tls key "/etc/ssl/httpd/lg.grifon.fr.key" location "/" { block return 301 "https://$HTTP_HOST/cgi-bin/bgplg" } location "/cgi-bin/*" { fastcgi root "" } } ==== let's encrypt - acme-client ==== Pour l'obtention gratuite et le renouvellement des certificats, [[https://man.openbsd.org/acme-client.1|acme-client(1)]] permet de causer à let's encrypt. lg$ cat /etc/acme-client.conf authority letsencrypt { api url "https://acme-v01.api.letsencrypt.org/directory" account key "/etc/acme/letsencrypt-privkey.pem" } authority letsencrypt-staging { api url "https://acme-staging.api.letsencrypt.org/directory" account key "/etc/acme/letsencrypt-staging-privkey.pem" } domain lg.grifon.fr { domain key "/etc/ssl/httpd/lg.grifon.fr.key" domain certificate "/etc/ssl/httpd/lg.grifon.fr.crt" domain full chain certificate "/etc/ssl/httpd/lg.grifon.fr.chained.crt" sign with letsencrypt } Lors de la première utilisation il faut générer une clé de compte : lg$ doas acme-client -ADv lg.grifon.fr Ensuite pour le renouvellement automatique, on invoque acme-client tous les jours, et s'il y a renouvellement on redémarre httpd : for domain in $(awk '/^domain/ {print $2}' /etc/acme-client.conf); do \ acme-client -D $domain && \ rcctl reload httpd; \ done Un peu de customisation pour que ça soit plus joli :
Grifon ==== bgplg ==== Une fois le looking-glass fonctionnel en web, on passer à la partie purement route-server / cli. Ici c'est [[https://man.openbsd.org/bgplgsh|bgplgsh]] qui nous intéresse. Par convention purement personnelle l'utilisateur public sera 'rviews' avec un mot de passe 'Rviews'.