SSH, viết tắt của Secure Shell, theo mặc định, không an toàn, không chọn xác thực mật khẩu cơ bản mà 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 phải cấu hình nhiều hơn.
Không cho phép đăng nhập 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 hình thức mã hóa khóa công khai; bạn có một khóa công khai hoạt động như tên người dùng của bạn và một khóa riêng hoạt động 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 của bạn được lưu trữ trên đĩa của bạn, 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áy chủ, thay vì hỏi mật khẩu, ssh-agent sẽ kết nối với máy chủ bằng các phím của bạn.
Ngay cả khi bạn đã sử dụng khóa SSH, bạn vẫn sẽ muốn đảm bảo rằng đăng nhập mật khẩu của mình đã bị tắt, vì cả hai không loại trừ lẫn nhau.
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.
ssh-keygen
Điều 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 nên đượ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 vẫn ở 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ủ giữ một danh sách người dùng được ủy quyền, thường được lưu trữ trong ~/.ssh/authorized_keys
. Bạn có thể thêm tệp chính 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:
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ũ một lần nữa, sau đó bạn không nên nhắc lại mật khẩu và có thể vô hiệu hóa đăng nhập mật khẩu.
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 hoàn toàn xác thực mật khẩu. Đảm bảo rằng xác thực dựa trên khóa đang hoạt động hoặc bạn sẽ bị khóa khỏi máy chủ của mình.
Trên máy chủ, 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:
#PasswordAuthentication
Bạn sẽ muốn bỏ ghi chú này (xóa hashtag) và thay đổi có
Mật khẩu không xác thực
Sau đó, khởi động lại sshd
với:
khởi động lại hệ thống sshd
Bạn nên bị buộc phải kết nối lại và nếu tệp chính của bạn sai, bạn sẽ không được nhắc nhập mật khẩu.
Nếu bạn 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
:
Khóa xác thựcMethods PubkeyAuthentication có
và khởi động lại sshd
.
Khóa những kẻ tấn công bằng denyhosts
denyhosts
là một tiện ích để ngăn chặn các lần đăng nhập thất bạ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 thử. 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 distro. Đối với các hệ thống dựa trên Debian như Ubuntu, đó sẽ là:
sudo apt-get cài đặt denyhosts -y
Sau khi cài đặt, kích hoạt nó với:
sudo systemctl cho phép denyhosts
denyhosts
sẽ tự động chạy ngay bây giờ, nhưng bạn sẽ muốn đưa danh sách trắng vào địa chỉ IP của mình trong 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 tiết kiệm một số rắc rối.
Mở lên /etc/hosts.allow
và ở dưới cùng của tập tin thêm:
sshd: địa chỉ ip của bạn
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ử thất bại cho người dùng root và năm lần thất bại cho 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 tự khóa mình, bạn sẽ cần 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.
Truy cập SSH danh sách trắng
Mặc dù việc buộc các khóa SSH denyhosts
có thể đủ bảo mật, bạn có thể liệt kê 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 danh sách trắng từ đó thay vì từ máy chủ SSH, vì bạn sẽ 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 phải cấu hình 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 danh sách trắng vào nhà, 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 vào danh sách đen tất cả các địa chỉ IP khác hoặc thêm nhiều địa chỉ làm bản sao lưu hoặc chỉ bỏ qua bước này hoàn toàn.
Mở ra /etc/hosts.allow
và đảm bảo địa chỉ IP của bạn có trong tệp:
sshd: địa chỉ ip của bạn
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:
tiếng vang 'sshd: ALL' >> /etc/hosts.deny
Khởi động lại sshd
và bạn sẽ thấy những thay đổi của bạn.
Ngoài ra, hãy thiết lập Proxy trước máy chủ SSH của bạn
Nếu bạn không muốn đưa máy chủ SSH của mình ra internet nhưng cần truy cập nó từ nhiều địa chỉ IP, bạn có thể thiết lập proxy trước máy chủ để 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 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 bị hỏng, bạn sẽ bị khóa trừ khi bạn có địa chỉ dự phòng.
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à cung cấp cho người dùng đó đặc quyền sudo. Đây thực sự là một điều tương tự nhưng có một điểm khác biệt lớn: 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 bảo mật, chính sách Unix tốt thường không được đăng nhập root
mọi lúc, vì root
không tạo nhật ký và không nhắc nhở khi truy cập 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:
người dùng tên người dùng
và đặt mật khẩu cho người dùng đó:
tên người dùng của tôi
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 các khóa SSH, nhưng nó là bắt buộc. Lý tưởng nhất, làm cho điều này khác với mật khẩu gốc của bạn.
Thêm người dùng này /etc/sudoers
để cấp quyền cho quản trị viên:
echo 'myfancyusername ALL = (ALL) ALL' >> / etc / sudoers
Chuyển sang người dù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 bạn 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:
#PermitRootLogin có
Xóa hastag và thay đổi có
PermitRootLogin không
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 như root
.
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 đó chiếm đoạt các 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 để làm điều 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 pháp hai yếu tố. Với Google Authenticator, bạn sẽ được cấp mã QR mà bạn có thể quét từ ứng dụng di động Google Authenticator để 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 vài mã dự phòng để phục hồi 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 nó không thực sự là hai yếu tố.