Hiểu biết về Sonarqube - oPhamThiDao/Devops GitHub Wiki
Sonarqube là gì?
SonarQube là một nền tảng nguồn mở được phát triển bởi SonarSource để kiểm tra liên tục chất lượng mã, review tự động với việc phân tích code để phát hiện lỗi, đoạn code không tốt, hoặc lỗ hổng bảo mật trên 20 ngôn ngữ lập trình khác nhau.
Cụ thể đến hiện tại chính xác Sonarqube hỗ trợ 27 ngôn ngữ lập trình khác nhau: Java (bao gồm Android), C#, C/C++, JavaScript, TypeScript, Python, Go, Swift, COBOL, Apex, PHP, Kotlin, Ruby, Scala, HTML, CSS, ABAP, Flex, Objective-C, PL/I, PL/SQL, RPG, T-SQL, VB.NET, VB6 và XML.
Chi phí sử dụng
Sonarqube có 4 loại phiên bản với cách tính phí khác nhau: Commiunity, Developer, Enterprise, Data Center.
Riêng phiên bản Commiunity là được miễn phí - được cung cấp cho các nhà phát triển và nhóm phát triển một giải pháp thông minh và tích hợp để review code. Các nhà phát triển có thể cải thiện khả năng bảo trì, độ tin cậy và bảo mật trên 15 ngôn ngữ lập trình thông qua tích hợp trực tiếp IDE phổ biến.
Còn các phiên bản Developer, Enterprise, Data Center sẽ phải trả phí khi sử dụng nó. Các phiên bản này được định giá mỗi năm và dựa trên số lượng dòng mã được phân tích tối đa sẽ tính ra được phí phải trả - nghĩa là Sonarqube phân tích bao nhiêu dòng code (LOC) - bạn sẽ trả phí bấy nhiều và định kỳ phải trả là theo năm.
Vậy các dòng mã (Lines of code - LOC) sẽ được tính như thế nào?
LOC được tính bằng cách tổng hợp LOC của dự án được phân tích. Số LOC cho dự án là số LOC của nhánh lớn nhất của dự án.
Dưới đây bảng tính phí cho mỗi phiên bản:
Số dòng mã | Giá mỗi năm tính bằng € |
---|---|
100,000 | €120 |
250,000 | €900 |
500,000 | €1,800 |
1 Million | €3,000 |
2 Million | €6,000 |
5 Million | €17,500 |
10 Million | €36,000 |
20 Million | €50,000 |
Số dòng mã | Giá mõi năm tính bằng € |
---|---|
1 Million | €15,000 |
5 Million | €25,000 |
10 Million | €37,500 |
20 Million | €50,000 |
30 Million | €75,000 |
50 Million | €90,000 |
75 Million | €125,000 |
100 Million | €180,000 |
Số dòng mã | Giá mõi năm tính bằng € |
---|---|
20 Million | €100,000 |
50 Million | €150,000 |
75 Million | €200,000 |
100 Million | €250,000 |
250 Million | €400,000 |
500 Million | €600,000 |
1 Billion | €1,000,000 |
> 1 Billion | Upon request |
- Một tiện ích của Sonarqube, bạn có thể tạo tài khoản free trong 14 ngày để trải nghiệm những lợi ích của nó.
Sonarqube phân tích cái gì?
Tùy thuộc vào phiên bản Sonarqube có thể phân tích tới 27 ngôn ngữ khác nhau.
Issues
Kết quả sau mỗi phân tích Sonaqube sẽ trả về danh sách issue mỗi khi đoạn mã vi phạm quy tắc coding (coding rule). Tập hợp các quy tắc mã được xác định thông qua Hồ sơ chất lượng (Quality Profiles) liên quan cho từng mỗi ngôn ngữ trong dự án.
Với mỗi issues sẽ được Sonarqube đánh giá với 5 mức độ nghiêm trọng như sau, để nhà phát triển có hiểu được mức độ ảnh hưởng của issue:
-
BLOCKER
Lỗi có khả năng cao ảnh hưởng đến hành vi của ứng dụng trong quá trình sản xuất: rò rỉ bộ nhớ, kết nối JDBC không được tiết lộ, .... Mã PHẢI được sửa ngay lập tức.
-
CRITICAL
Lỗi có xác suất thấp ảnh hưởng đến hành vi của ứng dụng trong quá trình sản xuất hoặc sự cố đại diện cho lỗ hổng bảo mật: khối bắt trống, chèn SQL, ... Mã PHẢI được xem xét ngay lập tức.
-
MAJOR
Lỗ hổng chất lượng có thể ảnh hưởng lớn đến năng suất của nhà phát triển: đoạn mã không được che đậy, khối trùng lặp, thông số không sử dụng, ..
-
MINOR
Lỗ hổng chất lượng có thể ảnh hưởng một chút đến năng suất của nhà phát triển: dòng không được quá dài, câu lệnh "switch" phải có ít nhất 3 trường hợp, ...
-
INFO
Không phải lỗi hay sai sót về chất lượng, chỉ là một phát hiện
Rules
Sonarqube phân tích theo coding rules và được Sonarqube phân làm 4 loại
-
Bug
Content: Các lỗi này sẽ làm hỏng mã của bạn và cần được sửa ngay lập tức.
Impact: Điều tồi tệ nhất có thể khiến ứng dụng bị treo hoặc làm hỏng dữ liệu được lưu trữ không?
Likelihood: Xác suất mà Điều tồi tệ nhất sẽ xảy ra là bao nhiêu?
-
Vulnerability
Content: Một điểm trong mã của bạn được mở để tấn công.
Impact: Việc khai thác Điều tồi tệ nhất có thể dẫn đến thiệt hại đáng kể cho tài sản của bạn hoặc người dùng của bạn không?
Likelihood: Xác suất để một hacker có thể khai thác Điều tồi tệ nhất là bao nhiêu?
-
Code Smell
Contnet: Một vấn đề về khả năng bảo trì khiến mã của bạn khó hiểu và khó bảo trì.
-
Security Hotspot
Các điểm nóng bảo mật không được chỉ định mức độ nghiêm trọng vì không biết liệu có thực sự là lỗ hổng cơ bản hay không nên với các issue về rule này sonarqube mới chỉ đánh đấu để người pháp triển đánh giá có cần áp dụng hay không.
Có thể thấy 2 rules Security Hotspot và Vulnerability là điểm sáng trong Sonarqube. Chúng đều là phân tích về lỗi hổng bảo mật nhưng có điểm gì khác giữ 2 rule này?
Sự khác biệt chính giữa Vulnerability và Hotspot là cần phải xem xét trước khi quyết định có áp dụng bản sửa lỗi hay không.
-
Với Hotspot: Một đoạn mã nhạy cảm với bảo mật được đánh dấu, nhưng bảo mật tổng thể của ứng dụng có thể không bị ảnh hưởng. Nhà phát triển tùy thuộc vào việc xem xét mã để xác định xem có cần sửa chữa để bảo mật mã hay không.
-
Với Vulnerability: Một vấn đề ảnh hưởng đến bảo mật của ứng dụng đã được phát hiện cần được khắc phục ngay lập tức.
Ví dụ về lỗi bảo mật RSPEC-2092 trong đó khuyến nghị sử dụng cờ bảo mật cookie để ngăn cookie được gửi qua các kết nối không phải HTTPS nhưng cần xem xét lại vì:
-
HTTPS là biện pháp bảo vệ chính chống lại các cuộc tấn công MITM và vì vậy cờ an toàn chỉ là một biện pháp bảo vệ bổ sung trong trường hợp có một số lỗi bảo mật mạng.
-
Cookie có thể được thiết kế để gửi ở mọi nơi (bao gồm các trang web không phải HTTPS) vì đó là cookie theo dõi hoặc tương tự.
Vì vậy các issues về hotspots chỉ đánh dấu và đưa ra các mối đe dọa và hướng dẫn người phát triển chọn các biện pháp bảo vệ phụ hợp theo ngữ cảnh.
Đánh giá khả năng phân tích ngôn ngữ Ruby và PHP
Hiện tại tổng số các quy tắc mà sonarqube phân tích cho tổng 27 ngôn ngữ như sau:
Bug: 919
Vulnerability: 269
Code Smell: 3k
Security Hotspot: 312
Một con số khá ấn tượng để phân tích mã cho mình dự án. Nhưng những con số này dường như lại dành nhiều cho ngôn ngữ Java - 642 rules, C++ - 534 rules, C# - 421 rules. Đây là 3/27 ngôn ngữ đã chiếm hơn nửa số rules, nhưng cũng thể hiểu đây có thể là ngôn ngữ nhà của sonarqube bởi bản thân sonarqube đã xử dụng java làm ngôn ngữ chính để phải triển.
Nhưng đến với ngôn ngữ Ruby thì số rules còn lại như sau:
Bug: 8
Vulnerability: 0
Code Smell: 38
Security Hotspot: 2
Tổng cộng có 48 rules một con số khá khiêm tốn.
Về phân tích lỗ hổng bảo mật thì cũng chỉ có 2 rules - Security Hotspot với quy tắc chi tiết sau:
- Using hardcoded IP addresses is security-sensitive:
Recommended Secure Coding Practices
Don't hard-code the IP address in the source code, instead make it configurable with environment variables, configuration files, or a similar approach. Alternatively, if confidentially is not required a domain name can be used since it allows to change the destination quickly without having to rebuild the software.
Sensitive Code Example
ip = "192.168.12.42"; // Sensitive
Compliant Solution
ip = IP_ADDRESS; // Compliant
- Hard-coded credentials are security-sensitive
Because it is easy to extract strings from an application source code or binary, credentials should not be hard-coded. This is particularly true for applications that are distributed or that are open-source.
In the past, it has led to the following vulnerabilities:
* CVE-2019-13466
* CVE-2018-15389
Credentials should be stored outside of the code in a configuration file, a database, or a management service for secrets.
Tuy nhiên đối với ngôn ngữ PHP số lượng rules cũng khá ấn tượng
Bug: 40
Vulnerability: 37
Code Smell: 133
Security Hotspot: 27
Tổng số rules của PHP là 237 rules - một số khá ấn tượng so với Ruby nhưng đối Java thì con số này cũng bằng 1/3.
Mở rộng
Nếu muốn trải nghiệm khả năng phân tích, tự động review code của sonarqube bạn có thể truy cập tại https://sonarcloud.io và đăng nhập bằng tài khoản github, gitlab, bitbucket hay Azure DevOps - Bạn sẽ không phải mất chi phí gì đối các project public.
Thông tin chi tiết giá: https://sonarcloud.io/pricing