Choi G.J bio photo

Choi G.J

IT System Engineer

접근제어(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"}]}].