Ignorieren von .svn-Verzeichnissen unter IIS

8

Wir sind eine Webentwicklungsorganisation und haben kürzlich Subversion für unser Versionskontrollsystem verwendet. Da das Ausführen eines Updates so viel schneller ist als das Exportieren und Kopieren der Dateien, möchten die Entwickler, dass der Produktionsserver eine Arbeitskopie ist.

Das einzige Problem, das ich damit habe, sind alle im System verstreuten .svn-Dateien und die Tatsache, dass eine unternehmerische Person möglicherweise den Inhalt der darin enthaltenen Dateien lesen und ihnen möglicherweise Informationen geben könnte, die wir lieber nicht hätten .

Was ist der beste / einfachste Weg, um zu verhindern, dass IIS Inhalte aus diesen .svn-Verzeichnissen bereitstellt?

cdeszaq
quelle
1
Hallo. Könnten Sie bitte klären, welche Art von Informationen Sie in der .svn-Datei haben möchten, die in den bereitgestellten Dateien nicht bereits verfügbar sind?
Geo
Welche Version von IIS? Wenn IIS7, könnten Sie das URL Rewrite Module erhalten und einfach eine einfache Regel einrichten, um .svn-Verzeichnisse zu ignorieren.
MattB
1
@Geo - Das .svn-Verzeichnis enthält Klartextkopien der Dateien in Textbasis. Da die Dateien dort den gleichen Namen haben und nur .svn-base angehängt ist, können Benutzer den Code im Klartext anzeigen (dies ist eine klassische ASP-Site). Das wollen wir lieber nicht haben.
Cdeszaq
@MattB - Der Server ist momentan IIS6, wechselt aber schließlich zu IIS7. Ich werde mich also nach dem Wechsel mit dem Umschreibemodul befassen, aber leider ist der Server gerade IIS6.
Cdeszaq

Antworten:

8

"Mach es nicht so" beantwortet die Frage nicht.

Praktisch mag ich es, eine Arbeitskopie auf dem Produktionsserver zu haben, weil ich auf diese Weise schnelle Änderungen in der Produktion vornehmen kann (wer hat das noch nie getan?) Und sie wieder einchecken kann. Dies hängt davon ab, wo Sie Ihren Sicherheits- / Komfort-Schieberegler haben möchten, und In vielen Fällen ist dies ein guter Ort.

Die Standardlösung in Apacheland besteht darin, die .svn-Dateien dort zu belassen, den Webserver jedoch anzuweisen, sie niemals bereitzustellen. So geht's mit IIS 5-7 unter Windows 2000-2008.

  1. Laden Sie ISAPI_Rewrite herunter und installieren Sie es - die Lite-Version reicht für diesen Zweck aus. Beachten Sie die zusätzlichen Systemanforderungen für Win 2008. Warnung - Das MSI-Installationsprogramm stoppt und startet IIS.

  2. Deaktivieren Sie das Kontrollkästchen "Schreibgeschützt" in den Eigenschaften der Datei httpd.ini . Wenn Sie das MSI-Installationsprogramm verwendet haben, finden Sie im Startmenü unter Helicon-> ISAPI_Rewrite eine Verknüpfung zur Datei httpd.ini

  3. Fügen Sie diese Zeilen zu httpd.ini hinzu :

ISAPI_Rewrite-Anweisungen in httpd.ini :

# Deny access to Subversion working copy administrative
#  directories (.svn) and their contents
RewriteRule .*/\.svn\b.* . [F,I,O]

Jetzt führt jede Anforderung eines .svn-Verzeichnisses oder seines Inhalts dazu, dass 404 vom Server nicht gefunden wird.

Nathan
quelle
Ich habe nicht bemerkt, dass ich die ältere Version ISAPI_Rewrite2 installiert habe. Die neuere Version, ISAPI_Rewrite3, enthält eine App namens "ISAPI_Rewrite Manager", die das Bearbeiten der Datei ein wenig vereinfacht. Unter Windows 2008 Server schien ein Neustart von IIS nicht erforderlich zu sein. Außerdem habe ich dies mit ein paar weiteren Details in meinem Blog gepostet
Nathan
"Mach es nicht so" beantwortet die Frage nicht. - Stapelüberlauf auf den Punkt gebracht. Vielen Dank, dass Sie die Frage direkt beantwortet haben.
John Hargrove
5

Sie können sicherstellen, dass von IIS verwendete Benutzerkonten keine Rechte für den Zugriff auf die SVN-Verzeichnisse haben.

Sie können dies entweder manuell tun (nicht empfohlen) oder ein MrJangles-Löschskript verwenden, das entweder ausgelöst wird, nachdem Sie das SVN-Update durchgeführt haben, oder regelmäßig als geplante Aufgabe ausgeführt wird:

for /r YOURPATH %f in (.svn) do icacls /deny <name_of_iis_user>:F "%f"

(Hinweis: Ich habe das oben Gesagte nicht getestet. Sie müssen überprüfen, ob es das tut, was es versucht, bevor Sie sich in der Produktion darauf verlassen. Weitere Informationen finden Sie in der Ausgabe von "icacls / help".)

(Ein weiterer Hinweis: "icacls" ist ein Vista / 2008-Befehl. In früheren Windows-Varianten lautet der Befehl stattdessen "cacls".)

David Spillett
quelle
Das ist reines Genie!
Richard Slater
5

Öffnen Sie mit IIS 7 den IIS-Manager, wählen Sie den Serverknoten aus und doppelklicken Sie auf die Funktion Handlerzuordnungen . Klicken Sie auf die Aktion Managed Handler hinzufügen und konfigurieren Sie den Handler wie folgt:

  • Anforderungspfad: * .svn / * (Platzhalterzuordnung für alle Dateien in allen .svn-Ordnern)
  • Typ: System.Web.HttpForbiddenHandler
  • Name: Subversion-Metadaten (Sie können einen anderen Namen wählen, wenn Sie möchten)

Jetzt sollte jede Anforderung von Dateien in den Subversion-Metadatenordnern mit dem Namen .svn in allen Sites Folgendes zurückgeben:

Serverfehler in '/' Anwendung.

Diese Art von Seite wird nicht bereitgestellt.

Beschreibung: Der von Ihnen angeforderte Seitentyp wird nicht bereitgestellt, da er ausdrücklich verboten wurde. Bitte überprüfen Sie die unten stehende URL und stellen Sie sicher, dass sie richtig geschrieben ist.

Angeforderte URL: /.svn/text-base/Default.aspx.svn-base

Wenn Sie möchten, können Sie einen anderen Handlertyp auswählen, z. B. einen FileNotFound-Handler, der einen 404-Statuscode zurückgibt.

Für IIS 6 (mit installiertem und konfiguriertem ASP.NET 2):

Navigieren Sie zu Ausgangsverzeichnis> Konfiguration> Zuordnung und ordnen Sie die .svn-baseErweiterung zu %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll. Dann können Sie in machine.config (die Sie in finden %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\CONFIG) denselben Handler wie oben für die Erweiterung hinzufügen und das folgende XML-Element als untergeordnetes Element des Elements hinzufügen <httpHandlers>:

<add verb="*" path="*.svn-base" type="System.Web.HttpForbiddenHandler"/>

Dies verhindert nur, dass Besucher die Quellcodedateien anfordern. Sie können dennoch andere Dateien aus den .svn-Ordnern anfordern. Ordnen Sie aspnet_isapi.dll weitere Erweiterungen zu oder erstellen Sie eine Platzhalterzuordnung (wirkt sich auf die Leistung aus), und Sie können verhindern, dass weitere Dateien angefordert werden.

Michiel van Oosterhout
quelle
4

Aus rein sicherheitstechnischer Sicht würde ich Ihre Entwickler umerziehen.

Eine einfache Bereitstellung ist nicht unbedingt eine gute Idee, wenn Sie die Sicherheit opfern.

Sie planen eine Konfiguration, um den Zugriff auf vertrauliche Informationen zu blockieren. Was passiert, wenn sich die Konfiguration versehentlich ändert? Was passiert, wenn ein IIS-HotFix herunterfährt und die Funktionsweise Ihrer Konfiguration ändert? Was passiert, wenn die von Ihnen verwendete Drittanbieter-Bibliothek fehlerhaft ist und nicht mehr funktioniert? Ich kann mir einige äußerst wahrscheinliche Ereignisse vorstellen, die Ihre Konfiguration beschädigen und den Zugriff auf diese Dateien ermöglichen würden. Dies würde VOLLSTÄNDIG VERMINDERT , wenn die Dateien überhaupt nicht auf dem Server wären .

Sie sollten ein Bereitstellungsskript erstellen, das die entsprechenden Dateien von einem Staging-Server kopiert. Sie können sogar über SVN in ein anderes Verzeichnis auf Prod wechseln.

Zum Bereitstellen können Sie RoboCopy und den Befehl / XD verwenden, um .svn-Verzeichnisse auszuschließen. Sie können das Microsoft Web Deployment Tool verwenden und damit die Verzeichnisse einschränken. Sie können die oben genannten Funktionen for /r YOURPATH %f in (.svn) do rd /s /q "%f"bei Bedarf bereitstellen und ausführen .

Stellen Sie diese Verzeichnisse nur nicht auf der Produktionswebsite bereit.

Christopher_G_Lewis
quelle
1

Verwenden Sie keine Subversion. Ernsthaft.

Aus Ihren Kommentaren geht hervor, dass Sie das falsche Tool für den Job verwenden. Subversion ist ein großartiges Tool für Ihre Entwickler, aber kein Bereitstellungs- / Spiegelungstool. Wenn Sie einfach Dateien mit einem Minimum an Bandbreite und Zeit von Ihrem Staging- / Testserver auf Ihren Produktionsserver kopieren möchten, empfehlen wir Ihnen, rsync zu verwenden . Da ich ein Unix-Administrator bin, gibt es möglicherweise ein Windows-Äquivalent zu rsync, von dem ich nichts weiß. Daher möchten Sie möglicherweise Nachforschungen anstellen. Sie können jedoch rsync unter Cygwin oder cwrsync verwenden .

Mit Rsync können Sie Verzeichnisse auf einem Server mit Verzeichnissen auf einem anderen Server spiegeln. Es berechnet ein Delta zwischen den beiden Servern und kopiert nur die Unterschiede. Nicht nur das, sondern es komprimiert das Delta und kann es optional auch verschlüsseln.

Swoogan
quelle
.... +1 für rsync
Jason S
Abgeordnet. Das Hauptproblem beim Versuch, die Dateien aktiv auszublenden, besteht darin, dass alle Dateien plötzlich wieder verfügbar gemacht werden, wenn die von Ihnen eingerichtete Handler- oder Umschreiberegel ausfällt. Wenn Sie Ihre Arbeitskopie in einer Test- oder privaten Bereitstellungsumgebung haben und dann nur eine große, rote Schaltfläche zum Veröffentlichen (ein kleines Skript) benötigen, die von diesem Speicherort auf den Live-Server synchronisiert wird. rsync kann einfach so konfiguriert werden, dass Dateipfade / -muster ignoriert werden, und lädt die meisten Änderungen sofort hoch. Es ist fast so praktisch wie Ihr aktuelles Setup.
SmallClanger
0

Best Practice wäre ein automatisches Bereitstellungssystem, das exportiert und veröffentlicht wird, nachdem ein SVN-Update durchgeführt wurde. Betrachten Sie zum Beispiel Hudson. Es gibt nur noch wenige, aber da wir keine brauchen, bin ich nicht sehr gut informiert

Greetz, GHad

GHad
quelle
Wir möchten den Export aufgrund einer Reihe von Problemen wie Bandbreite und Verbindungsgeschwindigkeit vermeiden. Aktualisieren Sie nur die Dinge, die sich geändert haben, was die Menge der Dinge drastisch begrenzt, was für uns ein wichtiger Faktor ist. Außerdem möchten wir nicht, dass die Dinge automatisch aktualisiert werden. Hudson von CC.Net würde dies zwar bereitstellen, aber es hilft uns hier nicht, da wir die Produktion manuell aktualisieren.
Cdeszaq
Wenn Sie manuell aktualisieren, sollten Sie Ihr WC in einem Bereich haben, der nicht vom Webserver bereitgestellt wird, und die aktualisierten Dateien aus diesem Verzeichnis in das Verzeichnis kopieren, das bereitgestellt wird. Sie profitieren von einer schnellen Netzwerkaktualisierung auf Kosten des Speicherplatzes.
Gbjbaanb
0

Ich plane ein Skript auf meinen Produktionsservern, das nach .svn sucht und die Dateien einfach löscht. Ich denke nicht, dass dies in Ihrem Fall funktionieren wird.

for /r YOURPATH %f in (.svn) do rd /s /q "%f"

Wenn das Entfernen der Dateien keine Option ist, können Sie die Verzeichnisse über IIS (Kennwort- oder IP-Einschränkungen) grundlegend schützen. Dies würde IIS daran hindern, Inhalte für nicht autorisierte Benutzer bereitzustellen.

Viel Glück!

Snipper
quelle
Das Entfernen der .svn-Verzeichnisse ist keine Option, da wir die Arbeitskopierfunktionen verlieren würden. Gibt es eine skriptfähige Möglichkeit, einen Baum zu durchsuchen und diese IIS-Einschränkungen hinzuzufügen? Die Aufgabe, dies manuell zu tun, ist zu groß und verliert die Automatisierung, die Subversion bietet.
Cdeszaq
Kein Zweifel. Ich habe so etwas noch nie geschrieben, also hoffen wir, dass jemand anderes antwortet.
Snipper