Forum Programmation.web Lancement de SSH via script CGI

Posté par (page perso) . Licence CC by-sa
1
24
oct.
2016

Bonjour à tous,

Je cherche une solution pour démarrer SSH à la demande et ainsi sécuriser cet accès.
J'ai vu les solutions de Knocking mais cela ne me convient pas(j'ai souvent des restrictions de ports chez mes clients).

Avez-vous déjà mis en place une solution de SSH à la demande via une page CGI?

J'ai commencé à écrire quelque chose mais je souhaite éviter de réinventer la "roue"…

Merci,
Antoine

  • # port 443

    Posté par . Évalué à 5. Dernière modification le 24/10/16 à 17:02.

    sshd doit tourner en root (sauf reconfiguration et grosses limitations).
    un CGI qui lance un truc en root, je trouve pas ça top.

    restrictions de ports chez mes clients

    Tu pourrais faire utiliser le port 443, rarement filtré, pour faire tourner SSH.
    Si tu as aussi un serveur HTTPS (sûrement puisque tu cherchais un CGI), tu peux tester sslh pour multiplexer HTTPS et SSH sur un même port.

    Pour ma part j'utilise une VPN openvpn sur le 443 puis me connecte en mosh à ma machine au travers de la VPN.

    • [^] # Re: port 443

      Posté par (page perso) . Évalué à 1.

      J'avais vu SSlH mais le SSH est toujours ouvert, ce que je ne souhaite pas.

      Pour MOSH, je vais regarder cela, cela a l'air intéressant dans certaines circonstances.

      Je sais que ce n'est pas super de lancer un script SUID pour lancer le SSH.
      Mais le script CGI intègre des valeurs clés(sécurité) à mettre pour lancer le script.

    • [^] # Re: port 443

      Posté par . Évalué à 3.

      personnellement j'utilise haproxy pour multiplexer https et ssh (enfin, il n'est pas actif poour le moment pour cause de plantage de Xen Host). Mais ça marche.

    • [^] # Re: port 443

      Posté par . Évalué à 1. Dernière modification le 24/10/16 à 17:42.

      Un cron qui tourne toutes les mn et qui va voir une table en bdd (ou ailleurs) pour activer ssh pourrait le faire. Et plutôt que de jouer avec l'arrêt/relance du daemon, on peut peut-âtre jouer avec une règle de firewall qui refuserait l'accès à tout sauf certaines IP pour se connecter quoi qu'il arrive en dépannage (via LAN par exemple). Et tu mets à jour ta table ou ton ichier via CGI.

      Mais bon, à ce stade le VPN est peut-être la meilleure solution

  • # Knocking

    Posté par (page perso) . Évalué à 3.

    Tu pourrais envoyer depuis ton serveur https le knock qui va bien en CGI qui ouvre le port SSH. Du coup, cela sépare bien les choses ;-)

    • [^] # Re: Knocking

      Posté par (page perso) . Évalué à 1.

      C'est pas mal comme idée…
      Avec la page CGI, je fais la séquence d'ouverture de ports qui va bien puis je me connecte en SSH ou mosh.

      Je vais regarder cela demain pour faire le "knocking".
      J'avais quasiment fini mon script, c'est dommage!
      Avec en paramètre, un 'sleep' pour savoir combien de temps, je devais garder le SSH ouvert.

          #!/bin/sh
          # Lecture des variables systemes
          tmp=`/bin/date`
          day=`/bin/date +"%d"`
          hour=`/bin/date +"%H"`
          key=`/bin/date +"%A"`
      
          # Lecture des variables via formulaire
          jour=`echo "$QUERY_STRING" | sed -n 's/^.*jour=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
          heure=`echo "$QUERY_STRING" | sed -n 's/^.*heure=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
          min=`echo "$QUERY_STRING" | sed -n 's/^.*min=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
          clef=`echo "$QUERY_STRING" | sed -n 's/^.*clef=\([^&]*\).*$/\1/p' | sed "s/%20/ /g"`
      
          if [ "$REQUEST_METHOD" = "POST" ]; then
                  read QUERY_STRING
          fi
      
          # on split la chaine de donnees en des paires name=value
          OPTS=`echo $QUERY_STRING | sed 's/&/ /g'`
      
          echo "Content-type: text/html"
          echo ""
          echo "<HTML><HEAD>"
          echo "<TITLE>Reponse au questionnaire</TITLE>"
          echo "</HEAD>"
          echo "<BODY BGCOLOR=\"#ffffff\">"
          #`echo "`{mathjax} QUERY_STRING" | sed -n 's/^.*jour=\([^&]*\).*`/\1/p' | sed "s/%20/ /g"
      
          echo "<H1>R&eacute;sultat du traitement de votre questionnaire</H1>"
          echo "<H2>Chaine de donn&eacute;es recue par le programme</H2>"
      
      
          echo "</BL>"
          echo "</UL>"
          echo "$day, $jour, $hour, $heure, $min,$key,$clef<br>"
          if [ "$day" = "$jour" ]; then
                  if [ "$hour" = "$heure" ]; then
                          if [ "$key" = "$clef" ]; then
                                  `/home/tonio/startssh.sh $min`
                                  echo "ok"
                          else
                                  echo "3"
                          fi
                  else
                          echo "2"
                  fi
          else
                  echo "1"
          fi
      
          echo "<hr>"
          echo "<b>La date courante sur le serveur est</b>"
          echo $tmp
          echo "</BODY></HTML>"
      
      • [^] # Re: Knocking

        Posté par (page perso) . Évalué à 7.

        Wouaw, tu nous donnera l'adressse de ton serveur web histoire qu'on rentre sur ta machine grâçe a tes CGI shell ultra pas sécurisés du tout ?

        Je suis un peu méchant, mais franchement tu devrait éviter ça, SSH est safe, bien plus safe que ce genre de choses.
        Tu désactive les accès par password, tu limite les login autorisés à ouvrir une session (PermitRootLogin / AllowUser / DenyUser / AllowGRoup / DenyGroup) et tu tiens a jour le demon SSH pour les quelques failles existantes et franchement tu ne risque pas grand chose.

        Par contre a laisser ouvert un serveur web, avec du php et des cgi shell, la …

        • [^] # Re: Knocking

          Posté par (page perso) . Évalué à 1.

          Je suis d'accord avec ta remarque sur l'ouverture d'un serveur web et de scripts cgi.
          Rien que pour cela, c'est vraiment moyen comme solution de contournement.

          Suite aux différentes remarques, je pense juste faire un script avec création de fichier et un cron qui vérifie la présence ou non du fichier.

          Mon serveur SSH tourne depuis longtemps sans souci mais je fais des mises à jour 3, 4 fois par an. Donc je souhaite éviter de trop l'exposer.

          • [^] # Re: Knocking

            Posté par . Évalué à 2.

            Suite aux différentes remarques, je pense juste faire un script avec création de fichier et un cron qui vérifie la présence ou non du fichier.
            Mon serveur SSH tourne depuis longtemps sans souci mais je fais des mises à jour 3, 4 fois par an. Donc je souhaite éviter de trop l'exposer.

            c'est ce qu'on vient de te dire,
            ton serveur web sera donc exposer en permanence, pas forcement plus durci que ton serveur SSH (mis à jour 3/4 fois par an aussi)
            et en plus c'est ton code qui va devoir gerer la securité

            alors que ssh et le portknocking, c'est quand meme fait pour…

            • [^] # Re: Knocking

              Posté par . Évalué à 2.

              D'après ce que j'ai compris, le serveur web existe déjà, donc est déjà exposé.

    • [^] # Re: Knocking

      Posté par (page perso) . Évalué à 2.

      Le port knocking (si c'est bien ce dont on parle) fonctionne pour une IP source.
      Si c'est le serveur HTTPS (aka localhost) qui knock, ça n'ouvrira pas le port pour son client remote…

  • # fichier drapeau

    Posté par (page perso) . Évalué à 2.

    Par FTP ou via un petit frontal web, créer ou faire créer un fichier, par ex /home/ssh_on_demand/on
    Un cronjob regarde chaque minute si le ficheir existe et si c'est le cas, il lance ssh et efface le fichier.

    La gelée de coings est une chose à ne pas avaler de travers.

  • # Jamais tu fais un script qui lance SSH

    Posté par (page perso) . Évalué à 4.

    Si tu veux vraiment utiliser ton serveur web (partons sur un Httpd Apache, mais fonctionne avec Hiawatha, nginx, …) :

    • Créer un virtual host (demande de configurer ton DNS ou /etd/hosts pour), ou path particulier,
    • Gérer un access.log juste pour cette partie,
    • utilise inotify sur ton access.log pour lancer un script qui :

      • soit lit le fichier de log pour obtenir l'IP et faire une ouverture firewall
      • soit démarre le SSH server.

    N.B. : Si inotify c'est overkill pour toi, tu as la crontab toutes les minutes…

    Aucun script lancé par le Web server. A la limite y a même pas besoin qu'une page existe derrière.

  • # Résultat pour commentaire ou pas

    Posté par (page perso) . Évalué à 2. Dernière modification le 25/10/16 à 16:46.

    Voici le résultat concernant mon besoin:

    La page web en php pour créer le fichier drapeau:

    <html>
    <head>
    <title>Test PHP</title>
    </head>
    <body>
    <?php
    $fileLocation = "/tmp/startsshd.tmp";
    $file = fopen($fileLocation,"w");
    $content = "C'est parti pour un tour";
    fwrite($file,$content);
    fclose($file);
    ?>
    Demande faite
    </body>
    </html>

    J'ai ajouté un .htaccess dans le répertoire, pour restreindre l'accès.

    Le script crontab:

    #!/bin/bash
    file="/tmp/startsshd.tmp"
    logfile="/var/log/startsshd.log"
    if [ -f "$file" ]
    then
    echo "$file found."
    echo "Start SSHD" >> $logfile
    date >> $logfile
    rm $file
    service sshd start
    sleep 60m
    service sshd stop
    echo "Start SSHD" >> $logfile
    date >> $logfile
    echo "---------------" >> $logfile
    else
    echo "$file not found."
    fi

    L'entrée dans /etc/crontab

        *  *    * * *   root    /etc/cron.d/start_sshd.sh
    

    Sur mon apache, j'ai plusieurs sites web derrière ainsi que du reverse proxy. Donc je n'ai pas pu reprendre l'idée du serveur web spécifique.

    • [^] # Re: Résultat pour commentaire ou pas

      Posté par . Évalué à 2.

      Sur mon apache, j'ai plusieurs sites web derrière ainsi que du reverse proxy. Donc je n'ai pas pu reprendre l'idée du serveur web spécifique.

      ben tu fais justement un virtualhost,
      ou un reverse proxy dédié

  • # Tor

    Posté par . Évalué à 1. Dernière modification le 26/10/16 à 13:20.

    Tu peux aussi restreindre l'accès a SSH uniquement sur 127.0.0.1, tu fais pointer un Tor Hidden Service dessus et via une WEBUI, un script ou ton interface tu lances "sudo service tor stop|start". Avec sudoers tu peux régler les problèmes de droit root en permettant à l'user qui gère ton interface de pouvoir stop|start le service.

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.