Tiếng chuông lúc 2 giờ sáng và lỗ hổng 500GB dữ liệu
2 giờ sáng, điện thoại mình rung liên hồi vì thông báo từ OpsGenie. Đội Security Audit vừa quét thấy 500GB dữ liệu backup trên S3 đang ở dạng “trần trụi” (raw), không một lớp mã hóa. Chỉ cần một IAM user bị lộ, toàn bộ thông tin khách hàng từ năm 2020 đến nay sẽ lên sàn ngay lập tức. Trong cơn ngái ngủ, GnuPG (GPG) là công cụ đầu tiên mình nghĩ đến để vá lỗ hổng này. Đây là tiêu chuẩn mã hóa mã nguồn mở đã bảo vệ thế giới Linux từ năm 1999 đến nay.
Nếu bạn đang cầm trong tay những file .env nhạy cảm, mã nguồn bí mật hay đơn giản là muốn gửi file qua Slack mà không lo bị soi mói, đừng bỏ qua GPG. Nội dung dưới đây là những gì mình rút ra được sau nhiều lần trực tiếp xử lý sự cố trên hệ thống production.
Thực hành nhanh: Mã hóa file trong 5 phút
Lý thuyết để sau, hãy bắt tay vào làm cho nó chạy trước đã. Đây là quy trình 3 bước mình thường dùng để xử lý nhanh một file nhạy cảm trước khi gửi đi.
1. Tạo cặp khóa (Key Pair)
Gõ lệnh sau vào terminal để bắt đầu:
gpg --full-generate-key
Hãy chọn loại RSA and RSA. Với độ dài khóa, mình luôn ưu tiên 4096 bits thay vì 2048 bits để đảm bảo an toàn trước các cuộc tấn công brute-force hiện đại.
Mẹo nhỏ: Passphrase là chốt chặn cuối cùng. Bạn nên ghé toolcraft.app để tạo một chuỗi 32 ký tự ngẫu nhiên. Đừng dùng ngày sinh hay tên thú cưng nếu không muốn công sức mã hóa đổ sông đổ biển.
2. Mã hóa file thần tốc
Giả sử mình cần bảo mật file config_prod.yaml bằng chính public key vừa tạo:
gpg --encrypt --recipient "[email protected]" config_prod.yaml
Hệ thống sẽ tạo ra file config_prod.yaml.gpg. Lúc này, bạn có thể tự tin xóa file gốc hoặc đẩy nó lên bất kỳ cloud storage nào mà không sợ bị đọc trộm.
3. Giải mã khi cần dùng
Khi cần lấy lại nội dung gốc, chỉ cần chạy:
gpg --decrypt config_prod.yaml.gpg > config_prod.yaml
Mã hóa bất đối xứng: Hiểu đơn giản để dùng đúng
Nhiều người hay hỏi mình: “Dùng zip -e cho nhanh, sao phải phức tạp hóa với GPG?”. Câu trả lời nằm ở cách quản lý mật khẩu. Với mã hóa đối xứng (zip, openssl), bạn và người nhận phải dùng chung một mật khẩu. Việc gửi mật khẩu đó qua chat hay email chính là điểm yếu chết người.
GPG giải quyết bài toán này bằng cơ chế Public Key Cryptography:
- Public Key (Khóa công khai): Giống như một cái hòm thư có khe bỏ vào nhưng không có lối lấy ra. Bạn có thể treo nó công khai trên GitHub hoặc gửi cho bất kỳ ai.
- Private Key (Khóa bí mật): Là chiếc chìa khóa duy nhất để mở hòm thư đó. Nó phải nằm an toàn trong máy tính của bạn.
Trong công việc hàng ngày, mình thường gửi Public Key cho đối tác. Họ dùng nó mã hóa dữ liệu rồi gửi lại. Dù hacker có chặn đường lấy được file, chúng cũng chỉ thấy một đống ký tự rác nếu không có Private Key của mình.
Quản lý khóa: Những lệnh SysAdmin cần thuộc lòng
Sử dụng GPG mà không biết quản lý khóa thì sớm muộn bạn cũng sẽ gặp rắc rối khi đổi máy tính hoặc scale hệ thống.
Kiểm tra danh sách khóa hiện có
Để biết trong hệ thống đang có những ai, hãy dùng:
gpg --list-keys # Liệt kê khóa công khai
gpg --list-secret-keys # Liệt kê khóa bí mật của bạn
Backup khóa (Export)
Mất Private Key đồng nghĩa với việc mất vĩnh viễn quyền truy cập vào dữ liệu đã mã hóa. Đừng để kịch bản này xảy ra. Hãy xuất khóa ra và cất vào USB hoặc Vault bảo mật:
# Xuất Public Key để chia sẻ
gpg --armor --export "[email protected]" > my_pub.asc
# Xuất Private Key để backup (Cẩn thận tuyệt đối!)
gpg --armor --export-secret-keys "[email protected]" > my_priv.asc
Flag --armor sẽ chuyển định dạng nhị phân sang text ASCII, giúp bạn dễ dàng lưu trữ hoặc sao chép.
Triển khai vào Production: Tự động hóa và Kinh nghiệm xương máu
Làm việc với GPG trên server đòi hỏi sự tinh tế hơn vì bạn không thể ngồi đó nhập mật khẩu thủ công mỗi khi script chạy.
1. Chế độ không tương tác (–batch)
Trong các cronjob tự động backup, hãy sử dụng flag --batch để GPG không dừng lại đợi lệnh từ người dùng:
echo "passphrase_cua_ban" | gpg --batch --yes --passphrase-fd 0 --decrypt backup.gpg
2. Chứng chỉ thu hồi (Revocation Certificate)
Ngay sau khi tạo key, hãy tạo luôn file thu hồi. Nếu chẳng may máy tính bị mất trộm, bạn dùng file này để thông báo rằng khóa cũ không còn an toàn nữa:
gpg --gen-revoke "[email protected]" > revoke.asc
3. Tin tưởng khóa (Trust Level)
GPG rất khắt khe. Khi bạn import khóa của đồng nghiệp, nó sẽ báo lỗi “khóa không đáng tin”. Hãy dùng lệnh gpg --edit-key, gõ trust và chọn mức 4 hoặc 5 để xác nhận bạn tin tưởng người này.
Lời kết
GPG không hề khó như lời đồn. Cái khó nhất là xây dựng thói quen mã hóa mọi thứ trước khi đưa lên mây. Sau sự cố 2 giờ sáng năm đó, mình đã tích hợp GPG vào mọi pipeline CI/CD để tự động bảo vệ log và database. An tâm hơn rất nhiều!
Nếu bạn đang xây dựng lớp giáp bảo mật cho server, hãy cân nhắc kết hợp GPG với mã hóa ổ đĩa LUKS. Bảo mật là một hành trình nhiều lớp, và GPG chính là lớp khiên vững chắc nhất cho dữ liệu của bạn.

