예시 : 은행에서 돈을 인출하려 할때 은행직원은 신분증을 제시해 달라고 요청합니다.
다른 예로 비행기 티켓을 구매하려고 하면, 비행기를 탈수 있는 자격이 되는지 증명하기 위해 여권을 제시해야 할 수도 있는것 처럼요..
예시 : 공연장에 입장하기 위해 티켓을 구매하는 상황이 있다고 가정해보죠.. 기획사는 신원이 무엇인지에는 관심이 없습니다. 단지 공연장에 입장할 권한이 있는지에 대한 여부만 관심이 있겠죠?
신원정보를 포함하지 않더라도, 인가 과정에서 검증이 실패하거나 하는것이 아닌것처럼요..
위에서 무엇을 뜻하는지 밝히기는 했지만, 이 용어들은 자주 중복해서 사용되고 혼란의 원인이 됩니다.
예시 : 은행에서처럼 신분증을 제시했지만, 그 신분증은 본인의 계좌에 접근하기 위한 인가에도 사용되는 것처럼 혼합될 수 있고
사원증을 아무리 찍어도, 대표님 방문은 열수 없으니까요!
인증과 인가는 밀접하게 연관되어 있으나, 어떤 시나리오에서는 서로 바꿔서 사용할 수 있는 주제가 되기도 합니다.
여기서 중요한 점은 인증은 인가로 이어지지만, 인가가 인증으로 이어지지는 않는다는 점이 핵심입니다.
예시 : 비행기탈때 탑승권으로 승무원은 내가 비행기를 탈수 있음을 나타내는 증명과 동시에 내 신원을 알수 있지만.. 반대로 공연티켓으로는 공연을 볼수있다 할지라도, 입장은 가능하지만 입장 외에는 아무것도 아닌것처럼요..
접근 제어 모델을 설명하기 전에 먼저 접근 제어 모델에서 사용하는 용어에 대해 알 필요가 있습니다.
접근 제어 모델에서 인가를 받으려는 사용자를 주체(Subject)
라고 합니다.
주체
는 특정 사용자 개인이 될 수도 있고, 특정 사용자 그룹이 될 수도 있으며, 또는 전체 사용자를 가리킬 수도 있습니다.객체(Object)
는 사용자가 접근하고자 하는 서비스나 자원, 정보와 같은 접근 대상을 말합니다.
객체
의 예입니다.권한(Permission)
은 객체
에 허용된 주체
가 수행할 수 있는 행위의 목록을 말합니다. 보통 권한
에는 읽기, 쓰기, 생성, 삭제, 실행, 검색 등과 같은 권한이 존재할 수 있습니다.결국 접근 제어(Access Control)라는 것은 객체(Object)
에 접근하고자 하는 주체(Subject)
가 해당 객체(Object)
에 접근할 수 있는 권한(Permission)
을 가지고 있는지 판단하는 것입니다.
예시 : 네이버나 다음 까페에서 회원 등급에 따라 접근할 수 있는 게시판과 없는 게시판을 구분하는것 입니다.
각 게시판(객체)마다 접근할 수 있는 허용 등급이 정해져 있기 때문에 객체와 주체 사이의 권한 등급을 직접 비교하여 접근 허용 여부를 결정하는 것이죠
우리 어릴때 막 등업하려고 노력 많이 한것처럼요 ㅎㅎ
강제적 접근 제어 모델에서는 높은 보안 수준을 요구하는 정보는 낮은 보안 수준을 가진 주체가 접근할 수 없습니다.
장점 : 강제적 접근 제어 모델은 중앙 집권적인 관리자에 의해 제어되기 때문에 보안성이 높은 편이어서 주로 군(military)이나 방화벽처럼 강력한 보안이 필요한 곳에서 주로 사용합니다.
단점 : 권한 관리 기능이 단순하고 제한적이어서 주체별로 접근 제어를 다르게 적용할 수 없으며, 모든 주체와 객체에 일일이 허용 등급 설정을 해주어야 하므로 설정이 복잡합니다.
예시 : 리눅스 파일이나, 디렉토리에 대해 접근제어 방식을 말합니다.
이 유저의 권한은 RWX, 이 유저의 권한은 R.. 등
파일은 파일의 소유자가 그 파일에 대한 접근 제어를 설정할 수 있습니다.
여기서 임의적(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 전략 방향의 중심에 위치하면서 시스템, 애플리케이션 및 데이터에 대한 접근 권한 관리에 많은 신경을 써야 하는 시대가 이미 와있는 만큼, 이글을 보시는 모든 분들이 권한의 소중함을 짚어보셨으면 좋겠습니다. 😊
너무 알찬 내용 깔끔한정리 감사하모니카
많이 배워갑니다