마이크로 서비스 및 소비자를위한 인증 및 인증 시스템


15

우리는 회사 시스템을 마이크로 서비스 기반 시스템으로 리팩토링 할 계획입니다. 이 마이크로 서비스는 자체 내부 회사 응용 프로그램과 필요한 경우 타사 파트너가 사용합니다. 예약 용, 제품 용 등

역할 및 범위를 처리하는 방법을 잘 모릅니다. 아이디어는 관리자, 에이전트 및 최종 사용자와 같은 3 가지 기본 사용자 역할을 생성하고 필요한 경우 소비자 앱이 범위를 미세 조정할 수 있도록하는 것입니다.

  • 관리자 는 기본적으로 (회사의) 모든 리소스를 생성, 업데이트, 읽기 및 삭제할 수 있습니다.
  • 에이전트 는 회사의 데이터를 작성, 업데이트 및 읽을 수 있습니다.
  • 최종 사용자 는 데이터를 생성, 업데이트, 삭제 및 읽을 수 있지만 에이전트 또는 관리자와 동일한 엔드 포인트에 액세스 할 수 없습니다. 또한 에이전트 나 관리자와 같은 수준이 아닌 데이터를 만들거나 수정할 수 있습니다. 예를 들어 최종 사용자는 에이전트가 계정 정보를 업데이트 할 수 있지만 관리자 정보를 보거나 업데이트 할 수없는 것처럼 계정 정보를 업데이트하거나 읽을 수 있습니다.

에이전트가 기본적으로 회사의 각 리소스를 생성, 읽기 및 업데이트 할 수 있으며 토큰 / 세션에 대해 요청할 수있는 최대 범위이지만 클라이언트 (API 소비자) 응용 프로그램 개발자는 에이전트 중 하나가 특정 자원 만 읽고 작성하십시오.

내부 보안에서이를 처리하고 데이터베이스에 해당 데이터를 쓰도록하거나 클라이언트가 범위가 더 작은 토큰을 요청하여 내부적으로 처리하도록하는 것이 더 나은 방법입니까? ? 이런 식으로 토큰 범위 만 추적해야합니다.

이것의 단점은 우리 팀이 내부 응용 프로그램에서 미세 조정 된 액세스 메커니즘을 만들어야한다는 것입니다.

이러한 사고 방식으로 마이크로 서비스와 인증 시스템은 소비자 일뿐 시스템의 일부가 아니기 때문에 고객의 요구를 방해해서는 안됩니다 (일부 소비자는 자체 내부 앱 임에도 불구하고)?

이 위임이 좋은 접근 방법입니까?

답변:


14

인증 및 권한 부여는 항상 좋은 주제입니다

현재 진행중인 현재 다중 테넌트 서비스에서 권한 부여를 처리하는 방법을 설명하려고합니다. 인증 및 권한 부여는 JSON 웹 토큰 공개 표준을 사용하는 토큰 기반입니다. 이 서비스는 모든 종류의 클라이언트 (웹, 모바일 및 데스크톱 애플리케이션)가 액세스 할 수있는 REST API를 제공합니다. 사용자가 성공적으로 인증되면 서비스는 각 요청에서 서버로 전송해야하는 액세스 토큰을 제공합니다.

서버 응용 프로그램에서 데이터를 인식하고 처리하는 방법에 따라 사용하는 몇 가지 개념을 소개하겠습니다.

리소스 : 클라이언트가 서비스를 통해 액세스 할 수있는 모든 단위 또는 데이터 그룹입니다. 제어하려는 모든 리소스에 단일 이름을 할당합니다. 예를 들어, 다음 엔드 포인트 규칙이 있으면 다음과 같이 이름을 지정할 수 있습니다.

product

/products
/products/:id

payment

/payments/
/payments/:id

order

/orders
/orders/:id
/orders/:id/products
/orders/:id/products/:id

지금까지 서비스에 3 가지 리소스 가 있다고 가정 해 봅시다 . product, paymentorder.

조치 : 읽기, 작성, 업데이트, 삭제 등과 같은 자원에서 수행 할 수있는 조작입니다. 클래식 CRUD 조작 일 필요는 없습니다. follow예를 들어, WebSocket을 사용하여 어떤 종류의 정보를 전파하는 서비스를 공개하려고합니다.

능력 : 수행 할 수있는 능력 action켜짐 resource. 예를 들어; 제품 읽기, 제품 만들기 등 기본적으로 리소스 / 액션 쌍입니다. 그러나 이름과 설명도 추가 할 수 있습니다.

역할 : 사용자가 소유 할 수있는 능력. 예를 들어, 역할에 Cashier"지불 읽기", "지불 작성"기능이 있거나 역할에 Seller"제품 읽기", "주문 읽기", "업데이트 주문", "주문 삭제"기능이있을 수 있습니다.

마지막으로 사용자는 자신에게 다양한 역할을 할당 할 수 있습니다.


설명

앞에서 말했듯이 JSON 웹 토큰을 사용하며 사용자가 보유한 기능은 토큰의 페이로드에 선언됩니다. 따라서 소규모 소매점에서 출납원과 판매자 역할을 동시에 수행하는 사용자가 있다고 가정하십시오. 페이로드는 다음과 같습니다.

{
    "scopes": {
        "payment": ["read", "create"],
        "order": ["read", "create", "update", "delete"]
    }
}

scopes클레임 에서 볼 수 있듯이 역할 (직원, 판매자)의 이름을 지정하지 않고 관련 리소스와 작업 만 지정합니다. 클라이언트가 엔드 포인트에 요청을 보낼 때 서비스는 액세스 토큰에 필요한 자원 및 조치가 포함되어 있는지 확인해야합니다. 예를 들어, GET엔드 포인트에 대한 요청 /payments/88은 성공하지만 DELETE동일한 엔드 포인트에 대한 요청은 실패해야합니다.


  • 리소스 를 그룹화하고 이름을 지정하는 방법과 작업기능 을 정의하고 이름을 지정하는 방법 은 개발자가 결정합니다.

  • 역할역할 이 무엇이며 고객이 내린 결정입니다.


물론, 토큰을 발행 한 사용자 및 고객 (테넌트)을 식별하기 위해 페이로드에 추가 특성을 추가해야합니다.

{
    "scopes": {
        ...
    },
    "tenant": "acme",
    "user":"coyote"
}

이 방법을 사용하면 서비스에 대한 모든 사용자 계정 액세스를 미세 조정할 수 있습니다. 그리고 가장 중요한 것은 질문에서 지적한대로 관리자, 에이전트 및 최종 사용자와 같은 다양한 사전 정의 된 정적 역할을 만들 필요가 없습니다 . 슈퍼 사용자는 소유 사용자가 될 것입니다 role모든과 resourcesactions할당 된 서비스를.

이제 100 개의 리소스가 있고 모든 리소스 또는 거의 모든 리소스에 액세스 할 수있는 역할을 원한다면 어떻게해야합니까? 우리의 토큰 페이로드는 엄청납니다. 이는 리소스를 중첩하고 액세스 토큰 범위에 상위 리소스를 추가함으로써 해결됩니다.


권한 부여는 각 응용 프로그램의 요구에 따라 해결해야하는 복잡한 주제입니다.


당신의 답변에 감사드립니다. 이것은 매우 도움이됩니다. 사용자 당 여러 역할과 관련된 질문이 있습니다. 역할 권한이 겹치는 경우가 있습니까? 출납원과 같은 payment:[read]판매자가 payment: [create]있습니다. 이 경우 사용 권한을 집계합니까?
Robert

반복되는 능력을 가진 역할이있는 경우 역할을 (resource/action)병합해야합니다. 권한이 겹치는 경우 집계해야합니다. 아이디어는 토큰에서 허용되는 리소스와 작업 만 정의하고 역할을 추상화하는 것처럼 역할을 추상화하여 고객에게 덜 복잡한 권한 부여 방법을 제공하는 것입니다.
된장

1
사용자가 자신이 소유 한 리소스에 대해서만 작업을 수행 할 수있는 경우 예를 들어 은행 계좌와 마찬가지로 반드시 "bank_account": [ "read", "update"]는이를 지정하지 않습니다. 또한 마이크로 서비스 시스템에서 인증 프로세스가 정확히 어디에서 이루어 집니까? 중앙 인증 서버 또는 각 서비스에서 자체 인증을 수행합니까?
rocketspacer

@rocketspacer. 이것이 토큰에 user페이로드에 속성 이있는 이유 입니다. 사용자가 소유 한 리소스를 잠그는 방법은 user소유권 주장을 URL 에 매핑하는 것입니다. 예를 들어 : /users/coyote/back-accountuserclaim이 같은 토큰으로 만 액세스 할 수 있습니다 coyote. 도움이 되길 바랍니다.
된장

3

어쨌든 귀하의 서비스가 사용자를 검증하기 위해 작성한 인증 서비스에서 제공하는 인증 토큰을 수락하기를 원한다고 생각합니다. 이것은 마이크로 서비스의 오용을 막는 가장 간단하고 안전한 방법입니다. 또한 일반적으로 클라이언트에게 좋은 경험을 제공하려면 중요한 기능을 직접 구현하고 제공하는 기능이 제대로 구현되었는지 철저히 테스트해야합니다.

모든 발신자는 마이크로 서비스가 자신의 인증을 받았다는 증거를 제공해야하므로 해당 인증에 권한을 부여 할 수도 있습니다. 사용자를 임의 액세스 그룹 (또는 권한 추가 대 빼기 처리하기는 어렵지만 그룹을 원하는 경우 그룹으로 묶을 수있는 기능)을 제공 할 수있는 경우, 사용자에게 왜 사용자에 대한 질문이 더 적은지 x는 원치 않는 작업을 수행 할 수있었습니다. 어쨌든 누군가가 각 서비스에 대한 액세스 목록 검사를 수행해야하므로 귀하도 될 수 있습니다. 모든 서비스의 시작 부분에서 매우 쉽게 코딩되는 것입니다.if ( !TokenAuthorized(this.ServiceName, this.token) { Raise error }) 사용자 그룹을 직접 추적하고 관리 할 수 ​​있습니다. 사실 권한 그룹 관리자가 있어야하고이를 사용자 관리 UI로 작업해야합니다 (사용자 권한에 기존 / 새 그룹 만들기 사용) 혼동을 피하기 위해 정의를 편집 할 때 그룹에 연결된 사용자를 명확하게 나열하십시오. . 그러나 힘든 일이 아닙니다. 모든 서비스에 대한 메타 데이터 만 있으면 그룹과 서비스 간의 매핑을 인증 토큰 처리와 연계 할 수 있습니다.

아주 약간의 세부 사항이 있지만이 기능을 원하는 각 클라이언트는 어떤 경우에도이를 코딩해야하며 세 가지 수준의 사용자 권한을 지원하는 경우 사용자별로 액세스 할 수 있도록 확장 할 수 있습니다 여러 떼. 기본 그룹 권한과 사용자 별 권한 사이의 논리적 교차가 올바른 집계 일 수 있지만 관리자, 에이전트, 최종 사용자 기본 권한의 기본 권한을 추가하고 제거 할 수 있어야합니다. 권한 그룹의 ususal tri-state 플래그 : 권한 추가, 권한 거부, 기본 권한 및 권한을 적절히 결합하십시오.

(참고로, 대화의 양 끝 보안에 대해 우려 할 경우 SSL 또는 양방향 SSL과 같은 모든 상황에서 발생해야합니다. 이러한 토큰을 공격자에게 "누설"하면 마치 마치 마치 d는 암호를 해독했습니다.)


인프라와 구현에 대해 생각하면서 클라이언트 경험을 완전히 잊어 버렸습니다. 비즈니스에 더 적합한 규칙을 만드는 아이디어가 마음에 듭니다. 관리자, 에이전트 및 최종 사용자는 너무 일반적이며 더 많은 사용자 유형을 구현할 계획이며, 이는보다 설명적이고 비즈니스 및 유비쿼터스 언어와 관련이 있습니다.
Robert

마지막 문장에서 "anded" 오타 를 수정할 수 없었습니다.
Tulains Córdova

반드시 오타는 아니지만 명확하게 설명
하겠습니다

1

내 견해는 여기에 두 가지 선택이 있다는 것입니다.

  • 본질적으로 동일한 응용 프로그램에 구성 가능한 액세스 권한 만 있으면 서비스에서 권한을 확인하고 고객에게 각 역할에 부여 된 권한을 변경할 수있는 인터페이스를 제공하십시오. 이를 통해 대부분의 사용자는 기본 역할 설정을 사용할 수 있습니다. '문제'고객은 역할을 조정하거나 필요에 따라 새 역할을 만들 수 있습니다.

  • 고객이 자체 응용 프로그램을 개발하는 경우 자체 중간 API를 소개해야합니다. 어느 것이 관리자로서 귀하에게 연결되지만 서비스를 호출하기 전에 자신의 사용자 정의 인증 요구 사항에 대해 들어오는 요청을 확인합니다.


1

보안 고려 사항

디자인을 잘 이해하면 일부 리소스 액세스 제어 메커니즘을 클라이언트 측에 위임하려고합니다. 즉, 소비 앱은 사용자가 볼 수있는 항목을 줄입니다. 가정은 다음과 같습니다.

마이크로 서비스와 인증 시스템은 고객의 요구를 방해하지 않아야합니다.

나는 여기 심각한 사업에 대한 두 가지 심각한 문제를 봅니다.

  • 거기에있는 일부 불량 사용자 (예 : 파트너 공장 중 하나)가 클라이언트 앱을 리버스 엔지니어링하고 API에 대해 알아 낸 경우 회사가 클라이언트에 적용한 제한을 우회하고 해당 정보를 사용하여 회사에 해를 끼치면 어떻게됩니까? 귀하의 회사는 손해 배상을 청구 할 것입니다. 그러나 회사 회사는 귀하가 귀하의 데이터를 충분히 보호 할 수단을 제공하지 않았다고 주장 할 것입니다.
  • 일반적으로 민감한 데이터가 잘못 사용되거나 (감사로 인해 위험이 발견 될 경우) 경영진이 해당 데이터를보다 엄격하게 제어 할 것을 요구하는 것은 시간 문제 일뿐입니다.

그렇기 때문에 그러한 이벤트를 예상하고 승인 요청을 처리하는 것이 좋습니다. 초기 리엔지니어링 단계에 있으며 아키텍처에서 (이를 모두 구현하지 않은 경우에도) 이후보다 훨씬 쉽게 고려할 수 있습니다.

현재 직책을 수행하는 경우 최소한 정보 보안 담당자에게 문의하십시오.

그것을 구현하는 방법

트릭이 있습니다.

이런 식으로 토큰 범위 만 추적해야합니다.

좋아, 당신은 클라이언트가 선택한 몇 가지 일반적인 토큰을 사용하려고합니다. 일부 고객은 귀하의 통제를 벗어날 수 있기 때문에 다시 한 번 내 눈에 약점이 있습니다.

JWT 를 이미 사용하고 있는지 또는 다른 기술을 사용하고 있는지 모르겠습니다 . 그러나 JWT를 사용하는 경우 사용자의 신원을 전달하는 신원 토큰 (원래 앱을 안전하게 식별하는 두 번째 토큰)이있어 사내 고객과 외부 고객 간의 신뢰 수준을 차별화 할 수 있습니다 ).

당신이 microservice 아키텍처 갈 예정으로, 내가하는 것이 좋습니다 싶습니다 차이 amke 사용자 관리 및 인증 프로세스 (전용 서비스로 실행해야합니다) 특정 각 microservice에있는 액세스 제어 (사이, 그리고해야 각 지역별로 취급해야합니다. 물론 일부 관리자 클라이언트는 사용하기 쉽도록 여러 서비스에 대해 포괄적 인 개요를 제공해야합니다.


1
여기 좋은 조언이 있습니다. 나는 두 번째 토큰으로 아이디어를 좋아합니다.
Robert

1

여기에도 짧은 대답이 있습니다. "클라이언트"에게 제공하려는 모든 핵심 기능을 직접 구현해야합니다 . 이미 사용자 인증을 수행하고 있으므로 클라이언트가 사용자 권한과 같은 기본 동작을 추가하도록하는 것은 문제가있는 것 같습니다. 이를 구현하기 위해 클라이언트에 맡기면 동일한 권한 코드의 여러 구현을 "지원"할 수 있습니다. "소유"하지 않더라도 코드에 버그가있을 수 있으며 고객이 원하는 기능을 갖기를 원하므로 고객이 겪고있는 문제의 해결을 지원해야합니다. 여러 코드 기반을 지원하는 것은 재미가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.