> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cloudthinker.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Chạy kiểm thử bảo mật

> Thiết lập mục tiêu kiểm thử, xác minh tên miền, thêm người dùng thử nghiệm và phạm vi, rồi chạy ngay hoặc theo lịch và theo dõi kết quả.

Lượt kiểm thử là một lượt quét DAST trên một ứng dụng đang chạy của bạn: CloudThinker kiểm thử ứng dụng trong giới hạn bạn đặt ra và ghi lại bằng chứng request và response cho mọi vấn đề được xác nhận. Trang này trình bày mọi tùy chọn thiết lập; để chạy lần đầu với thiết lập tối thiểu, hãy dùng [Bắt đầu nhanh với Cyber](https://docs.cloudthinker.io/vi/guide/security/cyber-quickstart.md).

## Điều kiện tiên quyết

* Một ứng dụng bạn được phép kiểm thử, truy cập được qua URL tên miền. Dùng môi trường staging cho mọi cường độ cao hơn **Safe**.
* Quyền truy cập bản ghi DNS của tên miền, và quyền admin workspace để xác minh tên miền.
* Credit cho lượt chạy. Lượt chạy nào cũng tốn credit, và Deep dive tốn nhiều nhất. Xem [Mức sử dụng](https://docs.cloudthinker.io/vi/guide/billing/usage.md).
* Tùy chọn: tài khoản thử nghiệm riêng, OpenAPI spec hoặc Postman collection, và [kết nối Git](https://docs.cloudthinker.io/vi/guide/connections/github.md) để kiểm thử white-box.

## Đăng ký ứng dụng

**1. Đặt mục tiêu**

Mở **Cyber** và nhấn **New app** trong mục **Apps** (hoặc **Register an App** nếu workspace chưa có ứng dụng nào). Ở bước **Target**, nhập **App name** và **Application URL**, rồi chọn **Web application** hoặc **API** trong **What to test**. Nhấn **Continue**.

Lựa chọn này quyết định các nhóm OWASP mà báo cáo độ bao phủ sẽ đo. Bạn không thể kết hợp hai loại hay đổi về sau; hãy tạo ứng dụng thứ hai để kiểm thử cùng host dưới dạng API.

![App name, Application URL và lựa chọn độ bao phủ Web hoặc API.](https://mintcdn.com/cloudthinker/YUtBQCA-74Ac7wGh/images/security/cyber/02-test-target.png?fit=max\&auto=format\&n=YUtBQCA-74Ac7wGh\&q=85\&s=5cb73b9c91f3172933e05ad5f8716148)

**2. Xác minh tên miền**

Trong **Target ownership**, nhấn **Create DNS proof**. Thêm **DNS record name** và **TXT value** được hiển thị dưới dạng bản ghi TXT tại nhà cung cấp DNS, rồi nhấn **Check again**. Nếu nhà cung cấp tự thêm tên zone, hãy bỏ phần hậu tố đó.

**Trạng thái thành công:** **Target ownership** hiển thị **Verified**. Nếu host thuộc một tên miền bạn đã xác minh, thẻ hiển thị **Proof reused from** kèm tên miền đó và bạn không cần thêm bản ghi mới.

**3. Thêm quyền truy cập**

Ở bước **Access**, thêm người dùng thử nghiệm, kho mã và tài liệu API. Cả ba đều là tùy chọn. Xem các phần bên dưới để biết chi tiết từng mục.

![Người dùng thử nghiệm, mã nguồn và tài liệu API tùy chọn.](https://mintcdn.com/cloudthinker/YUtBQCA-74Ac7wGh/images/security/cyber/03-test-access.png?fit=max\&auto=format\&n=YUtBQCA-74Ac7wGh\&q=85\&s=e88123ad92a4a6c58421bf09b1845858)

**4. Kiểm tra và bắt đầu**

Ở bước **Start**, kiểm tra **Test summary** và **Coverage status**. Nhấn **Show limited checks** để xem những gì dữ liệu hiện tại chưa kiểm thử được. Chọn **Testing intensity**, rồi nhấn **Start test**, hoặc **Run later** để lưu ứng dụng mà không chạy.

Quá trình thiết lập không có bước phạm vi, nên **Start test** bao phủ toàn bộ mục tiêu. Với lượt chạy đầu tiên, hãy chọn **Safe**, nhấn **Run later**, rồi đặt đường dẫn bao gồm và loại trừ trong [Scope](#thiết-lập-phạm-vi-và-ngữ-cảnh) ở **Settings** của ứng dụng trước khi chạy. [Bắt đầu nhanh với Cyber](https://docs.cloudthinker.io/vi/guide/security/cyber-quickstart.md) hướng dẫn chi tiết bước này.

**Trạng thái thành công:** **Start test** mở bàn làm việc của lượt chạy. **Run later** mở ứng dụng đã lưu, chưa có lượt chạy nào.

Bạn có thể quản lý các tên miền đã xác minh cho cả workspace tại **Cyber → Settings**. Xác minh tên miền cho phép kiểm thử trên tên miền đó, nhưng không mở rộng phạm vi của bất kỳ ứng dụng nào.

## Thêm người dùng thử nghiệm

Người dùng thử nghiệm giúp Cyber vào được các trang cần đăng nhập và kiểm tra phân quyền: người dùng A có xem được dữ liệu của người dùng B không? Nút này có tên **Add test user** khi thiết lập, **Add authentication** trong **Settings** của ứng dụng ở mục **Test identities**, và **Add auth** trong hộp thoại **Run test**. Cả ba đều mở cùng một biểu mẫu: mô tả người dùng (**Identity label**, **Identity description**, **Persona or role**, **Tenant**), rồi chọn **Authentication method**.

| Phương thức | Bạn nhập gì | Cách kiểm tra |
| - | - | - |
| **Password** | **Username or email**, **Password**, **Login URL (optional)** | Lưu mà không đăng nhập thử. Lượt chạy đăng nhập khi bắt đầu, và nếu đăng nhập thất bại, lượt chạy kết thúc với trạng thái **Failed**. Xem [Xử lý đăng nhập có CAPTCHA](https://docs.cloudthinker.io/vi/guide/security/captcha.md#cấu-hình-đăng-nhập) |
| **Session token** | Một yêu cầu `GET` đã đăng nhập, sao chép dưới dạng cURL từ bảng Network của trình duyệt | **Verify and attach** gửi yêu cầu một lần và chỉ lưu nếu thành công. CloudThinker kiểm tra lại thêm hai lần: khi bạn mở **Run test**, và khi lượt chạy bắt đầu |
| **Long-lived token** | Mỗi dòng là một tên và giá trị header, ví dụ tên `Authorization`, giá trị `Bearer <token>`. Nếu để trống tên ở dòng đầu, tên mặc định là `Authorization`. | Lưu mà không kiểm tra. Lượt chạy sẽ báo nếu quyền truy cập bị từ chối. |
| **Agent creates new account** | **Instructions** để tạo người dùng qua trang đăng ký hoặc admin API | Mỗi lượt chạy thủ công tạo người dùng mới và báo cáo việc đăng ký, đăng nhập có thành công không. Bước đăng ký tạo tài khoản thật trong ứng dụng của bạn, nên hãy chọn **Aggressive** trở lên cho phương thức này |

Với **Agent creates new account**, hãy viết hướng dẫn nêu rõ các vai trò cần tạo, dùng `<generated_username>` và `<generated_password>` làm thông tin đăng nhập, và mô tả dấu hiệu chứng tỏ đăng nhập thành công:

```text theme={null}
Sign up at /register with <generated_username> and <generated_password>.
Create one "member" and one "admin" user.
Login succeeded when the page shows "Welcome back" and the URL is /dashboard.
```

Hướng dẫn được lưu ở dạng mã hóa và không bao giờ hiển thị lại. Để thay đổi, mở tài khoản trong **Settings** của ứng dụng ở mục **Test identities** và nhập hướng dẫn mới; hướng dẫn mới sẽ thay thế bản đã lưu. Phương thức này không hỗ trợ đăng ký cần mã qua email hoặc SMS.

Lượt chạy theo lịch chỉ đăng nhập bằng người dùng **Long-lived token**, vì chỉ loại này dùng lại an toàn khi không có người giám sát: phiên đăng nhập sẽ hết hạn, còn đăng nhập bằng mật khẩu và tài khoản do agent tạo không được dùng cho lịch chạy. Lịch chạy không bao giờ tự tắt. Nếu token đã bị xóa khi đến giờ chạy, lượt đó kết thúc với trạng thái **Failed** và bạn nhận được thông báo; lượt kế tiếp sẽ đăng nhập lại ngay khi có token hoạt động được lưu. Nếu không có long-lived token, lịch chạy sẽ không đăng nhập bằng người dùng thử nghiệm, nên không kiểm thử hay kiểm tra lại được gì phía sau trang đăng nhập. Hãy chạy các kiểm tra đó thủ công, hoặc thêm một người dùng long-lived token.

> [!TIP]
>
> Hãy thêm hai người dùng thuộc vai trò hoặc tenant khác nhau. Với hai người dùng, Cyber có thể kiểm tra liệu người này có đọc hay sửa được dữ liệu của người kia không.

Yêu cầu cURL đã sao chép chứa một phiên đăng nhập đang hoạt động. Hãy coi nó như mật khẩu và chỉ dán vào biểu mẫu này. Nếu trang đăng nhập dùng CAPTCHA, hãy thiết lập trước: xem [Xử lý đăng nhập có CAPTCHA](https://docs.cloudthinker.io/vi/guide/security/captcha.md).

![Biểu mẫu người dùng thử nghiệm với thông tin chi tiết và đăng nhập bằng mật khẩu.](https://mintcdn.com/cloudthinker/_u5eRuTpYujlERGZ/images/security/cyber/13-test-user-credentials.png?fit=max\&auto=format\&n=_u5eRuTpYujlERGZ\&q=85\&s=43b85f6db43decd66878b1f2fd2b72e6)

## Thiết lập phạm vi và ngữ cảnh

Mở ứng dụng và nhấn **Settings**. Mục tiêu và framework chỉ đọc ở đây. Mọi mục khác đều sửa được.

| Mục | Nội dung cần đặt |
| - | - |
| **Scope** | Nhấn **Manage scope** để đặt **Include paths**, **Exclude paths** và **Page asset origins**, rồi nhấn **Save scope**. Khi chưa có quy tắc nào, phần tóm tắt hiển thị **Full target**. |
| **Context files** | OpenAPI spec, Postman collection, runbook, ghi chú kiến trúc hoặc tài liệu khác. Các tệp này giúp Cyber tìm những endpoint không phát hiện được bằng cách crawl. |
| **Repositories** | Một kho mã và nhánh đã kết nối. Mục này biến lượt chạy thành white-box. |
| **Test identities** | Các phương thức giống như khi thiết lập |
| **Schedule** | Các lượt chạy định kỳ mà bạn có thể sửa, tạm dừng hoặc xóa |
| **Default intensity** | Cường độ được chọn sẵn cho các lượt chạy sau |

Quy tắc đường dẫn là glob, được so khớp với toàn bộ đường dẫn:

| Mẫu | Khớp | Không khớp |
| - | - | - |
| `/api/*` | `/api/users` (một phân đoạn) | `/api/users/42` |
| `/api/**` | `/api/users`, `/api/users/42` (mọi độ sâu) | Chính `/api` |
| `/admin/**` trong **Exclude paths** | Mọi thứ bên dưới `/admin/` | `/administrator` |

* **Loại trừ luôn được ưu tiên.** Đường dẫn khớp cả hai danh sách sẽ nằm ngoài phạm vi.
* **Không có quy tắc bao gồm nghĩa là toàn bộ mục tiêu.** Mọi đường dẫn trên host của ứng dụng đều nằm trong phạm vi cho đến khi bạn thêm một quy tắc.
* **Host khác nằm ngoài phạm vi.** **Page asset origins** nhận các origin HTTPS chính xác, như `https://cdn.example.com`, và chỉ cho phép trang tải script, style, hình ảnh và font từ đó. Điều hướng và các yêu cầu chủ động vẫn chỉ nhắm vào mục tiêu của bạn.
* Mỗi danh sách chứa tối đa 100 quy tắc, mỗi quy tắc tối đa 100 ký tự.

![Đường dẫn bao gồm và loại trừ của một API minh họa.](https://mintcdn.com/cloudthinker/YUtBQCA-74Ac7wGh/images/security/cyber/06-test-scope.png?fit=max\&auto=format\&n=YUtBQCA-74Ac7wGh\&q=85\&s=68ebbe69da0796713606b70ac94636f2)

## Chọn mức truy cập và cường độ

Mức truy cập được xác định từ những gì bạn cung cấp, không phải từ một cài đặt:

| Mức truy cập | Bạn đã cung cấp |
| - | - |
| **Black-box** | Chỉ URL |
| **Gray-box** | URL cùng người dùng thử nghiệm |
| **White-box** | URL cùng kho mã, có hoặc không có người dùng thử nghiệm |

Cường độ quyết định lượt chạy được phép làm gì. Đây là bảng tham chiếu cho mọi trang Cyber:

| Cường độ | Hành vi | Nên chạy trên |
| - | - | - |
| **Safe** | Khám phá route và phản hồi chỉ bằng yêu cầu đọc (`GET`, `HEAD`, `OPTIONS`). Thao tác ghi và xóa bị tắt. | Lượt chạy đầu tiên trên ứng dụng mới, và mọi môi trường không được phép thay đổi dữ liệu |
| **Aggressive** (giao diện đánh dấu là **Recommended**) | Thêm `POST`, `PUT` và `PATCH` để kiểm thử biểu mẫu và luồng nghiệp vụ. Có thể tạo và sửa dữ liệu thử nghiệm. `DELETE` vẫn tắt. | Staging, sau khi một lượt Safe đã xác nhận phạm vi và đăng nhập |
| **Full** | Thêm `DELETE` và kiểm thử các thao tác có tác động lớn, gồm sửa và xóa dữ liệu trong phạm vi. Yêu cầu bạn xác nhận trước. | Chỉ staging với dữ liệu dùng một lần |
| **Deep dive** | Toàn bộ những gì Full thực hiện, qua nhiều lượt nối tiếp để lần theo các lỗ hổng nhiều bước liên kết với nhau. Tốn nhiều thời gian và credit nhất. Yêu cầu bạn xác nhận trước. | Chỉ staging với dữ liệu dùng một lần. Xem [Kiểm thử Deep dive](https://docs.cloudthinker.io/vi/guide/security/deep-dive-testing.md) |

Safe tránh chủ ý thay đổi dữ liệu, nhưng yêu cầu đọc vẫn có thể làm thay đổi dữ liệu nếu ứng dụng của bạn đổi trạng thái khi nhận `GET`. Dù vậy, hãy đặt đường dẫn bao gồm trước lượt chạy đầu tiên. Bước đăng nhập của người dùng thử nghiệm **Password** tách biệt với giới hạn cường độ, nên có thể gửi biểu mẫu đăng nhập ở mọi cường độ, kể cả Safe.

> [!WARNING]
>
> **Full** và **Deep dive** gửi các yêu cầu phá hủy, gồm `DELETE`, tới mục tiêu. Trước khi chạy, một hộp thoại yêu cầu bạn xác nhận. Hãy dùng môi trường dùng một lần và tài khoản thử nghiệm; dữ liệu trong phạm vi đã lưu có thể bị thay đổi hoặc xóa vĩnh viễn.

## Chạy ngay hoặc theo lịch

**1. Mở hộp thoại chạy**

Trên trang ứng dụng, nhấn **Run test**. Hộp thoại hiển thị thông tin thiết lập của ứng dụng và mọi trở ngại, như **Domain verification required**.

**2. Chọn cường độ và phạm vi quét**

Chọn cường độ. Với ứng dụng white-box, hãy đặt thêm **Scan scope**: **Changes only** kiểm thử các commit trên nhánh đã lưu của từng kho mã đính kèm, tính từ commit mà lượt chạy thành công gần nhất ghi lại. **Whole codebase** kiểm thử mọi thứ. Lượt chạy đầu tiên phải dùng **Whole codebase**, và nhánh không có commit mới sẽ được quét toàn bộ.

**3. Chạy hoặc lên lịch**

Nhấn **Run Safe test** (nhãn thay đổi theo cường độ) để chạy ngay. Để chạy lặp lại, hãy nhấn **Schedule…** và chọn **Daily**, **Weekly**, **Monthly**, **No Repeat** (một lần) hoặc **Custom** (biểu thức cron). Thời gian tính theo múi giờ cục bộ của trình duyệt. Bạn cũng có thể đặt ngày hết hạn. Nhấn **Schedule** để lưu. Với **Full** hoặc **Deep dive**, một hộp thoại yêu cầu bạn xác nhận lịch chạy. Lịch chạy chỉ đăng nhập bằng người dùng thử nghiệm **Long-lived token** (xem [Thêm người dùng thử nghiệm](#thêm-người-dùng-thử-nghiệm)).

**Trạng thái thành công:** lượt chạy mở bàn làm việc với trạng thái **Running**. Lịch chạy xuất hiện trong **Settings** của ứng dụng với trạng thái **Enabled**.

![Hộp thoại Run test với cường độ và các nút điều khiển lượt chạy.](https://mintcdn.com/cloudthinker/YUtBQCA-74Ac7wGh/images/security/cyber/07-run-test.png?fit=max\&auto=format\&n=YUtBQCA-74Ac7wGh\&q=85\&s=3f946c93f57d3b261ed2aa51ed1877cf)

Để thay đổi lịch chạy, dùng **Edit schedule** trong **Settings** của ứng dụng. Tạm dừng vẫn giữ nguyên cấu hình. Mỗi ứng dụng chỉ chạy một lượt kiểm thử tại một thời điểm.

> [!WARNING]
>
> Lượt chạy **Full** hoặc **Deep dive** theo lịch gửi yêu cầu phá hủy mỗi lần kích hoạt, mà không ai xác nhận cho lượt đó. Chỉ lên lịch các lượt này trên staging với dữ liệu dùng một lần và phạm vi chặt chẽ.

## Theo dõi lượt chạy

Bàn làm việc hiển thị lịch sử lượt chạy, các phát hiện ngay khi được lưu, và App surface mà Cyber phát hiện. Mỗi lượt chạy có hai tab: **Timeline** cho hoạt động trực tiếp, và **Report** cho báo cáo hoàn chỉnh, liệt kê những gì lượt chạy không kiểm thử được, như các khu vực phía sau một lần đăng nhập thất bại. Lượt chạy kết thúc với trạng thái **Success**, **Failed** hoặc **Stopped**.

Không có thông báo khi lượt chạy kết thúc, nên hãy xem tab **Runs**. Nếu **Session token** không qua được bước kiểm tra khi lượt chạy bắt đầu, lượt chạy kết thúc với trạng thái **Failed** mà chưa kiểm thử gì, và bạn nhận được thông báo **Test run blocked**. Đăng nhập **Password** thất bại cũng khiến lượt chạy kết thúc với **Failed**, nhưng không có thông báo. **Long-lived token** không được kiểm tra trước, nên token bị ứng dụng từ chối không làm dừng lượt chạy: lượt chạy vẫn tiếp tục và báo cáo liệt kê những gì không kiểm thử được. Hãy cập nhật thông tin đăng nhập trong **Settings** của ứng dụng ở mục **Test identities** và bắt đầu lượt chạy mới.

**Stop run** hủy lượt chạy và không thể tiếp tục lại. Các phát hiện đã lưu vẫn được giữ. Lượt chạy thất bại hoặc bị dừng là một lần kiểm thử chưa hoàn chỉnh, nên đừng coi kết quả của nó là bằng chứng ứng dụng an toàn.

![Lịch sử lượt chạy, timeline, phát hiện và App surface đã phát hiện.](https://mintcdn.com/cloudthinker/_u5eRuTpYujlERGZ/images/security/cyber/08-run-workbench.png?fit=max\&auto=format\&n=_u5eRuTpYujlERGZ\&q=85\&s=f6006424c4888f08190fe3e16f2e3de2)

## Khắc phục sự cố

Để xem mọi sự cố của Cyber ở một chỗ, xem [Khắc phục sự cố Cyber](https://docs.cloudthinker.io/vi/guide/security/cyber-troubleshooting.md).

> **Run test bị chặn với Domain verification required**
>
> Tên miền chưa được xác minh, hoặc bước kiểm tra TXT thất bại. So sánh bản ghi DNS của bạn với **DNS record name** và **TXT value** trong **Target ownership**, sửa phần hậu tố zone bị lặp nếu có, rồi nhấn **Check again**. Nếu bạn không phải admin workspace, hãy nhờ một admin xác minh.

> **Lượt chạy bị chặn hoặc thất bại ở bước đăng nhập**
>
> Một thông tin đăng nhập đã lưu không hoạt động. Session token được kiểm tra lại hai lần: khi bạn mở **Run test**, lúc này hộp thoại hiển thị **A saved login no longer works** và không cho khởi chạy; và khi lượt chạy bắt đầu, lúc này lỗi sẽ khiến lượt chạy kết thúc với **Failed**. Mật khẩu không bao giờ được kiểm tra trước: lần thử đầu tiên diễn ra khi lượt chạy bắt đầu, và đăng nhập thất bại khiến lượt chạy kết thúc với **Failed**. Hãy cập nhật mật khẩu, làm mới phiên cURL hoặc thay token trong **Settings** của ứng dụng ở mục **Test identities**, rồi chạy lại.

> **Độ bao phủ hiển thị các kiểm tra bị giới hạn**
>
> Một kiểm tra cần dữ liệu bạn chưa cung cấp: vai trò thứ hai, tenant, kho mã hoặc tài liệu API. Hãy bổ sung và chạy lại. Kiểm tra bị giới hạn không phải kiểm tra đã đạt.

> **Changes only bị khóa**
>
> Chế độ này so sánh với lượt chạy thành công gần nhất. Hãy hoàn tất một lượt chạy **Whole codebase** trước.

## Bước tiếp theo

> **[Khắc phục sự cố Cyber](https://docs.cloudthinker.io/vi/guide/security/cyber-troubleshooting.md)**
>
> Mọi sự cố của Cyber ở một chỗ, kèm nguyên nhân, cách kiểm tra và cách sửa

> **[Phân loại phát hiện](https://docs.cloudthinker.io/vi/guide/security/cyber-findings.md)**
>
> Đọc bằng chứng, sửa lỗi và kiểm thử lại

> **[Báo cáo Cyber](https://docs.cloudthinker.io/vi/guide/security/cyber-reports.md)**
>
> Xuất các phát hiện đã chọn hoặc bản đánh giá của một lượt chạy

> **[Chạy Code Audit](https://docs.cloudthinker.io/vi/guide/security/code-audit.md)**
>
> Kiểm tra mã nguồn của ứng dụng bạn vừa kiểm thử


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.