예시 : 은행에서 돈을 인출하려 할때 은행직원은 신분증을 제시해 달라고 요청한다.
비행기 티켓을 구매하려고 하면, 비행기를 탈수 있는 자격이 되는지 증명하기 위해 여권을 제시해야 할 수도 있다.
예시 : 공연장에 입장하기 위해 티켓을 구매하는 상황, 기획사는 신원이 무엇인지에는 관심이 없음. 단지 공연장에 입장할 권한이 있는지에 대한 여부만 관심이 있음
신원정보를 포함하지 않더라도, 인가 과정에서 검증이 실패하거나 하는것이 아닌것처럼..
위에서 무엇을 뜻하는지 밝히기는 했지만, 이 용어들은 자주 중복해서 사용되고 혼란의 원인이 된다.
예시 : 은행에서처럼 신분증을 제시했지만, 그 신분증은 본인의 계좌에 접근하기 위한 인가에도 사용되기 때문
사원증을 아무리 찍어도, 대표님 방문은 열수 없는것처럼..
인증과 인가는 밀접하게 연관되어 있으나, 어떤 시나리오에서는 서로 바꿔서 사용할 수 있는 주제가 되기도 하다.
여기서 중요한 점은 인증은 인가로 이어지지만, 인가가 인증으로 이어지지는 않는다는 점이다.
예시 : 비행기탈때 탑승권으로 승무원은 내 신원을 알수 있지만.. 공연티켓으로 공연을 볼수있다 할지라도, 공연장에 입장할수 있지만, 그 다른 무엇도 아닌것처럼..
접근 제어 모델을 설명하기 전에 먼저 접근 제어 모델에서 사용하는 용어에 대해 알 필요가 있다.
접근 제어 모델에서 인가를 받으려는 사용자를 ‘주체(Subject)’ 라고 한다.
‘객체(Object)’는 사용자가 접근하고자 하는 서비스나 자원, 정보와 같은 접근 대상을 말한다.
결국 접근 제어(Access Control)라는 것은 ‘객체(Object)’에 접근하고자 하는 ‘주체(Subject)’가 해당 ‘객체(Object)’에 접근할 수 있는 ‘권한(Permission)’을 가지고 있는지 판단하는 것이다.
예시 : 네이버나 다음 까페에서 회원 등급에 따라 접근할 수 있는 게시판과 없는 게시판을 구분하는것.
각 게시판(객체)마다 접근할 수 있는 허용 등급이 정해져 있기 때문에 객체와 주체 사이의 권한 등급을 직접 비교하여 접근 허용 여부를 결정하는 것이다.
강제적 접근 제어 모델에서는 높은 보안 수준을 요구하는 정보는 낮은 보안 수준을 가진 주체가 접근할 수 없다.
장점 : 강제적 접근 제어 모델은 중앙 집권적인 관리자에 의해 제어되기 때문에 보안성이 높은 편이어서 주로 군(military)이나 방화벽처럼 강력한 보안이 필요한 곳에서 주로 사용한다.
단점 : 권한 관리 기능이 단순하고 제한적이어서 주체별로 접근 제어를 다르게 적용할 수 없으며, 모든 주체와 객체에 일일이 허용 등급 설정을 해주어야 하므로 설정이 복잡하다.
예시 : 리눅스 파일이나, 디렉토리에 대해 접근제어 방식을 말한다.
이 유저의 권한은 읽기쓰기수정, 이 유저의 권한은 읽기.. 등
파일은 파일의 소유자가 그 파일에 대한 접근 제어를 설정할 수 있다.
여기서 ‘임의적(Discretionary)’이라는 말은 객체 소유자의 판단에 따라 권한을 줄 수 있다는 뜻
DAC 을 구현하는 방법은 대표적으로 다음 4가지의 구현 방법이 있다. (이것에 대한 구현방법은 내용이 너무 길어지므로, 종류만 소개한다.)
장점 : 주체와 객체를 알고 있으면 어떤 권한을 가지고 있는지 바로 알아낼 수 있다.
단점 : 주체의 수나 객체의 수가 많아지면 쓸데없이 사용되는 메모리 공간이 많아지는 단점을 가지고 있다.
어느 한 객체에 대해 많은 사용자가 권한을 부여받았을 경우에는 리스트가 길어져 탐색이 오래 걸리는 단점이 있다.
권한을 사용자 개인이 아닌 역할 그룹에 부여하고, 사용자에게 역할을 할당하여 접근 제어를 하는 방식
이름 그대로 역할에 따라 자원에 대한 접근을 제어한다.
일반적으로 직무를 기반으로 하는 서비스들에서 많이 사용되는 접근 제어 방법으로 강제적 접근 제어(MAC)과 비슷하게 각 주체에 허용된 접근 수준(Clearance)과 객체에 부여된 허용등급(Classification)에 근거하여 접근 제어가 이루어진다.
실제로 많은 서비스들이 회원 가입과 탈퇴는 빈번하게 일어나지만, 그 회원들이 부여받을 수 있는 역할의 종류와 역할과 객체 사이의 권한 관계는 잘 변하지 않는다.
사용자와 역할 사이의 관계는 보통 다대다(N:M) 관계이기 때문에 한 사용자가 여러 개의 역할을 부여받을 수 있다.
역할 정의
{
"name": "roles/testRole",
"title": "billing role",
"includedPermissions": [
"paymentStatement.list",
"usage.list"
]
}
역할 부여
{
"bindings": [{
"role": "roles/testRole",
"members": [
"user:viewrain@hohoho.com"
]
}]
}
예시 : 예를 들어 파일 1에 접근하기 위해서는 사용자의 type 속성에 admin이라는 태그가 달려 있어야 한다고 정의할 수 있다.
속성 기반 접근 제어 적용
{
"bindings": [{
"role": "roles/testRole",
"members": [
"user:viewrain@hohoho.com"
]}
],
"condition": {
"title": "DateTime Expires",
"description": "Expires at noon on 2023-12-31 UTC",
"expression": "request.time < timestamp('2022-06-01T12:00:00Z')"
}
}
지금까지 일반적으로 사용되는 접근 제어 모델의 종류에 대해 알아보았다.
하지만 위에서 알아본 일반적인 접근 제어 모델들이 모든 서비스에 적합한 것은 아니다.
각 서비스마다 보호해야 하는 객체의 종류나 정책이 다를 수 있고, 객체들 사이의 관계도 복잡할 수 있다.
결국 완벽한 접근 제어(사용하기도 쉽고 성능도 나쁘지 않은)를 하기 위해서는 그 시스템을 사용하는 사용자가 누구인지, 그리고 보호하려는 객체는 어떤 것이 있으며, 각 객체 사이의 관계와 특징은 무엇인지, 어느 정도 복잡한 접근 제어까지 지원해야 하는지 등의 요구 사항을 명확히 파악하는 것이 무엇보다도 중요하다.
인터넷에 권한관리에 대한 내용을 검색해보면, 큰 틀이지만 공통된 방안을 제시한다.
플랫폼에 따라 지원 수준과 표현법은 다르지만 역할 기반 및 속성 기반 접근 제어는 권한 관리의 기본이기 때문에 조금 복잡하더라도 한 번만 제대로 익혀두면 다양한 서비스에 적용할 수 있다.
권한 관리의 허점을 파고든 클라우드 보안 사고의 발생 가능성은 항상 존재합니다. 특히 클라우드가 기업 IT 전략 방향의 중심에 위치하면서 시스템, 애플리케이션 및 데이터에 대한 접근 권한 관리에 많은 신경을 써야 한다.