Mục tiêu Chương 24
Sau khi học xong, bạn sẽ nắm vững các kỹ thuật bảo mật Linux nâng cao
Mã hóa đối xứng và bất đối xứng
AES, RSA, quy trình mã hóa/giải mã, ứng dụng thực tế trong bảo vệ dữ liệu
GPG - GNU Privacy Guard
Tạo cặp khóa, mã hóa/giải mã/ký tệp, mạng lưới tin cậy, quản lý khóa GPG
Mã hóa ổ đĩa LUKS
Sử dụng cryptsetup, mã hóa toàn bộ phân vùng, quản lý các khối LUKS trên Linux
Khung PAM
pam_pwquality, pam_faillock, pam_limits, pam_time — các chính sách xác thực nâng cao
Xác minh tính toàn vẹn tệp
sha256sum, md5sum, rpm -V — kiểm tra tính toàn vẹn của hệ thống tệp tin
Chữ ký số
gpg --sign, --verify, quản lý khóa tin cậy, xác minh nguồn gốc tài liệu
Lý Thuyết Cơ Bản
C1 Khái Niệm Mã Hóa (Cryptography Concepts)
Mã Hóa Đối Xứng (Symmetric)
- Sử dụng một khóa duy nhất để mã hóa và giải mã
- Tốc độ nhanh, phù hợp cho dữ liệu lớn
- Giải thuật phổ biến: AES-256, 3DES, ChaCha20
- Vấn đề: làm thế nào chia sẻ khóa an toàn?
Mã Hóa Bất Đối Xứng (Asymmetric)
- Sử dụng cặp khóa: khóa công khai (public key) + khóa bí mật (private key)
- Khóa công khai để mã hóa — khóa bí mật dùng giải mã
- Giải thuật phổ biến: RSA-4096, ECC, DSA
- Ứng dụng: GPG, SSL/TLS, SSH key
Hàm Băm (Hash Functions)
SHA-256
Chuẩn hiện tại, đầu ra 256-bit. Dùng xác minh tính toàn vẹn tệp, chữ ký số.
SHA-512
Đầu ra 512-bit, bảo mật cao hơn. Dùng trong các ứng dụng bảo mật cao.
MD5
Đã bị phá vỡ, chỉ dùng kiểm tra lỗi đơn giản. KHÔNG dùng cho mục đích bảo mật.
Chữ Ký Số (Digital Signatures)
Ký: Khóa bí mật dùng để ký tài liệu — chỉ bạn mới có thể tạo chữ ký này.
Xác minh: Khóa công khai dùng để kiểm tra chữ ký — bất kỳ ai cũng có thể thực hiện xác minh.
Đảm bảo tính xác thực (authenticity) và tính không thể phủ nhận (non-repudiation).
C2 GPG (GNU Privacy Guard)
GPG là công cụ mã hóa tiêu chuẩn để bảo vệ email, tệp tin và xác minh chữ ký số trên hệ điều hành Linux.
# Tạo cặp khóa GPG mới
$ gpg --gen-key
# Xem danh sách các khóa công khai
$ gpg --list-keys
# Xem danh sách các khóa bí mật
$ gpg --list-secret-keys
# Xuất khóa công khai (định dạng ASCII armor)
$ gpg --export --armor [email protected] > pubkey.asc
# Nhập khóa công khai từ một tệp
$ gpg --import pubkey.asc
# Mã hóa tệp tin cho người nhận cụ thể
$ gpg --encrypt --recipient [email protected] file.txt
# Kết quả tạo ra tệp file.txt.gpg
# Giải mã tệp tin
$ gpg --decrypt file.txt.gpg
# Ký tệp tin (tạo tệp .gpg chứa cả nội dung và chữ ký)
$ gpg --sign file.txt
# Ký dạng văn bản thuần (clear-sign — vẫn có thể đọc nội dung bằng mắt thường)
$ gpg --clearsign document.txt
# Kết quả tạo ra tệp document.txt.asc
# Xác minh chữ ký của tệp
$ gpg --verify file.txt.gpg
gpg: Good signature from "User Name <[email protected]>"
C3 Xác Minh Tính Toàn Vẹn Tệp (File Integrity)
Kiểm tra xem tệp tin có bị thay đổi trái phép hay không — cực kỳ quan trọng cho bảo mật hệ thống.
# Tính toán mã băm SHA-256 của tệp
$ sha256sum /usr/bin/passwd
a3b4c5d6e7f8... /usr/bin/passwd
# Kiểm tra mã băm từ một tệp danh sách có sẵn
$ sha256sum -c checksums.sha256
/usr/bin/passwd: OK
/usr/bin/su: FAILED (THẤT BẠI)
# RPM: Kiểm tra tất cả các gói — tìm các tệp đã bị thay đổi
$ rpm -Va | grep "^..5"
S.5....T. c /etc/passwd
# "5" = mã băm MD5 đã thay đổi, S = kích thước đã thay đổi
# Kiểm tra một tệp cụ thể thuộc gói RPM
$ rpm -Vf /usr/bin/passwd
Giải Thích Các Ký Tự Trong rpm -V
S — Kích thước tệp (File size) thay đổi
M — Quyền truy cập (Mode/permissions) thay đổi
5 — Mã băm MD5 (checksum) thay đổi
D — Thiết bị (Device major/minor) thay đổi
L — Liên kết mềm (Symlink) thay đổi
U — Người sở hữu (User owner) thay đổi
G — Nhóm sở hữu (Group owner) thay đổi
T — Thời gian sửa đổi (Modification time) thay đổi
LUKS, PAM và authselect
C4 Mã Hóa Ổ Đĩa LUKS
Linux Unified Key Setup (LUKS) là chuẩn mã hóa ổ đĩa trên Linux. cryptsetup là công cụ chính để quản lý LUKS.
Quy Trình Làm Việc Với LUKS
- luksFormat — Tạo khối LUKS (thao tác này sẽ xóa hết dữ liệu cũ)
- luksOpen — Mở khóa và ánh xạ thiết bị vào /dev/mapper/
- mkfs — Định dạng hệ thống tệp trên thiết bị đã được mở khóa
- mount — Gắn (Mount) thiết bị vào một thư mục
- luksClose — Đóng và khóa lại thiết bị sau khi sử dụng xong
# Bước 1: Tạo khối LUKS (cảnh báo: sẽ xóa dữ liệu trên /dev/sdb1)
$ cryptsetup luksFormat /dev/sdb1
WARNING: Device /dev/sdb1 already contains a ext4 superblock signature.
Are you sure? (Nhập "YES" bằng chữ in hoa): YES
Nhập mật khẩu cho /dev/sdb1: ********
# Bước 2: Mở khóa thiết bị LUKS
$ cryptsetup luksOpen /dev/sdb1 myencrypted
Nhập mật khẩu cho /dev/sdb1: ********
# Bước 3: Định dạng hệ thống tệp
$ mkfs.xfs /dev/mapper/myencrypted
# Bước 4: Gắn vào thư mục để sử dung
$ mount /dev/mapper/myencrypted /mnt/secure
# Bước 5: Đóng và khóa sau khi dùng xong
$ cryptsetup luksClose myencrypted
# Xem thông tin tiêu đề LUKS
$ cryptsetup luksDump /dev/sdb1
LUKS header information
Version: 2
Metadata area: 16384 [bytes]
C5 PAM (Pluggable Authentication Modules)
PAM cung cấp kiến trúc xác thực linh hoạt. Cấu hình nằm trong thư mục /etc/pam.d/.
Ngăn xếp PAM — 4 Loại
Xác thực danh tính người dùng (mật khẩu, vân tay...)
Kiểm tra điều kiện tài khoản (hết hạn, bị khóa...)
Thay đổi mật khẩu, kiểm tra độ phức tạp
Thiết lập/hủy phiên làm việc (mount thư mục cá nhân, môi trường...)
Cờ Điều Khiển (Control Flags)
Phải thành công, nhưng vẫn chạy tiếp; nếu thất bại => toàn bộ ngăn xếp thất bại
Bắt buộc phải thành công; thất bại => dừng ngay lập tức
Nếu thành công và không có lỗi 'required' trước đó => coi như đạt yêu cầu
Kết quả không ảnh hưởng trực tiếp đến trạng thái toàn bộ ngăn xếp
Các Module PAM Quan Trọng
pam_unix
Xác thực mật khẩu Unix tiêu chuẩn qua /etc/shadow
pam_pwquality
Kiểm tra độ phức tạp của mật khẩu khi người dùng đổi mật khẩu
pam_faillock
Khóa tài khoản tự động sau nhiều lần đăng nhập sai liên tiếp
pam_limits
Giới hạn tài nguyên hệ thống (tệp, tiến trình, bộ nhớ)
pam_time
Giới hạn thời gian đăng nhập dựa trên khung giờ/ngày
pam_tally2
Đếm số lần đăng nhập thất bại (cũ, đã được thay thế bởi faillock)
C6 Ví dụ Cấu Hình PAM
# Chính sách độ phức tạp mật khẩu
minlen = 12
# Chiều dài tối thiểu là 12 ký tự
dcredit = -1
# Bắt buộc ít nhất 1 chữ số (digit)
ucredit = -1
# Bắt buộc ít nhất 1 chữ hoa (uppercase)
lcredit = -1
# Bắt buộc ít nhất 1 chữ thường (lowercase)
ocredit = -1
# Bắt buộc ít nhất 1 ký tự đặc biệt (other)
maxrepeat = 3
# Không được lặp quá 3 ký tự giống nhau liên tiếp
# Chính sách khóa tài khoản khi đăng nhập sai nhiều lần
deny = 5
# Khóa tài khoản sau 5 lần đăng nhập sai
unlock_time = 300
# Tự động mở khóa sau 300 giây (5 phút)
fail_interval = 900
# Đếm số lần thất bại tích lũy trong 900 giây (15 phút)
# Định dạng: [đối tượng] [loại] [hạng mục] [giá trị]
@developers hard nproc 50
# Nhóm developers: tối đa 50 tiến trình (giới hạn cứng)
@users soft nofile 1024
# Nhóm users: cảnh báo khi vượt 1024 tệp đang mở (mềm)
@users hard nofile 4096
# Nhóm users: tuyệt đối không quá 4096 tệp (cứng)
* hard maxlogins 4
# Tất cả người dùng: tối đa 4 phiên đăng nhập đồng thời
C7 authselect
authselect là công cụ trên RHEL/CentOS 8+ thay thế cho authconfig cũ, dùng để cấu hình xác thực hệ thống một cách thống nhất và an toàn.
# Xem danh sách các hồ sơ (profile) có sẵn
$ authselect list
- minimal Chỉ người dùng cục bộ cho cài đặt tối giản
- sssd Kích hoạt SSSD để xác thực hệ thống
- winbind Kích hoạt Winbind để xác thực hệ thống
# Chọn hồ sơ sssd kèm theo faillock
$ authselect select sssd with-faillock
Profile "sssd" was selected (Hồ sơ sssd đã được chọn).
# Xem hồ sơ hiện tại đang được sử dụng
$ authselect current
Profile ID: sssd
Enabled features: with-faillock
# Áp dụng các thay đổi cấu hình
$ authselect apply-changes
Phòng Thí Nghiệm Thực Hành
Mã hóa tệp tin và cấu hình chính sách mật khẩu nâng cao
Tạo Cặp Khóa GPG
Tạo cặp khóa GPG (khóa công khai + khóa bí mật) để sử dụng mã hóa và chữ ký số.
$ gpg --gen-key
Tên thật (Real name): Linux Admin
Địa chỉ Email: [email protected]
Thay đổi (N)tên, (E)mail, hoặc (O)Đồng ý/(Q)Thoát? O
pub ed25519 2025-01-01 [SC] [hết hạn: 2027-01-01]
AABBCCDDEEFF00112233445566778899AABBCCDD
uid [ultimate] Linux Admin <[email protected]>
Xuất và Nhập Khóa Công Khai
Chia sẻ khóa công khai với người khác để họ có thể mã hóa tệp gửi cho bạn.
$ gpg --export --armor [email protected] > mypubkey.asc
$ cat mypubkey.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----
$ gpg --import colleague_pubkey.asc
gpg: key XXXXX: public key "Đồng nghiệp <[email protected]>" imported
gpg: Tổng số đã xử lý: 1
Mã Hóa Tệp Với GPG
Mã hóa tệp bằng khóa công khai của người nhận. Chỉ người sở hữu khóa bí mật tương ứng mới giải mã được.
$ echo "Dữ liệu bí mật" > secret.txt
$ gpg --encrypt --recipient [email protected] secret.txt
# Tạo ra tệp secret.txt.gpg
$ ls -la secret.txt*
-rw-r--r-- 1 user user 16 Jan 01 10:00 secret.txt
-rw-r--r-- 1 user user 512 Jan 01 10:00 secret.txt.gpg
Giải Mã Tệp
Sử dụng khóa bí mật (private key) của bạn để giải mã tệp đã nhận.
$ gpg --decrypt secret.txt.gpg
gpg: encrypted with ed25519 key, ID XXXXXXXX
Dữ liệu bí mật
# Giải mã và lưu kết quả ra tệp mới
$ gpg --decrypt --output secret_decoded.txt secret.txt.gpg
gpg: Good signature from "Linux Admin <[email protected]>"
Ký Số Một Tài Liệu
Sử dụng gpg --clearsign để ký một tài liệu văn bản mà vẫn giữ nguyên nội dung đọc được.
$ echo "Tài liệu chính thức" > doc.txt
$ gpg --clearsign doc.txt
# Tạo tệp doc.txt.asc
$ cat doc.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Tài liệu chính thức
-----BEGIN PGP SIGNATURE-----
...
-----END PGP SIGNATURE-----
$ gpg --verify doc.txt.asc
gpg: Good signature from "Linux Admin <[email protected]>"
Cấu Hình pwquality cho Chính Sách Mật Khẩu Mạnh
Chỉnh sửa /etc/security/pwquality.conf để bắt buộc chiều dài và độ phức tạp cho mọi mật khẩu người dùng.
$ sudo vi /etc/security/pwquality.conf
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
maxrepeat = 3
# Kiểm tra cấu hình bằng cách đổi mật khẩu một người dùng
$ passwd testuser
New password: abc
BAD PASSWORD: Mật khẩu ngắn hơn 12 ký tự
Cấu Hình faillock
Bật faillock để tự động khóa tài khoản sau khi nhập sai mật khẩu quá nhiều lần.
$ sudo vi /etc/security/faillock.conf
deny = 5
unlock_time = 300
fail_interval = 900
# Kích hoạt faillock thông qua authselect
$ sudo authselect select sssd with-faillock
Hồ sơ "sssd" đã được kích hoạt thành công.
# Xem trạng thái các lần đăng nhập sai của người dùng
$ faillock --user testuser
testuser:
Thời gian Loại Nguồn Hợp lệ
# Quản trị viên mở khóa tài khoản đang bị khóa
$ faillock --user testuser --reset
Đặt Giới Hạn Tài Nguyên Với limits.conf
Chỉnh sửa /etc/security/limits.conf để giới hạn tài nguyên hệ thống cho người dùng hoặc nhóm cụ thể.
$ sudo vi /etc/security/limits.conf
@developers hard nproc 50
@users soft nofile 1024
@users hard nofile 4096
* hard maxlogins 4
# Xem giới hạn tài nguyên của phiên hiện tại
$ ulimit -a
open files (-n) 1024
max user processes (-u) 50
# Hãy đăng xuất rồi đăng nhập lại để các thay đổi có hiệu lực
$ logout
Câu Hỏi Ôn Tập
Nhấp vào từng câu hỏi để xem đáp án chi tiết
Mã hóa đối xứng (Symmetric): Sử dụng cùng một khóa cho cả việc mã hóa và giải mã. Tốc độ thực hiện nhanh, hiệu quả cao với lượng dữ liệu lớn. Ví dụ: AES-256. Nhược điểm chính là việc phải truyền khóa an toàn cho người nhận.
Mã hóa bất đối xứng (Asymmetric): Sử dụng một cặp khóa (khóa công khai và khóa bí mật). Khóa công khai dùng để mã hóa, khóa bí mật dùng để giải mã. Cách này giải quyết được vấn đề truyền khóa nhưng tốc độ chậm hơn nhiều. Ví dụ: RSA-4096. GPG thường sử dụng kết hợp cả hai loại để đạt hiệu quả tốt nhất.
Hai loại khóa này phục vụ các mục đích khác nhau và bổ trợ cho nhau:
- Khóa công khai (Public key): Được chia sẻ rộng rãi. Người khác dùng nó để mã hóa dữ liệu gửi cho bạn.
- Khóa bí mật (Private key): Phải giữ bí mật tuyệt đối. Bạn dùng nó để giải mã dữ liệu nhận được và dùng để ký tên lên tài liệu (chữ ký số).
Tính bảo mật phụ thuộc hoàn toàn vào việc giữ bí mật khóa riêng — nếu bị lộ, bất kỳ ai cũng có thể đọc dữ liệu của bạn hoặc giả mạo chữ ký của bạn.
Lệnh để khởi tạo khối LUKS:
sudo cryptsetup luksFormat /dev/sdb1
Lệnh này sẽ yêu cầu bạn nhập mật khẩu bảo vệ, ghi tiêu đề LUKS vào phân vùng và xóa sạch dữ liệu cũ. Sau đó, bạn cần mở nó bằng lệnh: cryptsetup luksOpen /dev/sdb1 ten_anh_xa
PAM (Pluggable Authentication Modules) là một kiến trúc xác thực dạng module trên Linux. Nó tách biệt hoàn toàn logic xác thực ra khỏi các ứng dụng cụ thể, cho phép quản trị viên thay đổi chính sách bảo mật mà không cần can thiệp vào mã nguồn ứng dụng.
Tầm quan trọng: PAM giúp tập trung hóa việc quản lý xác thực, hỗ trợ nhiều phương thức xác thực khác nhau (mật khẩu, sinh trắc học, token) và dễ dàng áp dụng các chính sách bảo mật nghiêm ngặt cho toàn bộ hệ thống từ một nơi duy nhất.
dcredit = -1 có nghĩa là bắt buộc phải có ít nhất 1 chữ số (digit) trong mật khẩu mới.
Giá trị âm (-N) quy định số lượng tối thiểu bắt buộc của loại ký tự đó. Giá trị dương (+N) là hệ thống tính điểm thưởng (phong cách cũ). Tương tự: ucredit = -1 (bắt buộc chữ hoa), lcredit = -1 (bắt buộc chữ thường), ocredit = -1 (bắt buộc ký tự đặc biệt).
Quy trình hoạt động: Mỗi lần người dùng đăng nhập sai, faillock sẽ ghi lại sự kiện đó. Khi số lần đăng nhập sai đạt đến mức deny=5 trong khoảng thời gian fail_interval (mặc định là 15 phút), tài khoản sẽ bị khóa hoàn toàn. Tài khoản sẽ tự động được mở khóa sau unlock_time=300 giây (tức là 5 phút). Quản trị viên có thể mở khóa ngay lập tức bằng lệnh: faillock --user ten_nguoi_dung --reset. Cơ chế này giúp bảo vệ hệ thống chống lại các cuộc tấn công dò mật khẩu (brute-force).
Tệp này dùng để thiết lập giới hạn tài nguyên hệ thống cho từng người dùng hoặc nhóm người dùng: nproc (số lượng tiến trình), nofile (số lượng tệp mở đồng thời), maxlogins (số phiên đăng nhập tối đa), fsize (kích thước tệp tối đa). 'Soft limit' là mức cảnh báo khi vượt qua, còn 'Hard limit' là mức giới hạn tuyệt đối không thể vượt quá. Các quy tắc này được áp dụng thông qua module pam_limits.
Lệnh rpm -Va (Verify all) thực hiện kiểm tra toàn bộ các tệp tin thuộc mọi gói phần mềm RPM đã cài đặt và báo cáo những tệp nào đã bị thay đổi so với trạng thái ban đầu. Dấu hiệu bảo mật cần quan tâm nhất là khi mã băm (MD5/SHA) của các tệp thực thi hệ thống thay đổi (ký hiệu số 5). Ví dụ, nếu các lệnh quan trọng như /usr/bin/passwd hay /bin/su bị thay đổi mã băm, đó có thể là dấu hiệu hệ thống đã bị cài đặt rootkit.
authselect là công cụ quản lý cấu hình xác thực trên các hệ điều hành họ RHEL/CentOS từ phiên bản 8 trở đi. Nó giúp tự động cập nhật và duy trì tính nhất quán cho các tệp tin PAM trong /etc/pam.d/, nsswitch.conf, và sssd.conf dựa trên các hồ sơ mẫu. Nó cũng cho phép dễ dàng kích hoạt các tính năng bảo mật bổ sung như with-faillock (khóa khi sai mật khẩu), with-mkhomedir (tự tạo thư mục cá nhân), hoặc with-sudo.
SHA-256: Có đầu ra 256-bit, hiện tại vẫn được coi là an toàn tuyệt đối, chưa có phương pháp tấn công hiệu quả nào để tạo ra xung đột mã băm (collision). Đây là lựa chọn hàng đầu cho việc kiểm tra tính toàn vẹn tệp, TLS, và chữ ký số hiện đại.
MD5: Chỉ có đầu ra 128-bit, hiện nay đã bị coi là không còn an toàn cho các mục đích bảo mật vì các nhà nghiên cứu đã tìm ra cách tạo ra hai tệp khác nhau nhưng có cùng một mã băm MD5 một cách dễ dàng.
Kết luận: Luôn ưu tiên dùng SHA-256 hoặc SHA-512 cho các yêu cầu bảo mật. MD5 chỉ nên dùng cho các kiểm tra lỗi truyền tin đơn giản khi yếu tố bảo mật không được đặt lên hàng đầu.