<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          警惕 Spring Boot Actuator 引發(fā)的安全問題

          共 8176字,需瀏覽 17分鐘

           ·

          2021-07-04 11:06

          前言

          一年一度的 HW 行動開始了,最近也是被各種安全漏洞搞的特別鬧心,一周能收到幾十封安全團(tuán)隊(duì)掃描出來的漏洞郵件,這其中有一類漏洞很容易被人忽視,但影響面卻極廣,危害也極大,我說出它的名字你應(yīng)該也不會感到陌生,正是 Spring Boot Actuator 。

          寫這篇文章前,我跟我的朋友做了一個小調(diào)查,問他們對 Spring Boot Actuator 的了解,結(jié)果驚人的一致,大家都知道 Spring Boot 提供了 spring-boot-starter-actuator 的自動配置,但卻很少有人真正用到它相關(guān)的特性。在繼續(xù)往下面看這篇文章時(shí),大家也可以先思考下幾個問題:

          1. 檢查下你開發(fā)的項(xiàng)目中有引入 spring-boot-starter-actuator 依賴嗎?
          2. 你在項(xiàng)目中有真正用到 spring-boot-starter-actuator 的有關(guān)功能嗎?
          3. 你知道 spring-boot-starter-actuator 的安全風(fēng)險(xiǎn)和正確配置方式嗎?

          Spring Boot Actuator 是什么?

          好久沒翻過 spring 的文檔了,為了解釋這個還算陌生的名詞 Actutor [??ktju?e?t?r],我特地去翻了下它的文檔,找到了官方的定義

          Definition of Actuator

          An actuator is a manufacturing term that refers to a mechanical device for moving or controlling something. Actuators can generate a large amount of motion from a small change.

          好家伙,看了等于白看,以我 CET-6 的水平,理解這段話著實(shí)有點(diǎn)難度,希望能有英語比較好的同學(xué)幫我翻譯下。只能按照我個人對 Spring Boot Actuator 功能的理解來意譯下了:我們可以借助于 Spring Boot Actuator 來對 Spring Boot 應(yīng)用的健康狀態(tài)、環(huán)境配置、Metrics、Trace、Spring 上下文等信息進(jìn)行查看,除了一系列查看功能之外,它還實(shí)現(xiàn)了 Spring Boot 應(yīng)用的上下線和內(nèi)存 dump 功能。

          Quick Start

          第一步 引入依賴

          tips:spring-boot-starter-actuator 在不同版本 Spring Boot 中有一定的配置差異,本文采用的是目前最新的 2.4.4 版本

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-actuator</artifactId>
              <version>2.4.4</version>
          </dependency>

          第二步 了解 endpoint

          endpoint 是我們使用 Spring Boot Actuator 最需要關(guān)心的對象,列舉一些你可能感興趣的 endpoint

          IDDescription
          beans查看 Spring 容器中的所有對象
          configprops查看被 @ConfigurationProperties 修飾的對象列表
          env查看 application.yaml 配置的環(huán)境配置信息
          health健康檢查端點(diǎn)
          info應(yīng)用信息
          metrics統(tǒng)計(jì)信息
          mappings服務(wù)契約 @RequestMapping 相關(guān)的端點(diǎn)
          shutdown優(yōu)雅下線

          例如 health,只需要訪問如下 endpoint 即可獲取應(yīng)用的狀態(tài)

          curl "localhost:8080/actuator/health"

          第三步 了解 endpoint 的 enable 和 exposure 狀態(tài)

          Spring Boot Actuator 針對于所有 endpoint 都提供了兩種狀態(tài)的配置

          • enabled 啟用狀態(tài)。默認(rèn)情況下除了 shutdown 之外,其他 endpoint 都是啟用狀態(tài)。這也很好理解,其他 endpoint 基本都是查看行為,shutdown 卻會影響應(yīng)用的運(yùn)行狀態(tài)。
          • exposure 暴露狀態(tài)。endpoint 的 enabled 設(shè)置為 true 后,還需要暴露一次,才能夠被訪問,默認(rèn)情況下只有 health 和 info 是暴露的。

          enabled 不啟用時(shí),相關(guān)的 endpoint 的代碼完全不會被 Spring 上下文加載,所以 enabled 為 false 時(shí),exposure 配置了也無濟(jì)于事。

          幾個典型的配置示例如下

          啟用并暴露所有 endpoint

          management:
            endpoints:
              web:
                exposure:
                  include: "*"
            endpoint:
              shutdown:
                enabled: true

          只啟用并暴露指定 endpoint

          management:
            endpoints:
              enabled-by-default: false
            endpoint:
              info:
                enabled: true
            endpoints:
              web:
                exposure:
                  include: "info"

          禁用所有 endpoint

          management:
            endpoints:
              enabled-by-default: false

          或者,去除掉 spring-boot-starter-actuator 依賴!

          了解 Spring Boot Actuator 的安全風(fēng)險(xiǎn)

          從上文的介紹可知,有一些 Spring Boot Actuator 提供的 endpoint 是會將應(yīng)用重要的信息暴露出去的,以 env 為例來感受下一個典型的 application.yaml 的示例。

          server:
            port: 8080
          spring:
            datasource:
             url: jdbc:mysql://testDbHost:3306/kirito
              username: kirito
              password: 123456
          kirito:
            ak: kirito@xxx_ak
            sk: kirito@xxx_sk
          management:
            endpoints:
              web:
                exposure:
                  include: "*"

          上面的配置再經(jīng)典不過,我們看看訪問 localhost:8080/actuator/env 之后的返回值

          {
            "activeProfiles": [],
            "propertySources": [
              {
                "name""server.ports",
                "properties": {
                  "local.server.port": {
                    "value": 8080
                  }
                }
              },
              {
                "name""Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/'",
                "properties": {
                  "server.port": {
                    "value": 8080,
                    "origin""class path resource [application.yaml] - 2:9"
                  },
                  "spring.datasource.url": {
                    "value""jdbc:mysql://testDbHost:3306/kirito",
                    "origin""class path resource [application.yaml] - 5:44"
                  },
                  "spring.datasource.username": {
                    "value""kirito",
                    "origin""class path resource [application.yaml] - 6:15"
                  },
                  "spring.datasource.password": {
                    "value""******",
                    "origin""class path resource [application.yaml] - 7:15"
                  },
                  "kirito.ak": {
                    "value""kirito@xxx_ak",
                    "origin""class path resource [application.yaml] - 10:7"
                  },
                  "kirito.sk": {
                    "value""kirito@xxx_sk",
                    "origin""class path resource [application.yaml] - 11:7"
                  },
                  "management.endpoints.web.exposure.include": {
                    "value""*",
                    "origin""class path resource [application.yaml] - 17:18"
                  }
                }
              }
            ]
          }

          可以發(fā)現(xiàn),對于內(nèi)置的敏感配置信息 spring.datasource.password,Spring Boot Actuator 是進(jìn)行了脫敏的,但是對于自定義的一些敏感配置,如 kirito.ak 和 kirito.sk 卻被暴露出來了。

          可能有的讀者會立馬提出質(zhì)疑:我們的機(jī)器都部署內(nèi)網(wǎng),并且一般都是通過反向代理對外暴露的服務(wù),這類 endpoint 是不會被外部用戶訪問到的。那我只能說太天真了,例如以下情況都是導(dǎo)致安全漏洞的真實(shí) case:

          • 反向代理誤配置了根節(jié)點(diǎn),將 actuator 的 endpoint 和 web 服務(wù)一起暴露了出去
          • 線上配置沒問題,測試環(huán)境部署時(shí)開通了公網(wǎng) SLB,導(dǎo)致 actuator 的 endpoint 暴露了出去
          • 同一環(huán)境中某臺機(jī)器被攻陷,導(dǎo)致應(yīng)用配置信息泄露

          安全建議

          針對 Spring Boot Actuator 提供的 endpoint,采取以下幾種措施,可以盡可能降低被安全攻擊的風(fēng)險(xiǎn)

          1. 最小粒度暴露 endpoint。只開啟并暴露真正用到的 endpoint,而不是配置:management.endpoints.web.exposure.include=*。
          2. 為 endpoint 配置獨(dú)立的訪問端口,從而和 web 服務(wù)的端口分離開,避免暴露 web 服務(wù)時(shí),誤將 actuator 的 endpoint 也暴露出去。例:management.port=8099。
          3. 引入 spring-boot-starter-security 依賴,為 actuator 的 endpoint 配置訪問控制。
          4. 慎重評估是否需要引入 spring-boot-stater-actuator。以我個人的經(jīng)驗(yàn),我至今還沒有遇到什么需求是一定需要引入spring-boot-stater-actuator 才能解決,如果你并不了解上文所述的安全風(fēng)險(xiǎn),我建議你先去除掉該依賴。

          今天,你使用 Spring Boot Actuator 了嗎?

          往期推薦

          來活兒了!趕緊檢查下代碼里有沒有臟話...

          Windows 11,一個新功能,一場新屠殺!

          圖解 Spring 循環(huán)依賴,寫得太好了!

          為取消大小周而歡呼?字節(jié)員工可不那么想...

          重磅!可以發(fā)朋友圈和搜一搜的PC端微信來了,趕緊來下載!



          喜歡本文歡迎轉(zhuǎn)發(fā),關(guān)注我訂閱更多精彩

          關(guān)注我回復(fù)「加群」,加入Spring技術(shù)交流群

          瀏覽 44
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91欧美日韩 | 大鸡吧综合网 | 91综合在线 | 噜噜无码高清 | 午夜久久久久 |