RabbitMQ 보안 구성 문제 일반적인 문제 해결

RabbitMQ에서 일반적인 보안 구성 문제를 해결하고 해결하는 방법을 알아보십시오. 이 가이드는 세분화된 사용자 권한, 중요한 SSL/TLS 설정 오류 및 연결 인증 실패와 관련된 문제를 진단하고 수정하는 방법을 다룹니다. 실제 명령 및 구성 확인을 통해 브로커의 보안 태세를 강화하십시오.

일반적인 RabbitMQ 보안 구성 문제 해결

RabbitMQ 보안 구성 문제는 일반적으로 로그인 실패, 403 ACCESS_REFUSED 오류, 또는 완료되지 않는 TLS 핸드셰이크로 나타납니다. 수정 방법은 연결이 실패하는 지점(인증, vhost 액세스, 리소스 권한, 인증서 검증)에 따라 다릅니다.

이 가이드를 사용하여 해당 계층을 순서대로 확인하세요. 추측 없이 확인할 수 있는 실용적인 RabbitMQ 명령어와 구성 포인트에 중점을 둡니다.

사용자 권한 및 액세스 제어 문제

가장 흔한 보안 문제는 잘못된 사용자 권한에서 비롯됩니다. RabbitMQ는 교환, 큐, 바인딩에 대한 태그와 리소스 권한(구성, 쓰기, 읽기)을 기반으로 하는 세분화된 액세스 제어 시스템을 사용합니다.

누락된 권한 진단

애플리케이션이 연결, 게시 또는 메시지 소비를 할 수 없는 경우 첫 번째 단계는 사용자의 유효 권한을 확인하는 것입니다. RabbitMQ 관리 플러그인 인터페이스나 rabbitmqctl 명령줄 도구를 사용할 수 있습니다.

일반적인 증상:

  • 연결은 열리지만 게시 또는 소비 작업이 ACCESS_REFUSED로 실패합니다.
  • 사용자가 기존 교환에는 게시할 수 있지만 큐를 선언할 수는 없습니다.
  • 동일한 사용자 이름이 한 vhost에서는 작동하지만 다른 vhost에서는 실패합니다.

rabbitmqctl을 통한 사용자 태그 및 권한 확인

사용자의 태그와 권한을 확인하려면 다음을 사용하세요:

rabbitmqctl list_users
# 사용자와 해당 태그(예: administrator, management)를 확인합니다.

rabbitmqctl list_user_permissions username
# 사용자에게 구성, 쓰기, 읽기 권한이 있는 vhost를 표시합니다.

rabbitmqctl list_permissions -p /your_vhost
# 하나의 vhost에 있는 모든 사용자의 권한을 표시합니다.

권한 차이 해결

권한은 가상 호스트(vhost) 수준에서 설정되어야 하며 종종 리소스 수준(교환/큐)에서 세분화해야 합니다.

예: /app_vhost에서 app.으로 시작하는 리소스에 대한 애플리케이션 사용자 액세스 권한 부여:

rabbitmqctl set_permissions -p /app_vhost app_user "^app\\." "^app\\." "^app\\."

RabbitMQ 권한은 구성, 쓰기, 읽기 순서의 정규 표현식입니다. 프로덕션에서는 애플리케이션이 해당 vhost의 모든 리소스를 실제로 소유하지 않는 한 ".*"를 피하세요. app_userorders_exchange에만 게시하고 processing_queue에서만 소비하는 경우 교환 이름에 대한 쓰기 권한과 큐 이름에 대한 읽기 권한을 부여하세요.

administrator 태그는 RabbitMQ 관리 사용자를 위한 것이며 일반 애플리케이션용이 아닙니다. 광범위한 관리 액세스 권한을 부여하므로 앱 권한 수정을 위한 지름길로 사용해서는 안 됩니다.

인증 실패

인증 실패는 액세스 제어 확인이 시작되기 전에 브로커가 사용자의 자격 증명(사용자 이름/비밀번호)을 거부할 때 발생합니다.

일반적인 원인

  • 비밀번호 불일치: 클라이언트 시크릿이 RabbitMQ에 저장된 비밀번호와 일치하지 않습니다.
  • URI의 잘못된 사용자 이름 또는 vhost: AMQP URL에는 vhost 경로가 포함되므로 /%2F로 인코딩됩니다.
  • 인증 메커니즘 불일치: 예를 들어 TLS 클라이언트 인증서 흐름에는 EXTERNAL 메커니즘이 필요할 수 있는 반면, 사용자 이름/비밀번호 클라이언트는 일반적으로 PLAIN 또는 AMQPLAIN과 같은 메커니즘을 사용합니다.

로그를 사용한 인증 문제 해결

인증 실패는 브로커에 의해 기록됩니다. 많은 Linux 패키지에서 로그는 /var/log/rabbitmq/에 있습니다. 컨테이너화된 배포는 일반적으로 로그를 stdout 또는 컨테이너 로그 드라이버로 보냅니다.

다음이 포함된 줄을 찾으세요:

=ERROR REPORT==== YYYY-MM-DD HH:MM:SS ===
Error in server: {auth_failed,<<...>>}

비밀번호 재설정 또는 변경

자격 증명을 분실했거나 손상된 것으로 의심되는 경우 즉시 재설정하세요:

# 'app_user'의 비밀번호 변경
rabbitmqctl change_password app_user new_secure_password

SSL/TLS 및 인증서 구성 오류

보안 통신(AMQPS 또는 보안 WebSocket)을 적용할 때 인증서 및 신뢰 저장소 문제는 일반적인 보안 구성 골칫거리입니다.

SSL/TLS 실패 증상

  • 클라이언트 연결 시도 시간 초과 또는 즉시 거부.
  • 클라이언트가 SSL handshake failed, certificate verify failed 또는 unknown ca와 같은 오류를 보고합니다.

주요 구성 확인

A. 서버 인증서 확인

RabbitMQ 서버가 제시하는 인증서 체인이 유효하고 클라이언트가 신뢰하는지 확인하세요.

  1. 서버 설정 확인: 리스너에 대해 rabbitmq.conf 파일에서 올바른 인증서(.pem 등)와 키 파일이 참조되는지 확인하세요:
    # rabbitmq.conf 예시 스니펫
    listeners.ssl.default = 5671
    ssl_options.cacertfile = /path/to/ca_certificate.pem
    ssl_options.certfile = /path/to/server_certificate.pem
    ssl_options.keyfile = /path/to/server_key.pem
    
  2. 클라이언트 신뢰 저장소 확인: 서버 인증서가 자체 서명되었거나 개인 CA에 의해 서명된 경우 클라이언트는 해당 CA 인증서를 신뢰해야 합니다.

B. 암호 및 프로토콜 불일치

클라이언트와 서버가 공통 암호 제품군 또는 TLS 버전(예: 클라이언트가 TLS 1.2만 지원하지만 서버가 TLS 1.3만으로 구성된 경우)에 동의할 수 없으면 핸드셰이크가 실패합니다.

엄격한 프로토콜 적용이 필요한 경우 rabbitmq.conf에서 지원되는 TLS 버전을 명시적으로 정의하세요. 그렇지 않으면 RabbitMQ는 기본 Erlang/OTP 런타임 및 RabbitMQ 버전에서 제공하는 TLS 지원에 의존합니다.

# 허용된 버전을 명시적으로 정의(예: TLS 1.2 및 1.3 강제)
ssl_options.versions.tcp = [tlsv1.2, tlsv1.3]

C. 클라이언트 인증서 인증(mTLS)

클라이언트가 인증서를 제시해야 하는 경우:

  1. ssl_options.verify = verify_peer를 설정하세요.
  2. 클라이언트 인증서가 필요한 경우 ssl_options.fail_if_no_peer_cert = true를 설정하세요.
  3. RabbitMQ가 클라이언트 인증서에 서명한 CA를 신뢰하도록 ssl_options.cacertfile 또는 ssl_options.cacerts_path를 구성하세요.
  4. 일반적으로 rabbitmq_auth_mechanism_ssl 플러그인을 사용하여 인증서 기반 인증을 구성하고 인증서 ID가 예상 RabbitMQ 사용자 이름에 매핑되는지 확인하세요.

가상 호스트 액세스 문제

사용자는 명시적으로 액세스 권한이 부여된 vhost 내의 리소스에만 액세스할 수 있습니다.

기본 VHost (/)

사용자가 생성되었지만 어떤 vhost에도 할당되지 않은 경우 연결하거나 작업할 수 없습니다. 기본 vhost(/)를 사용하는 경우 사용자에게 해당 vhost에 대한 권한이 있는지 확인하세요.

관리 인터페이스 또는 rabbitmqctl을 사용하여 사용자에게 권한이 있는 vhost를 나열하세요:

rabbitmqctl list_user_vhosts username

사용자가 billing_vhost라는 vhost에 액세스해야 하는 경우 사용자가 연결되어 있는지 확인하세요:

rabbitmqctl set_permissions -p billing_vhost app_user "^billing\\." "^billing\\." "^billing\\."

핵심 요점

RabbitMQ 보안 실패를 순서대로 확인하세요: 리스너와 TLS 먼저, 그 다음 자격 증명, 그 다음 vhost 액세스, 그 다음 구성/쓰기/읽기 권한. 이 순서를 따르면 실제 문제가 잘못된 AMQP URL, 신뢰할 수 없는 CA 또는 누락된 vhost 권한일 때 권한을 다시 작성하는 것을 방지할 수 있습니다.