Outils pour utilisateurs

Outils du site


machines:grifon:lg

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 à bgplg via un socket restreint.

bgplg peut ensuite être utilisé en tant que cgi sur l'interface web, ou bien en tant que shell via bgplgsh en ssh.

Les pages de man de bgplg et de 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 (rdomain) particulière, afin de faire tourner un sshd dans cette dernière. em1 est l'interface publique.

/etc/hostname.em0
rdomain 1
inet 172.17.0.35/24 
inet6 fd00:1e02:40::c/64 
/etc/hostname.em1
inet 89.234.186.9/27 
inet6 2a00:5884::a/64 
lg$ ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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 <programme>'.

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.

/etc/bgpd.conf
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 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
/etc/httpd.conf
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, acme-client(1) permet de causer à let's encrypt.

/etc/acme-client.conf
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 :

/etc/daily.local
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 :

/var/www/conf/bgplg.head
</head>
<body style="text-align: center">
<div style="margin: 0px auto; text-align: left; width: 800px;">
<a href="https://grifon.fr/">
<img style="width: 200px; margin: 0 auto;" src="/bgplg/grifon_resize.png" alt="Grifon"/>
</a>

bgplg

Une fois le looking-glass fonctionnel en web, on passer à la partie purement route-server / cli.

Ici c'est bgplgsh qui nous intéresse. Par convention purement personnelle l'utilisateur public sera 'rviews' avec un mot de passe 'Rviews'.

<code>

machines/grifon/lg.txt · Dernière modification: 2019/03/18 20:51 par petrus