접근제어(Authentication, Authorisation)
기본 Virtual Host와 User
RabbitMQ가 최초 기동되거나 database의 데이터가 비어있으면 기본적으로 “/”인 Virtual Host와 거기에 접근권한을 가진 guest//guest 계정이 생성된다.
보안처리를 위해 “guest” 계정은 삭제하고 새로운 계정을 만들어 사용하는 것이 좋다.
“guest”계정은 기본적으로 localhost에서만 접근가능하고 remote에서는 사용할 수 없는 계정이다. 때문에 “guest”계정으로 원격에서 client프로그램을 통해 접근 가능하게 하려면 configuration파일에서 loopback_users의 “guest”계정을 제거해야 한다.
Before
{loopback_users,[<<"guest">>]}
After
{loopback_users,[]}
권한 추가 및 확인
$ rabbitmqctl -n node1 add_user temp temp
$ rabbitmqctl -n node1 set_permissions -p / temp "^temp.*" ".*" ".*"
$ rabbitmqctl -n node1 list_permissions
set_permissions -p {virtualHostPath} {configure권한} {write권한} {read권한}
의 형식을 가지고 있다.
권한에 대한 부분은 정규식으로 작성하여 패턴에 매칭되는 것만 “allow”되도록 되어있다.
”.*“(모두허용), ““(모두차단)
configure권한
리소스(queue, exchange 등) declare할 수 있는 권한이다. “temp.*“로 설정하면 모든 “temp”로 시작되는 리소스에 대한 declare 권한이 부여된다.
channel.queueDeclare(...);
명령 수행 과정에서 권한 체크하며, 권한이 없으면 이 단계에서 오류가 발생한다.
write권한
exchange에 대한 Publish에 대한 권한이다.
이름없는 exchange ““는 amq.default에 대한 접근권한이 부여되어 있어야 publish가능하다. “extemp.*“로 설정하면 extemp로 시작하는 이름의 exchange에 publish할 때의 권한이 부여된다.
channel.basicPublish(...);
명령 수행 과정에서 권한 체크하며, 권한없으면 이 단계에서 오류가 발생한다.
read권한
queue에 대한 consume에 대한 권한이다.
“qtemp.*“로 설정하면 qtemp로 시작하는 이름의 queue의 consume에 대한 권한을 부여한다.
channel.basicConsume(...);
명령 수행 과정에서 권한 체크하며, 권한 없으면 이 단계에서 오류가 발생한다.
권한예제
계정 | conf | write | read | 설명 |
---|---|---|---|---|
only_read_all | ”” | ”” | ”.*” | 모든 queue를 consume만 가능 |
only_read_some | ”” | ”” | “some.*” | some으로 시작되는 queue만 consume만 가능 |
only_read_temp | ”” | ”” | “amq.gen.*” | 임시 queue에 대해서만 consume가능 |
only_publish_all | ”” | ”.*” | ”” | 모든 exchange로 publish만 가능 |
only_publish_some | ”” | “some.*” | ”” | some으로 시작되는 exchange에만 publish 가능 |
only_configure | ”.*” | ”” | ”” | 모든 queue, exchange에 대한 생성/접근만 가능 |
admin | ”.*” | ”.*” | ”.*” | 모든 권한 |
외부리소스로 Authentication/Authorisation 설정
internal database에 설정된 권한 뿐만아니라 LDAP, HTTP로 Backend 권한처리를 설정할 수 있다.
rabbit_auth_backend_ldap, rabbit_auth_backend_http, rabbitmq_auth_backend_http를 복합적으로 선언하여 순차적으로 체크하도록 할 수 있다.
예제
[{rabbit, [
{auth_backends, [rabbit_auth_backend_ldap, rabbit_auth_backend_http]}
]
},
%% See HTTP backend docs for details
{rabbitmq_auth_backend_http,
[{user_path, "http://my-authenticator-app/auth/user"},
{vhost_path, "http://my-authenticator-app/auth/vhost"},
{resource_path, "http://my-authenticator-app/auth/resource"}]}].