Outils pour utilisateurs

Outils du site


lumo:configurer_dokuwiki_nginx_pour_executer_un_script_bash_ayant_des_arguments

Configurer dokuwiki + nginx pour exécuter un script bash ayant des arguments

retour


J'ai pensé à çaConfigurer DokuWiki avec Nginx pour exécuter un script bash avec des arguments est une demande technique intéressante, mais qui nécessite quelques précautions importantes. Je vais vous expliquer les différentes approches et leurs implications de sécurité.Approche recommandée : Plugin DokuWikiLa méthode la plus propre consiste à créer ou utiliser un plugin DokuWiki qui appelle le script :Structure du plugin
/lib/plugins/myscript/
├── action.php
├── syntax.php
└── script.sh

Exemple de code PHP (action.php)
  • <?php
    class action_plugin_myscript extends DokuWiki_Action_Plugin {
        public function register(Doku_Event_Handler $controller) {
            $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_script');
        }
        
        public function handle_script(Doku_Event $event, $param) {
            if ($event->data == 'script') {
                $arg = $_GET['arg'] ?? '';
                // Validation stricte des arguments
                if (!preg_match('/^[a-zA-Z0-9_-]+$/', $arg)) {
                    http_response_code(400);
                    exit('Argument invalide');
                }
                
                $script = __DIR__ . '/script.sh';
                exec($script . ' ' . escapeshellarg($arg), $output, $return);
                
                echo json_encode(['output' => $output, 'return' => $return]);
            }
        }
    }
Configuration Nginx
  • server {
        listen 80;
        server_name wiki.votre-domaine.com;
        root /var/www/dokuwiki;
        
        # DokuWiki principal
        location / {
            try_files $uri $uri/ @dokuwiki;
        }
        
        location @dokuwiki {
            fastcgi_pass unix:/var/run/php/php-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        }
        
        # Protection des scripts bash
        location ~* \.sh$ {
            deny all;
            return 403;
        }
    }
⚠️ Considérations de sécurité CRITIQUES
RisqueSolutionInjection de commandesValider strictement tous les arguments avec regexExécution arbitraireNe jamais passer directement $_GET ou $_POST à exec()Élévation de privilègesExécuter le script avec un utilisateur dédié (non-root)Fuite d'informationsDésactiver l'affichage des erreurs en productionAttaques CSRFImplémenter des tokens CSRF dans les formulaires
Alternative plus sécurisée : API REST
Plutôt que d'exécuter directement depuis DokuWiki, créez une API séparée :
  • #!/bin/bash
    # /usr/local/bin/script-api.sh
    # Utiliser systemd socket ou une API Node.js/Python dédiée
Cette approche permet :

Une authentification indépendante
Un logging séparé
Des contrôles d'accès plus granulaires
Une mise à jour sans toucher au wiki

Permissions recommandées
  • # Propriétaire du script
    chown www-data:www-data /path/to/script.sh
    
    # Permissions restrictives
    chmod 750 /path/to/script.sh
    
    # DokuWiki doit être dans le même groupe
    usermod -aG www-data dokuwiki-user
    
Points importants

Évitez exec() si possible : Privilégiez les hooks PHP natifs de DokuWiki
Journalisation : Ajoutez un logging complet de chaque exécution
Timeout : Limitez le temps d'exécution pour éviter les blocages
Rate limiting : Implémentez des limites sur Nginx pour éviter les abus

Souhaitez-vous que je développe un aspect particulier de cette configuration, comme la création complète du plugin ou la configuration détaillée de Nginx ?
lumo/configurer_dokuwiki_nginx_pour_executer_un_script_bash_ayant_des_arguments.txt · Dernière modification : de estro

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki