Cách khóa máy chủ SSH của bạn

Tác giả sysadmin, T.Hai 05, 2023, 12:54:42 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Cách khóa máy chủ SSH của bạn


SSH, viết tắt của Secure Shell, không an toàn lắm theo mặc định, chọn xác thực mật khẩu cơ bản không có giới hạn nào khác. Nếu bạn thực sự muốn khóa máy chủ của mình, bạn sẽ cần thực hiện nhiều thao tác định cấu hình hơn.


1. Không cho phép đăng nhập bằng mật khẩu — Sử dụng khóa SSH

Điều đầu tiên cần làm là loại bỏ hoàn toàn xác thực mật khẩu và chuyển sang sử dụng các khóa SSH. Khóa SSH là một dạng mã hóa khóa công khai; bạn có một khóa chung đóng vai trò như tên người dùng của mình và một khóa riêng đóng vai trò như mật khẩu của bạn (ngoại trừ mật khẩu này dài 2.048 ký tự). Khóa riêng tư của bạn được lưu trữ trên đĩa nhưng được mã hóa bằng cụm mật khẩu và ssh-agent. Khi bạn truy cập SSH vào một máy chủ, thay vì hỏi mật khẩu của bạn, tác nhân ssh sẽ kết nối với máy chủ bằng các khóa của bạn.

Ngay cả khi bạn đã sử dụng khóa SSH, bạn vẫn muốn đảm bảo rằng thông tin đăng nhập bằng mật khẩu của mình đã bị tắt vì cả hai không loại trừ lẫn nhau.

2. Tạo khóa SSH

Bạn có thể tạo khóa SSH mới bằng ssh-keygen tiện ích, được cài đặt theo mặc định trên hầu hết các hệ thống Unix.

Mã nguồn [Chọn]
ssh-keygen
Thao tác này sẽ yêu cầu bạn nhập cụm mật khẩu để mã hóa tệp khóa cục bộ. Nó không được sử dụng để xác thực với máy chủ, nhưng vẫn phải được giữ bí mật.

ssh-keygen sẽ lưu khóa riêng của bạn vào ~/.ssh/id_rsa, và cũng sẽ lưu khóa chung của bạn vào ~/.ssh/id_rsa.pub. Khóa riêng nằm trên ổ cứng của bạn nhưng khóa chung phải được tải lên máy chủ để máy chủ có thể xác minh danh tính của bạn và xác minh rằng bạn có quyền truy cập vào máy chủ đó.

Máy chủ lưu giữ danh sách người dùng được ủy quyền, thường được lưu trữ ở định dạng ~/.ssh/authorized_keys. Bạn có thể thêm tệp khóa của mình theo cách thủ công vào tệp này hoặc bạn có thể sử dụng ssh-copy-id tiện ích:

Mã nguồn [Chọn]
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
Thay thế user@host bằng tên người dùng và tên máy chủ của riêng bạn. Bạn sẽ được yêu cầu đăng nhập bằng mật khẩu cũ của mình một lần nữa, sau đó bạn sẽ không được nhắc nhập lại mật khẩu đó nữa và có thể tắt tính năng đăng nhập bằng mật khẩu.

3. Vô hiệu hóa đăng nhập mật khẩu SSH

Bây giờ bạn có thể truy cập máy chủ bằng các khóa của mình, bạn có thể tắt xác thực mật khẩu hoàn toàn. Đảm bảo rằng xác thực dựa trên khóa đang hoạt động, nếu không bạn sẽ bị khóa khỏi máy chủ của mình.

Trên máy chủ, hãy mở /etc/ssh/sshd_config trình soạn thảo văn bản yêu thích của bạn và tìm kiếm dòng bắt đầu bằng:

Mã nguồn [Chọn]
#PasswordAuthentication
Bạn sẽ muốn bỏ ghi chú này (xóa thẻ bắt đầu bằng #) và thay đổi "có" thành "không":

Mã nguồn [Chọn]
PasswordAuthentication no
Sau đó, khởi động lại sshd với:

Mã nguồn [Chọn]
systemctl restart sshd
Bạn sẽ buộc phải kết nối lại và nếu tệp khóa của bạn sai, bạn sẽ không được nhắc nhập mật khẩu.

Nếu muốn, bạn cũng có thể buộc xác thực dựa trên khóa công khai, điều này sẽ chặn tất cả các phương thức xác thực khác. Thêm các dòng sau vào /etc/ssh/sshd_config:

Mã nguồn [Chọn]
AuthenticationMethods publickey
PubkeyAuthentication yes

Và khởi động lại sshd.

4. Khóa những kẻ tấn công với Denyhost

denyhosts là một tiện ích để ngăn chặn các lần đăng nhập thất bại lặp đi lặp lại qua SSH, tương tự như cách điện thoại của bạn khóa bạn sau quá nhiều lần đăng nhập. Nó không được cài đặt theo mặc định, vì vậy bạn sẽ phải cài đặt nó từ trình quản lý gói của bản phân phối. Đối với các hệ thống dựa trên Debian như Ubuntu, đó sẽ là:

Mã nguồn [Chọn]
sudo apt-get install denyhosts -y
Sau khi được cài đặt, hãy kích hoạt nó bằng:

Mã nguồn [Chọn]
sudo systemctl enable denyhosts
Denyhosts sẽ tự động chạy ngay bây giờ, nhưng bạn sẽ muốn đưa địa chỉ IP của mình vào danh sách trắng phòng trường hợp bạn bị khóa. Bạn luôn có thể thử lại từ một địa chỉ IP khác, nhưng điều này sẽ giúp bạn tránh được một số rắc rối.

Mở lên /etc/hosts.allow và ở dưới cùng của tệp thêm:

Mã nguồn [Chọn]
sshd: your-ip-address
Thay thế your-ip-address bằng địa chỉ IP của bạn.

Theo mặc định, denyhosts sẽ khóa sau một lần thử không thành công đối với người dùng root và năm lần thử không thành công đối với những người dùng khác. Bạn có thể thay đổi hành vi này bằng cách chỉnh sửa /etc/denyhosts.conf.

Nếu bạn đã vô tình khóa chính mình, bạn cần phải dừng denyhosts và xóa địa chỉ IP của mình khỏi một vài nơi:

  • /etc/hosts.deny
  • /var/lib/denyhosts/hosts
  • /var/lib/denyhosts/hosts-restricted
  • /var/lib/denyhosts/hosts-root
  • /var/lib/denyhosts/hosts-valid
  • /var/lib/denyhosts/users-hosts

Khởi động lại denyhosts và bạn sẽ có thể kết nối lại.

5. Truy cập SSH danh sách trắng

Mặc dù buộc khóa SSH denyhosts có thể đủ bảo mật, nhưng bạn có thể đưa vào danh sách trắng các địa chỉ IP cụ thể. Hầu hết các nhà cung cấp máy chủ sẽ cung cấp các công cụ để thực hiện việc này từ giao diện web. Nếu đó là một tùy chọn, bạn sẽ muốn đưa vào danh sách trắng từ đó thay vì từ máy chủ SSH, vì bạn luôn có thể thay đổi IP trong danh sách trắng trong trường hợp bạn bị khóa.


Nếu đó không phải là một tùy chọn, bạn sẽ cần định cấu hình theo cách thủ công /etc/hosts.deny để chặn tất cả lưu lượng truy cập từ các máy chủ trái phép.

Một lưu ý quan trọng: Nếu bạn đưa nhà của mình vào danh sách trắng, ISP của bạn có thể không cung cấp cho bạn địa chỉ IP tĩnh và địa chỉ IP của bạn có thể thay đổi bất cứ lúc nào. Bạn sẽ muốn đảm bảo rằng điều đó sẽ không xảy ra trước khi đưa tất cả các địa chỉ IP khác vào danh sách đen hoặc thêm nhiều địa chỉ làm bản sao lưu hoặc bỏ qua bước này hoàn toàn.

Mở lên  /etc/hosts.allow và đảm bảo địa chỉ IP của bạn có trong tệp:

Mã nguồn [Chọn]
sshd: your-ip-address
Nếu có, bạn có thể tiếp tục và từ chối tất cả các kết nối khác:

Mã nguồn [Chọn]
echo 'sshd: ALL' >> /etc/hosts.deny
Khởi động lại sshd và bạn sẽ thấy những thay đổi của mình.

6. Ngoài ra, hãy thiết lập một proxy trước máy chủ SSH của bạn

Nếu bạn không muốn hiển thị máy chủ SSH của mình với internet nhưng cần truy cập nó từ nhiều địa chỉ IP, bạn có thể thiết lập một proxy phía trước nó để xử lý kết nối. Đây có thể là một máy chủ đám mây khác hoặc thậm chí là một hộp chạy trong nhà bạn.

Máy chủ SSH phải được định cấu hình để chỉ chấp nhận kết nối từ máy chủ proxy và máy chủ proxy sẽ chấp nhận kết nối từ mọi nơi. Bạn có thể thiết lập máy chủ proxy theo cách bạn muốn, nhưng ngay cả một  kết nối netcat đơn giản cũng sẽ hoạt động. Hãy nhớ rằng máy chủ proxy này sẽ là điểm truy cập duy nhất cho máy chủ SSH của bạn, vì vậy nếu proxy gặp sự cố, bạn sẽ bị khóa trừ khi bạn có địa chỉ dự phòng.

7. Không cho phép đăng nhập root

Thay vào đó, hãy tạo một người dùng mới và cấp đặc quyền sudo cho người dùng đó. Điều này thực sự giống nhau nhưng có một điểm khác biệt chính: những kẻ tấn công tiềm năng sẽ cần biết tên tài khoản người dùng của bạn để thậm chí bắt đầu tấn công máy chủ của bạn, bởi vì nó sẽ không đơn giản như  root@yourserver.

Ngoài vấn đề bảo mật, chính sách Unix nói chung tốt là không đăng nhập root mọi lúc, vì  root không tạo nhật ký và không nhắc khi truy cập các tài nguyên được bảo vệ.

Tạo người dùng mới trên máy chủ SSH của bạn:

Mã nguồn [Chọn]
adduser myfancyusername
Và đặt mật khẩu cho người dùng đó:

Mã nguồn [Chọn]
passwd myfancyusername
Bạn sẽ không đăng nhập bằng mật khẩu này vì bạn vẫn sẽ sử dụng khóa SSH, nhưng mật khẩu này là bắt buộc. Lý tưởng nhất là làm cho mật khẩu này khác với mật khẩu root của bạn.

Thêm người dùng này /etc/sudoers để cấp quyền quản trị viên:

Mã nguồn [Chọn]
echo 'myfancyusername ALL=(ALL) ALL' >> /etc/sudoers
Chuyển sang người dùng đó bằng su myfancyusername, và xác minh rằng bạn có thể chuyển trở lại người dùng root bằng sudo su (không yêu cầu mật khẩu của root). Nếu có thể, bạn có quyền truy cập sudo.

Bây giờ bạn sẽ muốn chặn đăng nhập root. Trong /etc/ssh/sshd_config, bạn sẽ muốn thay đổi:

Mã nguồn [Chọn]
#PermitRootLogin yes
Xóa hastag và đổi "có" thành "không":

Mã nguồn [Chọn]
PermitRootLogin no
Khởi động lại sshd và máy chủ của bạn sẽ chặn tất cả các yêu cầu đăng nhập bằng tên miền root.

8. Thiết lập xác thực hai yếu tố

Điều này chắc chắn là quá mức cần thiết, nhưng nếu bạn hoang tưởng về việc ai đó đang lấy khóa SSH riêng tư của mình, bạn có thể định cấu hình máy chủ SSH của mình để sử dụng 2FA.

Cách dễ nhất để thực hiện việc này là sử dụng Google Authenticator  với thiết bị Android hoặc iOS, mặc dù SSH hỗ trợ nhiều phương thức hai yếu tố. Với Google Authenticator, bạn sẽ được cung cấp mã QR mà bạn có thể quét từ ứng dụng Google Authenticator dành cho thiết bị di động để liên kết điện thoại của mình với máy chủ và bạn cũng sẽ được cung cấp một số mã dự phòng để khôi phục trong trường hợp điện thoại của bạn bị mất. Không lưu trữ các mã này trên máy chính của bạn, nếu không, đó không thực sự là hai yếu tố.