접근제어
접근제어(Access Control)는 적절한 권한을 가진 인가지만 특정 시스템이나 정보에 접근할 수 있도록 통제하는 것으로, 시스템의 보안 수준을 갖추기 위한 가장 기본적 수단이다.[1]
목차
개요
접근제어는 적절한 권한을 가진 인가지만 특정 시스템이나 정보에 접근할 수 있도록 통제하는 것으로, 시스템의 보안 수준을 갖추기 위한 가장 기본적 수단이다. 시스템 및 네트워크에 대한 접근제어의 가장 기본적인 수단은 IP와 서비스 포트이다. 운영체제, 데이터베이스, 응용 프로그램 및 네트워크 장비에서 각각 접근제어된다.[1] 데이터 저장장치에 접근하는 권한을 정의하거나 제한하고, 권한 있는 자 및 프로그램, 기타 시스템만이 시스템 자원정보에 접근할 수 있도록 제한하며, 사용자 요청에 따라 시스템 자원을 지정하는 자원제어기의 기능을 수행한다.[2] 웹 서비스나 클라우드 서비스 등을 개발하면서 가장 중요하게 고려해야 하는 부분 중 하나는 바로 각 사용자들이 서비스의 어느 부분까지 사용할 수 있고, 어느 부분은 사용할 수 없는지를 제어하는 것이다. 이것은 보안에 매우 밀접한 관련이 있기 때문에 올바르게 접근제어를 구현하는 것은 매우 중요하다. 서비스 개발자는 해당 서비스를 통해 어떤 기능을 제공할 것인지에 대한 고민뿐만 아니라, 서로 다른 사용자들의 서비스 접근 권한을 어떻게 제어할 것인지도 고민해야 한다. 그러기 위해서는 접근제어 모델의 종류와 그 구현 방법들을 아는 것이 매우 중요하다. 접근제어 모델에서 인가를 받으려는 사용자를 ‘주체(Subject)’ 라고 한다. ‘주체’는 특정 사용자 개인이 될 수도 있고, 특정 사용자 그룹이 될 수도 있으며, 또는 전체 사용자를 가리킬 수도 있다. ‘객체(Object)’는 사용자가 접근하고자 하는 서비스나 자원, 정보와 같은 접근 대상을 말한다. 네이버 카페의 게시판이 ‘객체’의 예이다. ‘권한(Permission)’은 ‘객체’에 허용된 ‘주체’가 수행할 수 있는 행위의 목록을 말한다. 보통 ‘권한’에는 읽기, 쓰기, 생성, 삭제, 실행, 검색 등과 같은 권한이 존재할 수 있다. 결국 접 제어(Access Control)라는 것은 ‘객체(Object)’에 접근하고자 하는 ‘주체(Subject)’가 해당 ‘객체(Object)’에 접근할 수 있는 ‘권한(Permission)’을 가지고 있는지 판단하는 것이다.[3]
종류
강제적 접근제어 방식
강제적 접근제어 방식(MAC : Mandatory Access Control)은 어떤 주체가 특정 객체에 접근할 때, 양자의 보안 레벨에 기초하여 낮은 수준의 주체가 높은 수준의 객체정보에 접근하는 것을 강제적으로 제한하는 방법이다. 컴퓨터의 모든 자원(중앙처리장치, 메모리, 프린터, 모니터, 저장장치 등)을 객체로 하고, 그 객체를 사용하고자 하는 것을 주체(사용자 및 모든 프로세스)로 설정하여, 각 객체 파일의 비밀 등급과 각 주체의 허가 등급을 부여한다. 이후 주체가 객체를 읽거나 기록하거나 실행시키고자 할 때마다 그 주체가 그 객체에 대한 권한을 가지고 있는지를 확인하는 방식이다.[2] 대표적인 예로 네이버나 다음 카페에서는 회원 등급에 따라 접근할 수 있는 게시판과 접근할 수 없는 게시판이 있는 것처럼 말이다. 각 회원(주체)마다 부여된 보안 등급이 있고, 각 게시판(객체)마다 접근할 수 있는 허용 등급이 정해져 있기 때문에 객체와 주체 사이의 권한 등급을 직접 비교하여 접근 허용 여부를 결정하는 것이다. 강제적 접근제어 모델에서는 높은 보안 수준을 요구하는 정보는 낮은 보안 수준을 가진 주체가 접근할 수 없다. 시스템 관리자가 이러한 권한 수준을 제어하며, 사용자들은 어떠한 접근 권한 수준도 설정할 수 없다. 다시 말해, 객체의 소유자라고 할지라도 그 객체에 접근할 수 있는 보안 등급을 부여받지 못하면 그 객체에 접근할 수 없다. 이러한 강제적 접근제어 모델은 중앙 집권적인 관리자에 의해 제어되기 때문에 보안성이 높은 편이어서 주로 군(military)이나 방화벽처럼 강력한 보안이 필요한 곳에서 주로 사용한다. 하지만 권한 관리 기능이 단순하고 제한적이어서 주체별로 접근제어를 다르게 적용할 수 없으며, 모든 주체와 객체에 일일이 허용 등급 설정을 해주어야 하므로 설정이 복잡하다는 단점이 있다.[3]
임의적 접근제어 방식
임의적 접근제어 방식(DAC : Discretionary Access Control)은 자원의 소유자 혹은 관리자가 보안 관리자의 개입 없이 자율적 판단에 따라 접근 권한을 다른 사용자에게 부여하는 기법을 말한다. 따라서 자원의 보호보다는 자원의 공동 활용이 더 중요시되는 환경에 적합하며, 기업 환경에는 자원의 유출 가능성을 내포하고 있다. DAC은 특별한 사용자나 그들이 소속되어 있는 그룹들의 식별자(ID)에 근거하여 객체에 대한 접근을 제공한다. 접근제어는 객체의 소유자에 의하여 임의적으로 이루어진다. 그러므로 특정 객체에 대한 접근 허가를 가지고 있는 한 주체는 임의의 다른 주체에게 자신의 허가를 넘겨줄 수 있다. 즉 추가적인 접근제어는 그 사용자에게 일임하는 방식이다. 따라서 임의적 접근제어 방식은 하나의 주체 대 객체 단위로 접근 제한을 설정할 수 있고, 이러한 접근 제한은 모든 주체 및 객체들 간에 동일하지 않다. 즉 한 주체가 특정한 비밀 등급의 한 객체에 대한 접근을 허가하지 않는 임의적 접근제어 정책을 수립해도 그 주체가 그러한 비밀 등급을 갖는 다른 객체들에게 접근하는 것은 방지할 수 없다.[2] 표적인 예는 전통적인 유닉스나 윈도우 등의 운영체제에서 각 파일이나 디렉토리에 대해 접근제어를 하는 방식이다. 유닉스에서 각 파일은 파일의 소유자가 그 파일에 대한 접근제어를 설정할 수 있다. 여기서 ‘임의적(Discretionary)’이라는 말은 객체 소유자의 판단에 따라 권한을 줄 수 있다는 뜻이다. 대체적으로 구현이 용이하고 사용이 간단하다는 장점이 있다. 또한 객체별로 세분화된 접근제어가 가능해 융통성이 넓다. 하지만 소유자 임의로 접근을 허용할 수 있어 강제적 접근제어(MAC)에 비해 상대적으로 보안성이 취약하고 시스템 차원의 일관성 있는 접근제어가 어렵다. 또한 접근제어를 신분에 의존하다 보니 다른 주체의 신분을 도용한 경우 중대한 결함이 발생할 수 있다. DAC 을 구현하는 방법은 여러 가지가 있지만, 대표적으로 다음 4가지의 구현 방법이 있다.[3]
접근제어 행렬
접근제어 행렬(Access Control Matrix)은 위 그림과 같이 전체 주체와 전체 객체에 대한 권한 관계를 2차원 배열로 관리하는 구현 방법이다. 각 행은 각 주체를 나타내며 각 열은 각 객체를 나타낸다. 위 그림에서 사용자 A는 파일 1에 대해 소유하고 있으며 따라서 읽기와 쓰기가 가능하다. 사용자 B는 파일 1에 대해 읽기만 가능하며, 파일 3에 대해서는 쓰기도 가능하다. 이처럼 주체와 객체를 알고 있으면 어떤 권한을 가지고 있는지 바로 알아낼 수 있지만, 주체의 수나 객체의 수가 많아지면 쓸데없이 사용되는 메모리 공간이 많아지는 단점을 가지고 있다.[3]
접근제어 목록
접근제어 목록(Access Control List: ACLs)은 가장 많이 사용하는 구현 방법으로 위 그림에서와 같이 각 객체에 대해 권한을 가지고 있는 주체를 리스트 형태로 관리하는 구현 방법이다. 위 그림에서 파일 1은 사용자 A, B, C가 권한을 가지고 있으며, 사용자 A는 파일 1을 소유했고 따라서 읽기와 쓰기가 가능하다. 사용자 B는 읽기만 가능하며 사용자 C는 읽기와 쓰기가 가능하다. 이처럼 각 객체에 대해 권한을 부여 받은 관리자 목록만 관리하기 때문에 낭비되는 메모리가 적지만, 어느 한 객체에 대해 많은 사용자가 권한을 부여받았을 경우에는 리스트가 길어져 탐색이 오래 걸리는 단점이 있다.[3]
가용성 티켓
가용성 티켓 (Capability Tickets)은 접근제어 목록(ACLs) 과는 반대로 각 주체에 대해 접근 가능한 객체를 리스트 형태로 관리하는 구현 방법이다. 위 그림에서 사용자 C는 파일 1에 대해 읽기와 쓰기가 가능하며 파일 2에 대해서는 읽기만, 파일 4에 대해서는 소유하고 있기 때문에 읽기와 쓰기가 가능하다. 접근제어 목록(ACLs) 구현 방법과 비슷하게 메모리 낭비가 적지만, 한 사용자에 대해 접근할 수 있는 객체가 많아지면 탐색이 오래 걸릴 수 있다.[3]
권한 테이블
권한 테이블 (Permission Table)은 관계형 데이터베이스의 테이블을 이용하여 주체와 객체 목록과 권한 목록을 관리하는 구현 방법이다. 테이블에는 주체 테이블, 객체 테이블, 권한 테이블이 있다. 권한 테이블의 한 레코드에는 하나의 자원에 대한 한 주체의 한 가지 접근 권한이 명시된다. 관계형 데이터베이스의 인덱스 기능을 이용하면 한 사용자에 대한 객체 접근 권한을 빠르게 조회할 수 있는 장점이 있다.[3]
역할 기반 접근제어 방식
역할 기반 접근 제어(RBAC)는 권한을 사용자 개인이 아닌 역할 그룹에 부여하고, 사용자에게 역할을 할당하여 접근 제어를 하는 방식이다. 임의적 접근 제어(DAC)과 강제적 접근 제어(MAC)의 단점을 보완한 방식으로써 사용자에게 정적 혹은 동적으로 역할 그룹을 할당할 수 있다. 이는 사용자 정보는 자주 바뀌어도 역할 정보는 자주 바뀌지 않는다는 것에 착안한 모델이다. 실제로 많은 서비스들이 회원 가입과 탈퇴는 빈번하게 일어나지만, 그 회원들이 부여받을 수 있는 역할의 종류와 역할과 객체 사이의 권한 관계는 잘 변하지 않는다. 권한 관리자는 다수의 사용자에 대해 일일이 접근 권한을 관리하지 않아도 되고 적절한 역할만 부여해주면 되기 때문에 권한 관리 부담이 줄어든다. 일반적으로 직무를 기반으로 하는 서비스들에서 많이 사용되는 접근 제어 방법으로 강제적 접근 제어(MAC)과 비슷하게 각 주체에 허용된 접근 수준(Clearance)과 객체에 부여된 허용등급(Classification)에 근거하여 접근 제어가 이루어진다. 다양한 권한 요소를 고려하다 보면 권한 조건이 늘어날 때마다 역할의 개수가 과도하게 늘어날 수 있는 단점이 있으므로 역할을 개수를 적절히 유지하는 것이 중요하다. 사용자와 역할 사이의 관계는 보통 다대다(N:M) 관계이기 때문에 한 사용자가 여러 개의 역할을 부여받을 수 있다. 또한 역할과 객체 사이의 관계도 다대다(N:M) 관계이기 때문에 한 역할이 여러 객체에 대한 접근 권한을 부여받을 수 있다.[3] 역할 기반 접근제어 방식의 핵심 개념은 권한을 역할과 연관시키고, 사용자들이 적절한 역할을 할당받도록 하는 것이다. RBAC은 최소한의 보안 특권을 부여하는 보안 원리에 따라 유지되며, 그것은 어떤 사용자도 그 사람의 일을 수행하는 데 필요한 권한 이상을 가지지 않는다. 또한 한 조직이 슈퍼 유저의 능력들을 분리할 수 있게 해주고, 특정 개인들을 그들의 일의 필요에 따라 할당하기 위한 특별 사용자 계정 혹은 역할로 포장할 수 있게 해준다. 따라서 다양한 보안 정책이 가능하다. 계정들은 보안, 네트워킹, 방화벽, 백업, 그리고 시스템 운영과 같은 영역에서 특정 목적의 관리자를 위해 설정될 수 있다. 한 명의 강력한 관리자를 선호하고 사용자들이 그들 자신의 시스템 일부를 고칠 수 있기를 원하는 사이트는 상급 사용자(Advanced User) 역할을 설정할 수 있다. 보안 측면에서 RBAC은 기술만이 아니라 산업에 적용되는 방식이기도 하다. RBAC은 시스템 제어를 재할당하는 수단을 제공하지만, 구현을 결정하는 것은 그 조직이다. RBAC 모델은 2004년에 ANSI 표준으로 등재되었으며, 모델의 설명·기능·스펙까지 표준문서에 정리되어 있어 개발자에게 좋은 가이드가 될 것이다. 표준에서는 RBAC을 세 가지 모델로 구분하고 있다.[2]
- 핵심(Core) RBAC 모델
- 계층적(Hierarchical) RBAC 모델
- 한정된(Constrained) RBAC 모델
속성 기반 접근 제어 모델
속성 기반 접근 제어(ABAC)는 객체와 주체의 속성에 대한 조건을 기술하여 접근 제어를 하는 방식이다. 어떤 객체에 접근하기 위해 만족시켜야 하는 속성에 대해 정의하고, 그 객체에 접근하려는 주체가 그 속성을 가지고 있는지를 검사하여 접근 제어를 수행한다. 예를 들어 파일 1에 접근하기 위해서는 사용자의 type 속성에 admin이라는 태그가 달려 있어야 한다고 정의할 수 있다. 시스템의 다양한 요소를 반영할 수 있기 때문에 표현력과 유연성이 좋은 것이 장점이지만, 큰 규모의 시스템에서는 일일이 속성을 적용하기 어렵고 각 객체 접근마다 복잡한 속성 조건을 계산해야 하기 때문에 성능이 다소 느리다. 속성을 일일이 수동으로 정의하기 힘들기 때문에 접근 제어를 정의하기 위한 언어인 XACML(eXtensible Access Control Markup Language)을 별도로 제공한다.[3]
접근제어 기법들 비교
강제적 접근제어 방식은 사용자와 객체에게 부과된 보안 등급(Security Level)을 기반으로 접근 통제를 수행하며, 임의적 접근제어 방식은 객체에 부여된 허가, 거부 정책에 기반하여 객체에 대한 접근을 통제한다. 상용 환경에서는 정보의 변경 가능성이 불법 사용자에 의한 정보의 접근 가능성인 비밀성보다 더 중요한 관심사가 될 수 있다. 예를 들어 은행 업무에서 예금계좌의 정보변경이 예금계좌와 관련된 정보의 접근보다 더 위협적일 수 있다. 강제적 접근제어 방식은 등급화된 정보 기밀성을 위한 보안에 초점이 맞춰져 있고, 임의적 접근제어 방식은 접근권한이 객체의 소유자(owner)에 의해 임의로 변경될 수 있기 때문에 기업이나 정부 조직과 같이 무결성을 요구하는 상업적 응용의 정보 보안에는 부적절하다. 이러한 이유로 무결성 제어가 필요한 상용 환경에서는 역할 기반 접근제어 방식이 대안으로 주목받고 있다. 역할 기반 접근제어 방식은 필요할 때 강제적 접근제어 방식, 임의적 접근제어 방식과 함께 사용될 수 있는 접근 통제의 독자적인 요소이다. 이것은 세 가지 접근제어 방식에 의해 모두 허가되었을 경우에 허락된다.[2]
인증 vs 인가
인증과 인가를 종종 같은 의미로 사용하는 경우가 많다. 하지만 인증(Authentication)과 인가(Authorization)는 엄연히 다른 개념으로 둘의 차이점을 명확히 알고 있어야 한다. 인증(Authentication)은 사용자가 누구인지 판별하는 것을 말한다. 보통 서비스에 로그인하는 과정이 이에 해당한다. 그 사용자가 서비스에 회원 가입을 한 사용자이며 그 사용자가 누구인지 판별하는 것이다. 인가(Authorization)는 어떤 사용자가 어떤 행위(action)을 수행할 권한을 가지고 있는지를 판별하는 것을 말한다. 예를 들어 네이버 카페 같은 곳에 가입을 하면 회원 등급에 따라 특정 게시판에 글을 읽을 수는 있지만 쓸 수는 없는 경우가 있는데 이러한 경우가 바로 인가(Authorization)에 해당한다. 당연하게도 인가를 수행하기 위해서는 인증이 선행되어야 한다. 먼저 그 사용자가 누구인지 판별이 되어야 그 사용자에 대한 권한을 판별할 수 있기 때문이다.[3]
각주
참고자료
- 〈접근 제어〉, 《네이버 지식백과》
- 〈접근 제어〉, 《네이버 지식백과》
- Luniverse, 〈접근 제어의 종류와 구현 방법〉, 《Luniverse》, 2021-02-26
같이 보기