Programming/.NET

ASP.NET에서는 machine.config나 web.config파일에 대해 프로그래밍으로 직접 설정내용을 읽거나 추가/수정이 가능한 API를 제공하고 있습니다. 이들 API들은 System.Configuration 네임스페이스 아래에 있으며 사용할 수 있는 클래스로는 다음과 같은 것들이 있습니다.

 

 AppSettingsSection

 <appSettings> 요소

 ConnectionStringsSettings

 <connectionStrings> 요소

 ProtectedConfigurationSection

 <protectedConfiguration> 요소

 ProtectedDataSection

 <protectedData> 요소

 AuthenticationSection

 <authentication> 요소

 AuthorizationSection

 <authorization> 요소

 CompilationSection

 <compilation> 요소

 CustomErrorsSection

 <customErros> 요소

 FormsAuthenticationConfiguration

 <forms> 요소

 GlobalizationSection

 <globalization> 요소

 HttpHandlersSection

 <httpHandlers> 요소

 HttpModulesSection

 <httpModules> 요소

 HttpRuntimeSection

 <httpRuntime> 요소

 MachineKeySection

 <machineKey> 요소

 MembershipSection

 <membership> 요소

 PagesSection

 <pages> 요소

 ProcessModelSection

 <processModel> 요소

 WebPartsSection

 <webParts> 요소

 

위 클래스들을 사용하면 각 이름에 맞는 설정구성에 대해 접근및 추가, 삭제등을 수행할 수 있습니다.  예를 들어 연결정보가 설정된 ConnectionStrings 요소의 값들을 모두 가져오려면 다음과 같이 처리할 수 있으며

 

foreach (ConnectionStringSettings con in System.Web.Configuration.WebConfigurationManager.ConnectionStrings)
    Response.Write(con.ConnectionString + "<br />");

 

반면 연결정보에 설정내용을 추가하기 위해서는 아래 절차를 거치면 됩니다.

 

ConnectionStringSettings css = new ConnectionStringSettings("mssqldb", "Data Source=localhost;Initial Catalog=testdb;User ID=sa;Password=12345;Persist 

Security Info=True;");

Configuration con = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
con.ConnectionStrings.ConnectionStrings.Add(css);
con.Save();

 

참고로 Web.config대신 machine.config를 열려면 System.Configuration.ConfigurationManager의 OpenMachineConfiguration메소드를 사용해야 합니다.

 

Configuration c = System.Configuration.ConfigurationManager.OpenMachineConfiguration();
foreach (string con in c.SectionGroups)
    Response.Write(con);

 

만일 로컬이 아닌 원격지 서버의 설정파일정보를 가져와야 한다면 OpenWebConfiguration메소드를 확장하여 원격서버를 지정하십시오.

 

Configuration c = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/", "test.server.co.kr");
ConfigurationSection cs = c.GetSection("connectionStrings");

 

설정파일의 설정내용은 기본적으로 사람이 읽을 수 있는 형태로 저장되고 관리되었습니다. 때문에 아이디와 비밀번호같은 민감정보는 별도로 암호화하여 관리할 수 있는 방법이 필요한데 이와 관련해 ASP.NET에서는 aspnet_regiis.exe 도구를 제공하고 있습니다.

 

예들 들어 web.config파일안에 설정된 연결문자열 정보를 보면 문자열 내부에 User ID와 Password로 비밀번호가 그대로 노출됨을 알 수 있습니다. 물론 그렇다고 해서 외부의 사용자가 해당 파일을 열어볼 수 있는것은 아니지만 직접 파일을 열어보는 경우까지도 보호가 필요하다면 aspnet_regiis를 다음과 같이 활용할 수 있습니다.

 

aspnet_regiis.exe -pef "connectionStrings" "C:\interup\testweb"

 

connectionStrings는 실제 암호화를 적용할 설정요소를 의미하며 뒤이어 오는 PATH는 web.config가 존재하는 폴더입니다.

 

암호화를 수행하고 나면 다음과 비슷한 결과를 볼 수 있습니다.

 

<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>nhv88Uv72+z+</CipherValue>
        </CipherData>
      </EncryptedKey>
    </KeyInfo>
    <CipherData>
      <CipherValue>/p9unppHlaCtFaAbtYQJFIjdqL7izI/3g9ZRp4SN93V</CipherValue>
    </CipherData>
  </EncryptedData>
</connectionStrings>

 

 

설정값을 가져올때 이렇게 암호화된 내용을 어떻게 복호화하여 가져올 수 있는지에 대해서는 고민할 필요가 없습니다. 이미 해본것처럼 API를 통해 설정정보를 가져오기만 하면 자동으로 복호화를 수행한 결과를 가져올 것입니다.

 

반대로 복호화를 수행하려면 -pdf 옵션을 사용합니다.

0 0