Accès sécurisé par x mots de passe

Effet recherché :
Le port ssh est régulièrement attaqué alors qu'on ne l'utilise que ponctuellement pour de la maintenance.
On peut fermer et ouvrir le port à la demande comme Port knocking
Ici on active ou désactive le service en passant par un serveur http , l'action sera exécuter par inotify.

Requis

un serveur http surportant le php et les sessions php.
Installation de incron sur le serveur
5 fichiers nécéssaires :
  1. jquery.js
  2. acces.php
  3. codacces.php
  4. ouverture.php
  5. fermeture.php
Les deux derniers sont accessibles en écriture pour apache. Ce sont eux qui sont suivis par incron.
en root ouvrir
incrontab -e
et y écrire
/chemin_du_fichier/fermeture.txt IN_CLOSE_WRITE systemctl stop sshd
/chemin_du_fichier/ouverture.txt IN_CLOSE_WRITE systemctl start sshd
en adaptant à votre installation

SELinux

Si SELinux est actif, il faudra donner le bon contexte aux deux fichiers txt
chcon -t httpd_sys_rw_content_t /chemin_du_fichier/ouverture.txt
chcon -t httpd_sys_rw_content_t /chemin_du_fichier/fermeture.txt

Codes

Les deux codes sont aux lignes 7 et 8 de codacces.php
Ils peuvent être de longueurs différentes avec un nombre de caratères libre pour chaque case
La totalité d'un code ne doit pas se retrouver au début de l'autre code, c'est la première correspondance qui sera exécutée
les ' sont obligatoires en cas d'utilisation de caractère non numérique

Utilisation

Pour des raisons de sécurités, il n'y a pas de retour au commandes effextuées
Le champ de saisie et en haut à gauche, il sera visible en cliquant dedans.
Saisir le premier code puis valider avec la toucher Entrer
Tant que le nombre de saisie n'est pas dépassé, le champ se vide automatiquement pour la saisie du code suivant.
Quand le bon code est trouvé, l'action est exécuté mais il n'y a aucune indication de l'effet.
En cas d'erreur, recharger la page pour recommencer.

Recommandation

Sur un service distant, accessible uniquemet par son interface de gestion(hébergeur), sshd sera lancé au démarrage de la machine. En cas de problème, il suffira de redémarrer le serveur pour retrouver la main.
Sur un poste personnel qui est régulièrement redémarrer, sshd sera désactivé au démarrage s'il y a possibilité de lancer sshd en cas de problème.

Code fichiers

----------------------acces.php----------------------

<?php
session_start
();
$_SESSION['compteur'] = 0;
$_SESSION['ouverture'] = "";
$_SESSION['fermeture'] = "";
?>
<script type="text/javascript" src="jquery.js"></script>
<script>
$(document).ready(function() {
    $('input').on('keydown',function(event){
        if (event.which == 13){
            charge($(this).val());
        }
    });    
    function charge(req){
        $.ajax({
            type: "GET",
            url: "codacces.php?req="+req,
            dataType : "html",
            success:function(data){
            $("#resultat").append(data);
            }
        });
    }
});
</script>
<input type="password" style='border:0px'></input>
<div id='resultat'></div>

----------------------codacces.php----------------------

<?php
session_start
();
/* Note : les deux codes peuvent être de longueurs différentes avec un nombre de caratères libre pour chaque case
La totalité d'un code ne doit pas se retrouver au début de l'autre code, c'est la première correspondance qui sera exécutée
les ' sont obligatoires en cas d'utilisation de caractère non numérique
*/
$codeO = ['123','64','78901'];
$codeF = ['123','456','78f','aze'];
$max = (count($codeO) <= count($codeF)?count($codeF):count($codeO));
$reqfilter_input(INPUT_GET"req"FILTER_SANITIZE_STRING);
if (!isset(
$_SESSION['compteur'])) { //protection contre un accès direct
    
exit;
}
if (
$_SESSION['compteur'] >= $max) {
    exit;
}
$ouvertureControle "";
$fermetureControle "";
// Concatenation
foreach ($codeO as $a) {
    
$ouvertureControle .= $a;
}
foreach (
$codeF as $b) {
    
$fermetureControle .= $b;
}
$h date('d/M/Y/H:i:s');
//traitement
if (isset($req)) {
    if ((isset(
$codeO[$_SESSION['compteur']]))&&($req == $codeO[$_SESSION['compteur']])) {
        
$_SESSION['ouverture'].= $codeO[$_SESSION['compteur']];
        if (
$_SESSION['ouverture'] == $ouvertureControle) {
            
$fichier fopen($_SERVER['DOCUMENT_ROOT']."/ouverture.txt""w+");
            
fwrite($fichier$h);
            
fclose($fichier);
            
$_SESSION['compteur']++;
            exit;
        }
    }
    if ((isset(
$codeF[$_SESSION['compteur']]))&&($req == $codeF[$_SESSION['compteur']])) {
        
$_SESSION['fermeture'].= $codeF[$_SESSION['compteur']];
        if (
$_SESSION['fermeture'] == $fermetureControle) {
            
$fichier fopen($_SERVER['DOCUMENT_ROOT']."/fermeture.txt""w+");
            
fwrite($fichier$h);
            
fclose($fichier);
            
$_SESSION['compteur']++;
            exit;
        }
    }
    
$_SESSION['compteur']++;
}
?>
<script>$('input').val('');</script>