Hintergrund
Ich habe die Aufgabe, CI einzurichten. Es wurde beschlossen, die Transformation von Konfigurationsdateien zu verwenden und vertrauliche Daten in verschlüsselter Form zu speichern. Sie können sie mit dem Schlüsselcontainer verschlüsseln und entschlüsseln.
Schlüsselbehälter
Jedes Windows-Betriebssystem verfügt über Sätze generierter Schlüssel. Der Schlüssel wird entweder auf dem Konto oder auf dem Computer generiert. Die vom Computer generierten Schlüssel können unter diesem Pfad C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys angezeigt werden. Hier wird der Schlüssel liegen, den wir als nächstes erstellen werden.
Schlüsselerstellung
Wir starten cmd vom Administrator und wechseln mit aspnet_regiis in das Verzeichnis. Ich habe es C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319
Führen Sie den Befehl aus
aspnet_regiis -pc "TestKey" -exp
exp - wird hinzugefügt, damit Sie den Schlüssel in Zukunft exportieren können
TestKey - der Name unseres Schlüsselcontainers
Schlüsselexport
Das Team
aspnet_regiis -px "TestKey" :\TestKey.xml -pri
TestKey - Name Schlüsselcontainer
C: \ TestKey.xml - Der Pfad, in den die Datei exportiert wird
pri - Fügen Sie einen privaten Schlüssel zum Exportieren hinzu
Schlüssel importieren
Das Team
aspnet_regiis -pi "TestKey" :\TestKey.xml
TestKey - Name Schlüsselcontainer
C: \ TestKey.xml - Der Pfad, aus dem die Datei exportiert wird
Rechte einstellen
Damit Ihre Anwendung oder Ihr IIS mit dem Schlüsselcontainer funktioniert, müssen Sie die entsprechenden Rechte konfigurieren.
Dies wird vom Team durchgeführt
aspnet_regiis -pa "TestKey" "NT AUTHORITY\NETWORK SERVICE"
TestKey - Name Schlüsselcontainer
NT AUTHORITY \ NETWORK SERVICE - der Zugriff auf den Schlüssel erhält
Standardmäßig verfügt IIS über ApplicationPoolIdentity für den Pool.
In der Microsoft-Dokumentation (siehe Link 2) wird ApplicationPoolIdentity wie folgt beschrieben:
ApplicationPoolIdentity : Wenn ein neuer Anwendungspool erstellt wird, erstellt IIS ein virtuelles Konto mit dem Namen des neuen Anwendungspools und führt den Arbeitsprozess des Anwendungspools unter diesem Konto aus. Dies ist auch ein Konto mit den geringsten Berechtigungen.
Damit IIS die Konfiguration entschlüsseln kann, muss die Identität im Pool für das Konto konfiguriert sein, oder Sie können "NETWORK SERVICE" auswählen und ihm Rechte erteilen.
Hinzufügen eines Abschnitts zur Konfiguration
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider"> <providers> <add name="CustomRsaProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="TestKey" cspProviderName="" useMachineContainer="true" useOAEP="false"/> </providers> </configProtectedData>
Auch Schlüsselcontainer und RsaProtectedConfigurationProvider werden global in Dateien definiert
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config, C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ machine.config
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider"> <providers> <add name="RsaProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="NetFrameworkConfigurationKey" cspProviderName="" useMachineContainer="true" useOAEP="false"/> <add name="DataProtectionConfigurationProvider" type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses CryptProtectData and CryptUnProtectData Windows APIs to encrypt and decrypt" useMachineProtection="true" keyEntropy=""/> </providers> </configProtectedData>
Verschlüsselung
Die Verschlüsselung selbst kann auf drei Arten erfolgen.
Befehlszeilenverschlüsselung
aspnet_regiis.exe -pef connectionStrings :\Site -prov "CustomRsaProtectedConfigurationProvider"
C: \ Site - Pfad zur Datei mit der Konfiguration.
CustomRsaProtectedConfigurationProvider - unser in der Konfiguration angegebener Anbieter namens Schlüsselcontainer.
Verschlüsselung durch eine schriftliche Bewerbung
private static string provider = "CustomRsaProtectedConfigurationProvider"; public static void ProtectConfiguration() { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConfigurationSection connStrings = config.ConnectionStrings; if (connStrings != null && !connStrings.SectionInformation.IsProtected && !connStrings.ElementInformation.IsLocked) { connStrings.SectionInformation.ProtectSection(provider); connStrings.SectionInformation.ForceSave = true; config.Save(ConfigurationSaveMode.Full); } } public static void UnProtectConfiguration(string path) { Configuration config = ConfigurationManager.OpenExeConfiguration(path); ConfigurationSection connStrings = config.ConnectionStrings; if (connStrings != null && connStrings.SectionInformation.IsProtected && !connStrings.ElementInformation.IsLocked) { connStrings.SectionInformation.UnprotectSection(); } }
Fahrrad
Wenn eine Dateitransformation stattfindet und Sie Abschnitte getrennt von der gesamten Konfiguration verschlüsseln müssen, ist nur eine selbst geschriebene Version geeignet. Wir erstellen eine Instanz der RsaProtectedConfigurationProvider-Klasse, nehmen einen Knoten aus XML und verschlüsseln ihn separat. Dann ersetzen wir den Knoten in unserer ursprünglichen XML durch unseren verschlüsselten und speichern das Ergebnis.
public void Protect(string filePath, string sectionName = null) { XmlDocument xmlDocument = new XmlDocument { PreserveWhitespace = true }; xmlDocument.Load(filePath); if (xmlDocument.DocumentElement == null) { throw new InvalidXmlException($"Invalid Xml document"); } sectionName = !string.IsNullOrEmpty(sectionName) ? sectionName : xmlDocument.DocumentElement.Name; var xmlElement = xmlDocument.GetElementsByTagName(sectionName)[0] as XmlElement; var config = new NameValueCollection { { "keyContainerName", _settings.KeyContainerName }, { "useMachineContainer", _settings.UseMachineContainer ? "true" : "false" } }; var rsaProvider = new RsaProtectedConfigurationProvider(); rsaProvider.Initialize(_encryptionProviderSettings.ProviderName, config); var encryptedData = rsaProvider.Encrypt(xmlElement); encryptedData = xmlDocument.ImportNode(encryptedData, true); var createdXmlElement = xmlDocument.CreateElement(sectionName); var xmlAttribute = xmlDocument.CreateAttribute("configProtectionProvider"); xmlAttribute.Value = _encryptionProviderSettings.ProviderName; createdXmlElement.Attributes.Append(xmlAttribute); createdXmlElement.AppendChild(encryptedData); if (createdXmlElement.ParentNode == null || createdXmlElement.ParentNode.NodeType == XmlNodeType.Document || xmlDocument.DocumentElement == null) { XmlDocument docNew = new XmlDocument { InnerXml = createdXmlElement.OuterXml }; docNew.Save(filePath); } else { xmlDocument.DocumentElement.ReplaceChild(createdXmlElement, xmlElement); xmlDocument.Save(filePath); } }
Referenzen
1.docs.microsoft.com/en-us/previous-versions/53tyfkaw2.support.microsoft.com/en-za/help/4466942/understanding-identities-in-iis