블로그 | NGINX

NGINX LDAP 참조 구현의 보안 취약점 해결

NGINX-F5-수평-검정-유형-RGB의 일부
리엄 크릴리 썸네일
리암 크릴리
2022년 4월 11일 게시

2022년 4월 9일, NGINX LDAP 참조 구현 의 보안 취약점이 공개적으로 공유되었습니다. 참조 구현에만 영향을 미치는 것으로 확인되었습니다. NGINX 오픈 소스와 NGINX Plus 자체는 영향을 받지 않으며, 참조 구현을 사용하지 않는 경우 시정 조치가 필요하지 않습니다.

NGINX LDAP 참조 구현은 LDAP(Lightweight Directory Access Protocol)를 사용하여 NGINX에서 프록시되는 애플리케이션의 사용자를 인증합니다. https://github.com/nginxinc/nginx-ldap-auth 에서 Python 데몬 및 관련 NGINX 구성으로 게시되었으며, 그 목적과 구성은 블로그에서 자세히 설명합니다.

다음 조건 중 하나라도 적용되는 경우 LDAP 참조 구현의 배포는 취약점의 영향을 받습니다. 아래에서 이러한 상황과 이를 완화하는 방법에 대해 자세히 살펴보겠습니다.

  1. 명령줄 매개변수는 Python 데몬을 구성하는 데 사용됩니다.
  2. 사용되지 않는 선택적 구성 매개변수가 있습니다.
  3. LDAP 인증은 특정 그룹 멤버십에 따라 달라집니다.

메모: LDAP 참조 구현은 참조 구현으로 게시되며, 통합이 작동하는 방식의 메커니즘과 통합을 확인하는 데 필요한 모든 구성 요소를 설명합니다. 이는 프로덕션 등급의 LDAP 솔루션이 아닙니다. 예를 들어, 샘플 로그인 페이지에 사용된 사용자 이름과 비밀번호는 암호화되지 않았으며, 보안 공지에 이 사실이 명시되어 있습니다.

완화 조건 1: 명령줄 매개변수는 Python 데몬을 구성하는 데 사용됩니다.

LDAP 참조 구현을 구성하는 기본적인 방법은 샘플 구성설명서 에 자세히 설명된 대로 여러 개의 proxy_set_header 지침을 사용하는 것입니다. 그러나 구성 매개변수는 Python 데몬( nginx-ldap-auth-daemon.py )을 초기화하는 명령줄에서도 설정할 수 있습니다.

명령줄에 구성 매개변수가 지정되면 공격자는 특별히 조작된 HTTP 요청 헤더를 전달하여 일부 또는 전체를 재정의할 수 있습니다. 이를 방지하려면 NGINX 구성(repo의 nginx-ldap-auth.conf )의 location = /auth-proxy 블록에 다음 구성을 추가하여 인증 중에 외부 요청 헤더가 무시되도록 해야 합니다.

location = /auth-proxy {
# ...
proxy_pass_request_headers off;
proxy_set_header Authorization $http_authorization; # 기본 인증을 사용하는 경우
# ...
}

완화 조건 2: 사용하지 않는 선택적 구성 매개변수

조건 1에서처럼 공격자는 구성에 설정되지 않은 경우 특수하게 조작된 HTTP 요청 헤더를 전달하여 특정 구성 매개변수를 재정의할 수 있습니다. 예를 들어, LDAP 검색 템플릿은 구성에서 명시적으로 설정되지 않은 경우 재정의될 수 있습니다. 이는 NGINX 구성의 location = /auth-proxy 블록에 다음 구성을 추가하여 조건 1과 같은 방식으로 방어됩니다.

location = /auth-proxy {
# ...
proxy_pass_request_headers off;
proxy_set_header Authorization $http_authorization; # 기본 인증을 사용하는 경우
# ...
}

완화 조건 3: LDAP 그룹 멤버십이 필요합니다

Python 데몬은 입력 내용을 정리하지 않습니다. 결과적으로 공격자는 특별히 제작된 요청 헤더를 사용하여 그룹 멤버십( memberOf ) 검사를 우회하고 인증하려는 사용자가 필요한 그룹에 속하지 않더라도 LDAP 인증이 성공하도록 강제할 수 있습니다.

이를 완화하려면 로그인 양식을 제시하는 백엔드 데몬이 사용자 이름 필드에서 특수 문자를 제거하도록 해야 합니다. 특히 LDAP 서버에서 특별한 의미를 갖는 여는 괄호 문자와 닫는 괄호 문자 ( ) 및 등호( = )를 제거해야 합니다. LDAP 참조 구현의 백엔드 데몬은 적절한 시기에 이런 방식으로 업데이트될 예정입니다.

감사의 말

이러한 보안 취약점을 알려준 Lucas Verney, valodzka, @_Blue_hornet에게 감사드립니다.


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."