Bảo mật tối đa máy Linux: Hướng dẫn sử dụng YubiKey cho SSH và Sudo

Security tutorial - IT technology blog
Security tutorial - IT technology blog

5 phút đầu tiên: Giúp hệ thống nhận diện khóa của bạn

Mật khẩu là một điểm yếu duy nhất và mong manh. Nếu thông tin đăng nhập của bạn bị rò rỉ trong một vụ vi phạm dữ liệu hoặc bạn vô tình rơi vào một trang web lừa đảo (phishing) tinh vi, máy chủ của bạn coi như bị mở toang. Một khóa bảo mật phần cứng như YubiKey 5C hoặc Security Key NFC sẽ thêm một lớp bảo vệ vật lý mà những kẻ tấn công từ xa không thể vượt qua, giúp bạn xây dựng máy chủ bất khả xâm phạm. Trước khi chạm vào bất kỳ tệp cấu hình phức tạp nào, hãy đảm bảo kernel Linux thực sự nhận diện được thiết bị.

1. Kiểm tra kết nối USB

Cắm YubiKey của bạn vào một cổng trống. Chúng ta sẽ sử dụng tiện ích lsusb để kiểm tra xem phần cứng đã được đăng ký chính xác chưa:

lsusb | grep -i yubico

Bạn sẽ thấy một dòng đề cập đến “Yubico.com” hoặc “YubiKey”. Nếu kết quả trống, hãy thử cắm trực tiếp vào cổng trên bo mạch chủ thay vì bộ chia USB (USB hub) không có nguồn phụ, đồng thời cân nhắc việc ngăn chặn BadUSB để bảo vệ các cổng kết nối vật lý, vì các loại khóa này đôi khi gặp khó khăn với kết nối điện áp thấp.

2. Cài đặt các Middleware cần thiết

Các bản phân phối Linux hiện đại cần các thư viện cụ thể để chuyển đổi tín hiệu phần cứng thành các mã xác thực (token). Trên Ubuntu 22.04 hoặc 24.04, hãy cài đặt các gói sau:

sudo apt update
sudo apt install libpam-u2f pamu2fcfg fido2-tools -y

Người dùng Fedora có thể cài đặt các tính năng tương tự bằng lệnh dnf install pam-u2f fido2-tools. Những công cụ này đóng vai trò là cầu nối giữa thao tác chạm vật lý của bạn và trình nhắc đăng nhập của hệ điều hành.

Gia cố bảo mật SSH với khóa phần cứng FIDO2

Khóa SSH tiêu chuẩn chỉ là các tệp tin trên đĩa cứng. Nếu một kẻ xấu xâm nhập được vào máy cục bộ của bạn, chúng có thể trích xuất tệp ~/.ssh/id_rsa và mạo danh bạn mãi mãi. Khóa dựa trên phần cứng thay đổi cuộc chơi vì khóa riêng (private key) không bao giờ rời khỏi thành phần bảo mật của YubiKey. Đây là một bước tiến quan trọng trong việc bảo mật SSH, ngay cả khi kẻ trộm lấy được tệp id_ed25519_sk của bạn, nó cũng vô dụng nếu không có thiết bị vật lý cắm vào máy của chúng.

1. Tạo khóa dựa trên phần cứng

OpenSSH 8.2 đã giới thiệu hỗ trợ cho ed25519-sk. Định dạng này nhanh hơn và an toàn hơn các loại RSA cũ. Chạy lệnh sau để tạo khóa của bạn:

ssh-keygen -t ed25519-sk -O resident -O verify-required -C "khoa-may-tram-2024"

Hãy cùng phân tích các tham số (flag) này:

  • -O resident: Tùy chọn này lưu một “key handle” trên YubiKey. Bạn có thể sử dụng bất kỳ máy tính nào, cắm khóa vào và khôi phục danh tính SSH của mình mà không cần mang theo ổ USB.
  • -O verify-required: Buộc YubiKey yêu cầu mã PIN trước khi thực hiện xác thực.

YubiKey của bạn sẽ bắt đầu nhấp nháy. Hãy chạm vào điểm tiếp xúc bằng vàng để chứng minh có người thật đang thao tác. Sự tương tác vật lý này ngăn chặn mã độc sử dụng khóa của bạn một cách âm thầm trong nền.

2. Triển khai khóa lên máy chủ

Trước khi chuyển khóa, tôi thường tạo một chuỗi ký tự ngẫu nhiên 32 ký tự tại toolcraft.app/vi/tools/security/password-generator để thiết lập máy chủ ban đầu. Sau khi khóa phần cứng đã sẵn sàng, bạn có thể tắt hoàn toàn đăng nhập bằng mật khẩu để đạt bảo mật tối đa.

Đẩy khóa công khai (public key) của bạn lên VPS hoặc máy chủ từ xa:

ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub [email protected]

Giờ đây, mọi nỗ lực đăng nhập sẽ kích hoạt một trình nhắc. Terminal của bạn sẽ chờ cho đến khi bạn chạm vào khóa vật lý. Không chạm, không có quyền truy cập.

Bảo mật cục bộ: Yêu cầu khóa cho lệnh Sudo

Bảo vệ SSH là cực kỳ quan trọng, nhưng việc leo thang đặc quyền cục bộ cũng là một rủi ro lớn. Bạn có thể cấu hình Linux để yêu cầu chạm YubiKey mỗi khi chạy lệnh sudo. Điều này ngăn chặn các tập lệnh độc hại chiếm quyền root ngay cả khi chúng ghi lại được mật khẩu của bạn, tương tự như việc thắt chặt bảo mật Linux Sudoers.

1. Ánh xạ khóa vào tài khoản của bạn

Đầu tiên, hãy tạo một thư mục cấu hình riêng và đăng ký thiết bị của bạn:

mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys

Khóa sẽ nhấp nháy; hãy chạm chắc chắn vào nó. Nếu bạn có khóa dự phòng (và bạn thực sự nên có), hãy thêm nó vào cùng một tệp bằng tham số -n:

pamu2fcfg -n >> ~/.config/Yubico/u2f_keys

2. Chỉnh sửa PAM Stack

Chúng ta cần hướng dẫn Pluggable Authentication Module (PAM) kiểm tra token U2F. Mở cấu hình sudo:

sudo nano /etc/pam.d/sudo

Chèn dòng này ngay sau @include common-auth:

auth required pam_u2f.so

Mẹo nhỏ: Hãy giữ một cửa sổ terminal thứ hai đang mở với phiên sudo -i đang hoạt động. Nếu bạn làm sai cú pháp trong tệp PAM, bạn có thể tự khóa mình khỏi quyền quản trị. Việc có một shell root đang hoạt động cho phép bạn đảo ngược các thay đổi ngay lập tức, một kỹ năng quan trọng trong ứng phó sự cố Linux.

Thói quen vận hành lâu dài

Việc sử dụng khóa phần cứng yêu cầu một sự thay đổi nhỏ trong cách bạn làm việc. Dưới đây là ba thói quen để đảm bảo bạn không bị khóa khỏi hạ tầng của chính mình.

Quy tắc “Hai là một, một là không”

Khóa phần cứng nhỏ và dễ thất lạc. Nếu bạn mất chiếc khóa duy nhất và đã tắt mật khẩu, bạn sẽ gặp rắc rối lớn. Luôn mua khóa theo cặp. Đăng ký cả hai khóa cho GitHub, máy cục bộ và máy chủ của bạn. Giữ khóa dự phòng ở một nơi an toàn, chống cháy như két sắt gia đình.

Tính di động với Resident Keys

Nếu bạn thường xuyên chuyển đổi giữa máy tính bàn và laptop, ssh-add -K là người bạn tốt nhất. Nó sẽ tìm kiếm các resident key trong YubiKey đang cắm và tải chúng vào SSH agent cục bộ. Bạn không còn cần phải đồng bộ các thư mục ~/.ssh giữa các thiết bị thông qua các phương thức không an toàn.

Bắt buộc bảo vệ bằng mã PIN

Chỉ riêng khóa vật lý đã là xác thực hai yếu tố (sở hữu và chạm). Thêm mã PIN sẽ biến nó thành xác thực ba yếu tố. Sử dụng YubiKey Manager để thiết lập mã PIN FIDO2. Điều này đảm bảo rằng ngay cả khi ai đó lấy trộm khóa vật lý của bạn, họ cũng không thể sử dụng nó nếu không có mã bí mật.

ykman fido access change-pin

Nâng cấp lên xác thực dựa trên phần cứng là bước đi bảo mật hiệu quả nhất mà bạn có thể thực hiện. Mặc dù việc thiết lập ban đầu mất khoảng 15 phút, nhưng sự bảo vệ mà nó mang lại trước các cuộc tấn công từ xa là tuyệt đối. Cuối cùng, bạn có thể ngừng lo lắng về rò rỉ mật khẩu và tập trung vào việc viết code.

Share: