【Linux】Ubuntu 漏洞掃描與修復的吃癟經歷

自從上次“劫持”事情后,項目經理將所有跟安全相關的都推給我了(不算 KPI 又要被白嫖,煩死了)。這次客戶又提了一個服務器安全掃描和漏洞修復的“活”,我這邊順手將過程記錄一下,就當經驗總結跟各位分享一下。

本次掃描的是一臺 Ubuntu Server,用的是 22.04 版本操作系統。據說客戶一直都是用 CentOS 7 ,但由于今年 6 月 30 日后 CentOS 7 不再提供安全維護了,索性新應用的機器全部換成 Ubuntu Server (額…其實我想說換 openEuler 也挺好的,也符合信創標準)。

1. Ubuntu OVAL 數據掃描

由于用的是 Ubuntu 操作系統,為此本次掃描將使用 Canonical (Ubuntu 母公司)安全小組提供的 Ubuntu OVAL 數據,如下圖:
image.png
具體就是使用 oscap 讀取 OVAL 數據(USN 和 CVE)進行掃描,為了方便我寫了一個 shell 腳本,如下圖:

# 先從官網下載最新 OVAL 數據
wget https://security-metadata.canonical.com/oval/com.ubuntu.$(lsb_release -cs).usn.oval.xml.bz2
wget https://security-metadata.canonical.com/oval/com.ubuntu.$(lsb_release -cs).cve.oval.xml.bz2# 通過 bunzip2 對壓縮包進行解壓
bunzip2 com.ubuntu.$(lsb_release -cs).usn.oval.xml.bz2
bunzip2 com.ubuntu.$(lsb_release -cs).cve.oval.xml.bz2# 使用 oscap 讀取 oval 數據并產出 html 報告
oscap oval eval --report report_usn.html com.ubuntu.$(lsb_release -cs).usn.oval.xml
oscap oval eval --report report_cve.html com.ubuntu.$(lsb_release -cs).cve.oval.xml

掃描結果如下圖所示:
image.png
上圖是 CVE 漏洞統計共有 171 個,而 USN 有 11 個,如下圖所示。
image.png

2. 修復處理

2.1 基礎修復

面對如此數量的漏洞,第一個想到的辦法肯定是直接通過升級批量修復漏洞。如下圖:

sudo apt update
sudo apt upgrade
sudo apt dist-upgrade

升級后再進行 oscap 掃描得到以下結果:
image.png
image.png
CVE 減少到 151 個,而 USN 減少到 3 個。

2.2 解除“不更新”標記

以上結果跟我預估有所出入,本以為通過更新能至少解決三分之一的漏洞,但 CVE 只修復了 20 個,有點不太正常。于是我執行了 apt list --upgradable 指令發現仍存在部分可升級內容,如下圖:

ubuntu@VM-0-6-ubuntu:~$ apt list --upgradable
Listing... Done
linux-generic/jammy-updates,jammy-security 5.15.0.113.113 amd64 [upgradable from: 5.15.0.107.107]
linux-headers-generic/jammy-updates,jammy-security 5.15.0.113.113 amd64 [upgradable from: 5.15.0.107.107]
linux-image-generic/jammy-updates,jammy-security 5.15.0.113.113 amd64 [upgradable from: 5.15.0.107.107]
python3-update-manager/jammy-updates 1:22.04.20 all [upgradable from: 1:22.04.9]
ubuntu-minimal/jammy-updates 1.481.2 amd64 [upgradable from: 1.481.1]
ubuntu-server/jammy-updates 1.481.2 amd64 [upgradable from: 1.481.1]
ubuntu-standard/jammy-updates 1.481.2 amd64 [upgradable from: 1.481.1]
update-manager-core/jammy-updates 1:22.04.20 all [upgradable from: 1:22.04.9]

嗯…估計是客戶方運維將這些組件進行了標記,導致不能自動升級。于是嘗試執行 apt-mark showhold 指令來驗證一下自己的猜想,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo apt-mark showhold
containerd.io
docker-buildx-plugin
docker-ce
docker-ce-cli
docker-ce-rootless-extras
docker-compose-plugin
docker-scan-plugin
linux-generic
linux-generic-hwe-20.04
linux-generic-hwe-20.04-edge
linux-generic-hwe-22.04
linux-generic-hwe-22.04-edge
linux-headers-generic
linux-headers-generic-hwe-20.04
linux-headers-generic-hwe-20.04-edge
linux-headers-generic-hwe-22.04
linux-headers-generic-hwe-22.04-edge
linux-image-generic
linux-image-generic-hwe-20.04
linux-image-generic-hwe-20.04-edge
linux-image-generic-hwe-22.04
linux-image-generic-hwe-22.04-edge

如上圖所示 linux-generic、linux-headers-generic 和 linux-image-generic 都被標記為“不隨系統更新”,這印證了我的想法,但為什么要這樣做呢?

先不管了,在做完快照備份后接著將 linux-generic、linux-headers-generic 和 linux-image-generic 解除標記,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo apt-mark unhold linux-generic* linux-headers-generic* linux-image-generic*
Canceled hold on linux-generic.
Canceled hold on linux-generic-hwe-20.04.
Canceled hold on linux-generic-hwe-22.04.
Canceled hold on linux-generic-hwe-20.04-edge.
Canceled hold on linux-generic-hwe-22.04-edge.
Canceled hold on linux-headers-generic.
Canceled hold on linux-headers-generic-hwe-22.04.
Canceled hold on linux-headers-generic-hwe-22.04-edge.
Canceled hold on linux-headers-generic-hwe-20.04.
Canceled hold on linux-headers-generic-hwe-20.04-edge.
Canceled hold on linux-image-generic.
Canceled hold on linux-image-generic-hwe-22.04.
Canceled hold on linux-image-generic-hwe-22.04-edge.
Canceled hold on linux-image-generic-hwe-20.04.
Canceled hold on linux-image-generic-hwe-20.04-edge.

之后執行分布更新,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:linux-headers-5.15.0-113 linux-headers-5.15.0-113-generic linux-image-5.15.0-113-generic linux-modules-5.15.0-113-genericlinux-modules-extra-5.15.0-113-generic
The following packages have been kept back:python3-update-manager ubuntu-minimal ubuntu-server ubuntu-standard update-manager-core
The following packages will be upgraded:linux-generic linux-headers-generic linux-image-generic
3 upgraded, 5 newly installed, 0 to remove and 5 not upgraded.
Need to get 113 MB of archives.
After this operation, 583 MB of additional disk space will be used.

再重新掃描一次。嗯…問題依然存在(漏洞數沒有改變,這里就不再截圖展示了)。

2.3 查“漏”補“缺”

因為漏洞數沒有改變,于是再次執行 upgrade 命令得到新的發現,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:python3-update-manager ubuntu-minimal ubuntu-server ubuntu-standard update-manager-core
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.

5 not upgrade?提示中明顯標注了 python3-update-manager、ubuntu-minimal、ubuntu-server、ubuntu-standard、update-manager-core 沒有更新。既然沒有更新那就針對這 5 個組件進行 upgrade 操作,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo apt upgrade python3-update-manager ubuntu-minimal ubuntu-server ubuntu-standard update-manager-core
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:python3-update-manager ubuntu-minimal ubuntu-server ubuntu-standard update-manager-core
5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 59.1 kB of archives.
After this operation, 6,144 B of additional disk space will be used.

再掃描一次,結果如下:
image.png
image.png
CVE 漏洞減少到 127 個,而 USN 漏洞減少到 2 個。還是有 100+ 的 CVE 漏洞沒有修復完畢,究竟是為什么呢?帶著這些疑問我執行以下語句:

sudo unattended-upgrades --dry-run

本以為還有安全補丁沒有更新,結果直接沒有返回,看來應該做的一切都已經做了。

3. 進一步排查

這 100+ 的 CVE 漏洞究竟為什么無法修復呢?難道是內核導致的?帶著這個疑問我注冊了一個 Canonical Livepatch 的賬號,想通過 livepatch 檢查一下是否跟內核有關,如下圖:
image.png
關于 Canonical Livepatch 賬號申請我就不多說了(這個不是重點)。注冊完成后會得到一個 token,這個 token 將用于服務器與 Canonical Livepatch 進行通訊的。但在此之前還需要使用 snap 安裝 canonical-livepatch ,如下圖:

ubuntu@VM-0-6-ubuntu:~/openscap$ sudo snap install canonical-livepatch
canonical-livepatch 10.8.3 from Canonical? installed
ubuntu@VM-0-6-ubuntu:~/openscap$ sudo canonical-livepatch enable <Your Token>
Successfully enabled device. Using machine-token: xxxxx

接著就可以通過 canonical-livepatch 查看一下系統的狀態,如下圖:

ubuntu@VM-0-6-ubuntu:~/openscap$ sudo canonical-livepatch status --verbose
last check: 2 minutes ago
kernel:  (unsupported)
server check-in: succeeded
kernel state: ? kernel is not covered by Livepatch
patch state: ? no livepatches available for kernel  (unsupported)
tier: updates (Free usage; This machine beta tests new patches.)
machine id: e0fd450343fa48d8acc471dc903518d1
client version: 10.8.3
architecture: amd64
cpu model: AMD EPYC 9754 128-Core Processor
boot time: 37 minutes ago

kernel unsupported?kernel is not covered by Livepatch?
呃…我應該沒做什么騷操作吧。什么也別說了,我還是先重啟一下系統吧(自我安慰一下)。
不過這次重啟我特別留意了一下內核版本,如下圖:

Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.6.16-060616-generic x86_64)* Documentation:  https://help.ubuntu.com* Management:     https://landscape.canonical.com* Support:        https://ubuntu.com/proSystem information as of Wed Jul 10 10:58:45 AM CST 2024...

GNU/Linux 6.6.16-060616-generic x86_64?我印象中 Ubuntu 最新內核應該是 5.15.x 才對(我開發電腦也是使用 22.04 的 Ubuntu Desktop)。后面找了客戶方運維了解得知這個 6.6.16 版本是他從 kernel.org 手動下載升級的。原因是他們集團發公告告知需要升級,如下圖:
image.png
如公告所示,內核升級主要是為了解決 CVE-2024-1086 漏洞,但如果直接按照公告提示升級,內核就需要升級到 6.6.15 版本以上。但事實真的是這樣嗎?

通過 Canonical 安全小組發布的公告得知 CVE-2024-1086 漏洞已經在 5.15.0 內核版本中得到修復,如下圖:
image.png
公告地址:https://ubuntu.com/security/CVE-2024-1086

如此一來就沒有必要升級到 6.6.16 版本的內核。

4. 內核降級(吃癟開始)

由于現在使用的是 6.6.16 內核,要先切換到 5.15.x 版本,如下圖:

ubuntu@VM-0-6-ubuntu:~$ dpkg --list | grep linux-image
rc  linux-image-5.15.0-101-generic             5.15.0-101.111                          amd64        Signed kernel image generic
rc  linux-image-5.15.0-105-generic             5.15.0-105.115                          amd64        Signed kernel image generic
ii  linux-image-5.15.0-107-generic             5.15.0-107.117                          amd64        Signed kernel image generic
ii  linux-image-5.15.0-113-generic             5.15.0-113.123                          amd64        Signed kernel image generic
ii  linux-image-generic                        5.15.0.113.113                          amd64        Generic Linux kernel image
pi  linux-image-unsigned-6.6.16-060616-generic 6.6.16-060616.202402051536              amd64        Linux kernel image for version 6.6.16 on 64 bit x86 SMP

如上圖所示,使用 dpkg --list | grep linux-image 指令查看可用的內核版本。再使用 update-initramfs 更新使用內核版本,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo update-initramfs -u -k 5.15.0-113-generic
update-initramfs: Generating /boot/initrd.img-5.15.0-113-generic

再之后使用 update-grub 更新引導

ubuntu@VM-0-6-ubuntu:~$ sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Sourcing file `/etc/default/grub.d/kdump-tools.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.15.0-113-generic
Found initrd image: /boot/initrd.img-5.15.0-113-generic
Found linux image: /boot/vmlinuz-5.15.0-107-generic
Found initrd image: /boot/initrd.img-5.15.0-107-generic
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done

之后就能夠使用 dpkg -r 來刪除內核

sudo dpkg -r linux-image-unsigned-6.6.16-060616-generic
sudo dpkg --purge linux-image-unsigned-6.6.16-060616-generic

重啟之后就能看到內核版本已經恢復到 5.15.x 版本,如下圖:

Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-113-generic x86_64)* Documentation:  https://help.ubuntu.com* Management:     https://landscape.canonical.com* Support:        https://ubuntu.com/proSystem information as of Wed Jul 10 11:52:19 AM CST 2024...

再執行 dpkg --list | grep linux-image 會發現原 6.6.16 內核已經刪除,如下圖:

ubuntu@VM-0-6-ubuntu:~$ dpkg --list | grep linux-image
rc  linux-image-5.15.0-101-generic         5.15.0-101.111                          amd64        Signed kernel image generic
rc  linux-image-5.15.0-105-generic         5.15.0-105.115                          amd64        Signed kernel image generic
ii  linux-image-5.15.0-107-generic         5.15.0-107.117                          amd64        Signed kernel image generic
ii  linux-image-5.15.0-113-generic         5.15.0-113.123                          amd64        Signed kernel image generic
ii  linux-image-generic                    5.15.0.113.113                          amd64        Generic Linux kernel image

5. 吃癟結果

接下來再重新執行 upgrade 和 dist-upgrade 的更新指令,在更新完成后再進行一次掃描,結果炸裂:
image.png
image.png
這…這…內核降級后漏洞激增,從原來 127 個 CVE 漏洞上升到 1010 個。通過報告中提供的鏈接得知這些漏洞 Canonical 安全小組也在積極修復中,但大部分漏洞目前還處于 pending 狀態。

雖然這樣…也不全是壞消息,如下圖:

ubuntu@VM-0-6-ubuntu:~$ sudo canonical-livepatch status --verbose
last check: 1 minute ago
kernel: 5.15.0-113.123-generic
server check-in: succeeded
kernel state: ? kernel series 5.15 is covered by Livepatch
patch state: ? no livepatches available for kernel 5.15.0-113.123-generic
tier: updates (Free usage; This machine beta tests new patches.)
machine id: e0fd450343fa48d8acc471dc903518d1
client version: 10.8.3
architecture: amd64
cpu model: AMD EPYC 9754 128-Core Processor
boot time: 1 minute ago

內核降級后 canonical-livepatch 已經能識別當前內核并提供實時保護。

至此,我也沒有辦法了,將情況反饋給項目經理。項目經理與客戶溝通后決定先暫時使用 5.15.x 內核,主要是基于以下原因:

  1. 目前 5.15.x 內核是受到 canonical-livepatch 保護的,新的安全補丁發布后可以“一鍵修復”且不用重啟,這個大大減少客戶方運維的工作量;
  2. 目前掃描出來的漏洞基本都是 low 級別漏洞,對系統使用影響不大;
  3. 最最重要的是客戶方運維不想攬活,而我又沒有時間了,等有時間再幫他們修復吧;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45611.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos7安裝配置maven

一、配置安裝環境 #安裝wget yum install -y wget #安裝jdk17 #創建jdk存放目錄 mkdir -p /usr/local/java #切換目錄 cd /usr/local/java #下載jdk17 wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_b…

【Linux】多線程_7

文章目錄 九、多線程8. POSIX信號量根據信號量環形隊列的生產者消費者模型代碼結果演示 未完待續 九、多線程 8. POSIX信號量 POSIX信號量和SystemV信號量作用相同&#xff0c;都是用于同步操作&#xff0c;達到無沖突的訪問共享資源目的。 但POSIX可以用于線程間同步。 創建…

什么ISP?什么是IAP?

做單片機開發的工程師經常會聽到兩個詞&#xff1a;ISP和IAP&#xff0c;但新手往往對這兩個概念不是很清楚&#xff0c;今天就來和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全稱是&#xff1a;In System Programming&#xff0c;即在系統編程&…

如何申請抖音本地生活服務商?3種方式優劣勢分析!

隨著多家互聯網大廠在本地生活板塊的布局力度不斷加大&#xff0c;以抖音為代表的頭部互聯網平臺的本地生活服務商成為了創業賽道中的大熱門&#xff0c;與抖音本地生活服務商怎么申請等相關的帖子&#xff0c;更是多次登頂創業者社群的話題榜單。 就目前的市場情況來看&#x…

Go語言--廣播式并發聊天服務器

實現功能 每個客戶端上線&#xff0c;服務端可以向其他客戶端廣播上線信息&#xff1b;發送的消息可以廣播給其他在線的客戶支持改名支持客戶端主動退出支持通過who查找當前在線的用戶超時退出 流程 變量 用戶結構體 保存用戶的管道&#xff0c;用戶名以及網絡地址信息 typ…

ARM功耗管理之功耗數據與功耗收益評估

安全之安全(security)博客目錄導讀 思考&#xff1a;功耗數據如何測試&#xff1f;功耗曲線&#xff1f;功耗收益評估&#xff1f; UPF的全稱是Unified Power Format&#xff0c;其作用是把功耗設計意圖&#xff08;power intent&#xff09;傳遞給EDA工具&#xff0c; 從而幫…

vscode OpenCV環境搭建

cmake 官網https://cmake.org/files/ 環境變量D:\Program Files\CMake\bin w64devkit 官網https://github.com/skeeto/w64devkit/tags 環境變量D:\Program Files\w64devkit\bin minGW32-make 拷貝并重命名為make OpenCV 在執行完后&#xff0c;把關于python的都給取消勾選…

mybatis-plus映射mysql的json類型的字段

一、對json里面內容建立實體類 Data AllArgsConstructor NoArgsConstructor public class RouteMetaEntity {private String title;private Boolean affix;private Boolean isAlwaysShow; }二、主類做映射 TableField(typeHandler JacksonTypeHandler.class)private RouteMe…

Codeforces Round 958 (Div. 2)補題

文章目錄 A題 (拆分多集)B題(獲得多數票)C題&#xff08;固定 OR 的遞增序列&#xff09; A題 (拆分多集) 本題在賽時卡的時間比較久&#xff0c;把這題想復雜了&#xff0c;導致WA了兩次。后來看明白之后就是將n每次轉換成k-1個1&#xff0c;到最后分不出來k-1個1直接一次就能…

Hive的基本操作(查詢)

1、基礎查詢 基本語法 select 字段列表|表達式|子查詢 from 表(子查詢|視圖|臨時表|普通表) where [not] 條件A and|or 條件B --先&#xff1a;面向原始行進行篩選 group by 字段A[,字段B,...] > 分組【去重處理】 having 聚合條件(非原始字段條件) --再&#x…

JMeter案例分享:通過數據驗證的錯誤,說說CSV數據文件設置中的線程共享模式

前言 用過JMeter參數化的小伙伴&#xff0c;想必對CSV Data Set Config非常熟悉。大家平時更關注變量名稱&#xff0c;是否忽略首行等參數&#xff0c;其余的一般都使用默認值。然而我最近遇到一個未按照我的預想讀取數據的案例&#xff0c;原因就出在最后一個參數“線程共享模…

深度學習中激活函數的演變與應用:一個綜述

摘要 本文全面回顧了深度學習中激活函數的發展歷程,從早期的Sigmoid和Tanh函數,到廣泛應用的ReLU系列,再到近期提出的Swish、Mish和GeLU等新型激活函數。深入分析了各類激活函數的數學表達、特點優勢、局限性以及在典型模型中的應用情況。通過系統的對比分析,本文探討了激…

樹莓派配置vsftpd主動模式

sudo apt-get install vsftpd /etc/vsftpd.conf anonymous_enableNO # 禁用匿名用戶 local_enableYES # 允許本地用戶登錄 write_enableYES # 允許修改權限 #chroot_local_userYES # 將用戶限制在其主目錄 systemctl restart vsftpd sudo adduser ftpuser sudo pa…

詳解MySQL中的遞歸查詢

MySQL中的遞歸查詢主要通過WITH RECURSIVE語句來實現&#xff0c;這在處理具有層級關系或樹形結構的數據時非常有用。下面將通過一個具體的例子來詳細解釋如何在MySQL中使用遞歸查詢。 示例場景 假設我們有一個部門表&#xff08;departments&#xff09;&#xff0c;其中包含…

昇思訓練營打卡第二十五天(RNN實現情感分類)

RNN&#xff0c;即循環神經網絡&#xff08;Recurrent Neural Network&#xff09;&#xff0c;是一種深度學習模型&#xff0c;特別適用于處理序列數據。以下是對RNN的簡要介紹&#xff1a; RNN的特點&#xff1a; 記憶性&#xff1a;與傳統的前饋神經網絡不同&#xff0c;R…

老板新招的牛人,竟然用1天搭建了一套完整的倉庫管理系統!

倉儲管理系統是什么&#xff1f; 倉儲管理系統&#xff08;WMS&#xff09;是一個全面的軟件解決方案&#xff0c;旨在幫助企業優化倉庫管理流程、管理和控制日常倉庫運營。通過數學模型和信息手段&#xff0c;對倉庫管理的各個環節進行優化和調控&#xff0c;涵蓋了從貨物入庫…

使用網關和Spring Security進行認證和授權

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

jquery發送jsonp請求

使用 jQuery 發送 JSONP 請求相對來說比較簡單&#xff0c;以下是示例代碼&#xff1a; $.ajax({url: "http://example.com/data",dataType: "jsonp",jsonp: "callback",jsonpCallback: "myCallback" }).done(function(response) {//…

Linux命令更新-sort 和 uniq 命令

簡介 sort 和 uniq 都是 Linux 系統中常用的文本處理命令。 sort 命令用于對文件內容進行排序。 uniq 命令用于去除文件中重復出現的行。 1. sort 命令 命令格式 sort [選項] [文件]選項&#xff1a; -n: 按照數字進行排序 -r: 反向排序 -c: 統計每個元素出現的次數 -…

怎么錄制視頻?電腦錄制,試試這3種方法

在數字化快速發展的時代&#xff0c;視頻已經成為我們傳遞信息、分享生活、表達情感的重要載體。每一個人都希望自己能夠掌握視頻錄制技巧&#xff0c;輕松駕馭影像的力量&#xff0c;創造出屬于自己的視覺盛宴。 那么&#xff0c;怎么錄制視頻呢&#xff1f;首先選擇一款好用…