deb822


Giới thiệu

Bắt đầu từ Ubuntu 24.04, cách khai báo kho phần mềm (repository) đã được chuyển sang định dạng deb822 thay vì định dạng khai báo trên 1 dòng trong /etc/apt/sources.list như ở các phiên bản cũ. Nội dung của file /etc/apt/sources.list trên Ubuntu 24.04 giờ sẽ là:

# Ubuntu sources have moved to /etc/apt/sources.list.d/ubuntu.sources

Kho phần mềm Ubuntu archive sẽ được định nghĩa như sau:

Types: deb
URIs: http://jp.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Deb822 được lựa chọn vì định dạng này hỗ trợ khai báo Signed-By. Khai báo này cho phép chỉ định keyring gồm các khóa dùng để xác thực kho phần mềm giúp tăng cường tính bảo mật khi dùng apt cài đặt phần mềm. Bài viết này giải thích chi tiết hơn lý do Ubuntu developers lựa chọn định dạng này cũng như vấn đề mà định dạng này giúp giải quyết.

Tính chính thống của kho phần mềm

Người dùng Ubuntu chắc hẳn không lạ gì với việc dùng câu lệnh apt-get install ${PKG_NAME} để cài đặt phần mềm. apt sẽ tìm gói phần mềm với tên ${PKG_NAME} trong danh sách các kho phần mềm khai báo trong file /etc/apt/sources.list và sẽ tải và cài đặt binary của phần mềm này nếu tìm thấy. Vì phần mềm được phân phối dưới dạng binary, một câu hỏi hiển nhiên đặt ra là: “Làm thế nào ta có thể chắc chắn binary tải về không bao gồm mã độc?”. Câu trả lời là: “Niềm tin!”. Các kho phần mềm được cung cấp bởi các công ty có uy tín hoạt động lâu năm trong cộng đồng nguồn mở như Canonical, Redhat, Suse,… Cài đặt phần mềm từ các kho phần mềm chính thống cung cấp bởi các công ty này đồng nghĩa với việc người dùng tin tưởng những công ty này sẽ đảm bảo các gói phần mêm họ cung cấp là an toàn.

Về mặt kỹ thuật, tính chính thống của kho phần mềm được kiểm chứng sử dụng khóa công khai GPG. Quá trình apt kiểm chứng tính chính thống của phần mềm tải từ kho diễn ra như sau (giả định kho phần mềm là archive.ubuntu.com, phiên bản noble 24.04):

  1. apt truy cập URL của kho Ubuntu Archive khai báo trong sources.list và tải file InRelease.
  2. File InRelease được ký bởi nhà cung cấp, ở trường hợp này là Canonical. Khóa công khai của nhà cung cấp này sẽ được dùng để kiểm chứng tính chính thống của File.
  3. Sau khi apt xác nhận là file InRelease thực sự là file được cung cấp bởi Canonical, apt sẽ tải danh sách các phần mềm trong kho.
  4. File InRelease bao gồm giá trị Hash của file Packages.gz: 61fdc2e5778117b129beb558acaf18f6 1808488 main/binary-amd64/Packages.gz. apt sẽ tính hash của file Packages.gz tải về. Nếu giá trị hash khớp với giá trị ghi trong file InRelease ta có thể khẳng định file Packages.gz thực sự cung cấp bởi Canonical.
  5. Nội dung của file Packages.gz sẽ bao gồm danh sách các gói phần mềm trong kho và giá trị hash của từng file này. apt sẽ tìm phần mềm với tên tương ứng tải về và so sánh giá trị hash giống của gói phần mềm với giá trị hash ghi trong Packages.gz. Quá trình này tương tự như bước 4.

Các bước trên hình thành một chuỗi niềm tin. Giá trị hash trong file danh sách giúp xác thực binary tải về. GPG giúp xác định rằng chỉ người ký file InRelease (người có khóa bí mật) là người phát hành phần mềm. Do vậy, nếu ta tin tưởng người có khóa bí mật là Canonical, ta có thể hoàn toàn tin rằng phần mềm tải từ kho phần mềm là an toàn.

Trong Ubuntu 24.04, khóa công khai dùng để kiểm chứng kho phần mềm Ubuntu Archive được lưu tại /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg. Người phát hành tên là [email protected] và có thể kiểm chứng bằng câu lệnh dưới đây.

# gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg --list-keys
/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
------------------------------------------------------
pub   rsa4096 2018-09-17 [SC]
      F6ECB3762474EDA9D21B7022871920D1991BC93C
uid           [ unknown] Ubuntu Archive Automatic Signing Key (2018) <[email protected]>

Đâu là vấn đề của định dạng cũ

apt với định dạng cũ, khóa công khai dùng để kiểm chứng kho phần mềm không được lưu trữ riêng biệt theo từng kho mà được lưu trữ tập trung. Một khi khóa công khai được cài vào máy người dùng cuối, tất cả các kho phần mềm ký bởi khóa bí mật cùng cặp sẽ được tin tưởng. Vì không có sự phân biệt giữa khóa và kho, một khóa có thể bị dùng để kiểm chứng phần mềm từ kho phần mềm người dùng không có ý tin tưởng.

Lấy ví dụ Debian/Ubuntu có cơ chế Personal Package Archives for Ubuntu cho phép người dùng phân phối phần mềm thông qua kho cá nhân. Giả định mình là người cung cấp một kho phần mềm riêng và ký dùng khoá của mình. Người dùng tin tưởng mình và cài đặt phần mềm từ kho của mình. Mình vô tình để lộ khóa bí mật và hacker dùng khóa này để ký phần mềm độc hại do hacker phát hành. Người dùng nào tin tưởng mình trước đây sẽ tự động tin tưởng kho phần mềm của hacker và có thể vô tình cài phần mềm độc hại.

Giải pháp dùng định dạng deb822

Định dạng deb822 cho phép khai báo khóa công khai dùng để kiếm chứng kho phần mềm với từng kho. Bằng khai báo Signed-By, người dùng có thể tin tưởng rằng khóa đang dùng chỉ được dùng để chứng thực kho phần mềm trong khai báo, tránh việc một khóa có thể bị dùng để chứng thực nhiều kho phần mềm.

Với việc Ubuntu sử dụng deb822, các quy trình cài đặt sử dụng apt-key sẽ dần dần bị lỗi thời, giúp việc xóa apt-key trở nên thực tế hơn (Một ví dụ của việc quy trình cũ lỗi thời: How To Install and Use Docker on Ubuntu 20.04)

Tham khảo

  1. Chi tiết về GPG có thể tham khảo ở bài viết “Ghi chú về GPG”.