Outils pour utilisateurs

Outils du site


machines:grifon:lg
no way to compare when less than two revisions

Différences

Ci-dessous, les différences entre deux révisions de la page.


machines:grifon:lg [2019/03/18 19:51] (Version actuelle) – créée - modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== 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. 
 +
 +<file | /etc/hostname.em0>
 +rdomain 1
 +inet 172.17.0.35/24 
 +inet6 fd00:1e02:40::c/64 
 +</file>
 +
 +<file | /etc/hostname.em1>
 +inet 89.234.186.9/27 
 +inet6 2a00:5884::a/64 
 +</file>
 +
 +<code>
 +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
 +</code>
 +
 +==== 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) :
 +<code>
 +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
 +</code>
 +
 +  * sshd coté public (em1) :
 +<code>
 +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
 +</code>
 +
 +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 :
 +<code> 
 +lg$ doas route -T0 exec rcctl restart sshd_public
 +</code>
 +
 +Ainsi deux daemons tournent en parallèle sur la machine :
 +<code>
 +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
 +</code>
 +
 +Dans la table de routage par défaut, rdomain 0 :
 +<code>
 +lg$ netstat -nat | grep *.22                                         
 +tcp          0      0  *.22                   *.*                    LISTEN
 +tcp6              0  *.22                   *.*                    LISTEN
 +</code>
 +
 +Et dans le rdomain 1 :
 +<code>
 +lg$ netstat -T1 -nat | grep .22 
 +tcp          0      0  172.17.0.35.22         *.*                    LISTEN
 +tcp6              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  fd00:1e02:40::c.22     *.*                    LISTEN
 +</code>
 +
 +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.
 +
 +<file | /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
 +</file>
 +
 +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). 
 +
 +<code>
 +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
 +</code>
 +
 +<file | /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 ""
 +        }
 +}
 +</file>
 +
 +
 +==== 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. 
 +
 +<file | /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
 +}
 +</file>
 +
 +Lors de la première utilisation il faut générer une clé de compte : 
 +
 +<code>
 +lg$ doas acme-client -ADv lg.grifon.fr
 +</code>
 +
 +Ensuite pour le renouvellement automatique, on invoque acme-client tous les jours, et s'il y a renouvellement on redémarre httpd : 
 +
 +<file | /etc/daily.local>
 +for domain in $(awk '/^domain/ {print $2}' /etc/acme-client.conf); do \
 +  acme-client -D $domain && \
 +  rcctl reload httpd; \
 +done
 +</file>
 +
 +Un peu de customisation pour que ça soit plus joli :
 +<file | /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>
 +</file>
 +
 +==== 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'
 +
 +<code>
  
machines/grifon/lg.txt · Dernière modification : 2019/03/18 19:51 de 127.0.0.1