[ASP.NET] Web.config 암호화

2016. 6. 14. 13:57WEB/ASP.NET MVC

Web.Config에는 DB접속정보, SMTP ID/PW, API 키, 암호화 키 등 민감한 정보를 포함합니다. web.config를 암호화함으로써 이러한 정보들이 허락된 사용자를 제외하고 노출되는 것을 방지할 수 있습니다.

예를들어 여러 협력사와 동시에 개발 할 때는 web.config정보가 다수에게 노출될 수 밖에 없습니다. 이 경우 DB접속 정보 등 민감한 정보를 감추고 싶은 경우 connectionString만 암호화할 수 도 있습니다.

아래 예제에서는 web.config에서 ConnectionString을 암호화하는 방법을 다룹니다.

<configuration>
  <connectionStrings>
     <add name="myDB" connectionString="data source=mydb.database.windows.net;initial catalog=myDB;persist security info=True;user id=myadmin;password=mydbPassword@@;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>
  1. 먼저 명령 프롬프트를 관리자 권한으로 실행합니다.
  2. 다음의 경로로 이동합니다. .NET Framework 4.0이 설치된 폴더이며 이 경로는 사용자 환경에 따라 달라질 수 도 있습니다.
    C:\Windows\Microsoft.NET\Framework\v4.0.30319
  3. 아래의 명령을 실행합니다.
    ASPNET_REGIIS –pef “connectionStrings” “D:\MyWebSite\
    1. connectionStrings은 암호화할 대상 Section입니다. 대소문자를 정확하게 입력해야 합니다.
    2. D:\MyWebSite\는 web.config가 위치한 폴더의 경로입니다.
  4. 다음과 같이 암호화 된 것을 확인하실 수 있습니다.
    <?xml version="1.0" encoding="utf-8"?>
    
    <configuration>
        <configSections>
            <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </configSections>
        <connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
            <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
              xmlns="http://www.w3.org/2001/04/xmlenc#">
              <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
              <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
                  <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
                  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
                    <KeyName>Rsa Key</KeyName>
                  </KeyInfo>
                  <CipherData>
                    <CipherValue>a8LqToVNKoS1RSM1lBP5yXE9d8kPq8y68lwCARn98GbirZWnYmPuv75Z0HX01qx8XHWd4Q87/cmCdEDhj//P74CQ/KompgCZX6v7ORUWpLhFyVFPyhNCMTRAMX5peoWhZU7i62Gg3PudKdfJQRqtzJKii6kfPKLP5hLklBP4LX1qe+EjJ8i34CO+8AhIvNhzBVOOSX4oxE4lMb3qAeChr2oqZ7n4wtQOMYnN8/mwCybI2wrWRl1jPC29ATBTFnJy1vNj9KbRFOvysAbbAqwY5vmTpjTsM0gczgccCZaqsOPqTt8m6LLni/wWU/hKEKmcl32iTZdKb9aCVoyX5i00gQ==</CipherValue>
                  </CipherData>
                </EncryptedKey>
              </KeyInfo>
              <CipherData>
                <CipherValue>E48U+022nTePxygqxUX9aj20JvoCEtobrDXhT64PLoXf4fZ+0d0DUmIVVXjjTjEeAmTPLeVYgs7uJe0m2aVNckphdV1JYQ9/c3DvGc95jYeKYVGIalNVfy1Xp1+el6Z5R+uBbdP438iKwO358v1hHabUdR2x18kLn5Ks5Brm60ut25w4AyyCQVc3bTHe9qRNc0x3chxvxFSFSZ7q2zojFW9dCR6GmxJpPjD/2E9EaOro5J7JbandnpnFSHp25K975w37V6CYal6oIxGAlBaeYFk8ioofGlsgLp+gZA8iDxU4AQt8wn579+5Xv9ihqZjDpxK+jwQgYpf2WBsnId6I7D+Yn1uq1kAmYVsUN7zUZxRsZDQMHLNLQJipZmx/qQQ/C5nvM5snnNq194uwAyHMWhPszjlecvPQLxqajHSYnRA=</CipherValue>
              </CipherData>
            </EncryptedData>
        </connectionStrings>
        ... 
    
    </configuration>

암호화 키는 OS의 특정 영역에 자동으로 저장되게 됩니다. 따라서 이 web.config를 다른 OS로 옮긴다고 하더라도 복호화 되지 않습니다. ASP.NET Application은 web.config의 암호화된 블럭을 만나면 자동으로 복호화하여 읽어들이게 됩니다. 따라서 개발자가 특별히 해야할 추가적인 작업은 없으며, ASP.NET Project에서 다음과 같은 코드로 복호화된 connectionStrings을 확인 할 수도 있습니다.

string myDbConnectionString = ConfigurationManager.ConnectionStrings[1].ToString();

해당 운영체제에서는 누구라도 다음 명령어를 통해 Web.config를 복호화 할 수 있습니다.

ASPNET_REGIIS –pdf “connectionStrings” “D:\MyWebSite\

위의 방법을 통해 민감한 정보가 그대로 노출되지 않도록 보안의 단계를 향상시킬 수 있습니다. 하지만 해당 OS에서 ASPNET_REGIIS.exe를 실행할 수 있는 권한이 있는 사용자는 누구라도 복호화 할 수 있기 때문에 이 부분에 대해서는 주의가 필요합니다.