|
NT Security |
작성자 : 이동규,유미영 |
작성일 : 2011. 2. 18 | |
제목 : NT의 보안 |
1. Security 정의
- 보안이란 허가되지 않은 사용자의 고의적인 또는 우발적인 조작에 대해 시스템과 그 데이터를 안전하게
보호하기 위한 장치이다.
구체적으로 말하면 원하지 않는 사용자가 시스템의 자원(파일,프린트,레지스터 등)을 마음대로 쓰지
못하게 하는 것이다.
2. NT 보안 모델
- 윈도우(NT계열), 유닉스의 보안 모델은 미 국방성이 C2레벨까지 지원
l 시스템의 자원을 사용자 별로 허가하거나 거부할 수 있어야 한다.
l 프로세스가 해제한 메모리의 내용은 읽을 수 없도록 보호되어야 한다.
l 시스템을 사용하는 사람은 반드시 로그인 과정을 거쳐 자신의 신분을 밝혀야 한다.
l 관자는 보안과 관련된 이벤트를 감사할 수 있다.
l 운영체제는 스스로 자신의 실행코드를 보호할 수 있어야 한다.
3. 보안 설명자
- 보안 설명자는 보안 오브젝트의 보안 설정 정보라고 할 수 있으며 이런 보안 설정 정보를 기억하는
일종의 구조체이다.
- 보안 오브젝트는 NT의 보안 체계에 의해 보호되는 오브젝트로 보안 설정에 따라 사용자 별로 권한이
달라진다. 이러한 Access 제어가 가능 하려면 오브젝트 자체에 보안 설정이 기억되어 있어야 한다.
u 보안 오브젝트 목록
|
커널 객체인 것을 알 수 있다.
u 보안 속성 구조체
typedef struct _SECURITY_ATTRIBUTES{ DWORD nLength; LPVOID lpSecurityDescriptor; BOOL blnheritHandle; }SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES;
|
è 여기서 구조체 두 번째 멤버인 lpSecurityDescriptor가 NT 보안의 핵심인 보안 설명자인데
보안 설명자를 가지는 오브젝트가 바로 보안 오브젝트이며 보안 체계에 의해 보호되는 것들이다.
4. 보안 정보자 세부내용
n Owner’s SID : 오브젝트를 소유하고 있는 사용자의 SID이다.
- SID : Security Identifiers에 약자로써 로그인하는 사용자나 그룹 등에 붙이는 ID로써 보안 식별자라고 불린다.
로그인하는 모든 사용자를 구분할 수 있는 고유 값이고 좀 더 암호화되고 유일성을 보장한다.
- Access Token : 엑세스 하고자 하는 사람의 신분에 대한 정보와 보안 설명자를 비교하는데 여기서 사용자의
신분에 대한 정의를 엑세스 토큰이라 부른다.
n Group’s SID : 소유자가 속한 그룹의 ID이되 이 정보는 타 운영체제와의
호환성을 위해 존재한다. NT 환경에서는 큰 의미가 없다.
☺ ACL : DACL,SACL 설명에 앞서 ACL을 설명하자면 Access Control List에 약자로써
개별적인 보안 정보 조각인 ACE의 배열로 보안 설명자는 두 개의 ACL을 가지고 있다.
n DASL : Discretionary ACL 약자로 엑세스 권한에 대한 목록으로 여러 개의 ACE로
구성되며 각 ACE는 누가 이 오브젝트에 대해 어떤 권한을 가지는지에 대한 정보를 표현
n SASL : 감사 기록 작성을 통제
n ACE : Access Control Entry의 약자로 실질적인 보안 정보를 가지는 요소로 NT는
세가지 종류의 ACE를 가지고 있다.
- 허가 ACE : 특정 사용자에게 권한을 주기 위한 ACE
- 거부 ACE : 특정 사용자의 권한을 금지하기 위한 ACE
- 감사 ACE : 특정 사용자의 특정 엑세스에 대해 감사 기록을 남기도록 하기 위한 ACE
5. 함수
GetSecurityInfo() : 보안 설명자를 구하는 함수 |
DWORD GetSecurityInfo{ HANDLE handle, //커널 오브젝트 핸들값 SE_OBJECT_TYPE ObjectType, //보안 오브젝트의 종류를 지정 SECURITY_INFORMATION SecurityInfo, // 보안 설명자의 정보 중 구하고자 하는 정보의 종류 PSID *ppsidOwner, //앞에서 지정한 정보를 돌려받기 위한 포인터 변수들 PSID *ppsidGroup, //필요없는 부분은 NULL값으로 넣어주면 됨 PACL *ppDacl, PACL *ppSacl, PSECURITY_DESCRIPTOR *ppSecurityDescriptor //보안 설명자 크기만큼 메모리를 할당 후 //그 포인터의 포인터를 리턴하여 보안 설명자 내의 포인터가 대입 됨 }
|
LookupAccountSid() : SID로부터 계정 정보를 구하는 함수 |
BOOL LookupAccountSid{ LPCTSTR lpSystemName, //SID가 속한 컴퓨터 이름 (NULL일 경우 로컬 컴퓨터에서 찾음) PSID Sid, //조사 대상인 SID # : //사용자 이름,도메인 명을 리턴 받기 위한 문자열 버퍼(둘은 같이 사용할 수 없음) LPSTR Name, //# LPDWORD cbName, //Name의 문자열 버퍼의 길이를 알려줌 LPTSTR DomainName, //# LPDWORD cbDomainName, //Domain의 문자열 버퍼의 길이를 알려줌 PSID_NAME_USE peUse //계정의 타입을 리턴 }
|
GetExpliciEntriesFromAcl() : ACL에서 ACE 배열을 구하는 함수 |
DWORD GetExpliciEntriesFromAcl{ PACL pacl, //ACL의 포인터로서, GetSecurityInfo함수가 구한 그대로를 전달함. PULONG pcCountOfExplicitEntries, //ACL에서 ACE 목록 개수를 대입 PEXPLICIT_ACCESS *pListOfExplicitEntries , //조사된 ACE의 배열을 돌려받기 위한 포인터 변수 (내부적으로 메모리를 할당해 배열을 채우기 때문에 포인터의 포인터를 사용함) }
|
EXPLICIT_ACCESS() :ACE 구조체 |
typedef struct _EXPLICIT_ACCESS{ DWORD grfAccessPermissions; //어떤 권한의 ACE인지를 지정하는 액세스 마스크 값 ACCESS_MODE grfAccessMode; // ACE 타입을 나타내는 열거형 값 DWORD grfInheritance; //ACE의 상속성 여부 등의 옵션 플래그 집합 TRUSTEE Trustee; //ACE가 적용될 사용자를 지정하는 TRUSTEE 구조체 } |
|