Cách tắt Swagger UI trên môi trường production trong Spring

Swagger cho phép chúng ta hiển thị thông tin về các API (API document) mà backend cung cấp lên trên giao diện web (Swagger UI). Các frontend developer có thể dựa vào API document này để giao tiếp với backend mà không nhất thiết phải làm việc với các backend developer. Ngoài ra tester cũng có thể kiểm thử backend một cách độc lập thông qua Swagger UI.

Tiện lợi là vậy, thế nhưng có một vấn đề bảo mật nghiêm trọng khi chúng ta public hệ thống ra bên ngoài cho mọi người sử dụng (production). Nếu kẻ gian có được những thông tin về API từ Swagger UI, chúng có thể tìm ra các lổ hỏng của hệ thống và tấn công.

Cho nên điều cần thiết là chúng ta cần phải tắt Swagger UI khi deploy lên môi trường production.

Cấu hình Swagger

Để cấu hình swagger trong một ứng dụng Spring, các bạn có thể xem chi tiết tại đây. Trong phạm vi của bài viết này mình sẽ đi ở mức overview thôi nhé. Với mọi ứng dụng spring sử dụng Swagger chúng ta cần tạo một class dùng để cấu hình Swagger như ví dụ dưới đây.

@Configuration
@EnableSwagger2
@Import(BeanValidatorPluginsConfiguration.class)
public class SpringFoxConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.deft.swagger"))
                .paths(PathSelectors.ant("/book/*"))
                .build()
                .apiInfo(apiInfo())
                .useDefaultResponseMessages(false)
                .globalResponseMessage(RequestMethod.GET,
                        Arrays.asList(new ResponseMessageBuilder()
                                        .code(500)
                                        .message("500 message custom")
                                        .responseModel(new ModelRef("Error"))
                                        .build(),
                                new ResponseMessageBuilder()
                                        .code(403)
                                        .message("403 message custom!")
                                        .build()));
    }

    private ApiInfo apiInfo() {
        return new ApiInfo(
                "Swagger API DEMO",
                "Some custom description of API.",
                "API TOS",
                "Terms of service",
                new Contact("Deft", "https://shareprogramming.net/", "[email protected]"),
                "License of API", "API license URL", Collections.emptyList());
    }

}

Mặc định, SpringFoxConfig bean sẽ được inject vào Spring context, do vậy  Swagger UI sẽ có mặt trên tất cả các môi trường kể cả production. Để tắt Swagger trên môi trường production chúng ta cần cấu hình chỉ cho phép SpringFoxConfig bean inject vào các môi trường được chỉ định.

Spring Profile

Trong spring, chúng ta có thể sử dụng Spring Profile để kích hoạt hoặc vô hiệu hoá bean inject vào Spring context. Sử dụng biểu thức SpEL để cho phép Swagger trên “swagger” profile, và bị vô hiệu hoá trên “prod” profile.

@Configuration 
@Profile({"!prod && swagger"})
@EnableSwagger2 
public class SpringFoxConfig {
    ...
}

Bây giờ chúng ta có thể kiểm thử bằng cách điều chỉnh thuộc tính spring.profile.active trong tệp cấu hình YML hoặc propetites tương ứng.

  -Dspring.profiles.active=prod // Swagger sẽ bị vô hiệu hoá

  -Dspring.profiles.active=prod,dev, test // Swagger sẽ bị vô hiệu hoá

  -Dspring.profiles.active=swagger // Swagger được kích hoạt

  -Dspring.profiles.active=swagger, dev, test // Swagger được kích hoạt

  -Dspring.profiles.active= // // Swagger sẽ bị vô hiệu hoá

Spring Conditionals

Nếu không muốn sử dụng Spring Profile, thì chúng ta vẫn có một cách đơn giản hơn đó là sử dụng mệnh đề điều kiện trong Spring với @ConditionalOnExpressionannotaiton.

@Configuration 
@ConditionalOnExpression(value = "${useSwagger:false}")
@EnableSwagger2 
public class SpringFoxConfig {
    ...
}

Với cấu hình trên, chúng ta có thể điều chỉnh thuộc tính useSwagge=true để kích hoạt swagger hoặc useSwagge=false để vô hiệu hoá nó. Mặc định nếu useSwagge không được đặt thì giá trị là false. 

Bật Swagger bằng cách điều chỉnh trong tệp cấu hình như sau:

-DuseSwagger=true

Tóm lược

Qua bài viết hi vọng các bạn sẽ biết cách vô hiệu hoá Swagger trên môi trường production. Đây là một công việc đơn giản nhưng lại vô cùng quan trọng giúp hệ thống của bạn bảo mật và khó bị tấn công hơn.

Nguồn tham khảo

https://www.baeldung.com/swagger-ui-turn-off-in-production

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x