본문 바로가기

IT 살이/03. 관리 - 보안 관리

[연재] 3. 증거(evidence)

3. 증거(evidence)

권한 풀이기(permission resolver)는 어셈블리를 로딩하면서 그것에 대한 증거를 수집하게 된다. 이런 증거들은 .config 파일에 있을 수 있고(CODEBASE) 또는 어셈블리가 가지고 있는 메너페스트 등에도 있을 수 있다. 다음 그림은 .NET에서 사용하는 증거들을 “어디서 왔는가”에 사용되는 증거들, “누가 만들었는가”에 사용되는 증거들 그리고 기타 증거들로 분류해 놓고 있다.  

.NET의 7가지 증거(v2.0 기준)

.NET에서는 그림에 나타난 것처럼 기본적으로 8가지 증거를 확인한다. 어디서 왔는가? 누가 만들었는가?를 판단하는데 사용되는 증거들을 구분해서 보여주고 있다. 기타에 있는 해시값은 관리자가 어셈블리 파일을 배포한 이후 임의의 코드 변경(해킹)이 이뤄졌는가를 체크할 수 있는 증거이다. 하나의 어셈블리에 이 모든 증거가 부여되지는 않겠지만 몇 개가 동시에 부여될 수도 있다.

어셈블리 권한 풀이기는 어셈블리의 CODEBASE에 사용된 URL(http://, file://)을 통해서 어셈블리의 위치 기반의 증거(Url, Site, Zone)을 결정한다.
“Url” 증거는 CODEBASE  URL (http://호스트명/배포디렉토리/어셈블리명)을 통해서 바로 구할 수 있다. Site, Zone 증거도 URL에서 유추된다. Site 증거는 URL중에서 호스트 서버명 부분만을 말한다. CODEBASE URL이 http://www.example.com/assem.dll인 경우, 수집되는 “Site” 증거는 www.example.com이 된다. 만약 CODEBASE가 file:///C:/~ 형식이라면 Site증거는 없게 된다.
“Zone” 증거도 URL을 통해서 유추한다. CLR의 입장에서 보안과 관련해서는 세상을 5개의 영역으로 나눈다 : 내컴퓨터, 로컬 인트라넷, 인터넷, 신뢰할 수 있는 사이트, 신뢰할 수 없는 사이트. .NET에서는 System.Security.SecurityZone 열거형에 다음과 같이 정의하고 있다.

namespace System.Security
{
public enum SecurityZone
{
   MyComputer,
   Intranet,
   Trusted,
   Internet,
   Untrusted,
   NoZone = 0xFFFFFFFF
  }
}

로컬 파일 시스템에서 로딩된 모든 어셈블리는 MyComputer Zone에 속하게 된다. 그리고 원격 시스템에서 다운된 코드는 모두 IE 브라우저에서 구분하고 있는 영역을 기반으로 해서 결정된다.

IE 브라우저의 보안 영역 구분

IE 브라우저에서는 파일의 URL을 기반으로 해서 3영역, 로컬 인트라넷, 신뢰할 수 있는 사이트, 제한된 사이트를 정의한다. 그리고 이 3 영역에 포함되지 않는 모든 URL은 인터넷 영역에 포함된다. “로컬 인트라넷 영역”은 CODEBASE URL로, UNC 스타일의 URL( 예, \\server\dlls\assem.dll), DNS 스타일이나 IP 기반의 주소를 사용하지 않는 WINS 스타일의 HTTP URL( 예, http://서버명/apps/assem.dll, http://localhost/apps/assem.dll) 그리고 네트워크 공유 드라이브를 사용하는 URL( z:\apps\assem.dll)을 사용하는 어셈블리들이 이 영역에 포함된다. 사용자가 직접 이 영역에 포함되도록 사이트를 추가할 수도 있다.
IE 브라우저는 다시 “신뢰할 수 있는 사이트”와 “제한된 사이트” 영역을 정의하고 있다.  이 영역에는 사용자가 URL을 직접 추가하도록 해서 이 URL들에만 각각 적용되는 영역이다. URL이 앞의 어느 영역에도 적용되지 않으면 “인터넷 영역”으로 분리된다.
IE 브라우저에서 정의한 영역은 그대로 CAS 보안 영역에도 적용된다. 즉 브라우저에서 결정된 어셈블리에 대한 영역은 그대로 CAS의 보안 영역에 매핑되어서 어셈블리의 Zone 증거로 사용된다. 예를 들어, 어셈블리가 브라우저의 로컬 인트라넷 영역에 포함되었다면 이 어셈블리는 Zone 증거로 Intranet이 주어지게 된다.
“ApplicationDirectory” 증거는 애플리케이션의 베이스 디렉토리 값으로 결정된다. .NET2.0에서 새롭게 추가된 위치 기반의 증거로 “GAC”이 있는데, GAC에 등록된 어셈블리에 주어지는 증거이다. 지금까지 위치 기반의 증거들에 대해서 알아봤다.
위치 기반의 증거들외에도 .NET이 기본적으로 정의한 증거에는 누가 개발했는가를 알려주는 증거도 있다 : 강력한 이름(StrongName), 게시자(Publisher)
어셈블리의 4가지 이름 정보로 구성된 강력한 이름은 어셈블리의 메너페이스에서 구할 수 있다. 강력한 이름은 개발자 또는 이 어셈블리를 개발한 회사별로 고유한 이름이고 따라서 "어떤 이름을 갖는 어셈블리에게는 어떤 레벨의 권한을 부여하겠다"는 식의 보안 정책이 가능하다. 게시자(publisher) 증거도 마찬가지이다. 어셈블리는 공인 인증 기관에서 발급한 인증서에 대한 내용을 메너페스트에 디지털 서명으로 가지고 있을 수 있다. 이런 경우도 "어떤 인증 정보를 갖는 어셈블리에게는 어떤 권한을 부여하겠다"는 것이 가능하다.
마지막 증거, 해시(Hash)는 어셈블리 파일의 해시값으로서 어셈블리가 컴파일될때마다 변경될 수 있다. 어셈블리가 로딩되기 전에는 이 해시값이 없다. 로딩되면서 로더에 의해서 자동으로 어셈블리에 추가된다. 권한풀이기는 이 값을 증거로서 사용하는 것이다. 이것으로 증거들에 대한 이야기는 마치겠다.
이런 증거들을 근거로 해서 어셈블리에 주어질 권한을 계산해 내기 위해서는 PC마다 설정된 보안 정책이 있을 것이다. 이제 이 보안 정책에 대해서 알아본다.