이번 단원에서는 컴퓨터 시스템에 의해 정의된 자원에 대한 프로세스와 사용자의 접근을 제어하는 보호에 대해 알아보자.
17.1 Goals of Protection
✔ 보호를 제공하는 이유
- 사용자가 접근 제한을 악의적, 의도적으로 위반하는 것을 방지하기 위해
- 시스템 내의 각 프로세스가 시스템 자원들을 정해진 사용 정책대로 사용하도록 보장하기 위해
✨ 보호에 있어서 가장 중요한 원칙 ➡ 기법과 정책을 분리하는 것
- 기법(mechanism): 어떤 일을 어떻게 할지를 결정
- 정책(policy): 무엇을 할지를 결정
- 정책은 장소와 시간에 따라 변할 가능성이 있는데, 기법과 정책이 분리되어 있지 않다면 정책의 변경 하나하나가 아래에 깔린 기법의 변경을 필요로 할 수 있다.
17.2 Principles of Protection
- 최소 권한의 원칙 (principle of least privilege)
➡ 프로그램, 사용자, 시스템이 태스크를 수행하는 데 필요한 만큼의 권한만 부여하는 법칙
➡ 보호를 위해 핵심적이며 오랜 시간에 걸쳐 확인된 지배 원칙
➡ 최소 권한의 원칙을 준수하면 시스템이 공격을 완화할 수 있는 기회가 주어진다
-
권한 (privilege)
➡ 악의적인 코드가 루트 권한을 얻을 수 없는 경우 적절히 정의된 권한이 모든 또는 적어도 일부의 손상 작업을 차단할 수 있다
➡ 이런 의미에서 권한은 운영체제 수준에서 면역 체계처럼 작동할 수 있다
-
구획화 (compartmentalization)
➡ 최소 권한의 원칙의 파생물
➡ 특정 권한과 접근 제한을 통해 개별 시스템 구성요소를 보호하는 과정
-
감사 추적 (audit trail)
➡ 시스템 자원 사용에 대해 허용된 접근과의 차이를 추적
➡ 면밀하 감시했을 경우..
- 공격에 대한 조기 경고를 표시 가능
- 어떤 공격 벡터가 사용되었는지에 대한 단서 제공 가능
- 발생한 피해를 정확하게 평가 가능
-
심층 방어 (defense in depth)
➡ 여러 층의 방어를 다른 층 위에 하나씩 적용
➡ 어떤 하나의 원칙도 보안 취약점에 대한 만병통치약이 아니라는 점
➡ 수비대가 있는 성, 성벽, 그리고 그것을 보호하기 위한 해자를 떠올리자
17.3 Protection Rings
권한 분리를 수행하려면 하드웨어의 지원이 필요!
✅ 보호 링 모델 (protection ring model)
- 권한 분리의 일반적인 모델
- 링 i는 어떤 j<i 대해서도 링 j의 기능의 부분 집합을 제공
- 가장 안쪽 링인 링0은 전체 권한 집합을 제공
✔ 시스템은 더 높은 권한 수준으로 돌아가기 위해 코드는 보통 링 사이의 포털을 제공하는 게이트라고 불리는 특수 명령을 호출한다.
➡ syscall
➡ 프로세서 트랩
➡ 인터럽트 발생
✅ TrustZone (TZ)
- NFC 보안 요소 및 온칩 암호화 키와 같은 하드웨어 기반 암호화 기능에 독점적으로 액세스하여 비밀번호와 민감한 정보를 보다 안전하게 처리 가능
- 간단히 말하자면 하나의 장치에 두 개의 환경을 제공하여 보안이 필요한 정보를 격리된 환경에서 안전하게 보호하는 기술
- SMC (Secure Monitor Call)이라는 특별한 명령을 사용하여 이루어지며 커널 모드에서만 사용할 수 있다.
17.4 Domain of Protection
알 필요가 있는 원칙 (need-to-know)
➡ 한 프로세스는 자기가 접근을 인가받은 자원들만을 접근할 수 있어야 한다
➡ 어느 때든 프로세스는 자기 일을 완료하기 위해 현재 필요로 하는 객체들만을 접근할 수 있어야 한다
➡ 시스템에서 잘못된 프로세스가 유발할 수 있는 피해의 양을 제한하는데 유용하다
📌 알 필요가 있는 원칙 vs 최소 권한의 원칙
- 알 필요가 있는 원칙을 정책으로, 최소 권한의 원칙을 이 정책을 달성하기 위한 기법으로 생각하자
- 예) 파일 권한에서 알 필요가 있는 정책은 사용자에게 읽기 권한이 있지만 파일에 대해 쓰기 또는 실행 권한이 없음을 지정하고, 최소 권한의 원칙은 운영체제가 읽기는 허용하지만 쓰기 또는 실행 액세스는 허용하지 않는 기법을 제공하도록 요구한다
17.4.1 Domain Structure
프로세스는 하나의 보호 영역(protection domain) 내에서 동작한다.
이 영역은 프로세스가 접근할 수 있는 자원을 지정하고,
각 영역은 객체의 집합과 각 객체에 대해 호출될 수 있는 연산의 유형을 정의한다.
✔ 접근 권한 (access right)
: 객체에 대해 연산을 실행할 수 있는 권한
하나의 영역은 접근 권한의 집합이고, 각 권한은 <객체-이름, 권합-집합>의 순서 쌍으로 되어 있다.
영역은 접근 권한을 공유할 수 있다.
✅ 프로세스와 영역 간의 연관관계
- 정적
: 한 프로세스가 이용 가능한 자원들의 집합이 영역의 일생 고정된 경우
- 동적
: 그렇지 않은 경우
- 프로세스가 한 영역에서 다른 영역으로 전환하게 하는 기법이 존재
- 영역의 내용을 변경하기도 함
- 한 영역의 내용을 변경할 수 없다면 변경된 내용을 갖는 새로운 영역을 만든 다음, 우리가 영역의 내용을 변경하기를 원할 때 그 새로운 영역으로 전환함으로써 같은 효과를 낼 수 있다
- 영역은 다양한 방법으로 구체화 됨
➡ 각 사용자가 하나의 영역이 될 수 있다. 이 경우, 접근할 수 있는 객체의 집합은 사용자의 신원에 의존한다. ex) 한 사용자가 로그아웃하고 다른 사용자가 로그인할 때 영역전환 발생
➡ 각 프로세스가 하나의 영역이 될 수 있다. 이 경우, 접근할 수 있는 객체의 집합은 프로세스이 신원에 의존한다. ex) 한 프로세스가 다른 프로세스에 메시지를 보내고 응답을 기다릴 때 영역전환 발생
➡ 각 프로시저가 하나의 영역이 될 수 있다. 이 경우, 접근될 수 있는 객체의 집합은 프로시저 내의 정의된 로컬 변수에 해당한다. ex) 프로시저가 호출될 때 영역전환 발생
17.5 Access Matrix
✅ 접근 행렬 (access matrix)
- 일반적인 보호 모델
- 접근 행렬의 행은 열을 나타내고, 열은 객체를 나타낸다.
- 행렬의 각 항은 접근 권한의 집합으로 구성된다.
- 항 access(i, j)는 영역 D_i 내에서 실행 중인 프로세스가 객체 O_j에 대해 호출 가능한 연산의 집합을 정의한다.
- 사용자는 보통 접근 행렬의 항의 내용을 결정한다.
- 접근 행렬은 프로세스와 영역 간의 정적, 동적 연관을 위한 엄격한 제어를 정의하고 구현하는 적절한 기법을 제공한다.
➡ 프로세스를 한 영역에서 다른 영역으로 전환할 때, 영역이라는 객체에 대해 전환 연산을 실행하는 것.
➡ 접근행렬의 내용을 변화시킨다는 것은 접근 행렬이라는 객체에 대해 연산을 실행하는 것.
- 영역 D_i로부터 영역 D_j로의 영역 전환은 접근 권한 전환이 access(i j)에 포함되어 있을 때만 허용된다.
- 위의 그림에서 D_2에서 실행 중인 프로세스는 영역 D_3 또는 D_4로 전환할 수 있으며, 영역 D_4 내의 프로세스는 D_1으로 전환할 수 있으며, 영역 D_1의 프로세스는 영역 D_2로 전환할 수 있다.
📌 접근 행렬 항들의 내용에 대한 통제된 변경을 허용하기 위한 세 가지 연산
✔ 복사 (copy)
- 접근 행렬의 한 영역(행)으로부터 다른 영역으로 접근 권한을 복사할 수 있는 권한
- 접근 권한에 별표(*)를 덧붙여 나타낸다.
- 복사 권한은 오직 그 권한이 정의된 열 내에서만 접근 권한을 복사하는 것을 허락한다.
- ex) 영역 D_2에서 실행중인 프로세스는 파일 F_2와 연관된 어떤 항으로도 읽기 연산을 복사할 수 있다.
✔ 소유자 (owner)
- 새로운 권한을 추가하고, 그리고 몇몇 권한들을 제거하도록 허용하는 기법
- 만약 access(i, j)가 소유자 권한을 포함한다면, 영역 D_i에서 실행 중인 프로세스는 열 j 내의 어떤 항에 임의의 권한을 추가하거나 또는 항에서 제거할 수 있다.
- ex) 영역 D_1는 F_1의 소유자이며, 따라서 열 F_1에 임의의 유효한 권한을 추가하거나 제거할 수 있다.
✔ 제어 (control)
- 한 항 내의 항을 변경하기 위한 기법
- 만일 access(i, j)가 제어 권한을 포함하면, 영역 D_4에서 실행하는 프로세스가 j 행으로부터 임의의 접근 권한을 제거할 수 있다.
- ex) access(D_2, D_4)에 제어 권한을 포함한다면, 영역 D_2에서 실행되는 프로세스는 영역 D_4를 변경할 수 있을 것이다.
17.6 Implementation of Access Matrix
접근 행렬은 희소 행렬, 즉 항의 대부분이 공백인 행렬이다.
접근 행렬을 어떻게 효과적으로 구현할 수 있을까?
17.6.1 Global Table
✅ 전역 테이블
- 접근 행렬의 가장 단순한 구현
- 순서를 가진 세 부분 <영역, 객체, 권한 집합> 들의 집합으로 구성된다.
- 단점
➡ 테이블은 보통 매우 크기 때문에 메인 메모리에 보관할 수 없으며, 따라서 추가적인 입출력이 필요하다.
➡ 어떠한 객체나 영역의 특별한 그룹핑을 이용하기가 어렵다.
17.6.2 Access Lists for Objects
✅ 객체를 위한 접근 리스트
- 접근 행렬 내의 각 열은 하나의 객체에 대한 접근 리스트(access list)로 구현할 수 있다.
- 공백 항은 버릴 수 있다.
- 각 객체에 대해 만들어지는 리스트는 <영역, 권한 집합>의 순서쌍으로 구성된다.
- 장점
➡ 사용자가 객체를 만들 때, 이 객체에 접근할 수 있는 영역과 허용되는 연산을 지정할 수 있다.
- 단점
➡ 어느 특정 영역에 대한 접근 권한 정보는 국지화되지 않으므로, 각 영역에 대한 접근 권한 집합을 결정하기 어렵다.
➡ 객체에 접근할 때마다 그 접근 권한을 검사해야 하므로, 매번 접근 리스트의 탐색이 필요하다.
➡ 긴 접근 리스트를 가진 큰 시스템의 경우, 탐색하는데 많은 시간이 소비된다.
17.6.3 Capability Lists for Domains
✅ 영역을 위한 자격 리스트
- 한 영역에 대한 자격 리스트(capability list)는 객체와 그 객체에 허용된 연산의 리스트
- 각 행을 해당 영역과 연관시킨 것
- 자격 리스트는 운영체제에 의해 유지되며 사용자에 의해서 간접적으로만 접근되는 보호된 객체이다.
- 각 객체는 tag를 통해 그 유형이 자격인지 또는 접근 가능한 데이터인지 나타낸다.
- 장점
➡ 어느 특정 프로세스에 대한 정보를 국지화하는데 유용하다.
➡ 접근을 시도하는 프로세스는 그 접근에 대한 자격을 반드시 제시해야 하는데, 그러면 보호 시스템은 그 권한이 유효한지만을 검사하면 된다.
- 단점
➡ 권한의 취소는 비효율적일 수 있다.
17.6.4 A Lock-key Mechanism
✅ 락-키 기법
- 접근 리스트와 자격 리스트의 절충안
- 각 객체는 락(lock)이라고 불리는 유일한 비트 패턴의 리스트를 갖고 있다.
- 각 영역은 키(key)라고 불리는 유일한 비트 패턴의 리스트를 갖고 있다.
- 어떤 영역에서 실행 중인 프로세스는 그 영역이 객체의 락 중의 하나와 맞는 키를 가지고 있는 경우에만 그 객체에 접근할 수 있다.
- 장점
➡ 키의 길이에 따라 효율적이고 융통성을 가질 수 있다.
➡ 키들은 영역 간에 자유로이 전달될 수 있다.
17.7 Revocation of Access Rights
자격을 취소하는 것은 어렵다.
자격은 시스템 전체에 걸쳐 분포되어 있으므로, 자격을 취소하려면 먼저 그것을 찾아야만 한다.
✅ 권한에 대한 취소를 구현하기 위한 기법
-
재획득 (reacquisition)
: 주기적으로 자격들이 각 영역에서 제거된다.
그 후 한 프로세스가 어떤 자격을 사용하려 할 때 그 자격이 제거되었음을 발견하고, 그 자격을 다시 획득하려 할텐데, 만약에 접근이 취소되었다면 그 프로세스는 자격을 재획득할 수 없을 것이다.
-
후방 포인터 (back-pointer)
: 객체마다 그 객체와 연관된 모든 자격을 가리키는 포인터 리스트를 유지하고, 취소가 요구될 때는 이들 포인터를 따라가면서 필요에 따라 자격을 변경시킨다. 일반적이지만 비용이 많이 든다.
-
간접 (indirection)
: 자격이 객체를 직접 가리키지 않고, 간접적으로 가리킨다.
각 자격은 전역 테이블의 유일한 항을 가리키며, 그 항은 다시 객체를 가리킨다.
전역 테이블을 탐색하여 원하는 항을 찾아 그것을 제거하여 취소할 수 있다.
-
키 (keys)
: 각 자격에 연관될 수 있는 유일한 비트 패턴인 키는 자격이 만들어질 때 정의되고, 그 자격을 소유한 프로세스에 의해 변경되거나 검사될 수 없다.
각 객체에 마스터 키가 연관되며 이 키는 키 설정 연산으로 정의되거나 대체될 수 있다.
한 자격이 생성될 때, 마스터 키의 현재 값이 그 자격에 연관 지어지고, 그 자격이 행사될 때 자격의 키가 마스터 키와 비교된다.
그 키가 일치하면 연산은 계속 실행되도록 허용된다.
취소는 키 설정 연산에 의해 마스터 키를 새로운 값으로 대체하며, 이 객체에 대한 이전의 모든 자격을 무효화시킨다.
17.8 Role-Based Access Control
역할 기반 액세스 제어 (role-based access control, RBAC)
- 최소 권한의 원칙을 명시적으로 추가하여 운영체제에서 사용할 수 있는 보호 기능을 향상하는 아이디어
- 권한 및 프로그램을 역할에 할당한다.
- 사용자는 역할을 할당받거나, 역할에 할당된 암호를 기반으로 역할을 수행할 수 있고,
이러한 방식으로 사용자는 권한 행사를 가능하게 하는 역할을 받아들여 특정 작업을 수행할 수 있는 프로그램을 실행할 수 있다.
17.9 Mandatory Access Control, MAC
강제적 접근 제어 (MAC)
- 루트 사용자조차도 수정할 수 없는 시스템 정책으로 시행된다.
(임의 액세스 제어(discretionary access control, DAC)는 자원 소유자가 권한을 설정하거나 수정할 수 있고, 관리자 또는 루트 사용자가 무제한으로 접근 가능하다.)
- MAC 정책 규칙에 의해 부과된 제한은 루트 사용자의 자격보다 강력하며, 의도한 소유자 이외의 다른 사용자가 액세스 할 수 없도록 사용될 수 있다.