실무를 시작하면서 가장 많이 헷갈려 하는 부분이 바로 서비스들이 사용하는 계정이였다. 대부분의 사용자들이 서비스 계정 부분을 잘 이해하지 못하고 그저 서비스 문제가 생길 수 있겠다 생각하며 관리자 권한을 주거나 로컬 시스템 계정을 주게 된다. 하지만 이는 보안적으로 봤을 때, 해당 서비스에 과도한 권한을 주어, 해당 서비스로 인해 서버가 노출되거나 백도어가 심어지는 등의 공격을 당할 수 있는 문제를 야기할 수 있다.
그럼 서비스에서 사용하는 계정들이 무엇이 있고, 어떠한 권한들이 있는지 알아보도록 하자. 일반적으로 서비스에 계정을 등록하지 않는다면, 대부분의 서비스는 로컬 시스템 계정(SYSTEM 혹은 LocalSystem으로 표시)으로 실행되게 된다. 그 외에는 네트워크 서비스(Network Service로 표시)와 로컬 서비스(Local Service로 표시) 계정이 있으며, 이 계정은 앞의 로컬 시스템 계정보다 적은 권한을 가지게 된다. 그럼 이들 각각의 계정은 어떤 권한을 가지고 있는지 알아보자.
로컬 시스템(Local System)
로컬 시스템 계정은 Smss. Csrss, Lsass 등 시스템 지원 프로세스를 실행하는 계정과 동일한 것을 의미한다. 따라서 이 계정은 시스템 최고 권한으로 어떠한 도메인 계정이나 로컬 계정보다 강력한 계정이 된다. 로컬 시스템 전체를 조정할 수 있는 권한이라 생각하면 된다.
로컬 시스템에 기본적으로 포함된 계정은 Everyone, Authenticated Users, Administrators이다.
네트워크 서비스(Network Service)
컴퓨터 계정을 사용해 네트워크상의 다른 머신을 인증하려는 서비스가 사용하도록 고안된 계정으로, 로컬 시스템 계정보다 적은 권한을 가진다. 임의의 프로세스 실행을 할 수 없고, 드라이버 등을 로드할 수 없다. 그리고 별도의 프로파일을 사용하는데, 레지스트리는 HKU\S-1-5-20이고 파일 위치는 %Systemroot%\ServiceProfiles\NetworkService에 위치한다.
이 네트워크 서비스를 사용하는 서비스는 DNS 클라이언트를 확인할 수 있다. 네트워크 서비스에 기본적으로 속한 그룹은 Everyone, Authenticated Users, Users, Local, Network Service, Service가 있다.
로컬 서비스(Local Service)
로컬 서비스 계정은 익명 네트워크 접근만 할 수 있다는 점을 제외하면 네트워크 서비스 계정과 동일하다. 레지스트리는 HKU\S-1-5-19이고 파일 위치는 %Systemroot%\ServiceProfiles\LocalService에 위치한다.
로컬 서비스에 기본적으로 속한 그룹은 Everyone, Authenticated Users, Users, Local, Local Service, Service가 있다. 조금
더 자세히 계정별로 가지고 있는 특권은 어떠한 것들이 있는지 알아보자.
로컬 시스템 | 네트워크 서비스 | 로컬 서비스 |
SeAssignPrimaryTokenPrivilege | SeAssignPrimaryTokenPrivilege | SeAssignPrimaryTokenPrivilege |
SeAuditPrivilege | SeAuditPrivilege | SeAuditPrivilege |
SeBackupPrivilege | SeChangeNotifyPrivilege | SeChangeNotifyPrivilege |
SeChangeNotifyPrivilege | SeCreateGlobalPrivilege | SeCreateGlobalPrivilege |
SeCreateGlobalPrivilege | SeImpersonatePrivilege | SeImpersonatePrivilege |
SeCreatePagefilePrivilege | SeIncreaseQuotaPrivilege | SeIncreaseQuotaPrivilege |
SeCreatePermanentPrivilege | SeShutdownPrivilege | SeShutdownPrivilege |
SeCreateTokenPrivilege | SeUndockPrivilege(클라이언트) | SeUndockPrivilege(클라이언트) |
SeDebugPrivilege | ||
SeImpersonatePrivilege | ||
SeIncreaseBasePriorityPrivilege | ||
SeIncreaseQuotaPrivilege | ||
SeLoadDriverPrivilege | ||
SeLockMemoryPrivilege | ||
SeManageVolumePrivilege | ||
SeProfileSingleProcessPrivilege | ||
SeRestorePrivilege | ||
SeSecurityPrivilege | ||
SeShutdownPrivilege | ||
SeSystemEnvironmentPrivilege | ||
SeSystemTimePrivilege | ||
SeTakeOwnershipPrivilege | ||
SeTcbPrivilege | ||
SeUndockPrivilege(클라이언트) |
특권별로 주어지는 권한은 다음과 같다.
SeAssignPrimaryTokenPrivilege: 프로세스 수준의 토큰 교체 SeAuditPrivilege: 보안 감사 생성 SeBackupPrivilege: 파일과 디렉토리 백업 SeChangeNotifyPrivilege: 통과(Traverse) 검사 우회 SeCreateGlobalPrivilege: 전역 개체 만들기 SeCreatePagefilePrivilege: 페이지 파일 생성 SeCreatePermanentPrivilege: 영구적인 공유 개체 생성 SeCreateTokenPrivilege: 토큰 개체 생성 SeDebugPrivilege: 프로그램 디버그 SeImpersonatePrivilege: 인증 후 클라이언트 가장 SeIncreaseBasePriorityPrivilege: 스케줄링 우선순위 증가 SeIncreaseQuotaPrivilege: 할당량(Quota) 증가 SeLoadDriverPrivilege: 디바이스 드라이브 읽기, 내리기 SeLockMemoryPrivilege: 메모리의 페이지 잠금 SeManageVolumePrivilege: 볼륨 관리 SeProfileSingleProcessPrivilege: 단일 프로세스 측정(Profile) SeRestorePrivilege: 파일과 디렉토리 복구 SeSecurityPrivilege: 감사와 보안 기록 관리 SeShutdownPrivilege: 시스템 종료 SeSystemEnvironmentPrivilege: 펌웨어 환경변수 값 변경 SeSystemTimePrivilege: 시스템 시간 변경 SeTakeOwnershipPrivilege: 파일이나 다른 객체의 소유권 획득 SeTcbPrivilege: OS의 일부로 동작 SeUndockPrivilege(클라이언트): 도킹스테이션 제거 |
특정 계정으로 서비스 실행
다른 서비스와 연동을 위해 특정 계정이 필요할 경우 계정을 생성하여 진행할 수 있다. 보통 특정 보안 자격 증명이 필요한 경우 이를 이용하게 된다(MSSQL과 같은 서비스 구성시 별도의 전용 계정을 생성해 지정할 수 있다).
그리고 현재 실행 중인 서비스가 필요로 하는 특권은 아래와 같이 Sc 명령을 통해 확인할 수 있다. 이렇게 필요 특권을 확인하여 서비스 그룹을 선택하는것도 좋은 방안이 될 수 있다.
'WebBook > 윈도우 구조' 카테고리의 다른 글
윈도우 구조 - 커널 진입 - Ntdll.dll 세부 분석 (0) | 2022.04.02 |
---|---|
시스템 프로세스(Windows Startup Process) - 자동 실행 - Userinit.exe (0) | 2022.03.23 |
시스템 프로세스(Windows Startup Process) - 서비스 관리자 Services.exe (0) | 2022.03.14 |
시스템 프로세스(Windows Startup Process) - 보안 관리자 Lsass.exe (0) | 2022.03.05 |
시스템 프로세스(Windows Startup Process) - 로그인 관리자 Winlogon.exe (0) | 2022.03.03 |