Microsoft MVP성태의 닷넷 이야기
Windows: 22. 가상화에 대해서. [링크 복사], [링크+제목 복사],
조회: 24431
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

(시리즈 글이 8개 있습니다.)
Windows: 14. 보호 모드와 필수 무결성 제어(MIC: Mandatory Integrity Control)
; https://www.sysnet.pe.kr/2/0/433

Windows: 15. MIC 환경 구성 - Windows XP와 유사한 보안 설정
; https://www.sysnet.pe.kr/2/0/434

Windows: 16. 개발자를 위한 UAC 환경 설정
; https://www.sysnet.pe.kr/2/0/437

Windows: 17. 보안 데스크톱에서 활성화되지 않은 UAC 창이 안전할까?
; https://www.sysnet.pe.kr/2/0/441

Windows: 20. UAC 이모저모
; https://www.sysnet.pe.kr/2/0/449

Windows: 22. 가상화에 대해서.
; https://www.sysnet.pe.kr/2/0/456

.NET Framework: 297. 특정 EXE 파일의 실행을 Internet Explorer처럼 "Protected Mode"로 실행하는 방법
; https://www.sysnet.pe.kr/2/0/1225

개발 환경 구성: 571. UAC - 관리자 권한 없이 UIPI 제약을 없애는 방법
; https://www.sysnet.pe.kr/2/0/12633





가상화(Virtualization)에 대해서.



원래, 저는 "가상화"에 대해서는 별다른 언급을 하고 싶지 않았습니다. 어차피 없어질 기술이고, 그 취지 자체가 "사용할 만한 것"이 아니고 어쩔 수 없이 "사용되어지는 기술"이기 때문에 아래의 토픽에서 잠깐 다루고 지나가는 정도로 그치려고 했습니다.

UAC 이모저모 - 10. 가상화는 지양
; https://www.sysnet.pe.kr/2/0/449

그래도, 간단한 개념이라도 다른 분들이 잡는데 도움이 되지 않을까 해서 한번 써봅니다.^^ (음... 그래도 역시나 쓰기가 싫군요.)




자, 그럼 "가상화"가 뭔지 간략하게 설명해 볼까요?

가상화는, "관리자" 권한임을 가정하고 작성된 "기존 응용 프로그램들"이 비스타에서 실행이 되는 경우, "medium" 신뢰도 등급에서는 정상적으로 실행이 되지 않는 부분으로 인해 오동작 하는 것을 최대한 막기 위해 비스타에서 구현된 "임시" 조치입니다. 가상화는 "파일 시스템"과 "레지스트리"에 대해서만 제공이 되며, 그로 인해 최대한 "가상"으로 호환성을 제공해 주겠다는 취지인 것입니다. 즉... "비스타용으로 업그레이드될 예정이 없는 프로그램"들을 위한 "호환성" 측면에서 만들어진 기술로써, 최근에 대대적으로 행해지고 있는 비스타 호환성을 위한 업그레이드 작업을 진행중인 프로그램, 또는 신규 개발되는 응용 프로그램을 위한 기술이 아닙니다.

따라서, 모든 "프로그램"들이 가상화 기능의 혜택을 받는 것은 아니고, "UAC 이모저모 - 10. 가상화는 지양"에서도 밝혔지만, 해당 응용 프로그램이 다음과 같은 조건을 만족하지 않는 경우에만 비스타 운영체제에 의한 "가상화" 기능이 제공됩니다.

[표1: 가상화를 제공받지 못하는 프로세스 조건]
  • 64비트 프로세스
  • 사용자와의 상호작용 인터페이스가 없는 프로세스
  • 가장된(impersonate) 프로세스
  • 커널 모드 호출자
  • requestedExecutionLevel 값이 지정된 실행 파일

이로 인해 "%ProgramFiles%" (예를 들어, "C:\Program Files") 폴더에 파일을 저장하려고 하면, 실제로는 "%LOCALAPPDATA%\VirtualStore\Program Files" 폴더 하위에 저장이 되어집니다. 물론, 반대로 가상화가 되어진 해당 폴더를 "파일 열기 대화창" 등으로 보게 되면, 운영체제에 의해서 가상화된 폴더 내용과 병합되어져서 보이게 됩니다.

한 가지 유의 사항이 있다면, 이러한 가상화 서비스는 모든 폴더 및 레지스트리에 제공이 되는 것은 아닙니다. 시스템에 의해 제공되는 "%ProgramFiles%", "%SystemRoot%" 폴더나 "HKEY_LOCAL_MACHINE\SOFTWARE" 하위에 대해서만 제공이 되어집니다.

음... 이쯤 되면... 마이크로소프트의 노력이 참 "가상"하지요?




그럼, 한번 ... 재미삼아서 간단히 확인해 볼까요?

지금 "메모장"을 실행시키고 "C:\Program Files" 폴더에 아무 파일이나 저장해 보십시오. (Save든, Save As든 상관이 없습니다.) 아마도 권한 문제로 인해 저장이 안될 것입니다. 왜냐하면, "메모장" 프로그램은 "가상화"를 제공받기 위한 조건을 만족하지 않은 데다, 해당 폴더에 대한 쓰기 권한이 없는 "medium" 신뢰도 등급으로 실행되기 때문입니다.

자, 그럼 메모장에 "가상화"를 적용시켜 볼까요? "작업 관리자"를 띄워서 "notepad.exe" 프로그램을 선택한 다음 오른쪽 마우스 버튼을 눌러서 나오는 메뉴의 "가상화"를 선택합니다.

vista_virtualization_2.png

이제, 다시 "저장"과 관련된 동작을 "C:\Program Files"에 해봅니다. 이전의 시도와는 달리 정상적으로 파일 저장이 되는 것을 확인할 수 있습니다. 또한 저장이 된 다음, "열기" 대화창에서 "C:\Program Files"에 저장된 파일을 확인해 보면, 방금 저장한 파일이 있는 것을 확인할 수 있습니다. 하지만, "탐색기"로 "C:\Program Files" 내용을 확인해 보면 해당 파일이 존재하지 않습니다. 대신에, "C:\Users\[사용자 로그인 계정]\AppData\Local\VirtualStore\Program Files" 폴더에 그 파일이 있습니다.




여기서 한 가지 ... 제가 모르는 사항이 나타났습니다. "작업관리자"에 의해 확인된 사항으로 봐서는 메모장이 "가상화" 서비스를 받지 않는 조건이 있을 텐데, 저로서는 그 조건을 찾아내지 못했습니다. 왜냐하면 제 노트북의 "메모장" 프로그램은 위의 "[표1: 가상화를 제공받지 못하는 프로세스 조건]"에 해당하는 조건에 하나도 해당이 안되기 때문입니다. 즉, 테스트되어진 메모장은 32비트, 상호작용 인터페이스이며, 가장되지 않았고, 커널 모드 호출자도 아니며, requestedExecutionLevel 값이 정해져 있지도 않습니다. 실제로 notepad.exe의 리소스를 살펴봐도 "RT_MANIFEST"라는 것조차도 찾을 수 없었습니다.

vista_virtualization_1.png

단순히, 마이크로소프트에 의해서 만들어진 것이기 때문에 애당초 가상화에서 벗어난다는 추측만을 해볼 뿐 정확한 설명은 찾지 못했습니다. 비단, 메모장뿐만 아니라 system32에서 제공되는 대부분의(아니면 모든) 응용 프로그램이 그렇다는 것뿐.



^^ 사실, 제가 이 글을 굳이 쓰게 된 데에는 사연이 좀 있습니다. 바로, 다음의 댓글에 달린 내용이나 전체적인 내용을 보고 해당 토픽에 대해서 댓글로 설명을 부가한 것인데, 그 내용이 지워지는 바람에... ^^; 써놓은 글이 아까워서 제 게시판에 다시 써보는 것입니다. (내용이 좀 길어서 그냥 흘려보내기 아까워서. ^^;)

「UAC에 대해」
; http://vista.golbin.net/index.php?pl=774

아래는 제가 대략 달았던 내용을 원문이 사라진 관계로 다시 한번 정리를 해본 글입니다.

오류 정정 1: 지나가다님의 의견에서의 오류
이미 위에서 제가 설명한 내용을 대충 이해하신 분들이라면 아래의 댓글에 어떤 오류가 있는지 아실 수 있습니다.

지나가다 님.
"
사용자가 직접 저장 경로를 정해 저장하는 경우엔 Virtualization이 동작하지 않습니다. Virtualization의 경우, 응용 프로그램이(사용자의 액션없이 - 만약 메모장이 실행시 저장할 경로를 가지고, 사용자가 저장을 누르면 저장하도록되어져 있다면 메모장도 가상화경로에 저장됩니다. 그러나 지금의 예제는 부적절합니다. 사용자가 SaveAS API를 사용하였으므로, 가상화랑은 상관없습니다. 저건 권한 문제입니다.) 응용 프로그램내 저장 함수를 이용하여, 권한이 없는 특정 위치(%windir%, %programfiles%, HKLM와 같은)에 저장을 시도할 경우에 가상화가 되죠..(권한이 없다는건 잘아실것입니다.)
"



원글을 쓴 블로거.
"
그런데 리치 에딧에서 저장을 하였을 때 가상폴더로 갔었던 것 같은데요? 제가 잘못 본 건가요?
"


그쵸... 이건 완전히 틀린 댓글입니다. 그것은 "가상화"랑 연관된 것이 맞습니다. 댓글을 달았던 분의 말에 오류가 있음을 아시겠지요! 또한 그것에 대해 다시 물어보는 원글의 블로거도 "가상화"에 대한 개념을 제대로 잡지 못한 상태에서 글을 쓰신 것이 아닌가 생각되어지는데요.

"SaveAs API"라고 했는데... 그건 사용자 입장에서일 뿐, 개발 단계에서는 "Save"와 "SaveAs" API 같은 것은 없습니다. 모두 다 "CreateFile" API 하나로 생성되기 때문에 그것과 "가상화"는 별개의 문제입니다. 사용자가 파일 저장 대화창에서 "C:\Program Files"로 지정했다고 해도 "가상화가 적용된" 응용 프로그램은 "C:\Users\[사용자이름]\AppData\Local\VirtualStore\Program Files"로 저장이 됩니다.

하지만, 위에서 그렇게 테스트가 되지 않은 것은 "메모장"이 가상화에 해당하는 규칙을 만족하지 않기 때문에, 가상화 혜택을 받지 않고 실행되어 나타나는 현상입니다.




오류 정정 2: 원글에서의 오류
사실, 원글에서의 오류는 굳이 지적하고 싶지는 않습니다. 그런대로 잘 맞는 글이기 때문입니다. 하지만, 정확히 "가상화"에 대한 이해 없이 썼기 때문에 억지로 수정해야 할 부분이 보이긴 합니다.

예를 들어, "5번 IE에서 인터넷 뱅킹이 Run as adminstrator로 실행해야만 가능한 이유는?"을 설명하면서 "이 부분은 Virtualization 부분과 더 관련이 있지만"이라고 부가 설명을 하고 있지만, 그것과 가상화는 그다지 연관성이 없습니다.

IE는 기본적으로 가상화를 지원하게 되어 있지만(위에서 알려드린 작업 관리자를 통해서 확인해 보시면 알 수 있습니다.), "Run as administrator"로 실행을 할 수밖에 없는 것은 인터넷 뱅킹이 가상화에 대한 혜택을 받았다고 하더라도 그 신뢰도 등급(MIC)이 일반 데스크톱 응용프로그램이 가진 "medium" 수준도 아닌, "low" 레벨에 있기 때문입니다. 따라서 이 내용은 가상화와 관계가 있다기보다는 "보호 모드"와 더 연관이 있는 것입니다.

실제로, 기존 인터넷 뱅킹 관련 프로그램들을 포함한 웹 사이트들이 "신뢰할 수 있는 사이트"로 등록이 되어 "보호 모드"가 해제되면, 'low'가 아닌 'medium' 레벨로 동작되어 가상화 혜택과 함께 정상적으로 실행될 수 있는 가능성이 높아집니다.

하지만... 그래도 실행이 안되는 경우라면... 이런 경우를 들 수 있습니다.
"가상화"는 "파일 시스템"과 "레지스트리"에만 적용될 뿐, 그 이외의 자원에 대해서는 적용되지 않습니다. 따라서, 그 외의 관리 권한을 필요로 하는 동작을 해야 하는 경우라면 그 응용 프로그램은 실패하고 맙니다.



휴... 대강 위와 같은 댓글을 나름대로 타자 열심히 쳐 가면서 남겼었는데... ^^; 지워지니 허탈하군요. 암튼 ... 리바이벌이란~~~.

최근 들어서 너무 많은 기술이 쏟아져 나와서 배워야 할 것이 참 많아졌습니다. 또한 그 와중에서 다소 의미가 정상적으로 전달되지 않는 경우가 있을 수 있지만... 서로간에 댓글을 통해서 좀 더 올바른 정보들이 퍼지길 바랍니다.



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/15/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 61  62  63  [64]  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12339정성태9/21/202017058오류 유형: 655. 코어 모드의 윈도우는 GUI 모드의 윈도우로 교체가 안 됩니다.
12338정성태9/21/202017058오류 유형: 654. 우분투 설치 시 "CHS: Error 2001 reading sector ..." 오류 발생
12337정성태9/21/202018171오류 유형: 653. Windows - Time zone 설정을 바꿔도 반영이 안 되는 경우
12336정성태9/21/202021575.NET Framework: 942. C# - WOL(Wake On Lan) 구현
12335정성태9/21/202030741Linux: 31. 우분투 20.04 초기 설정 - 고정 IP 및 SSH 설치
12334정성태9/21/202015319오류 유형: 652. windbg - !py 확장 명령어 실행 시 "failed to find python interpreter"
12333정성태9/20/202015675.NET Framework: 941. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 (2)
12332정성태9/18/202018643.NET Framework: 940. C# - Windows Forms ListView와 DataGridView의 예제 코드파일 다운로드1
12331정성태9/18/202017541오류 유형: 651. repadmin /syncall - 0x80090322 The target principal name is incorrect.
12330정성태9/18/202018701.NET Framework: 939. C# - 전위/후위 증감 연산자에 대한 오버로딩 구현 [2]파일 다운로드1
12329정성태9/16/202021023오류 유형: 650. ASUS 메인보드 관련 소프트웨어 설치 후 ArmouryCrate.UserSessionHelper.exe 프로세스 무한 종료 현상
12328정성태9/16/202019990VS.NET IDE: 150. TFS의 이력에서 "Get This Version"과 같은 기능을 Git으로 처리한다면?
12327정성태9/12/202018131.NET Framework: 938. C# - ICS(Internet Connection Sharing) 제어파일 다운로드1
12326정성태9/12/202017529개발 환경 구성: 516. Azure VM의 Network Adapter를 실수로 비활성화한 경우
12325정성태9/12/202016726개발 환경 구성: 515. OpenVPN - 재부팅 후 ICS(Internet Connection Sharing) 기능이 동작 안하는 문제
12324정성태9/11/202017563개발 환경 구성: 514. smigdeploy.exe를 이용한 Windows Server 2016에서 2019로 마이그레이션 방법
12323정성태9/11/202016800오류 유형: 649. Copy Database Wizard - The job failed. Check the event log on the destination server for details.
12322정성태9/11/202020153개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한 [1]
12321정성태9/11/202015930오류 유형: 648. netsh http add urlacl - Error: 183 Cannot create a file when that file already exists.
12320정성태9/11/202017952개발 환경 구성: 512. RDP(원격 데스크톱) 접속 시 비밀 번호를 한 번 더 입력해야 하는 경우
12319정성태9/10/202017310오류 유형: 647. smigdeploy.exe를 Windows Server 2016에서 실행할 때 .NET Framework 미설치 오류 발생
12318정성태9/9/202016334오류 유형: 646. OpenVPN - "TAP-Windows Adapter V9" 어댑터의 "Network cable unplugged" 현상
12317정성태9/9/202019587개발 환경 구성: 511. Beats용 Kibana 기본 대시 보드 구성 방법
12316정성태9/8/202017397디버깅 기술: 170. WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
12315정성태9/7/202019804개발 환경 구성: 510. Logstash - FileBeat을 이용한 IIS 로그 처리 [2]
12314정성태9/7/202019962오류 유형: 645. IIS HTTPERR - Timer_MinBytesPerSecond, Timer_ConnectionIdle 로그
... 61  62  63  [64]  65  66  67  68  69  70  71  72  73  74  75  ...