der henry: Apache2, Verzeichnis öffentlich machen

Hallo,

ich habe einen Webserver am laufen, bei dem ich AuthType basic nutze. Nun möchte ich aber ein einziges Verzeichnis öffentlich machen und darin ein cgi-script von Außen starten.

Ich habe mir zu meiner vhost nachfolgendes hinzugefügt.

<Directory "/srv/www/htdocs/public/*">
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
Require all granted
</Directory>

... ich kann jetzt auf mein öffentliches Verzeichnis zugreifen, um z.B. ein Bild im Webserver, ohne Authentifizierung, zu sehen.

Wenn ich aber mein cgi-script starten will, wird das cgi-script vom Browser herunter geladen. (Es liegt nicht am cgi-script, dies funktioniert seit Jahren)

Wer hat hier einen Tip.

Vielen Dank !!

der henry
  1. Ich rate mal.

    Du hast vergessen in Deiner Server-Konfiguration in der obersten Ebene (Document-Root) ein AllowOverride zu setzen?

    DocumentRoot /var/www/html
    
    <Directory "/var/www/html">
        Options None
        AllowOverride All
    </Directory>
    
    <Directory "/var/www/html/special">
        Require all granted
        Options +Indexes +ExecCGI
        AddHandler cgi-script .cgi
    </Directory>
    
  2. Lass mich raten (2)

    Du hast

    sudo a2enmod cgi; sudo systemctl restart apache2;
    

    vergessen?

    1. Hallo Raketenwilli,

      sollte das nicht einen http 500 Code geben?

      Rolf

      --
      sumpsi - posui - obstruxi
      1. sollte das nicht einen http 500 Code geben?

        Kommt drauf an, ob Henry alles gezeigt und/oder den Neustart gemacht hat.

        Wenn das

            AddHandler cgi-script .cgi
        
            Options +Indexes +ExecCGI
        

        tatsächlich ein:

            <IfModule mod_cgid.c>
                AddHandler cgi-script .cgi
                Options +Indexes +ExecCGI
            </IfModule>
        

        ist, dann nicht. Aber wie schon geschrieben, ohne Neustart sind das alles nur „tote“ Texte.

        Hier mal meine

        <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html

            <Directory "/var/www/html">
                    AllowOverride All
                    <IfModule mod_cgid.c>
                            AddHandler cgi-script .cgi
                            Options +Indexes +ExecCGI
                    </IfModule>
            </Directory>
        
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
        

        </VirtualHost>

        1. Hallo,

          natürlich habe ich den Server mit "service apache2 restart" immer neu gestartet. Das Modul "a2enmod cgi" hatte ich schon wegen anderer Scripte installiert und aktiviert.

          ... anbei meine komplette vhost.conf

          <VirtualHost *:443>
          
           DocumentRoot /srv/www/htdocs
           ServerName Laserprozessor
           ServerAdmin info@xyz.de
          
          <Directory /srv/www/htdocs>
            AllowOverride All                   # NEU !!! '
            Options +ExecCGI +Includes
          
            AuthType Basic
            AuthName "Bitte geben Sie Ihre Authorisierung ein"
            AuthUserFile /srv/www/htaccess/.htusers
            require valid-user
          </Directory>
          
          ScriptAlias /cgi-bin/ /srv/www/cgi-bin/
          
          <Directory /srv/www/cgi-bin>
            Options +ExecCGI +Includes
          
            AuthType Basic
            AuthName "Bitte geben Sie Ihre Authorisierung ein"
            AuthUserFile /srv/www/htaccess/.htusers
            require valid-user
          </Directory>
          
           SSLCertificateFile /etc/apache2/ssl.crt/fullchain.pem
           SSLCertificateKeyFile /etc/apache2/ssl.key/privkey.pem
           SSLEngine On
          
          ### Es werden alle Dateien (*.html) nach SSI durchsucht
           AddType text/html .html
           AddHandler server parsed .html
           AddOutputFilter Includes .html
          
          
          # Zugriff Kamera / USV-Software
           RewriteEngine   on
          # RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
          
          
          # Kamera  1 ##################################
          ProxyPass /kamera_1/ http://192.168.10.71:80/
          ProxyPassReverse /kamera_1/ http://192.168.10.71:80/
          
          
          # Kamera  2 ##################################
          ProxyPass /kamera_2/ http://192.168.10.72:80/
          ProxyPassReverse /kamera_2/ http://192.168.10.72:80/
          
          
          
          #########################################################
          # Zugriff auf public-Verzeichnis für "Stückzahl"
          #########################################################
          
          <Directory "/srv/www/htdocs/public">
          Require all granted
          Options +Indexes +ExecCGI
          AddHandler cgi-script .cgi
          </Directory>
          
          
          </VirtualHost>
          

          Ein ...

           ErrorLog ${APACHE_LOG_DIR}/error.log
           CustomLog ${APACHE_LOG_DIR}/access.log combinedQuelltext hier
          

          bringt Fehler, kann den apache2 nicht starten.

          Ich habe nun in meinen alten Unterlagen gekramt und hatte schon einmal ein "public" Verzeichnis. Hier stand in der serverkonfig noch zusätzlich

          Header set Access-Control-Allow-Origin  "*"
          Header set Access-Control-Allow-Methods  "PUT,GET"
          

          ... was aber bei der aktuellen Serverversion einen Fehler verursacht.

          Jetzt habe ich eine info.html erstellt in dem das cgi-script aufgerufen wird und siehe da ... es geht

          Danach habe ich den Pfad inkl. Port und cgi-namen + Übergabeparameter in die Browserzeile eingegeben ... es geht und der Rückgabewert wird angezeigt

          Wiederum danach habe ich die Webseite (anderer Webserver) unter die Lupe genommen, die auf den Webserver (publicverzeichnis) zugreift und mittels "fetch" das script vom entfernten Server aufruft um den Rückgabewert anzuzeigen. Hier kommt beim Aufruf (fetch) eine Fehlermeldung: "NetworkError when attempting to fetch resource" ... die Adresse ist aber 100% richtig.

          Konstellation:

          Webserver 1 (Zentrale) -> Webseite mit javascript holt von den Maschinen-Webservern (2-25 im Internet) über ein cgi-script in deren publicverzeichnis Daten ab.

          Eine Maschine hat einen neuen Rechner bekommen, dabei wurde der Webserver mit https aktiviert, alle anderen Maschinen haben noch http Von allen "http Maschinen" können weiterhin Daten abgeholt werden, von der "https Maschine" nicht. Kann dies am fehlenden Zertifikat liegen ... dies habe ich bei direkten Aufruf als sicher eingestuft und akzeptiert.

          Jetzt habe ich gelesen, es könnte eventuell mit Firefox und put/get zu tun haben ... ich habe jetzt keine Ahnung mehr, wo ich ansetzen soll/muss.

          Vielen Dank für eure Unterstützung

          der henry

          1. Moin.

            Vorab: Bei „Apache-Fragen“ ist es für die potentiell Helfenden immer wichtig zu wissen, welcher Apache unter welchem OS (auch welches Linux) wie installiert (aus dem Repo, docker, snap, selbst kompiliert, ...? ) installiert wurde. Siehe unten.

            ... anbei meine komplette vhost.conf

            AllowOverride All # NEU !!! '

            Das kann jetzt wieder weg, hab ich geschrieben weil ich dachte, Du steuerst das womöglich in einer .htaccess. AllowOverride steuert, was in einer solchen beachtet oder ignoriert wird…

            Ein ...

             ErrorLog ${APACHE_LOG_DIR}/error.log
             CustomLog ${APACHE_LOG_DIR}/access.log combinedQuelltext hier
            

            bringt Fehler, kann den apache2 nicht starten.

            Womöglich läuft Dein Apache nicht unter Debian und es gibt die Debian-typische Datei envvars nicht in /etc/apache2. Ersetze die Pfade (z.B. durch /var/log/apache2/error.log. Poste die Fehlermeldungen. Oder lass es halt weg wenn Du keine speziellen Logfiles brauchst.

            Ach so: Wenn/Falls Du da Pfade setzt, dann in dem Verzeichnis, in welches der Apache seine Logfiles „out of the box“ schreibt und lass die Endung „.log“ - sonst musst Du auch noch logrotate anpassen.

            Ich habe nun in meinen alten Unterlagen gekramt und hatte schon einmal ein "public" Verzeichnis. Hier stand in der serverkonfig noch zusätzlich

            Header set Access-Control-Allow-Origin  "*"
            Header set Access-Control-Allow-Methods  "PUT,GET"
            

            ... was aber bei der aktuellen Serverversion einen Fehler verursacht.

            https://httpd.apache.org/docs/current/mod/mod_headers.html

            Ist das Apache-Modul mod_headers eingeschaltet?

            Jetzt habe ich eine info.html erstellt in dem das cgi-script aufgerufen wird und siehe da ... es geht

            Das hab ich jetzt nicht verstanden.

            Danach habe ich den Pfad inkl. Port und cgi-namen + Übergabeparameter in die Browserzeile eingegeben ... es geht und der Rückgabewert wird angezeigt

            Wiederum danach habe ich die Webseite (anderer Webserver) unter die Lupe genommen, die auf den Webserver (publicverzeichnis) zugreift und mittels "fetch" das script vom entfernten Server aufruft um den Rückgabewert anzuzeigen. Hier kommt beim Aufruf (fetch) eine Fehlermeldung: "NetworkError when attempting to fetch resource" ... die Adresse ist aber 100% richtig.

            Verstehe ich das richtig:

            Du hast statisches HTML, darin Javasript, das „telefoniert“ zu unterschiedlichen Servern und holt anhand einer dynamischen (zur Laufzeit zusammengebauten) Adresse die Ausgaben des cgi-Skriptes ab?

            fetch hat - soweit ich das weiß und das MDN das beschreibt - keine Methode oder Setting mit dem man einen ungültigen Server-Key übergehen kann.

            Lösung: Dein Server sollte keine selbst signierten Keys anbieten. Eine Lösung ist: Konfiguriere und benutze Let's Encypt.

          2. Hallo Henry,

            mit Apache kenne ich mich nicht so aus, aber mir fällt was anderes auf: http/https.

            Das Protokoll gehört zum Origin der URL, d.h. wenn Du mit JavaScript von http://example.org aus etwas von https://examle.org lesen willst, ist das ein Cross-Origin Zugriff, der durch entsprechende CORS-Header genehmigt sein muss, damit der Browser ihn nicht verhindert.

            Header set Access-Control-Allow-Origin  "*"
            

            ist sozusagen der Freifahrtschein dafür.

            HTTPS an sich sollte nicht so kritisch sein; von einer HTTP-Seite aus eine HTTPS-Ressource zu lesen ist erlaubt, von HTTPS aus HTTP zu Lesen hingegen nicht.

            Access-Control-Allow-Methods brauchst Du nur für PUT, weil GET, POST und HEAD immer erlaubt sind (sagt MDN). Brauchst Du PUT? Machst Du fetch-Aufrufe mit PUT-Methode?

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo Raketenwilli, hallo Rolf,

              vielen Dank für eure Unterstützung. Fehler war ... wie schon so oft ... das Modul headers war/wurde nicht automatisch geladen.

              Als dies geladen habe konnte ich die Zeile

              Header set Access-Control-Allow-Origin "*"

              aktivieren und es läuft.

              Vielen Dank nochmals an euch zwei ...

              Ich werde mich bei Zeiten einmal mit Let's Encypt befassen.

                Gruß
              

              der henry

              1. Ich werde mich bei Zeiten einmal mit Let's Encypt befassen.

                Eigentlich muss man nur certbot installieren (und zuvor dafür sorgen, dass der Hostname im Internet zu seiner IP auflösbar ist und natürlich, dass dieser aus dem Internet auf Ports 80 und 443 (TCP) erreichbar ist.

                Das Debian-Wiki verrät, wie einfach das ist.