Tác giả: Huy

Thông tin liên hệ:


Chào mọi người mình là Huy. Hiện tại mình là DevOps Engineer với hơn 1,5 năm kinh nghiệm tại công ty ***. Đây là bài chia sẻ đầu tiên của mình trên devopsedu.vn

Đầu tiên, rất cảm ơn anh Mạnh đã lan tỏa những kiến thức giá trị và thực tế. Phải nói thật sự nếu như không có các kiến thức của anh thì em đã không thể chuyển từ một “coder Java” sang devops. Cũng chính vì vậy mà sau một khoảng thời gian với vị trí này em cũng xin phép được chia sẻ một chút chút kiến thức để có thể lan tỏa giá trị tới cộng đồng cũng như biết ơn anh.


10 cách bảo mật ssh trên Linux thực tế

Đây là phần kiến thức đầu tiên khi đổi từ vị trí Dev sang DevOps mà mình được dạy trong doanh nghiệp. Và đây đều là những cách mà mình vẫn áp dụng thực tế. Có thể sẽ giúp ích cho bạn trong doanh nghiệp.

#1. Vô hiệu hóa đăng nhập người dùng root

Chắc bạn cũng hiểu là người dùng root có quyền hạn tuyệt đối trên Linux và thật sự rất nguy hiểm nếu chẳng may lộ mật khẩu của người dùng root và bị kẻ tấn công dò được và nó có một cái hại nữa là người dùng root mặc định có trên hệ thống thế nên kẻ tấn công sẽ sử dụng các phép thử mật khẩu liên tục điều này kể cả họ không tìm ra được mật khẩu của bạn nhưng cũng sẽ ảnh hưởng ít nhiều đến hệ thống. Trước khi vô hiệu hóa đăng nhập người dùng root, hãy đảm bảo rằng người dùng thông thường có thể đăng nhập như root. Ví dụ, cho phép người dùng huybv đăng nhập như root bằng lệnh sudo.

Cách thêm người dùng huybv vào nhóm sudo trên Debian/Ubuntu

# sudo adduser huybv sudo

Mở file /etc/ssh/sshd_config cấu hình ssh để vô hiệu hóa đăng nhập root bạn tìm đến dòng và sửa thành nội dung sau:

PermitRootLogin no


#2. Giới hạn quyền truy cập SSH của người dùng

Mặc định, tất cả người dùng hệ thống có thể đăng nhập qua SSH bằng mật khẩu hoặc khóa công khai. Đôi khi, bạn tạo tài khoản người dùng UNIX/Linux chỉ để sử dụng cho FTP hoặc email thôi. Tuy nhiên, những người dùng này cũng có thể đăng nhập vào hệ thống thông qua SSH. Họ sẽ có quyền truy cập đầy đủ vào các công cụ hệ thống, bao gồm cả các trình biên dịch và ngôn ngữ kịch bản như Perl, Python,… có thể mở cổng mạng và làm nhiều thứ phức tạp khác. Ví dụ, để chỉ cho phép người dùng root, huybv sử dụng hệ thống qua SSH, thêm dòng sau vào file /etc/ssh/sshd_config

AllowUsers huybv

Ngoài ra, bạn có thể cho phép tất cả người dùng đăng nhập qua SSH nhưng chặn chỉ một số người dùng cụ thể không được đăng nhập qua SSH bằng cách thêm dòng sau vào file /etc/ssh/sshd_config

DenyUsers root huybv

Bạn cũng có thể cấu hình PAM (Pluggable Authentication Modules) trên Linux để cho phép hoặc từ chối đăng nhập thông qua máy chủ SSHD. Bạn có thể cho phép hoặc từ chối danh sách tên nhóm truy cập vào SSH.


#3. Vô hiệu hóa mật khẩu trống

Bạn cần phải rõ ràng không cho phép đăng nhập từ xa từ các tài khoản có mật khẩu trống. Cập nhật file /etc/ssh/sshd_config với dòng sau:

PermitEmptyPasswords no


#4. Sử dụng mật khẩu mạnh và cụm mật khẩu (passphrase) cho người dùng/khóa SSH

Điều cực kỳ quan trọng là phải sử dụng mật khẩu mạnh cho người dùng và cụm mật khẩu cho các khóa SSH. Các cuộc tấn công brute force có hiệu quả vì người dùng thường sử dụng mật khẩu dựa trên quy tắc đời thường. Bạn có thể bắt buộc người dùng tránh sử dụng mật khẩu dễ bị tấn công từ điển và sử dụng công cụ John the Ripper để tìm ra các mật khẩu yếu hiện có. Thật ra thì bạn hoàn toàn có thể sử dụng các công cụ tạo mật khẩu tự động trên internet đều có nhưng để yên tâm và đảm bảo tuyệt đối thì chẳng gì bằng do mình tạo ra. Dưới đây là một ví dụ về trình tạo mật khẩu ngẫu nhiên (đặt trong file ~/.bashrc  của bạn):

Chạy lệnh dưới đây để tạo ra mật khẩu ngẫu nhiên:

# genpasswd 16

Kết quả:

uw8CnDVMwC6vOKgW


#5. Thiết lập tường lửa cho cổng SSH TCP số 22

Bạn cần thiết lập tường lửa cho cổng SSH TCP số 22 bằng cách cập nhật các cấu hình iptables, ufw, firewall-cmd hoặc pf firewall. Thông thường, máy chủ OpenSSH chỉ nên chấp nhận kết nối từ mạng LAN của bạn hoặc các trang web WAN từ xa khác. Xem các ví dụ lệnh ufw hoặc iptables để biết thêm thông tin.

Cấu hình Netfilter (Iptables)

Cập nhật file /etc/sysconfig/iptables. (tệp cụ thể cho Redhat và các hệ thống tương tự) để chỉ chấp nhận kết nối từ 192.168.1.0/24 và 202.54.1.5/29, nhập:

-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s 202.54.1.5/29 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Nếu bạn đang sử dụng SSHD với cấu hình IPv6 kép, chỉnh sửa file /etc/sysconfig/ip6tables (tệp cụ thể cho Redhat và các hệ thống tương tự), nhập:

-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT

Thay thế ipv6network::/ipv6mask bằng các phạm vi IPv6 thực tế.

UFW cho Linux Debian/Ubuntu

UFW là viết tắt của Uncomplicated Firewall. Đây là công cụ dùng để quản lý tường lửa trên Linux, với mục tiêu cung cấp giao diện dễ sử dụng cho người dùng. Sử dụng lệnh sau để cho phép cổng 22 từ 202.54.1.5/29:

# sudo ufw allow from 202.54.1.5/29 to any port 22

Cấu hình Tường lửa PF cho BSD

Nếu bạn đang sử dụng tường lửa PF, cập nhật file /etc/pf.conf như sau:

pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port ssh flags S/SA synproxy state


#6 Thay đổi cổng SSH và giới hạn IP binding

Mặc định, SSH lắng nghe trên tất cả các giao diện và địa chỉ IP có sẵn trên hệ thống. Hãy giới hạn việc binding cổng SSH và thay đổi cổng SSH (nhiều script tấn công brute force chỉ cố gắng kết nối đến cổng TCP số 22). Để binding vào các IP 192.168.1.5 và 202.54.1.5 và sử dụng cổng 300, thêm hoặc chỉnh sửa các dòng sau trong file /etc/ssh/sshd_config:

Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5

Một cách tiếp cận tốt hơn là sử dụng các script tiếp cận chủ động như fail2ban hoặc denyhosts khi bạn muốn chấp nhận kết nối từ địa chỉ IP WAN động.


#7 Cấu hình thời gian chờ đăng xuất khi không hoạt động

Người dùng có thể đăng nhập vào máy chủ qua SSH, và bạn có thể thiết lập một khoảng thời gian chờ khi không hoạt động để tránh các phiên SSH không được giám sát. Mở file sshd_config và đảm bảo cấu hình các giá trị sau:

ClientAliveInterval 300
ClientAliveCountMax 0

Thiết lập khoảng thời gian chờ khi không hoạt động tính bằng giây (300 giây = 5 phút). Sau khi khoảng thời gian này trôi qua, người dùng không hoạt động sẽ tự động bị ngắt kết nối.


#8 Vô hiệu hóa các tệp .rhosts (xác minh)

Không đọc các tệp ~/.rhosts~/.shosts của người dùng. Cập nhật file /etc/ssh/sshd_config với các cài đặt sau:

IgnoreRhosts yes

SSH có thể mô phỏng hành vi của lệnh rsh đã lỗi thời, vì vậy hãy vô hiệu hóa quyền truy cập không an toàn qua RSH.


#9 Vô hiệu hóa xác thực dựa trên máy chủ (xác minh)

Để vô hiệu hóa xác thực dựa trên máy chủ, cập nhật tệp /etc/ssh/sshd_config với tùy chọn sau:

HostbasedAuthentication no


#10 Chroot OpenSSH (Giới hạn người dùng trong thư mục chính của họ)

Mặc định, người dùng được phép duyệt qua các thư mục của máy chủ như /etc/, /bin/ và các thư mục khác. Bạn có thể bảo vệ SSH bằng cách sử dụng chroot dựa trên hệ điều hành hoặc các công cụ đặc biệt như rssh. Với việc phát hành OpenSSH 4.8p1 hoặc 4.9p1, bạn không còn phải dựa vào các giải pháp bên thứ ba như rssh hoặc cấu hình chroot(1) phức tạp để giới hạn người dùng trong thư mục chính của họ. Xem bài viết trên blog về chỉ thị chrootDirectory mới để giới hạn người dùng trong thư mục chính của họ.

Trong các bài sau mình sẽ làm các bài lab chi tiết hơn. Cảm ơn các bạn đã theo dõi nha. Mong giúp ích được các bạn.