본문 바로가기

IT 살이/04. 기술 - 프로그래밍

[연재 06] ClickOnce 보안 모델

어셈블리가 로딩될 때, 어셈블리의 근원지가 로컬 PC가 아닌 경우 즉 로컬 PC의 외부에서 유입된 모든 어셈블리에서 대해서는 기본적으로 CAS가 적용된다. 달봉이는 처음에 보안(권한)과 관련해서, 로컬 PC에서 실행되는 일반 애플리케이션과 “온/오프라인용” 모드로 설치된 ClickOnce의 차이점이 궁금했다. ClickOnce 애플리케이션은 “온/오프라인용”으로 설정되면 로컬에 캐시된 애플리케이션이 구동된다. 이런 경우 스마트클라이언트 애플리케이션은 로컬 PC에서 구동되는 애플리케이션과 어떻게 구분되어서 적절한 보안 정책을 적용시킬 수 있게 되는 것일까? 이 포스트를 읽고 나면 답이 나올 것이다.

■ ClickOnce 애플리케이션 권한 설정

ClickOnce 애플리케이션의 권한은 애플리케이션 메너페스트(.exe.manifest)에 기술되어 있다. 애플리케이션이 부여받는 권한은 정확히 매너페스트에 기술된 것만 부여받는다. 그 이상도 이하도 아니다.
VS.NET2005에서는 프로젝트 디자이너의 보안 페이지에서 ClickOnce 애플리케이션의 권한을 설정할 수 있다. 
1350716813

VS.NET의 기본 설정

VS.NET2005에서는 기본적으로 애플리케이션이 FullTrust 권한을 필요로 하는 것으로 설정된다. “ClickOnce 보안 설정 사용” 체크박스가 선택되어 있고, “완전 신뢰 응용 프로그램”이 선택되어 있어서 FullTrust 권한을 선택하고 있다.
그러나 개발시에는 권한 관련한 설정을 모두 해제하고 작업을 하는 것이 편할 수도 있다. 그런 경우 “ClickOnce 보안설정 사용”을 해제하면 된다.
FullTrust도 필요한 경우도 있겠지만, 더 보안이 강화된 프로그램을 만들기 위해서 필요한 권한만을 요청하도록 설정할 수 있다.  다음 그림은 개발자가 직접 필요한 권한을 선택하는 것을 보여주고 있다.
1089587048 

필요한 권한 선택

“부분 신뢰 응용 프로그램”을 선택하면 비활성화된 영역 선택 부분과 권한 선택 부분이 활성화된다. 영역 선택의 콤보 박스에서는 애플리케이션을 게시할려고 하는 영역을 선택한다. 이렇게 하면 VS.NET은 영역에 부여된 기준 권한을 미리 알 수 있게 된다. VS.NET은 개발자가 선택한 권한이 개발자가 선택한 영역의 기준 권한을 벗어나지 않도록 할 수 있다.
녹색 체크 표시의 “포함” 컬럼은 해당 권한이 애플리케이션에 주어졌다는 것을 말한다. 개발자는 이 컬럼을 선택해서 “포함” 또는 “제외”를 선택할 수 있다. 또한 “속성…”버튼을 클릭하면 해당 권한에 대한 좀 더 자세한 설정을 할 수는 창이 뜬다. 
1135582803

권한 설정 창

이렇게 권한을 개발자가 직접 하나씩 설정해도 되지만, 자동 계산해주는 방법도 제공해주고있다. “권한 계산” 버튼을 클릭하면 현재 애플리케이션에서 필요로 하는 권한을 자동 계산할 수 있다. 이런 최종 권한 설정은 애플리케이션의 배포 메너페스트(.exe.manifest)에 기록된다.
이제 사용자가 ClickOnce 애플리케이션을 설치할 때, 매너페스트 파일에 기록된 대로 애플리케이션에 권한이 부여될 것이다. 그러나 매너페스트에서 요청하는 권한이 정상적인 CAS 정책에 정의된 것보다 더 많은 권한을 요구할 때는 사용자에게 애플리케이션이 요청한 권한을 부여할 것인지(elevation of permissions)를 확인하는 대화창이 뜬다. 사용자가 허락을 하게 되면 필요한 권한 설정이 추가되어 저장된다. 그래서 이후 실행시는 같은 대화창이 뜨지 않는다.

■ ClickOnce 애플리케이션의 런칭

애플리케이션이 권한에 맞도록 설치되었다. 이제 실행시킬 일만 남았다. 사용자는 적절한 URL(publish.htm , .application)을 호출해서 애플리케이션을 실행시킬 수도 있고 또는 “시작” 메뉴에 있는 바로가기 메뉴를 클릭해서 호출할 수도 있을 것이다. 바로 가기 메뉴를 클릭하면 확장자가 .appref-ms인 파일이 호출된다. 이 파일에는 .application 파일에 대한 바로가기 값이 있다.
사용자가 ClickOnce 애플리케이션을 호출할때 완전 신뢰 애플리케이션과 부분 신뢰 애플리케이션에 따라 구동 절차가 달라진다. 만약 완전 신뢰의 애플리케이션이라면 일반 로컬 PC의 애플리케이션과 동일하다. 즉 CAS 정책을 받지 않는다.
그러나 부분 신뢰의 애플리케이션에서는 호출되는 ClickOnce 애플리케이션이 구동되기 전에 AppLaunch.exe 이 실행된다. 
1318438464

ClickOnce 애플리케이션 구동 절차

일반 로컬 애플리케이션은 애플리케이션 자체가 독립적인 프로세스로 구동된다. 그러나 ClickOnce 애플리케이션을 구동하면 즉 .application 파일이나 .appref-ms 파일을 호출하면 먼저 dfshim.dll 파일을 거치게 된다. 이것은 윈도우 탐색기의 "도구->폴더옵션" 메뉴를 확인하면 알 수 있다. 
1223387852

ClickOnce 애플리케이션 파일 형식 구동 #1

1099820944 

ClickOnce 애플리케이션 파일 형식 구동 #2

1086896538 

ClickOnce 애플리케이션 파일 형식 구동 #3

그림은 .application 확장명을 클릭하면 rundll32.exe 명령어에의해 dfshim.dll이 호출됨을 보여주고 있다. .appref-ms 파일을 클릭해도 마찬가지다.
dfshim.dll은 ClickOnce 애플리케이션이 FullTrust 권한을 갖는다면 일반 로컬 애플리케이션처럼 실행시키지만 만약 부분 신뢰의 애플리케이션이라면 일단 AppLaunch.exe를 구동시키고 그런 다음 그것이 ClickOnce 애플리케이션을 로딩하고 호스팅하게 된다. 이것은 작업관리자(task manager)를 이용해서 쉽게 확인해 볼 수 있다. 이렇게 구동된 AppLaunch.exe는 ClickOnce 애플리케이션의 보안 샌드 박스(Security Sand Box)역할을 한다. 애플리케이션에 부여된 권한 밖의 일을 못하도록 하는 제어를 하게 된다.

■ 애플리케이션 인증

ClickOnce 애플리케이션이 배포되기 위해서는 매너페스트 파일들이 인증서를 이용해서 서명이 되어야 한다. 공인된 인증 기관으로부터 인증서를 구할 수 있는 상황이 아니라면 예를 들어 개발단계에서라면 테스트용 인증서를 만들어서 사용하면 된다. .NET 프레임워크 SDK에 포함된 MakeCert.exe 프로그램을 사용할 수도 있고, VS.NET을 사용해서도 쉽게 만들 수 있다. 다음은 EXE 프로젝트의 프로젝트 디자이너에 있는 서명 페이지를 보여주고 있다. 
1315509090

서명 페이지

만약 인증기관으로부터 받은 인증서가 있다면 서명 페이지에서 "저장소에서 선택..." 또는 "파일에서 선택..."을 이용해서 인증 정보를 가져오면 된다. 공인된 인증서가 없다면 "테스트 인증서 만들기..."버튼을 이용해서 테스트용 인증서를 만들 수 있다. 이 버튼을 클릭하면 다음과 같은 대화창이 뜬다. 이곳에 인증서를 만들기 위한 적절한 암호를 입력하고 확인을 하면 임시로 사용할 수 있는 인증서(.pfx)가 생성되고 정보가 인증서에 대한 내용이 자동으로 채워진다.

1179097507 

테스트 인증서 암호 입력

1025995781 

생성된 테스트 인증서

이렇게 설정을 마친 후 게시를 하면 애플리케이션의 매너페스트 파일(.application, .exe.manifest) 파일이 테스트용 서명이 추가된다. 애플리케이션의 매너페스트 파일만 서명하는 것이지 모든 어셈블리 파일에 적용되는 것은 아니다. 다들 잘 알겠지만, 인증서에 의한 서명은 CAS와는 상관없는 보안 정책이다.

부연. Authenticode 서명 vs. Strong Name 서명

하나의 어셈블리는 Authenticode 서명과 Strong Name 서명 모두를 가질 수 있다. 두 서명이 모두 게시자를 검증하기 위한 방법이긴 하지만 그 검증 시나리오는 사뭇 다르다. 또한 두 서명을 모두 가지고 있는 어셈블리의 경우 로딩과 보안 검증에 있어서도 재밌는 현상들이 있다. 지적 유희를 좋아하시는 분들은 다음 블로그를 참고하시면 된다.
Authenticode and Assemblies - shawnfa
http://blogs.msdn.com/shawnfa/archive/2005/12/13/502779.aspx
Athenticode 서명의 개념이 필요하다면  "Introduction to code signing"을 참조하라.



참조 문서

NewSecurityFeatures in .NET 2.0 - Pierre Nallet
http://www.theserverside.net/tt/articles/showarticle.tss?id=NewSecurityFeatures
What is new for security in .NET 2.0 - Pierre Nallet
http://www.develop.com/downloads/NEW_dotNETsec_v071.pdf
ClickOnce and Security - Pierre Nallet
http://develop.com/us/downloads/DM_Clickonce.pdf
.NET Security Blog
http://blogs.msdn.com/shawnfa/archive/category/2864.aspx
Authenticode and Assemblies
http://blogs.msdn.com/shawnfa/archive/2005/12/13/502779.aspx
ClickOnce Manifest Signing and Strong-Name Assembly Signing Using Visual Studio Project Designer's Signing Page
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/ClickOnceVS05.asp
Authenticode - msdn
ClickOnce Deployment Technology - Peter Bromberg
http://www.wise.com/Library/ClickOnce.pdf
ClickOnce : Bringing Ease and Reliability to SmartClient Deployment
http://www.code-magazine.com/article.aspx?quickid=0601041&page=1
Deploying applications - msdn
http://msdn2.microsoft.com/en-us/library/6hbb4k3e(VS.80).aspx
ClickOnce 배포 및 보안 - msdn(한)
http://msdn2.microsoft.com/ko-kr/library/76e4d2xw.aspx
ClickOnce 배포 및 Authenticode - msdn(한)
http://msdn2.microsoft.com/ko-kr/library/ms172240.aspx