50.1. 검증기 토토 핫 안전하게 설계하기#

경고

검증기 토토 핫 구현하기 전에 이 섹션 전체를 읽고 이해하십시오. 제대로 작동하지 않는 유효성 검사기는 인증이 전혀 없는 것보다 더 나쁠 수 있습니다. 보안에 대한 잘못된 인식과 OAuth 생태계의 다른 부분에 대한 공격에 기여할 수 있기 때문입니다.

50.1.1. 검증인의 책임#

토토 핫마다 토큰 검증에 대해 매우 다른 접근 방식을 취할 수 있지만 구현에서는 일반적으로 세 가지 별도의 작업을 수행해야 합니다.

토큰 검증

검증기는 먼저 제시된 토큰이 실제로 클라이언트 인증에 사용할 유효한 전달자 토큰인지 확인해야 합니다. 이를 수행하는 올바른 방법은 공급자에 따라 다르지만 일반적으로 신뢰할 수 있는 당사자가 토큰을 생성했음을 증명하기 위한 암호화 작업(오프라인 유효성 검사) 또는 유효성 검사를 수행할 수 있도록 신뢰할 수 있는 당사자에게 토큰을 제시하는 작업(온라인 유효성 검사)이 포함됩니다.

온라인 검증, 일반적으로 다음을 통해 구현됨OAuth 토큰 검사, 검증자 토토 핫 단계가 더 적게 필요하며 토큰이 도난당하거나 잘못 발행된 경우 중앙에서 토큰을 취소할 수 있습니다. 그러나 토토 핫은 인증 시도당 하나 이상의 네트워크 호출을 수행해야 합니다(모두 구성된 시간 내에 완료되어야 함).authentication_timeout). 또한 공급자는 외부 리소스 서버에서 사용할 내부 검사 엔드포인트를 제공하지 않을 수도 있습니다.

오프라인 검증은 훨씬 더 복잡하며, 일반적으로 검증자가 제공자의 신뢰할 수 있는 서명 키 목록을 유지 관리한 다음 해당 콘텐츠와 함께 토큰의 암호화 서명을 확인해야 합니다. 구현에서는 발급자 확인("이 토큰의 출처는 어디입니까?"), 대상("이 토큰은 누구를 위한 것입니까?") 및 유효 기간("언제 이 토큰을 사용할 수 있습니까?")을 포함하여 편지에 대한 공급자의 지시를 따라야 합니다. 모듈과 공급자 간에 통신이 없기 때문에 이 방법을 사용하여 토큰을 중앙에서 취소할 수 없습니다. 오프라인 유효성 검사기 구현에서는 토큰 유효 기간의 최대 길이를 제한할 수 있습니다.

토큰을 확인할 수 없으면 토토 핫은 즉시 실패해야 합니다. 신뢰할 수 있는 당사자가 전달자 토큰을 발급하지 않은 경우 추가 인증/승인은 의미가 없습니다.

클라이언트 승인

다음으로 유효성 검사기는 최종 사용자가 클라이언트에게 자신을 대신하여 서버에 액세스할 수 있는 권한을 부여했는지 확인해야 합니다. 여기에는 일반적으로 토큰에 할당된 범위를 확인하여 현재 HBA 매개변수에 대한 데이터베이스 액세스가 포함되는지 확인하는 작업이 포함됩니다.

이 단계의 목적은 OAuth 클라이언트가 허위로 토큰을 얻는 것을 방지하는 것입니다. 유효성 검사기가 데이터베이스 액세스를 포함하는 범위를 전달하기 위해 모든 토큰을 요구하는 경우 공급자는 흐름 중에 해당 액세스 권한을 부여하도록 사용자에게 큰 소리로 메시지를 표시해야 합니다. 이렇게 하면 클라이언트가 데이터베이스에 연결하기 위해 자격 증명을 사용하지 않아야 하는 경우 요청을 거부할 수 있는 기회가 제공됩니다.

배포된 아키텍처에 대한 대역 외 지식을 사용하여 명시적인 범위 없이 클라이언트 인증을 설정할 수 있지만 이렇게 하면 사용자가 루프에서 제거되어 배포 실수를 포착하는 것을 방지하고 그러한 실수가 자동으로 악용될 수 있습니다. 데이터베이스에 대한 액세스는 신뢰할 수 있는 클라이언트로만 엄격하게 제한되어야 합니다.[17]사용자에게 추가 범위를 묻는 메시지가 표시되지 않는 경우.

인증이 실패하더라도 모듈은 감사 및 디버깅에 사용하기 위해 토큰에서 인증 정보를 계속 가져오도록 선택할 수 있습니다.

최종 사용자 인증

마지막으로 유효성 검사기는 공급자에게 이 정보를 요청하거나 토큰 자체에서 정보를 추출하여 토큰에 대한 사용자 식별자를 결정하고 해당 식별자를 서버에 반환해야 합니다(그런 다음 HBA 구성을 사용하여 최종 인증 결정을 내립니다). 이 식별자는 다음을 통해 세션 내에서 사용할 수 있습니다.시스템_사용자그리고 다음과 같은 경우 서버 로그에 기록됩니다log_connections활성화되었습니다.

다양한 제공업체는 최종 사용자에 대해 일반적으로 다음과 같은 다양한 인증 정보를 기록할 수 있습니다.주장. 공급자는 일반적으로 이러한 주장 중 승인 결정에 사용할 수 있을 만큼 신뢰할 수 있는 주장과 그렇지 않은 주장을 문서화합니다. (예를 들어 인증을 위한 식별자로 최종 사용자의 전체 이름을 사용하는 것은 현명하지 않을 것입니다. 많은 공급자가 사용자가 표시 이름을 임의로 변경할 수 있도록 허용하기 때문입니다.) 궁극적으로 사용할 클레임(또는 클레임 ​​조합)에 대한 선택은 공급자 구현 및 애플리케이션 요구 사항에 따라 결정됩니다.

사용자 맵 위임을 활성화하면 익명/가명 로그인도 가능합니다. 보다섹션 50.1.3.

50.1.2. 일반 코딩 지침#

개발자는 토큰 검증을 구현할 때 다음 사항을 명심해야 합니다.

토큰 기밀성

토토 핫은 서버 로그에 토큰 또는 토큰 조각을 기록해서는 안 됩니다. 이는 토토 핫이 토큰이 유효하지 않다고 간주하는 경우에도 마찬가지입니다. 클라이언트가 잘못된 공급자와 통신하도록 혼동하는 공격자는 디스크에서 해당(그렇지 않으면 유효한) 토큰을 검색할 수 없어야 합니다.

네트워크를 통해 토큰을 보내는 구현(예: 공급자를 통해 온라인 토큰 검증 수행)은 피어를 인증하고 강력한 전송 보안이 사용되는지 확인해야 합니다.

로깅

토토 핫은 동일한 것을 사용할 수 있습니다PostgreSQL : 문서 : 18 : 55.2. 서버 내보고 사설 토토 사이트표준 확장으로; 그러나 클라이언트에 로그 항목을 내보내는 규칙은 연결 인증 단계에서 미묘하게 다릅니다. 일반적으로 모듈은 확인 문제를 다음 위치에 기록해야 합니다.COMMERROR사용하는 대신 레벨을 설정하고 정상적으로 반환오류/치명적스택을 해제하여 인증되지 않은 클라이언트에 정보가 유출되는 것을 방지합니다.

중단 가능성

서버가 인증 시간 초과 및 종료 신호를 올바르게 처리할 수 있도록 토토 핫은 신호에 의해 중단 가능한 상태로 유지되어야 합니다.pg_ctl. 예를 들어 소켓에 대한 차단 호출은 일반적으로 경합 없이 소켓 이벤트와 인터럽트를 모두 처리하는 코드로 대체되어야 합니다(참조WaitLatchOrSocket(), WaitEventSetWait(), et al), 장기 실행 루프는 주기적으로 호출해야 합니다.CHECK_FOR_INTERRUPTS(). 이 지침을 따르지 않으면 백엔드 세션이 응답하지 않을 수 있습니다.

테스트 중

OAuth 시스템 테스트의 범위는 이 문서의 범위를 훨씬 벗어나지만 최소한 부정적인 테스트는 필수로 간주되어야 합니다. 승인된 사용자가 들어올 수 있는 모듈을 설계하는 것은 쉽지 않습니다. 시스템의 핵심은 승인되지 않은 사용자를 차단하는 것입니다.

문서

유효성 검사기 구현은 각 최종 사용자에 대해 서버에 보고되는 인증된 ID의 내용과 형식을 문서화해야 합니다. DBA는 이 정보를 사용하여 pg_ident 맵을 구성해야 할 수 있기 때문입니다. (예를 들어 이메일 주소, 조직 ID 번호, UUID입니까?) 또한 다음에서 모듈을 사용하는 것이 안전한지 여부도 문서화해야 합니다.delegate_ident_mapping=1모드, 이를 위해 필요한 추가 구성.

50.1.3. 사용자 승인(사용자 맵 위임)#

검증 토토 핫의 표준 제공 항목은 사용자 식별자이며, 서버는 이를 구성된 모든 항목과 비교합니다.pg_ident.conf매핑최종 사용자에게 연결 권한이 있는지 확인합니다. 그러나 OAuth는 그 자체로 인증 프레임워크이며 토큰은 사용자 권한에 대한 정보를 전달할 수 있습니다. 예를 들어 토큰은 사용자가 속한 조직 그룹과 연결되거나 사용자가 맡을 수 있는 역할을 나열할 수 있으며 해당 지식을 모든 서버의 로컬 사용자 맵에 복제하는 것은 바람직하지 않을 수 있습니다.

사용자 이름 매핑을 완전히 우회하고 유효성 검사기 모듈이 사용자 연결 승인에 대한 추가 책임을 맡도록 하려면 HBA를 다음과 같이 구성할 수 있습니다.delegate_ident_mapping. 그런 다음 모듈은 토큰 범위 또는 동등한 방법을 사용하여 사용자가 원하는 역할에 따라 연결할 수 있는지 여부를 결정할 수 있습니다. 사용자 식별자는 서버에 계속 기록되지만 연결을 계속할지 여부를 결정하는 데 아무런 역할을 하지 않습니다.

이 체계를 사용하면 인증 자체는 선택 사항입니다. 모듈이 연결이 승인되었음을 보고하는 한, 기록된 사용자 식별자가 전혀 없더라도 로그인은 계속됩니다. 이를 통해 제3자 공급자가 필요한 모든 인증을 수행하지만 사용자 식별 정보를 서버에 제공하지 않는 데이터베이스에 대한 익명 또는 가명 액세스를 구현할 수 있습니다. (일부 제공업체에서는 나중에 감사하기 위해 대신 기록할 수 있는 익명화된 ID 번호를 생성할 수 있습니다.)

사용자 맵 위임은 가장 뛰어난 아키텍처 유연성을 제공하지만 유효성 검사기 토토 핫 연결 인증에 대한 단일 실패 지점으로 바꿉니다. 주의해서 사용하세요.



[17]즉, OAuth 클라이언트와 그 의미에서 "신뢰할 수 있는" 것입니다.PostgreSQL서버는 동일한 개체에 의해 제어됩니다. 특히 libpq에서 지원하는 기기 인증 클라이언트 흐름은 공개/신뢰할 수 없는 클라이언트에서 사용하도록 설계되었기 때문에 일반적으로 이 기준을 충족하지 않습니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.