3장. 리눅스 및 유닉스 보안 특징들의 요약

 

Discretion will protect you, and understanding will guard you.

 Proverbs 2:11 (NIV)
차례
3.1. 프로세스
3.1.1. 프로세스 속성
3.1.2. POSIX Capabilities
3.1.3. 프로세스 생성과 조작
3.2. 파일
3.2.1. 파일시스템 객체 속성
3.2.2. 생성시 초기값
3.2.3. 접근 제어 속성 변경
3.2.4. 접근 제어 속성 사용
3.2.5. 파일시스템 계층구조
3.3. System V 프로세스간 통신
3.4. 소켓과 네트워크 연결
3.5. 시그널
3.6. 쿼터와 한도
3.7. 동적 링크 라이브러리
3.8. 감사
3.9. PAM
3.10. 유닉스 계열 시스템을 위한 전문적인 보안 확장

리눅스 또는 유닉스 보안 특징들의 사용 방법에 대한 지침을 논의하기 전에 프로그래머의 관점에서 보았을 때 그러한 특징들이 무엇인가를 아는 것은 유용하다. 이 절에서는 거의 모든 유닉스 계열 시스템에서 널리 사용할 수 있는 이러한 특징들을 간략히 기술한다. 그러나 유닉스 계열 시스템의 여러 버전간에는 상당한 변동이 있으며 모든 시스템이 여기서 기술한 능력을 갖지 않음을 주목해라. 이 장은 또한 리눅스에 대한 약간의 확장들 또는 리눅스 고유의 특징들을 특히 언급한다; 리눅스 배포판들은 모두 본질적으로 동일한 커널 및 C 라이브러리 (GPL 에 기초한 라이센스들은 새롭게 변경된 어떠한 사항들도 빠르게 보급될 수 있도록 장려한다) 를 사용하기 때문에 보안에 대해 프로그래밍 관점에서 보았을 때 각각은 상당히 유사한 경향이 있다. 또한 여러가지 유닉스 구현사이에는 보안과 관련해서 약간의 차이를 언급하지만 이것이 완전한 목록이 아님을 주목하기 바란다. 이 장에서는 많은 유닉스 계열 시스템들이 구현하지 않은 MAC (Mandatory Access Control) 같은 쟁점들은 논의하지 않는다. 이러한 특징들이 무엇인지 알고 있다면 이 절을 건너뛰어 읽어도 무방하다.

많은 프로그래밍 지침들은 리눅스 또는 유닉스의 보안 관련 부분을 간략하게 대충 다루며 중요한 정보를 건너뛰는데 특히 이러한 지침들은 대개 일반적인 말투로 ``사용 방법"을 논의하며 사용에 영향을 미치는 보안 속성에 관해서는 얼버무린다. 이와는 반대로 메뉴얼 페이지에는 개별적인 기능에 대한 상당한 양의 세부 정보가 있지만 각각의 개별적 기능의 사용 방법에 관한 세부 논의로 인해 때때로 주요한 보안 쟁점들을 이해하기 어렵게 한다. 이 절은 프로그래머가 사용할 것같은 리눅스 보안 메카니즘을 개략적으로 그러나 보안 관련 문제에 특히 중점을 두어 기술함으로써 이러한 간격을 좁히고자 한다. 이 절은 명확하게 보안 관련 문제에 중점을 둠으로써 일반적인 프로그래밍 지침보다 보다 깊이를 갖으며 더욱 세부적인 것을 얻을 수 있는 참고문헌들을 지적한다.

우선 기본. 리눅스와 유닉스는 근본적으로 커널과 ``사용자 공간 (user space)" 두 부분으로 나누어 지는데 대부분의 프로그램들은 커널 윗 부분의 사용자 공간에서 실행된다. 리눅스는 ``커널 모듈"의 개념을 지원하는데 이는 단순히 커널에 동적으로 코드를 적재할 수 있는 능력으로 리눅스가 아직도 이 근본적인 분리를 지님을 주목해라. HURD 와 같은 다른 시스템들은 ``마이크로 커널"에 기초하는데 이들은 더욱 제한된 기능성을 갖는 작은 커널과 커널에 의해 전통적으로 하위 수준 기능들을 구현하는 일련의 사용자 프로그램으로 이루어진다.

어떤 유닉스 계열 시스템들은 강력한 보안, 특히 Mandatory Acces Control (B1 수준 또는 그 이상) 에 대한 미국의 국방성 요건을 지원하기 위해 광범위하게 널리 수정되어 왔다. 이 책의 현재 버전은 이러한 시스템 또는 쟁점들을 다루지는 않는다. 물론 향후 버전에서는 이를 다룰 수 있을 것이다. 이들중 일부에 대한 보다 세부적인 정보는 다른 곳에서 얻을 수 있는데 예를 들어 SGI 의 "Trusted IRIX/B" 에 대한 항목들은 NSA 의 Final Evaluation Reports (FERs) 에서 얻을 수 있다.

사용자가 로그인할 때 사용자 이름은 사용자 아이디 ``UID" 와 그룹 (사용자가 멤버) 아이디 ``GID" 를 나타내는 정수로 사상되는데 UID 가 0 인 사용자는 특별한 권한을 갖는 사용자로 일반적으로 ``루트" 라고 불린다; 대부분의 유닉스 계열 시스템에서 루트는 대부분의 보안 검사를 좌우할 수 있고 시스템을 관리하는데 사용된다. 몇몇 유닉스 시스템에 GID 0 은 특별하며 그룹 수준에서 자원에 대해 제한되지 않은 접근을 허용한다 [Gay 2000, 228]; 이는 리눅스와 같은 다른 시스템에서는 들어맞지 않으며 그러나 이러한 시스템에서 group 0 은 많은 특별한 시스템 파일을 소유하기 때문에 만능이다. 보안 관점에서는 프로세스만이 ``주체"인데 즉 단지 프로세스만이 활성 객체이다. 프로세스는 다양한 데이타 객체, 특히 파일시스템 객체 (FileSystem Object, FSO), System V 프로세스간 통신 (Interprocess Communication, IPC) 객체 및 네트워크 포트에 접근할 수 있다. 또한 프로세스는 시그널을 설정할 수 있다. 다른 보안 관련 주제는 쿼터 (quota) 및 한도 (limits), 라이브러리, 감사와 PAM 을 포함하는데 이는 다음 몇개의 하부 절에서 세부적으로 논의된다.