응용 프로그램 풀 신원

등록일시: 2009-04-08 14:57,  수정일시: 2013-11-26 15:24
조회수: 14,616
이 문서는 IIS 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.

서론

윈도우 서버 2008과 윈도우 비스타에 서비스 팩 2를 설치하면 IIS에서 새로운 보안 기능이 제공되는데, 이 기능의 이름은 응용 프로그램 풀 신원(Application Pool Identity)입니다. 응용 프로그램 풀 신원을 사용하면 관리자가 일일이 생성하거나 관리할 필요 없는 특수한 도메인 또는 로컬 계정으로 응용 프로그램 풀을 실행할 수 있으며, 해당 응용 프로그램 풀 계정의 이름은 응용 프로그램 풀의 이름과 동일합니다. 다음은 DefaultAppPool이라는 이름의 계정으로 실행되는 IIS 작업자 프로세스(w3wp.exe)를 보여줍니다. *

* 결과적으로 최근 이슈가 되고 있는 윈도우 7 이나 윈도우 서버 2008 R2 에서 제공될 IIS 7.5 에서는 현재 응용 프로그램 풀의 기본 실행 계정인 NETWORKSERVICE 가 응용 프로그램 풀 신원으로 대체될 것으로 보인다.

응용 프로그램 풀 신원 계정

기본적으로 IIS 6이나 IIS 7의 작업자 프로세스는 NETWORKSERVICE 계정으로 실행되며, 이 NETWORKSERVICE 계정은 내장 윈도우 신원입니다. 이 계정에는 비밀번호가 필요 없으며 비교적 낮은 수준의 사용자 권한만 부여되어 있습니다. 보안 측면에서 볼 때, 낮은 수준의 사용자 권한을 가진 계정으로 서비스를 실행하는 것은 매우 좋은 습관입니다. 그러면, 악의적인 사용자가 소프트웨어의 버그를 이용해서 전체 시스템 권한을 획득하는 것을 미연에 방지할 수 있기 때문입니다.

그럼에도 불구하고 이 방식의 가장 큰 문제점은 NETWORKSERVICE 계정으로 실행되는 서비스가 동일한 계정으로 실행되는 다른 서비스들에 여전히 영향을 미칠 수 있다는 점입니다. 기본적으로 IIS 작업자 프로세스에서는 서드-파티 코드들이 (클래식 ASP, ASP.NET, PHP 코드 등) 실행되므로, IIS 작업자 프로세스는 다른 윈도우 시스템 서비스들과 격리돼야하며 별도의 신원으로 실행되는 것이 바람직합니다. 이를 위해서, 윈도우 운영 체제 수준에서 "가상 계정"이라는 이름의 새로운 기능을 제공해서 IIS로 하여금 각각의 응용 프로그램 풀들을 위한 자신만의 신원 계정을 생성할 수 있도록 지원해줍니다. 가상 계정에 대한 보다 자세한 내용은 이 문서를 참고하시기 바랍니다. *

결국 새로운 응용 프로그램 풀이 생성될 때마다 IIS 관리 프로세스에 의해 응용 프로그램 풀의 이름과 동일한 이름으로 보안 식별자(SID)가 생성됩니다. 다시 말해서, 만약 "MyNewAppPool"이라는 이름으로 새로운 응용 프로그램 풀을 생성했다면, 윈도우 보안 시스템에도 동일한 "MyNewAppPool"라는 이름으로 보안 식별자가 자동 생성된다는 것입니다. 그리고, 바로 이 시점부터 해당 신원을 리소스 보안 설정에 사용할 수 있습니다. 그렇지만, 이 신원은 실제로 존재하는 사용자 계정이 아니며 따라서 윈도우 사용자 관리 콘솔에는 나타나지 않습니다.

그러면, 테스트로 윈도우 탐색기에서 임의의 파일을 선택해서 접근 제어 목록(ACL)에 "DefaultAppPool" 신원을 추가해보도록 하겠습니다.

  1. 윈도우 탐색기를 실행합니다.
  2. 파일 또는 디렉터리를 선택합니다.
  3. 마우스 오른쪽 버튼으로 클릭하고 "속성" 메뉴를 선택합니다.
  4. "보안" 탭을 선택합니다.
  5. "편집" 버튼을 클릭한 다음 "추가" 버튼을 클릭합니다.
  6. "위치" 버튼을 클릭하고 여러분들의 머신을 선택합니다.
  7. "선택할 개체 이름을 입력하십시오." 텍스트 박스에 "IIS AppPool\DefaultAppPool"라고 입력합니다.
  8. "이름 확인" 버튼을 클릭하고 "확인" 버튼을 클릭합니다.

이상의 설정을 마치고 나면 선택한 파일을 "DefaultAppPool" 신원으로 접근할 수 있습니다. **

지금까지 설명한 것과 동일한 작업을 ICACLS 도구를 사용해서 명령 프롬프트에서 처리할 수도 있습니다. 다음 명령은 DefaultAppPool 신원에 모든 권한을 부여하는 샘플입니다. ***

ICACLS test.txt /grant "IIS AppPool\DefaultAppPool":F

윈도우 7과 윈도우 서버 2008 R2에서는 응용 프로그램 풀이 응용 프로그램 풀 신원 보안 식별자를 통해서 실행되며 "AppPoolIdentity"라는 이름으로 새로운 신원 유형이 제공됩니다. "AppPoolIdentity" 신원 유형이 선택되면 (윈도우 7 과 윈도우 서버 2008 R2 의 기본값) IIS 는 작업자 프로세스를 응용 프로그램 풀 신원으로 실행합니다. 다른 모든 신원 유형과 함께 이 보안 식별자는 작업자 프로세스의 접근 토큰에 삽입됩니다. 이 식별자가 삽입되었더라도 콘텐츠의 접근 제어 목록에 응용 프로그램 풀 신원을 포함시킬 수는 있지만, 아마도 토큰의 소유자가 유일하지는 않을 것입니다. 이 개념에 대한 보다 자세한 정보는 이 문서를 참고하시기 바랍니다. ****

* 링크된 문서를 반드시 읽어보시기 권합니다. 말하자면 이 문서는 본문을 이해하기 위해 반드시 필요한 선수 과목이라고 볼 수 있습니다. 물론 영문입니다.

** 베타 버전의 윈도우 7(빌드 7000)을 설치하고 본문에서 설명하는 대로 테스트를 해보았으나 실패했습니다. 참고로 윈도우 서버 2008 R2에서는 테스트를 해보지 못했습니다.

*** 반면, 베타 버전의 윈도우 7(빌드 7000)에서 명령 프롬프트를 이용한 테스트는 정상적으로 동작하는 것을 확인했습니다. 그리고, 재미있는 것은 이 명령어는 윈도우 비스타에서도 아무런 문제 없이 동작한다는 점인데 그 이유는 네 번째 주석에서 얘기하고 있는 링크 문서 내용에 기인하는 것 같습니다.

**** 이 링크 문서에서 말하고자 하는 주요 논지는 이런 것입니다. 응용 프로그램 풀 마다 전용 계정을 설정해서 실행시키면 본래의 취지대로 프로세스 간의 격리는 보장됩니다. 그러나, XML 형식으로 저장되어 있는 각각의 프로세스에 대한 설정 파일은 여전히 격리되지 못한 상태이므로 보안에 취약하다는 것입니다. 가령, A 응용 프로그램 풀에서 구성 설정 파일에 접근해서 B 응용 프로그램 풀의 설정을 바꿀 수도 있는 것입니다.

바로 그런 이유 때문에, IIS 7에서는 각각의 응용 프로그램 풀이 시작될 때마다 해당 응용 프로그램 풀의 구성 설정 파일을 임시 폴더(%systemdrive%\inetpub\temp\appPools)에 생성하고 올바른 응용 프로그램 풀만 이 구성 설정 파일에 접근할 수 있도록 설정합니다. 이 과정 중에 실시간으로 해당 응용 프로그램 풀에 대한 SID가 생성되어 작업자 프로세스에 주입됨과 동시에 임시로 생성된 구성 설정 파일의 ACL 목록에 추가되는데, 이 때 생성된 임시 SID가 바로 응용 프로그램 풀의 이름과 동일한 이름을 갖고 있는 것입니다.

네트워크 접근

도메인 환경에서 NETWORKSERVICE 계정을 사용하면 커다란 이점을 얻을 수 있습니다. NETWORKSERVICE 계정으로 동작하는 작업자 프로세스는 네트워크에 머신 계정 권한으로 접근합니다. 머신 계정은 머신이 도메인에 가입할 때 생성되는 계정으로 다음과 같은 형태를 갖고 있습니다:

<도메인 이름>\<머신 이름>$

다음은 그 샘플입니다:

mydomain\machine1$

머신 계정에 관심을 가져야 하는 이유는 머신 계정을 사용해서 파일 공유나 SQL 서버 데이터베이스와 같은 네트워크 리소스의 접근 제어 목록을 설정할 수 있기 때문입니다.

그렇다면, 응용 프로그램 풀 신원은 어떨까요?

다행스러운 점은 응용 프로그램 풀 신원 또한 네트워크 리소스에 접근할 때 머신 계정을 사용한다는 사실입니다. 따라서, 어떠한 변경도 필요 없습니다.

응용 프로그램 풀 신원 관련 호환성 이슈

안내 문서

응용 프로그램 풀 신원 기능과 관련된 가장 큰 호환성 이슈는 아마도 명시적으로 NETWORKSERVICE 계정을 리소스 보안 설정에 사용하는 것을 권장하는 기존에 작성된 여러 가지 안내 문서들일 것입니다. 대표적인 예를 들어본다면 IIS 6.0과 7.0의 DefaultAppPool 기본 신원 같은 경우가 바로 이에 해당합니다. IIS 7.5를 운영하고자 한다면 ACL을 "IIS AppPool\DefaultAppPool"로 설정하도록 문서를 변경해야 합니다. (그 변경 방법은 본문에서 이미 살펴보았습니다.)

사용자 프로파일

일단 IIS 자체는 윈도우 사용자 프로파일을 로드하지 않지만 어떤 응용 프로그램들은 임시 데이터를 사용자 프로파일에 저장하는 등의 방식으로 효과를 얻기도 합니다. 가령, SQL 익스프레스가 바로 그런 응용 프로그램의 한 사례입니다. 임시 데이터를 프로파일의 디렉터리나 레지스트리 하이브에 저장하려면 사용자 프로파일이 생성되야 합니다. NETWORKSERVICE 계정의 경우 사용자 프로파일은 시스템에 의해 생성되며 언제나 사용 가능합니다. 그러나, 이를 유일한 응용 프로그램 풀 신원으로 전환하면 아무런 사용자 프로파일도 생성되지 않습니다. 오직, 기본 응용 프로그램 풀(DefaultAppPool과 Classic .NET AppPool)의 사용자 프로파일만 디스크상에 존재합니다. 관리자가 생성한 응용 프로그램 풀은 사용자 프로파일을 생성하지 않습니다.

그러나, 필요하다면 "LoadUserProfile" 속성값을 "true"로 설정해서 IIS 응용 프로그램 풀이 사용자 프로파일을 로드하도록 설정할 수도 있습니다. *

* 이 속성값을 변경하는 가장 쉬운 방법은 다음과 같습니다. 먼저, 인터넷 정보 서비스 관리자를 실행하고 좌측 트리뷰를 확장하여 "응용 프로그램 풀" 노드를 선택합니다. 그리고, 응용 프로그램 풀 목록에서 속성값을 변경하고자 하는 응용 프로그램 풀을 선택한 다음, 우측 작업 패인에서 "고급 설정..." 링크 버튼을 클릭합니다. 그러면, 다음과 같은 "고급 설정" 대화 상자가 나타나는데 여기에서 "사용자 프로필 로드" 속성을 설정하면 됩니다.

요약

응용 프로그램 풀 신원은 윈도우 서버 2008, 윈도우 비스타, 윈도우 7, 그리고 윈도우 서버 R2에서 소개된 새롭고 강력한 격리 기능입니다. 이 기능은 IIS 응용 프로그램을 보다 보안에 충실하고 신뢰할 수 있도록 만들어 줄 것입니다.