Tóm tắt

      • – Phần mềm mã nguồn mở là phần mềm mà bất kỳ ai cũng được phép kiểm tra, nghiên cứu, sửa đổi và phân phối mã nguồn.
            • + Có nhiều lưu ý chi tiết tuỳ thuộc vào giấy phép nguồn mở cụ thể của phần mềm.

        • – Phần mềm nguồn mở đã thay đổi cách phát triển phần mềm, bằng việc cung cấp các cung cụ và ứng dụng miễn phí, có thể tái sử dụng để các doanh nghiệp hay cá nhân sử dụng, nhằm tiết kiệm thời gian khi phát triển ứng dụng mới.

        • – Phần mềm nguồn mở cho phép mọi người tự do kiểm tra, sửa đổi và phân phối, nhưng không có nghĩa là lúc nào cũng miễn phí. 

        • – Phần mềm nguồn mở được phát triển bởi các cá nhân và cộng đồng. Mặc dù có nhiều gói phần mềm mã nguồn mở chất lượng cao, một số lại chứa các lỗ hổng bảo mật nghiêm trọng.
              • + Trong những năm gần đây, các gói phần mềm mở độc hại có chủ ý đang ngày càng trở nên phổ biến.

              • + Sử dụng các công cụ Software Bill of Materials (SBOMs) và Software Composition Analysis (SCA) để giám sát các thành phần là một cách hiệu quả để giảm rủi ro từ các thành phần nguồn mở.

          • – Các gói (package) được lưu trữ và phân phối trong nhiều package registries hay central repositories – thường dựa trên ngôn ngữ lập trình.
                • + Một số ví dụ phổ biến là Maven, npm và PyPi.

          Phần mềm nguồn mở là gì?

          Ý nghĩ nào xuất hiện đầu tiên trong đầu bạn khi bạn nghe đến “phần mềm mã nguồn mở”? Có phải là “mã nguồn miễn phí” hay “tiết kiệm thời gian”? Mặc dù chúng cũng là hai khía cạnh của phần mềm nguồn mở, nhưng vẫn còn nhiều hơn thế nữa. Khái niệm về phần mềm nguồn mở (Open-source Software – OSS) xuất hiện vào cuối những năm 1990, bắt nguồn từ Open Source Initiative – một nhóm các nhà phát triển phần mềm đam mê “chia sẻ và cộng tác cải tiến mã nguồn phần mềm”. Cụ thể hơn, họ hy vọng sẽ thúc đẩy giáo dục, hỗ trợ và quản lý trong cộng đồng phát triển phần mềm. 

          Về bản chất, phần mềm nguồn mở là mã nguồn được tạo ra để cộng đồng có thể sử dụng và sửa đổi công khai, với ý tưởng chính là những sửa đổi như vậy sẽ giúp cải thiện mã nguồn theo một cách nào đó và truyền cảm hứng hợp tác giữa các nhà phát triển. Mức độ mà một người nào đó có thể sử dụng, sửa đổi và phân phối mã được nêu trong giấy phép sử dụng đi kèm. Các quy định trong giấy phép sử dụng phần mềm nguồn mở có thể rất chung chung hoặc rất cụ thể. Người dùng phải tuân thủ các điều khoản của giấy phép, nếu không có thể sẽ phải chịu trách nhiệm pháp lý. Bạn có thể đọc thêm về cấp phép phần mềm nguồn mở trong hướng dẫnkhoá học của Sonatype.

          Làm thế nào để áp dụng phần mềm nguồn mở vào công việc của tôi?

          Trong ngành phát triển phần mềm hiện đại, đổi mới nhanh chóng và hiệu quả chính là ưu tiên hàng đầu. Mục tiêu của điều đó rất đơn giản: Phát triển mã có thể tái sử dụng trong khoảng thời gian ngắn nhất có thể để giảm thiểu sự lặp lại. Để làm được điều này, các nhà phát triển phụ thuộc nhiều vào các gói và thư viện phần mềm nguồn mở của bên thứ ba. Các gói và thư viện này lại phụ thuộc vào các bản cập nhật và cải tiến thường xuyên (được gọi là dependencies) để đạt được chức năng tối đa.

          Trình quản lý gói (package managers) – đúng như tên gọi – tự động hoá quy trình tìm nạp (fetching) và tải xuống, cài đặt và định cấu hình các phần phụ thuộc khi cần thiết, theo các chỉ dẫn từ tập tin manifest của dự án, đồng thời giản quyết các xung đột thành phần phụ thuộc. Chúng theo dõi các phần phụ thuộc của phần mềm và thông tin phiên bản để gói được cập nhật đầy đủ, không thiếu bất kỳ thành phần cần thiết nào. Quá trình này diễn ra liên tục khi các phiên bản mới của các thành phần sử dụng trong các dự án được phát hành. Khi tất cả diễn ra theo kế hoạch, mọi thứ sẽ hoạt động một cách liền mạch, giúp các nhà phát triển đạt được mục tiêu tổng thể về tốc độ và hiệu suất.

          Vậy phần mềm nào không phải là phần mềm nguồn mở?

          Một trong những quan niệm sai lầm lớn nhất về phần mềm nguồn mở đó là nó miễn phí, hay “không mất phí”. Mặc dù hầu hết các phần mềm nguồn mở về bản chất là miễn phí, thì khái niệm “miễn phí” trong ngữ cảnh nguồn mở có nghĩa chính xác là “truy cập miễn phí” và “tự do sửa đổi”. Khi phần mềm được các nhà phát triển tạo ra với mục đích tính phí người dùng, thì phần mềm đó được gọi là phần mềm độc quyền (ví dụ như Adobe Photoshop, Microsoft Windows, …). 

          Có thể tìm phần mềm nguồn mở ở đâu?

          Phần mềm nguồn mở có ở khắp mọi nơi. Hơn 90% ứng dụng hiện đại chứa các thành phần mã nguồn mở của bên thứ ba. Các ngôn ngữ và hệ sinh thái phát triển phần mềm phổ biến nhất hiện nay – Java, JavaScript, Python và .Net – đều có kho lưu trữ nguồn mở riêng:

          Java – Maven Central Repository

          JavaScript – npm Repository

          Python – Python Package Index (PyPi)

          Net – NuGet Gallery

          Các kho lưu trữ cụ thể này sử dụng các trình quản lý gói khác nhau, và là những kho lưu trữ được sử dụng phổ biến nhất để duy trì các thành phần nguồn mở trong ứng dụng.

          Gọi những hệ sinh thái này là “phổ biến” không phải là nói quá. Theo Báo cáo Tình trạng Chuỗi cung ứng Phần mềm năm 2021 của Sonatype, cả bốn hệ sinh thái kể trên đều đã phát hành hơn 6 triệu phiên bản mới cho các thành phần nguồn mở và giới thiệu gần 725.000 dự án hoàn toàn mới vào năm 2021, ghi nhận mức gia tăng 20% so với nguồn cung cấp nguồn mở toàn cầu năm trước đó. Tuy nhiên, sự phổ biến này cũng kéo theo một vấn đề. Sự phổ biến của phần mềm nguồn mở đã thu hút cả những kẻ xấu với ý đồ xấu.

          “Kẻ xấu” là ai?

          “Kẻ xấu” đề cập đến bất kỳ ai có ý định phá hoại phần mềm nguồn mở, bao gồm tin tặc, kẻ phá hoại và những người đóng góp ác ý. Mặc dù tác động của phần mềm nguồn mở rất tích cực trong bối cảnh phát triển ngày nay, chúng cũng trở thành mục tiêu ngoài ý muốn cho các hoạt động bất chính. Tính công khai của phần mềm nguồn mở đã khiến nó trở thành một cuộc cách mạng, nhưng cũng trở thành một “lời nguyền”. Những kiểu tấn công này làm xói mòn niềm tin đã xây dựng cộng đồng nguồn mở.

          Có rất nhiều ví dụ về hành động của những kẻ xấu:

              • – Tham gia các dự án công cộng với các đóng góp hữu ích trước khi cố tình làm hỏng mã.

              • – Mạo danh cách dự án nổi tiếng bằng cách chiếm quyền điều khiển URL (typosquatting hay còn gọi là URL hijacking) trên các namespace tương tự. 

              • – Gây nhầm lẫn về phần phụ thuộc bằng cách xuất bản các thành phần hại cùng tên với các thành phần nội bộ của tổ chức.

              • – Chiếm các namespaces sau khi dự án bị xoá.

              • – Cố ý phá vỡ hoặc loại bỏ các thành phần phổ biến đóng vai trò quan trọng trong cơ sở hạ tầng của tổ chức.

            Những kẻ tấn công mạng sẽ săn lùng các kho phần mềm nguồn mở phổ biến của bên thứ ba để khai thác các lỗ hổng trong chuỗi cung ứng phần mềm. Tác động của những cuộc tấn công này đối với chuỗi cung ứng toàn cầu là rất lớn. Chi tiết một số cuộc tấn công quy mô lớn được nêu rõ trong báo cáo của Trung tân Phản gián và An ninh Quốc gia Hoa Kỳ (NCSC) để xem chi tiết một số cuộc tấn công quy mô lớn.

            Phương pháp của những kẻ tấn công ngày cành trở nên tinh vi và nhanh chóng hơn theo thời gian. Ngày nay, những kẻ tấn công đã có thể ẩn nấp bên ngoài các kho lưu trữ mã nguồn mở, tìm kiếm và tấn công các lỗ hổng công khai còn tồn đọng. Tuy nhiên, với các cuộc tấn công thế hệ tiếp theo, những kẻ xấu không chỉ đơn giản là chờ đợi lỗ hổng xuất hiện. Chúng đang bắt đầu tích cực cài đặt các lỗ hổng trong chuỗi cung ứng toàn cầu và khai thác những lỗ hổng đó trước khi bị phát hiện. Chiến thuật chủ động này dễ dàng và hiệu quả hơn nhiều đối với những kẻ tấn công vì mang đến cho chúng nhiều quyền kiểm soát hơn.

            Vậy làm thế nào để làm chủ phần mềm nguồn mở?

            Các tổ chức sử dụng các thành phần nguồn mở phải thật thận trọng và xem xét kỹ lưỡng không chỉ những người đóng góp cho các dự án mà còn cả ý định của họ. Mặt khác, điều này đặt ra một thách thức to lớn trong việc theo dõi tất cả các bên liên quan, đặc biệt là khi có quá nhiều thành phần phụ thuộc lẫn nhau. Dưới đây là một số điều cần lưu ý để giữ an toàn cho mã nguồn của bạn:

                • Hiểu biết về các thành phần của ứng dụng, từ trong ra ngoài. Trong khi bạn xây dựng ứng dụng của mình, hãy tạo một Software Bill of Materials (SBOM) – kho lưu trữ chính thức các thành phần và phần phụ thuộc của phần mềm, thông tin về các thành phần đó và mối liên hệ của chúng. Hãy chỉ định các phiên bản cho SBOM giống như phiên bản của phần mềm.

                • – Kết hợp các công cụ giám sát và tự động hoá thông minh vào kho lưu trữ mã nguồn của bạn để duy trì sự cảnh giác, đồng thời phân tích một cách liên tục theo một quy chuẩn trong tất cả các giai đoạn của vòng đời phát triển.

                • – Chỉ định các phiên bản của phần phụ thuộc một cách thủ công. Đừng tự động kích hoạt các phiên bản mới nhất của một thành phần trong mã nguồn của bạn. Thay vào đó, hãy chỉ định thủ công các phiên bản đã được thử nghiệm và đáng tin cậy, đồng thời giữ các thông tin phiên bản này trong một tập tin khoá (locks file).

                • – Kiểm tra và đánh giá các phiên bản mới, bao gồm cả các phần phụ thuộc bắc cầu, trước khi triển khai chúng vào môi trường production.

                • – Xây dựng một kế hoạch phát triển an toàn để các nhóm DevOps của bạn tuân theo, nhằm giúp mọi người biết cách giảm thiểu mọi lỗ hổng được phát hiện. Cách tốt nhất là áp dụng các thoả thuận cấp độ dịch vụ (Service-level Agreements – SLAs) để chỉ định cụ thể tốc độ xử lý rủi ro.

              Kết luận

              Phần mềm nguồn mở đã thay đổi bối cảnh phát triển phần mềm. Nó hỗ trợ các nhóm DevOps cộng tác và làm việc hiệu quả hơn, đồng thời giảm tình trạng dư thừa mã nguồn. Mặc dù phần mềm nguồn mở mang đến nhiều lợi ích sâu và rộng, những rủi ro bảo mật liên quan vẫn có thể tác động đến ngay cả những nhóm phát triển thông thái nhất. Nhóm của bạn nên chủ động thực hiện các hành động ngăn chặn các tác nhân xấu và bảo vệ mã nguồn của mình, chẳng hạn như trang bị cho ứng dụng các công cụ giám sát tự động hay xây dựng một kế hoạch phát triển được tiêu chuẩn hoá.

              Theo Sonatype

              Menu