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):
apt
truy cập URL của kho Ubuntu Archive khai báo trongsources.list
và tải fileInRelease
.- 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. - Sau khi
apt
xác nhận là fileInRelease
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. - File
InRelease
bao gồm giá trị Hash của filePackages.gz
:61fdc2e5778117b129beb558acaf18f6 1808488 main/binary-amd64/Packages.gz
.apt
sẽ tính hash của filePackages.gz
tải về. Nếu giá trị hash khớp với giá trị ghi trong fileInRelease
ta có thể khẳng định filePackages.gz
thực sự cung cấp bởi Canonical. - 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 trongPackages.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
- Chi tiết về GPG có thể tham khảo ở bài viết “Ghi chú về GPG”.