BEOKS / Web-DICOM-Management

DICOM database management for medical ML project based on web.
Creative Commons Zero v1.0 Universal
6 stars 0 forks source link

orthanc에 접근할 때, 보안 적용 방법 #91

Open BEOKS opened 2 years ago

BEOKS commented 2 years ago

orthanc는 Dicom 파일을 저장하기 때문에, 현재 프로젝트에서 가장 높은 보안 레벨이 적용되어야 한다. 어떤 방법이 있을까?

  1. Spring Boot 로그인 정보를 바탕으로 orthanc 접속을 허락하기
    • 현재 클라이언트에서 nginx를 통해서 orthanc로 접속하는데 Spring boot로그인 정보를 바탕으로 nginx에서 보안을 설정 할 수 있을까?
    • Spring Boot에서 Zuul을 이용해서 nginx의 리버스 프록시처럼 설정할 수 있다고 하는데, 이를 이용하면 spring boot의 로그인 정보를 가져오는게 쉽지 않을까?
  2. Orthanc에서 Securiting 관련 Docs가 있는데 이를 적용하는건 어떨까?(https://book.orthanc-server.com/faq/security.html)

Reference

  1. https://book.orthanc-server.com/faq/security.html
Jungwon-Lee commented 2 years ago
  1. Zuul을 이용하면 pre-filter에서 토큰정보를 받아서 처리하는 것이 가능하다고 함 (https://eblo.tistory.com/69)

  2. 보통 API에 권한에 따라 요청을 처리해야할 때, 클라이언트, 게이트웨이, API서버 셋 중에서 권한을 처리하는데, 보통 API서버에서 처리하는게 일반적이라고 한다. 그러나 우리의 경우는 orthanc의 소스를 건드릴게 아니라면 게이트웨이에서 일반 사용자와 관리자의 권한을 처리해서 서버에 넘겨주는 방식이 가장 적절할 것 같음. 의견바람 (https://digitalbourgeois.tistory.com/entry/API-REST-API-%EB%B3%B4%EC%95%88) (https://dongwooklee96.github.io/post/2021/03/28/rest-api-%EB%B3%B4%EC%95%88-%EB%B0%8F-%EC%9D%B8%EA%B0%80-%EB%B0%A9%EC%8B%9D/)

BEOKS commented 2 years ago

게이트웨이에서 일반 사용자와 관리자의 권한을 처리해서 서버에 넘겨주는 방식이 가장 적절할 것 같음. 의견바람

나도 이게 가장 적절할 것 같음. Zuul 링크를 읽어보니 prefilter 기능을 사용하면 해결 할 수 있을 것 같다.

Code Reference : https://eblo.tistory.com/69#:~:text=%C2%A0-,%EC%83%98%ED%94%8C%20%EC%BD%94%EB%93%9C%C2%A0,-PreFilter.java

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        log.debug("Request Method : " + request.getMethod());
        log.debug("Request URL : " + request.getRequestURL().toString());

        String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
        if (!validateToken(authorizationHeader)) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseBody("API key not authorized");
            ctx.getResponse().setHeader("Content-Type", "text/plain;charset=UTF-8");
            ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
        }
        return null;
    }

    private boolean validateToken(String tokenHeader) {
        // 여기에서 로그인 및 권한 정보를 가져와서 진행하면 될 듯
        return true;
    }

권한 정보를 가져오는 방식은 Oauth에 로그인 되어 있는지 유무, 또는 mongoDB에 사용자로 등록되어 있는지 확인하면 될 것 같다. 후자가 로그인 정보를 세세하게 검사(일반 사용자, admin, 데이터 관리자 등) 할 수 있을 것 같으므로 더 적절 할 듯