Plesk Panel mit Client-Zertifikat absichern

rolapp

Fan vom SSF
Plesk 11 Panel mit Client-Zertifikat absichern

Es wäre ja sinnvoll das Plesk-Panel zusätzlich vor Zugriff zu sichern.
Es besteht ja im Apache Web-Server die Möglichkeit einzelne Seiten oder Verzeichnisse über ein SSL Client-Zertifikat abzusichern.
Wie mache ich das aber mit Plesk und seinem Lighttpd, da bin ich hier im Forum und auf der Seite von Huschi auf mod_proxy gestoßen.
Ja das ist unser Freund.
Hier mal ein kleines Code-Beispiel
Code:
#   Konfiguration um Plesk-Panel mit Client-Zertifikat zu sichern	    
											    	 


# Konfiguration Subdomain plesk* Port:80 mit Automatischer Weiterleitung auf Port:443 

[COLOR="RoyalBlue"]<VirtualHost [COLOR="Red"]IP[/COLOR]:80 >

	ServerAlias plesk.*
   
        RewriteEngine on
	RewriteCond %{SERVER_PORT} !=443
	RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
    
</VirtualHost>[/COLOR]

# Konfiguration Subdomain update* für Port:443 

[COLOR="RoyalBlue"]<IfModule mod_ssl.c>
<VirtualHost [COLOR="Red"]IP[/COLOR]:443 >

	ServerAlias plesk.*
	
	SSLEngine on
        SSLCertificateFile /opt/psa/var/certificates/[COLOR="Red"]cert-xxx[/COLOR]
        SSLCACertificateFile /opt/psa/var/certificates/[COLOR="Red"]cert-xxx[/COLOR]
[/COLOR]
### Prüfung auf Client-Zertifikat
#   SSLRequire %{SSL_CLIENT_S_DN_Email} Email des Zertifikatinhabers
#   SSLRequire %{SSL_CLIENT_S_DN_CN} Name des Zertifikates
#   SSLRequire %{SSL_CLIENT_S_DN_O} Organisation
#   SSLRequire %{SSL_CLIENT_S_DN_OU} Abteilung
#   es gibt hier noch viel mehr werte und Verknüpfungsmöglichkeiten
#   für mehrere Werte :
#   SSLRequire %{SSL_CLIENT_S_DN_Email} in {"Email1", "Email2" ...}

[COLOR="RoyalBlue"]<Location />  
	SSLVerifyClient require
	SSLVerifyDepth 5
	SSLRequire 	%{SSL_CLIENT_S_DN_Email} eq "[COLOR="Red"]beispiel@beispiel.de[/COLOR]"
	</Location>

ErrorLog "/var/log/apache2/plesk_error"  
 
<IfModule mod_proxy.c>

	ProxyRequests Off  
	ProxyPreserveHost Off
	SSLProxyEngine On
[/COLOR]
# Zugriffsregeln für Proxy
	
[COLOR="RoyalBlue"]<Proxy *>
	Order Deny,Allow
	Deny from all
	Allow from all
</Proxy>[/COLOR]
# Weiterleitung auf Subdomain update wenn 'update und upgrade'
	
[COLOR="RoyalBlue"]<Location /admin/update/product/>
	RewriteEngine on
	RewriteRule ^ https://update.%{SERVER_NAME}/ [R=301,L]
</Location>[/COLOR]
# Weiterleitung auf localhost über mod_proxy
[COLOR="RoyalBlue"]			
	ProxyPass  / https://localhost:8443/	
	ProxyPassReverse / https://localhost:8443/
	
</IfModule>

</VirtualHost>

</IfModule>
[/COLOR]
# Konfiguration Subdomain update* Port:80 mit Automatischer Weiterleitung auf Port:443 

[COLOR="RoyalBlue"]<VirtualHost [COLOR="Red"]IP[/COLOR]:80 >

	ServerAlias update.*
    
        RewriteEngine on
	RewriteCond %{SERVER_PORT} !=443
	RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
    
</VirtualHost>
[/COLOR]
# Konfiguration Subdomain update* für Port:443
[COLOR="RoyalBlue"]
<IfModule mod_ssl.c>
<VirtualHost [COLOR="Red"]IP[/COLOR]:443 >

	ServerAlias update.*
 	
	SSLEngine on
    SSLCertificateFile /opt/psa/var/certificates/[COLOR="Red"]cert-xxx[/COLOR]
    SSLCACertificateFile /opt/psa/var/certificates/[COLOR="Red"]cert-xxx[/COLOR]
 [/COLOR]
### Prüfung auf Client-Zertifikat
#      SSLRequire %{SSL_CLIENT_S_DN_Email} Email des Zertifikatinhabers
#	SSLRequire %{SSL_CLIENT_S_DN_CN} Name des Zertifikates
#	SSLRequire %{SSL_CLIENT_S_DN_O} Organisation
#	SSLRequire %{SSL_CLIENT_S_DN_OU} Abteilung
#   es gibt hier noch viel mehr werte und Verknüpfungsmöglichkeiten
#   für mehrere Werte :
#	SSLRequire %{SSL_CLIENT_S_DN_Email} in {"Email1", "Email2" ...}
   
[COLOR="RoyalBlue"]<Location />  
	SSLVerifyClient require
	SSLVerifyDepth 5
	SSLRequire 	%{SSL_CLIENT_S_DN_Email} eq "[COLOR="Red"]beispiel@beispiel.de[/COLOR]"
</Location>

ErrorLog "/var/log/apache2/plesk_error"  
 
<IfModule mod_proxy.c>

	ProxyRequests Off  
	ProxyPreserveHost Off
	SSLProxyEngine On
	[/COLOR]
# Zugriffsregeln für Proxy	
[COLOR="RoyalBlue"]	<Proxy *>
		Order Deny,Allow
		Deny from all
		Allow from all
	</Proxy>
			
	ProxyPass  / https://localhost:8447/	
	<Location />
		ProxyPassReverse / 
	</Location>
</IfModule>

</VirtualHost>

</IfModule>[/COLOR]

Ich habs mal ein bischen bunt gemacht wegen der vielen Komentare, die anzupassenden Code-Teile sind rot markiert.
Das ganze habe ich in die Datei zzz_plesk.conf unter /etc/apache2/conf.d abgespeichert.
Apache neu starten.
Jede Domain kann jetzt das Plesk-Panel unter der Subdomain plesk.domain.de erreichen.
Es erfolgt eine automatische Weiterleitung auf https://plesk.domain.de inklusive Abfrage der ensprechenden Werte aus dem Client-Zertifikat.
Über update.domain.de kommt man dann direkt zum Update-Manager.
Das Meckern der Browser das das SSL-Zertifikat nicht zur Domain passt bleibt natürlich. Damit dies nicht mehr errscheint muß man das ganze nur an eine feste Domain mit passendem Zertifikat binden.

Für Anregungen und Hinweise bin ich Dankbar
Viel Spaß beim probieren.

Gruß
Steffen

P.S. mein System: Debian 6.0.6 / Plesk 11.0.9 / Apache/2.2.16 (Debian)
 
Last edited by a moderator:
update geht nicht

So weit war alles gut. Weil es schon spät war habe ich mich eben daran gemacht in den Iptables die Ports 8443 und 8447 nur noch für localhost zu zulassen.
Leider mußte ich feststellen das Update bringt mir 503 "Service Temporarily Unavailable" !!
Ging doch alles wunderbar.!???
Ok Netstat sagt es lauscht KEINER auf port 8447.
Der Fehler ist schon mal klar.

Also das Plesk ruft vor Weiterleitung auf Port 8447 den 'autoinstaller' auf.
/usr/local/psa/admin/bin/autoinstaller --web-interface

Der Knabe lauscht jetzt auf Port 8447 und es geht wieder alles, bis ich den Prozess beende.

Plesk killt den Prozess wahrscheinlich erst nach einer gewissen Zeit sonst wäre es ja nicht gegangen.

Hat jemand eine Idee wie man das elegant lösen kann sonst update über Konsole ?

Gruß
Steffen
 
Last edited by a moderator:
[gelöst]

Wie das eben immer ist, die Lösung war wieder mal zu einfach.
Und wer lesen kann hat Vorteile.

Mein Gedanke war es die Ports 8443 und 8447 nur von localhost erreichbar zumachen und gleichzeitig das Panel mit Client-Zertifikat abzusichern.

Port 8447 ist nur so lang offen wie der 'autoinstaller' Prozess läuft.
Ich weis jetzt nicht wie hoch das Timeout ist.

ich füge hier nochmal meine geänderte config ein
Code:
#
#																	
#   Konfiguration um Plesk-Panel mit Client-Zertifikat zu sichern	
#																	 
#

# Konfiguration Subdomain plesk* Port:80 mit Automatischer Weiterleitung auf Port:443

[COLOR="Blue"]<VirtualHost [COLOR="Red"]IP[/COLOR]:80 >

ServerAlias plesk.*
   
RewriteEngine on
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
    
</VirtualHost>[/COLOR]

# Konfiguration Subdomain update* für Port:443

[COLOR="Blue"]<IfModule mod_ssl.c>
<VirtualHost [COLOR="Red"]IP[/COLOR]:443 >

ServerAlias plesk.*
	
SSLEngine on
SSLCertificateFile /opt/psa/var/certificates/[COLOR="Red"]cert-xxx[/COLOR]
SSLCACertificateFile /opt/psa/var/certificates/[COLOR="Red"]cert-xxx[/COLOR]
[/COLOR]
### Prüfung auf Client-Zertifikat
#   SSLRequire %{SSL_CLIENT_S_DN_Email} Email des Zertifikatinhabers
#	SSLRequire %{SSL_CLIENT_S_DN_CN} Name des Zertifikates
#	SSLRequire %{SSL_CLIENT_S_DN_O} Organisation
#	SSLRequire %{SSL_CLIENT_S_DN_OU} Abteilung
#   es gibt hier noch viel mehr werte und Verknüpfungsmöglichkeiten
#   für mehrere Werte :
#	SSLRequire %{SSL_CLIENT_S_DN_Email} in {"Email1", "Email2" ...}

[COLOR="Blue"]<Location />  
	SSLVerifyClient require
	SSLVerifyDepth 5
	SSLRequire 	%{SSL_CLIENT_S_DN_Email} eq "[COLOR="Red"]beispiel@beispiel.de[/COLOR]"
</Location>

ErrorLog "/var/log/apache2/plesk_error"  
 
<IfModule mod_proxy.c>

ProxyRequests Off  
ProxyPreserveHost On
SSLProxyEngine On
[/COLOR]
# Zugriffsregeln für Proxy
	
[COLOR="Blue"]<Proxy *>
	Order Deny,Allow
	Deny from all
	Allow from all
</Proxy>
[/COLOR]
# Weiterleitung auf localhost über mod_proxy
			
[COLOR="Blue"]ProxyPass  / https://localhost:8443/	
ProxyPassReverse / https://localhost:8443/
	
</IfModule>

</VirtualHost>

</IfModule>
[/COLOR]

meine Änderungen:

Vhost für Port 8447 entfernt
ProxyPreserveHost On war vorher auf Off
Iptables nur Port 8443 auf local gestellt.

Das wars eigendlich schon.
Plesk-Panel ist nur noch mit Client-Zertifakat zu erreichen und Port 8443 nur noch über localhost zu erreichen.

nochmals vielen Dank für das tolle Forum hat mir schon sehr viel geholfen.

Gruß
Steffen

P.S. autoinstaller ist in der Zwischenzeit schon geschlossen worden
 
Doch noch zwei Fragen

So weit funktionierts gut.

Noch zwei Probleme

1. Problem mit Umleitung oder Redirect

Beim Aufruf der Zertifikatsverwaltung ein Domain bekomme ich folgenden Fehler

The requested URL /smb/redirect/pleskin/root//plesk/client@1/domain@4/certificate@/root//plesk/client@1/domain@4/mpc-certificates// was not found on this server.

Da sehe ich jetzt nicht durch!?

2. das hat jetzt nichts mit mod_proxy und der gleichen zu tun.
Beim Aufruf des Updates über Port 8447 bekomme ich das Plesk Standartzertifikat ausgeliefert. Hab ich geändert und gelöscht. Standartport 8443 ohne proxy wird korrekt ausgeliefert.
Das ist wieder irgendwo in einer conf abgelegt ähnlich dem von qmail,postfix. Die habe ich ja auch von Hand getauscht.

Wo könnte mann das finden?

Brauche jetzt doch mal Hilfe, hauptsächlich noch mal wegen mod_proxy, da gibts bestimmt noch Optionen oder so etwas.

Gruß
Steffen
 
Fehler gefunden

Ich habe mich noch mal mit den Fehlern befasst.

Fehler 2 falsches Zertifikat hat sich von selbst erledigt keine Ahnung

Fehler 1 betrifft generell mod_proxy und mod_rewrite im Apachen

Dieser Fehler trat noch bei folgenden Punkten in der Abonnementsverwaltung auf:

1. Ihre Site sichern (SSL Zertifikate verwalten)
2. FTP-Zugang
3. Backup Manager
4. File Manager (nur in der Domain Liste)

Der Fehler liegt an codierten Sonderzeichen z.B. %2F für / usw.
Der Apache codiert hier blind alle Sonderzeichen vermutlich auch doppelt habe folgendes im Query-String gefunden %252F soll %25 für %2F also / heisen. Ich vermute das ist der Punkt wo Plesk durcheinander kommt und die Seite nicht findet.

Ich habs wie folgt gelöst:

Code:
AllowEncodedSlashes On  

RewriteCond   %{THE_REQUEST} ^GET\ (.*)\ HTTP [OR]
RewriteCond   %{THE_REQUEST} ^POST\ (.*)\ HTTP
RewriteRule   ^ http://localhost:8880%1 [NE,P,L]

ProxyPassReverse  / http://localhost:8880/

Mit den Rewrite Regeln weise ich den Apachen an den Request unverändert weiter zu leiten. [NE]
NE|noescape

By default, special characters, such as & and ?, for example, will be converted to their hexcode equivalent. Using the [NE] flag prevents that from happening.

RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]

The above example will redirect /anchor/xyz to /bigpage.html#xyz. Omitting the [NE] will result in the # being converted to its hexcode equivalent, %23, which will then result in a 404 Not Found error condition.
Dann ist mir noch was aufgefallen Unterschied zwischen deutscher und englischer Beschreibung http://httpd.apache.org/docs/2.2
Die AllowEncodedSlashes-Direktive erlaubt die Verwendung von URLs, welche kodierte Pfadtrennzeichen (%2F für / und auf entsprechenden Systemen zusätzlich %5C für \) enthalten. Normalerweise werden derartige URLs mit einem 404-Fehler (Nicht gefunden) abgewiesen.

The AllowEncodedSlashes directive allows URLs which contain encoded path separators (%2F for / and additionally %5C for \ on according systems) to be used in the path info.

With the default value, Off, such URLs are refused with a 404 (Not found) error.

With the value On, such URLs are accepted, and encoded slashes are decoded like all other encoded characters.

With the value NoDecode, such URLs are accepted, but encoded slashes are not decoded but left in their encoded state.


Bei mir funktioniert nur ON|OFF

Soweit so gut, funktioniert eigendlich alles bis auf eine Sache.
In der Liste der Domains bzw Subdomains für ein Abo funktionier der File-Manager nicht. Der gibt mir ne 403 Forbidden. Das komische in der Übersicht oben funktionierts. Ich hänge noch Bild an was ich meine.

Gut da kann man glaub ich damit leben.
Plesk ist somit nur mit dem passendem Client-Zertifikat zu erreichen.
Ich hoffen meine Anleitung hilft auch allen die Plesk nur auf eine anderen Port erreichen wollen weil 8443 gesperrt oder änliches. (wurde ja im Forum schon Beschrieben). Die fehler traten bei Plesk 11 auf für ältere Varianten kann ich nichts sagen.

Für Kritiken bin ich offen.

Gruß
Steffen

Zitate sind von http://httpd.apache.org/docs/2.2/

P.S. hab noch was gefunden "NoDecode option available in 2.2.18 and later." alles klar
 

Attachments

  • plesk-fehler.jpg
    plesk-fehler.jpg
    134.3 KB · Views: 186
Last edited by a moderator:
Nachtrag

Hier noch ein kurzer Nachtrag.

Das Problem mit der Fehlermeldung vom File-Manager hats sich irgenwie in Luft aufgelöst hab mal probiert und es geht jetzt.

Hatte ein Problem mit cron und annacron, hab dadurch den Server neugestartet. Vileicht lag ja dadran keine Ahnung funktioniert jetzt wie es soll

Gruß
Steffen

P.S. Und schon kam der Fehler wieder, Apache-Update wenn möglich und alles wird gut
 
Last edited by a moderator:
Back
Top