Nội dung bài viết
Sau khi tạo máy ảo trên Google Cloud, bạn sẽ thấy mình không đăng nhập được bằng mật khẩu qua PuTTY hay bất kỳ SSH client nào. Đây là hành vi cố ý: Google Cloud mặc định chỉ chấp nhận SSH key, và tài khoản root không được đặt mật khẩu.
Hướng dẫn dưới đây thực hiện trên CentOS 7, các bản Linux khác làm tương tự.
Cân nhắc trước khi bật
Cần nói rõ điều này trước: bật đăng nhập root bằng mật khẩu trên một máy chủ có IP công cộng làm giảm đáng kể mức độ an toàn.
Máy chủ công cộng bị dò mật khẩu tự động liên tục, và root luôn là tài khoản bị thử đầu tiên vì nó chắc chắn tồn tại trên mọi hệ thống Linux. Với SSH key thì việc dò tìm là bất khả thi, còn với mật khẩu thì mức độ an toàn phụ thuộc hoàn toàn vào việc bạn đặt mật khẩu mạnh tới đâu.
Nếu vẫn quyết định làm, hãy đọc phần cuối bài về các biện pháp giảm thiểu rủi ro. Còn nếu chỉ cần truy cập máy chủ từ một máy tính khác, dùng SSH key vẫn là cách tốt hơn và cũng không mất nhiều công hơn.
Các bước thực hiện
Mở Terminal mà Google cung cấp ngay trên giao diện web (nút SSH trong danh sách VM instances), rồi làm lần lượt.
Bước 1: chuyển sang quyền root
sudo su
Bước 2: đặt mật khẩu cho root
sudo passwd
Google Cloud không tạo sẵn mật khẩu cho root, nên đây là lần đầu tài khoản này có mật khẩu. Hệ thống sẽ hỏi nhập hai lần.
Hãy đặt một mật khẩu thực sự dài. Đây là thứ duy nhất đứng giữa máy chủ của bạn và hàng nghìn lượt dò tự động mỗi ngày.
Bước 3: cho phép SSH xác thực bằng mật khẩu
Mở file cấu hình của dịch vụ SSH:
vi /etc/ssh/sshd_config
Tìm và sửa hai dòng sau:
PermitRootLogin yes
PasswordAuthentication yes
Cả hai thường đang để no, hoặc bị chú thích bằng dấu # ở đầu dòng. Nếu có dấu # thì phải xóa nó đi, dòng bị chú thích không có tác dụng gì.
Với ai chưa quen vi: nhấn i để vào chế độ sửa, sửa xong nhấn Esc, rồi gõ :wq và Enter để lưu và thoát.
Trên các bản Linux mới hơn, cấu hình có thể bị ghi đè bởi các file trong /etc/ssh/sshd_config.d/. Google Cloud thường đặt sẵn một file ở đó với PasswordAuthentication no. Kiểm tra bằng:
grep -r "PasswordAuthentication" /etc/ssh/
Nếu thấy dòng nào đặt giá trị no trong thư mục sshd_config.d, phải sửa cả ở đó, vì các file này được nạp sau và sẽ thắng.
Bước 4: khởi động lại dịch vụ SSH
service sshd restart
Hoặc trên hệ thống dùng systemd:
systemctl restart sshd
Kiểm tra cú pháp trước khi khởi động lại là một thói quen tốt, tránh trường hợp file cấu hình sai làm dịch vụ SSH không lên được:
sshd -t
Lệnh này không in gì nếu cấu hình hợp lệ.
Kiểm tra
Giữ nguyên cửa sổ Terminal trên web đang mở, đừng đóng nó. Nếu có sự cố, đó là đường vào duy nhất còn lại của bạn.
Mở PuTTY hoặc terminal trên máy cá nhân rồi thử:
ssh root@DIA_CHI_IP
Đừng quên tường lửa của Google Cloud
Google Cloud có tầng tường lửa riêng, độc lập với tường lửa trong hệ điều hành. Nếu kết nối bị treo mà không báo lỗi gì, khả năng cao là cổng 22 chưa được mở trong VPC network > Firewall.
Giảm rủi ro
Nếu đã bật xác thực bằng mật khẩu, ít nhất hãy làm thêm mấy việc sau.
Giới hạn IP được phép kết nối. Đây là biện pháp hiệu quả nhất. Trong luật tường lửa của Google Cloud, thay vì mở cổng 22 cho 0.0.0.0/0, chỉ cho phép dải IP của bạn.
Đổi cổng SSH. Không phải là bảo mật thật sự, nhưng cắt được phần lớn các đợt quét tự động nhắm vào cổng 22:
Port 2222
Nhớ mở cổng mới trên tường lửa Google Cloud trước khi khởi động lại SSH, nếu không bạn sẽ tự khóa mình bên ngoài.
Cài fail2ban để tự động chặn IP sau nhiều lần đăng nhập sai:
yum install epel-release -y
yum install fail2ban -y
systemctl enable --now fail2ban
Tạo tài khoản thường thay vì dùng root. Đăng nhập bằng tài khoản có quyền sudo rồi nâng quyền khi cần, và giữ PermitRootLogin no. Cách này giữ được sự tiện lợi của mật khẩu mà không phơi tài khoản quan trọng nhất ra ngoài.
Tắt lại khi xong việc. Nếu bạn chỉ cần đăng nhập mật khẩu cho một tác vụ nhất thời, hãy nhớ đưa hai giá trị ở bước 3 về no sau khi hoàn thành.