블로그 이미지
대갈장군

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Notice

'프로그래밍/70-536'에 해당되는 글 1

  1. 2010.09.01 Application Domain
2010. 9. 1. 00:10 프로그래밍/70-536
Application Domain, 줄여서 AD는 뭣하는 녀석인가? 가장 빠르고 쉽게 답하자면 '프로세스'와 비슷한 놈이다. 프로세스는 운영체제가 제공하는 일종의 '독립된 프로그램 운영 공간'인데 바로 이 AD는 .NET Framework에 의해 제공되며 운영체제가 제공하는 프로세스보다 성능 효율 그리고 보안적인 면에서 우위를 점하고 있는 놈이다.

그렇다면 이 AD가 가지는 장점을 나열해 보자.
  • 다른 어셈블리로의 직접적인 엑세스 방지 (보안성 증가)
  • 보안설정이 각각의 AD에 적용 가능 (보안성 증가)
  • 하나의 AD에서 발생한 unhandled exception은 다른 AD에 영향을 미치지 않음 (안정성 증가)
  • 프로세스 생성에 비해 오버헤드가 적다 (효율성 증가)
위에서 언급된 장점들을 이용하면 아주 효율적인 프로그램 작성이 가능한데, 두 가지의 예를 들자면, 우선 하나의 AD가 오류로 인해 정지하더라도 다른 AD 영역은 안정적으로 돌아가므로 프로그램 전체의 안정성이 증가한다. 이것을 우습게 보면 안되는 것이 인터넷 환경에서 예측할 수 없는 오류로 에러가 발생했을 경우 이 오류로 인해 저장되지 않은 모든 작업이 한번에 날아가 버린다면 얼마나 허무하겠는가? 고로 이런면에서 AD는 매우 중요한 '프로그램 안정성'을 제공할 수 있다는 것이다.

다른 예로는 효율성인데, 일반적으로 하나의 프로세스에서 돌아가는 프로그램은 모든 라이브러리 (어셈블리)가 실행시에 정적 혹은 동적으로 연결된다. 대표적인 동적 라이브러리가 DLL인데 일반적으로 이 DLL들은 사이즈가 무지막지하게 큰 경우가 있다. AD를 사용하면 이런 무거운 DLL들을 실행시에 별도의 AD 영역으로 불러들인 다음 사용하고 다시 unload 해 주면 효율성이 증대 된다. 물론 현재의 컴퓨터 환경에서 남아도는 메모리가 많은데 이렇게 까지 할 필요가 있나라는 생각이 들기도 하지만, 어쨌든, 그렇게 할 수 있다는 것은 프로세스에 비해 효율적일수 있다는 것.

Application Domain의 생성 및 어셈블리 로드, 그리고 해제에 대한 코드는 아래와 같다.

AppDomain AD = AppDomain.CreateDomain("MyDomain"); // AD 생성

AD.ExecuteAssembly("Assembly.exe"); // AD에 어셈블리 로드

AppDomain.Unload(AD); // AD 해제

위에서 말한 각각의 AD에 대한 보안 설정에 대해 자세히 알아보자. 일단 왜 개별 보안 설정이 위력적인지 알아야 한다. 예를 들어 인터넷에서 Third-party(대형 기업이 만든것이 아닌 제 삼자)가 만든 어셈블리를 사용한다고 했을때, 권한 설정이 되어 있지 않다면 이 어셈블리는 하고싶은 것을 다 할수 있게된다. 만약 이 어셈블리에 보안 취약점이 있고 해커가 그것을 이용해 사용자의 컴퓨터를 악용하려 한다고 해도 막을 방법이 없다. 사용자는 자신의 코드는 안전하다고 믿었으나 아무것도 모른체 눈뜨고 당할 수 밖에 없다. 

만약 이런 시나리오에서 '권한 설정'을 추가하게 되면 이야기가 달라진다. 새로운 AD를 설정하여 보안 취약성을 가지고 있는 어셈블리를 불러온 다음 권한 설정을 통해 하드디스크 읽고 쓰기를 금지시켜 버리면 비록 그 어셈블리가 취약성을 가지고는 있지만 악용할 수는 없게 된다.

바로 이것이 권한제한 -> 보안 취약성 제거 -> 피해 최소화 로 이어지는 방어법이다. 이것을 영어로 표현하면 Defense-in-depth 라고 하는데 위키로 찾아보니 군대 용어라고 하는데 겹겹이 방어하여 피해를 최소화하는 방어 전술이래라 뭐래라... -_- 틀린말은 아니네..

아무튼, 이런 권한 설정을 위한 방법이 바로 Evidence 인데... 책에 보니까 이 Evidence 한국말로 '증거' 에 대해서 쏼라쏼라 뭐라뭐라 많이 써놨는데 주욱 읽어보니 다 잡소리고 걍 줄여서 한마디로 '보안 등급' 정도로 생각하면 되겠다. 단계별로 생성과정을 설명하자면 우선, object[] 타입으로 생성되는 변수가 하나 있어야 하는데 이 변수는 System.Security.SecurityZone 열거자와 System.Security.Policy.Zone 객체를 사용해서 사용자가 원하는 '보안 등급 영역'을 설정할 수 있다. 대표적인 예가 SecurityZone.Internet인데 인터넷의 보안 등급 영역을 사용하라는 말이다. 인터넷 영역의 보안 등급은 당연히 매우 높음이다. 왜냐면 보안 취약성이 높기 때문이지. 아무튼, 이렇게 생성한 object[] 변수를 Evidence 객체 생성자에 때려 넣으면 비로서 Evidence 객체가 생성된다.

이제 이 생성된 Evidence 객체를 AD를 만들때 붙여 넣으면 Application Domain 전체에 그 보안 등급을 적용하는게 되고 만약 특정 어셈블리를 로드할 때만 붙여 넣으면 해당 어셈블리에 대해서만 보안 등급을 적용하는 것이다.

뭐 구질 구질하게 설명하는 것보다 간단하게 코드로 살펴보자.

우선 특정 어셈블리에만 보안 등급을 설정하려면, 
object[] MyZone = { new Zone(SecurityZone.Internet)};
Evidence MyEvidence = new Evidence(MyZone, null);
AppDomain MyDomain = AppDomain.CreateDomain("MyDomain");
MyDomain.ExcuteAssembly("AnotherAssembly.exe", MyEvidence);

그리고 전체 Application Domain에 적용하고 싶다면,
object[] MyZone = { new Zone(SecurityZone.Internet)};
Evidence MyEvidence = new Evidence(MyZone, null);
AppDomain MyDomain = AppDomain.CreateDomain("MyDomain", MyEvidence);
MyDomain.ExcuteAssembly("AnotherAssembly.exe");

여기서 잘 보면 Evidence 객체를 생성할때 생성자에 두 개의 변수를 입력 받도록 되어 있고 두번째 녀석은 null로 되어 있는데 첫번째 인자는 host evidence이고 두 번째 인자는 assembly evidence이다. 첫번째 인자를 설정하면 두번째 녀석은 설정안해도 자동으로 첫번째 인자를 이용한다. 다만 프로그램에서 어셈블리 생성시 적용되는 보안 등급을 다르게 해야 한다면 두번째 인자도 설정해주면 된다. 뭐, 별로 그럴일은 없어 보이지만..



posted by 대갈장군
prev 1 next