20 cách giúp tăng cường bảo mật cho Linux server – Phần 1
Bảo mật cho máy chủ Linux của bạn là điều hết sức quan
trọng để bảo vệ dữ liệu, các sở hữu trí tuệ, và cả thời gian, tiền bạc khỏi “bàn tay đen”
của các hacker. Người quản trị hệ thống chịu trách nhiệm chính cho việc bảo mật trên
máy chủ Linux. Trong phần đầu tiên của loạt bài viết về bảo mật Linux server, tôi sẽ
cung cấp cho các bạn 20 thủ thuật giúp tăng cường an ninh cho Linux server.
#1: Mã hóa dữ liệu được truyền đi
Tất cả các dữ liệu gửi qua môi trường mạng đều có nguy cơ bị hacker tóm được (sniff)
ngay trên đường truyền. Vì vậy, bất cứ khi nào có thể bạn nên mã hóa dữ liệu được
truyền đi với thuật toán mã hóa và mật khẩu đủ mạnh hay sử dụng các chứng thư số
(certificate).
1. Sử dụng các chương trình scp, ssh, rsync hoặc sftp để truyền file qua mạng. Với 2
công cụ fuse và sshfs, bạn cũng có thể mount các file system nằm trên server ở xa
(remote server file system) một cách an toàn thông qua SSH.
2. GnuPG giúp mã hóa dữ liệu và tạo chữ ký số cho file, thêm vào đó là tính năng
quản lý khóa mã hóa tiện lợi.
3. Fugu là một frontend có giao diện đồ họa cho SFTP. SFTP cũng giống với FTP,
chỉ khác là SFTP sẽ mã hóa toàn bộ phiên làm việc, có nghĩa rằng cả mật khẩu và
các dữ liệu khác sẽ được mã hóa trước khi gửi đi. Và như vậy dù cho hacker có
tóm được dữ liệu đó cũng không thể nào đọc được thông tin đã được mã hóa bởi
SFTP. Một tùy chọn khác là FileZilla – chương trình client chạy trên nhiều nền
Tăng cường bảo mật cho máy chủ Linux Page 1
tảng như Linux, Windows… (cross-platform), hỗ trợ các giao thức như FTP,
FTPS (FTP over SSL/TSL), SFTP (SSH FTP)…
4. OpenVPN chương trình SSL/VPN nhẹ nhàng, hiệu quả.
5. Lighttpd SSL (Secure Server Layer) Https <= xem thêm cách cài đặt và cấu hình
6. Apache SSL (Secure Server Layer) Https (mod_ssl) <= xem thêm cách cài đặt và
cấu hình.
#1.1: Tránh sử dụng FTP, Telnet, và Rlogin / Rsh
Bất kỳ ai nằm trên cùng một mạng với bạn đều có thể sử dụng một trình bắt gói tin
(packet sniffer) để tóm lấy các thông tin (như thông số cấu hình mạng, username,
password, câu lệnh, file…) chưa được mã hóa được gửi bởi các chương trình như FTP,
Telnet, Rlogin/Rsh. Giải pháp chung cho vấn đề này là chuyển sang sử dụng các chương
trình như OpenSSH , SFTP, hoặc FTPS. Đối với Fedora/CentOS/RHEL, gõ câu lệnh sau
để xóa bỏ NIS, rsh và các dịch vụ lỗi thời khác:
# yum erase inetd xinetd ypserv tftp-server telnet-server rsh-serve
#2: Giảm tối thiểu các gói phần mềm được cài đặt
Bạn có thật sự cần cài đặt hết tất cả các loại web service (Apache, IIS…) không? Hãy
tránh cài đặt các gói phần mềm không cần thiết để tránh nguy cơ lỗ hổng ẩn chứa trong
các phần mềm đó bị khai thác. Sử dụng các trình quản lý gói như yum, rpm, apt-get,
dpkg… để xem tất cả các gói đã cài trên hệ thống. Sau đó, xóa bỏ các gói không cần thiết.
Đối với Redhat-based Distro
# yum list installed
# yum list packageName
# yum remove packageName
Hoặc với Debian-based Distro
Tăng cường bảo mật cho máy chủ Linux Page 2
# dpkg –list
# dpkg –info packageName
# apt-get remove packageName
#3: Mỗi dịch vụ mạng chạy trên một hệ thống thực (hoặc máy ảo) riêng biệt
Nếu có thể, bạn nên chạy các dịch vụ mạng khác nhau trên các server tách biệt nhau.
Điều này giúp giảm thiểu rủi ro các dịch vụ sẽ bị “chết chùm” khi chúng nằm trên cùng
một server. Ví dụ, nếu một hacker có thể khai thác thành công một lỗ hổng của phần
mềm như Apache, hắn sẽ có toàn quyền truy cập vào server và gây ảnh hưởng cho các
dịch vụ khác như MySQL, e-mail nằm trên cùng server với Apache. Xem thêm cách cài
đặt và cấu hình môi trường ảo hóa trên Linux:
• Install and Setup XEN Virtualization Software on CentOS Linux 5
• How To Setup OpenVZ under RHEL / CentOS Linux
#4: Cập nhật đầy đủ và thường xuyên cho Linux kernel và
các phần mềm khác
Tăng cường bảo mật cho máy chủ Linux Page 3
Áp dụng các bản vá bảo mật là một công việc quan trọng trong kế hoạch bảo trì Linux
sever. Linux cung cấp tất cả các công cụ cần thiết để đảm bảo hệ thống của bạn luôn
được cập nhật, đồng thời giúp nâng cấp dễ dàng giữa các phiên bản. Bạn nên kiểm duyệt
và áp dụng tất cả các bản cập nhật ngay khi có thể. Một lần nữa, sử dụng yum, apt-get…
để thực hiện việc cập nhật này.
# yum update
hoặc
# apt-get update && apt-get upgrade
Bạn có thể cấu hình cho Red hat / CentOS / Fedora để nhận thông báo về các bản cập
nhật mới qua email (xem thêm update notification via email), dưới Debian / Ubuntu có
thể sử dụng apticron. Một tùy chọn khác để cài đặt tất cả các bản cập nhật là sử dụng cron
(xem thêm all security updates ).
#5: Sử dụng Linux Security Extensions
Có nhiều công cụ giúp bảo vệ Linux trước các lỗi bảo mật như cấu hình hệ thống lỏng
lẻo, tạo kẽ hở cho kẻ xâm nhập, các chương trình bị tấn công… Nếu có thể, bạn nên sử
dụng SELinux và các security extension khác để quản lý chặt chẽ các chương trình và
mạng (xem thêm SELinux and other Linux security). Ví dụ, SELinux cung cấp khá nhiều
các chính sách bảo mật khác nhau dành cho Linux kernel.
#5.1: SELinux
Khuyến khích các bạn sử dụng cơ chế Mandatory Access Control (MAC) mà SELinux
cung cấp. Còn theo cơ chế DAC (Discretionary Access Control), một ứng dụng hoặc tiến
trình được khởi chạy bởi người dùng nào đó thì ứng dụng này có các quyền hạn trên các
đối tượng (file, socket,…) giống với quyền hạn của người dùng đã khởi chạy nó. Việc
chạy MAC giúp bảo vệ hệ thống khỏi bị phá hoại bởi các chương trình độc hại hoặc chứa
lỗi. Giải thích chi tiết cấu hình cho SELinux có trong kho tài liệu chính thức của Redhat.
Xem thêm:
20 cách giúp tăng cường bảo mật cho Linux server – Phần 1
Tăng cường bảo mật cho máy chủ Linux Page 4
20 cách giúp tăng cường bảo mật cho Linux server – Phần 2
20 cách giúp tăng cường bảo mật cho Linux server – Phần 3
20 cách giúp tăng cường bảo mật cho Linux server – Phần 2
• 2 Comments
Tiếp theo phần 1 của loạt bài viết về bảo mật cho Linux server. Ở phần 2 này, tôi xin giới
thiệu tới các bạn 5 cách nữa để tăng cường an ninh cho máy chủ chạy Linux.
Xem thêm:
20 cách giúp tăng cường bảo mật cho Linux server – Phần 1
20 cách giúp tăng cường bảo mật cho Linux server – Phần 2
20 cách giúp tăng cường bảo mật cho Linux server – Phần 3
#6: Quản lý tài khoản người dùng và chính sách mật khẩu mạnh
Sử dụng lệnh useradd/usermod để tạo và quản lý các tài khoản người dùng. Hãy đảm bảo
rằng bạn áp dụng chính sách mật khẩu mạnh. Ví dụ, một mật khẩu mạnh bao gồm ít nhất
8 ký tự và kết hợp cả chữ cái, chữ số, ký tự đặc biệt, chữ hoa, chữ thường… Nhưng hầu
hết mọi người đều chọn một mật khẩu dễ ghi nhớ. Điều này tạo cơ hội để hacker sử dụng
các công cụ như John the ripperđể dò tìm các mật khẩu yếu trên server của bạn. Cấu hình
file pam_cracklib.so để thực thi chính sách mật khẩu mà bạn mong muốn.
Tăng cường bảo mật cho máy chủ Linux Page 5
#6.1: Thời gian tồn tại của mật khẩu (password aging)
Lệnh chage cho phép thay đổi số ngày giữa các lần thay đổi mật khẩu và ngày thay đổi
mật khẩu lần cuối. Dựa vào 2 thông tin này, hệ thống sẽ xác định xem khi xem nào người
dùng cần thay đổi mật khẩu của họ. File /etc/login.defs cũng bao gồm cấu hình password
aging.
Để vô hiệu hóa password aging, tức là mật khẩu sẽ không bao giờ hết hạn, bạn gõ lệnh
sau:
# chage -M 99999 userName
Để xem thông tin về thời gian mãn hạn của mật khẩu, gõ:
# chage -l userName
Cuối cùng, bạn cũng có thể chỉnh sửa file /etc/shadow file theo sự giải thích về các
trường dưới đây:
{userName}:{password}:{lastpasswdchanged}:{Minimum_days}:{Maximum_days}:
{Warn}:{Inactive}:{Expire}:
1. Minimum_days: Số ngày tối thiểu để thay đổi mật khẩu. Tức là, trước khi người
dùng được phép thay đổi mật khẩu của họ thì mật khẩu phải tồn tại ít nhất trong
Mininum_days ngày.
2. Maximum_days: Số ngày tối đa mà mật khẩu còn hiệu lực. Tức là, sau khi mật
khẩu đã tồn tại trong Maximum_days ngày, người dùng bắt buộc phải thay đổi mật
khẩu của họ.
3. Warn : Số ngày trước khi mật khẩu hết hạn mà người dùng sẽ nhận được cảnh báo
rằng mật khẩu của họ cần phải được thay đổi.
Tăng cường bảo mật cho máy chủ Linux Page 6
4. Expire : Số ngày kể từ ngày 01/01/1970 tài khoản sẽ bị khóa
Khuyên cáo bạn nên sử dụng lệnh chage thay vì tự tay chỉnh sửa file /etc/shadow.
Xem thêm
• Linux: Force Users To Change Their Passwords Upon First Login
• Linux turn On / Off password expiration / aging
• Lock the user password
• Search for all account without password and lock them
• Use Linux groups to enhance security
#6.2: Hạn chế sử dụng lại các mật khẩu trước đó
Trong Linux, bạn có thể ngăn chặn tất cả các người dùng sử dụng lại các mật khẩu cũ, đã
từng sử dụng trước đó. Tham số remember của module pam_unixcho biết số lượng các
mật khẩu trước đó sẽ không được sử dụng lại.
#6.3: Khóa tài khoản sau một số lần đăng nhập thất bại
Dưới Linux, bạn có thể sử dụng lệnh faillog để hiển thị các bản ghi hoặc để thiết lập giới
hạn số lần đăng nhập thất bại.
Để mở khóa cho tài khoản sau khi tài khoản này bị khóa sau 1 số lần đăng nhập thất bại,
gõ:
# faillog -r -u userName //–reset = -r
Lưu ý: bạn có thể sử dụng lệnh passwd để khóa hoặc mở khóa tài khoản
Tăng cường bảo mật cho máy chủ Linux Page 7
# passwd -l userName //khóa tài khoản
# passwd -u userName //mở khóa tài khoản
#6.4: Xác định các tài khoản sử dụng mật khẩu rỗng
Bạn gõ lệnh sau:
# awk -F: ‘($2 == “”) {print}’ /etc/shadow
Khóa tài khoản có mật khẩu rỗng
# passwd -l accountName
#6.5: Đảm bảo rằng không có người dùng thông thường nào có UID = 0
Chỉ có tài khoản root có UID =0 với quyền hạn cao nhất để truy cập vào hệ thống. Gõ
lệnh sau để hiển thị tất cả các tài khoản với UID = 0
# awk -F: ‘($3 == “0″) {print}’ /etc/passwd
Bạn sẽ thấy ít nhất 1 dòng tương ứng với tài khoản root như sau:
root:x:0:0:root:/root:/bin/bash
Trường thứ 3 cho biết giá trị UID. Nếu có thêm các tài khoản khác có UID =0, hãy đổi lại
UID cho những tài khoản này sử dụng lệnh sau:
# usermod –u new_UID userName
#7: Đừng bao giờ đăng nhập với root
Tăng cường bảo mật cho máy chủ Linux Page 8
Hạn chế tối đa đăng nhập với tài khoản root! Thay vào đó, bạn nên sử dụng sudo để thực
thi các lệnh với quyền root khi cần thiết mà không cần phải cung cấp mật khẩu của root.
Ngoài ra, sudo cũng cung cấp các tính năng auditing và tracking giúp bạn biết được
người dùng đã chạy những lệnh sudo nào.
#8: Bảo mật vật lý cho server
Cấu hình lại BIOS và vô hiệu hóa việc khởi động từ các thiết bị ngoại vi như
DVD/CD/USB. Bạn cũng nên đặt mật khẩu bảo vệ cho GRUB. Những máy chủ quan
trọng cần được khóa cẩn thận trong các IDC (Internet Data Center) và tất cả mọi người
phải trải qua các bước kiểm tra an ninh trước khi truy cập vào server của bạn. Xem thêm:
• 9 Tips To Protect Linux Servers Physical Console Access.
#9: Tắt hết các dịch vụ không cần thiết
Bạn cần loại bỏ tất cả các dịch vụ (service hoặc daemon) không cần thiết khỏi quá trình
khởi động của hệ thống. Điều này giúp gia tăng tốc độ hoạt động cũng như sự ổn định
của hệ thống và quan trọng hơn là giúp server giảm thiểu được nguy cơ bị tấn công bề
mặt (surface attack) vào các dịch vụ ẩn chứa lỗ hổng. Sử dụng lệnh chkconfig để liệt kê
tất cả các dịch vụ được khởi chạy cùng hệ thống ở runlevel 3
# chkconfig –list | grep ’3:on’
Để tắt một dịch vụ nào đó, gõ:
# service serviceName stop
Hoặc
# chkconfig serviceName off
#9.1: Tìm các cổng dịch vụ (port) đang mở trên server
Tăng cường bảo mật cho máy chủ Linux Page 9
Sử dụng lệnh sau để liệt kê tất cả các port đang mở và các chương trình sử dụng các port
đó.
netstat -tulpn
hoặc
nmap -sT -O localhost
nmap -sT -O server.example.com
Sử dụng iptables để đóng các port đang mở hoặc sử dụng 2 lệnh service và chkconfig ở
trên để tắt các dịch vụ mạng không cần thiết.
#9.2: Xem thêm
• update-rc.d like command on Redhat Enterprise / CentOS Linux.
• Ubuntu / Debian Linux: Services Configuration Tool to Start / Stop System
Services.
• Get Detailed Information About Particular IP
#10: Gỡ bỏ X Windows
Thành phần đồ họa X Windows thật không cần thiết chạy trên Linux server! Không có lý
do nào lại chạy X Windows trên Mail server hoặc Apache web server của bạn. Bạn có thể
loại bỏ hoàn toàn X Windows để nâng cao hiệu suất hoạt động và bảo mật cho server
theo các bước sau:
- Chỉnh sửa file /etc/inittab để thiết lập cho Linux khởi chạy ở runlevel 3.
- Xóa X Windows system bằng lệnh yum
# yum groupremove “X Window System”
20 cách giúp tăng cường bảo mật cho Linux server – Phần 3
Tăng cường bảo mật cho máy chủ Linux Page 10
Chúng ta sẽ tiếp tục cùng tìm hiểu thêm 5 cách trong phẩn 3 này
để bảo mật cho Linux server
Xem thêm:
20 cách giúp tăng cường bảo mật cho Linux server – Phần 1
20 cách giúp tăng cường bảo mật cho Linux server – Phần 2
20 cách giúp tăng cường bảo mật cho Linux server – Phần 3
#11: Cấu hình cho Iptables và TCPWrappers
Iptables là một chương trình hoạt động ở user space (hay userland, user mode – vùng bộ
nhớ dành cho các chương trình người dùng, trái với kernel space – vùng bộ nhớ dành
riêng cho các chương trình hệ thống như hệ điều hành, driver,…). Iptables cho phép bạn
cấu hình tính năng firewall (Netfilter) được cung cấp bởi Linux kernel. Bạn sử dụng
firewall để cản lọc các gói tin đi vào và đi ra từ máy tính hoặc hệ thống mạng của bạn.
Bên cạnh đó, TCPWrappers – một hệ thống kiểm soát truy cập mạng cho host (host-
based networking ACL system) cho phép bạn lọc các yêu cầu kết nối ra mạng ngoài (ví
dụ, Internet). Bạn có thể ngăn chặn nhiều cuộc tấn công từ chối dịch vụ với sự trợ giúp
của Iptables. Xem thêm:
• Lighttpd Traffic Shaping: Throttle Connections Per Single IP (Rate Limit).
• How to: Linux Iptables block common attack.
• psad: Linux Detect And Block Port Scan Attacks In Real Time.
#12: Bảo vệ Linux Kernel với /etc/sysctl.conf
Tăng cường bảo mật cho máy chủ Linux Page 11
File /etc/sysctl.conf được sử dụng để cấu hình các tham số cho kernel tại thời điểm kernel
được thực thi. Linux đọc và áp dụng các thiết lập trong file này tại quá trình khởi động.
Dưới đây là nội dung mẫu của file /etc/sysctl.conf
# Turn on execshield
kernel.exec-shield=1
kernel.randomize_va_space=1
# Enable IP spoofing protection
net.ipv4.conf.all.rp_filter=1
# Disable IP source routing
net.ipv4.conf.all.accept_source_route=0
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_messages=1
# Make sure spoofed packets get logged
net.ipv4.conf.all.log_martians = 1
#13: Chia tách các phân vùng ổ cứng
Tách biệt các file của hệ điều hành khỏi các chương trình, dữ liệu cá nhân của người
dùng. Hay nói cách khác, đặt các loại dữ liệu này trên các phân vùng khác nhau, sẽ giúp
hệ thống chạy ổn định và an toàn hơn. Đảm bảo rằng các hệ thống file (filesystem) dưới
đây được gắn (mount) trên các phân vùng riêng rẽ:
• /usr
• /home
• /var và /var/tmp
• /tmp
Tăng cường bảo mật cho máy chủ Linux Page 12
Tạo thêm các phân vùng tách biệt cho Apache và FTP server. Chỉnh sửa file /etc/fstab và
chắc rằng bạn đã thêm vào các tùy chọn cấu hình sau:
1. noexec – Không gán quyền thực thi (execute) cho các file nhị phân (binary) trên
phân vùng này. Điều này sẽ ngăn cản việc thực thi file binary nhưng cho phép
chạy các script.
2. nodev – Không cho phép (hoặc diễn dịch) các thiết bị kiểu character hoặc thiết bị
kiểu block trên phân vùng này.
3. nosuid – Các SUID/SGID sẽ mất hiệu lực trên phân vùng này.
Chú thích:
- character device: thiết bị cho phép đọc/ghi 0 hoặc nhiều byte thành từng luồng
(stream) có kích thước không cố định. Ví dụ; TTY, bàn phím…
- block device: thiết bị cho phép đọc/ghi lên nó một khối các byte có kích thước cố
định. Ví dụ: ổ cứng, ổ flash…
Ví dụ, một dòng mẫu trong file /etc/fstab dưới đây sẽ giới hạn việc truy cập của người
dùng trên phân vùng /dev/sda5 (thư mục gốc trên FPT server):
/dev/sda5 /ftpdata ext3 defaults,nosuid,nodev,noexec 1 2
#13.1: Hạn ngạch ổ đĩa (Disk Quotas)
Hãy chắc rằng Disk Quota được kích hoạt cho tất cả người dùng. Để triển khai Disk
quotas, bạn làm theo các bước sau:
1. Kích hoạt quotas trên các filesytem bằng cách chỉnh sửa file /etc/fstab.
2. Mount lại các filesystem đó.
Tăng cường bảo mật cho máy chủ Linux Page 13
3. Tạo các file cơ sở dữ liệu cho quota và khởi tạo bảng sử dụng ổ cứng.
4. Gán các chính sách hạn ngạch (quota policy).
5. Xem chi tiết các bước làm tại đây.
#14: Tạm thời tắt IPv6
Internet Protocol version 6 (IPv6) là một giao thức
mới hoạt động ở tầng Internet của bộ giao thức mạng TCP/IP. IPv6 đang dần thay thế cho
IPv4 do những lợi ích mà nó mang lại. Hiện tại, vẫn chưa có công cụ tốt nào có thể kiểm
tra các vấn đề bảo mật trên hệ thống hỗ trợ IPv6. Hầu hết các Distro Linux đã bắt đầu hỗ
trợ giao thức IPv6. Các cracker có thể gửi các lưu lượng độc hại thông qua IPv6 vì hầu
hết các quản trị viên chưa giám sát các lưu lượng IPv6 này. Vì thế, trừ khi hệ thống mạng
yêu cầu sử dụng IPv6, tốt nhất bạn nên tạm thời vô hiệu hóa IPv6 hoặc cấu hình trên
Firewall để cản lọc các gói tin IPv6. Xem thêm:
• RedHat / Centos Disable IPv6 Networking.
• Debian / Ubuntu And Other Linux Distros Disable IPv6 Networking.
• Linux IPv6 Howto – Chapter 19. Security.
• Linux IPv6 Firewall configuration and scripts are available here.
#15: Loại bỏ các bit SUID/SGID khỏi các file không cần thiết phải bật các bit này
Tất cả các file có các bit SUID/SGID được bật có thể bị lạm dụng khi các file này có lỗi
hoặc chứa lỗ hổng bảo mật. Các người dùng cục bộ hoặc ở xa đều có thể chạy các file
như vậy. Việc tìm ra các file có bật các bit SUID/SGID một cách không cần thiết là một ý
tưởng tốt. Sau đây là cách hiện thực ý tưởng này với lệnh find
#Tìm tất cả các file có bật bit SUID
find / -perm +4000
Tăng cường bảo mật cho máy chủ Linux Page 14
# Tìm tất cả các file có bật bit SGID
find / -perm +2000
# Hoặc kết hợp cả 2 thao tác trên với một lệnh duy nhất
find / \( -perm -4000 -o -perm -2000 \) –print
find / -path -prune -o -type f -perm +6000 –ls
Tiếp đến, bạn cần xem manpage của từng file để tìm hiểu về chức năng của nó. Nếu file
nào không cần thiết phải có bit SUID/SGID được bật, bạn gõ lệnh sau để loại bỏ các bit
này khỏi file:
# chmod u-s filename
# chmod g-s filename
#15.1: Các file có thể được ghi bởi bất kỳ ai (world-writable file)
Bất kỳ ai có thể chỉnh sửa các world-writable file sẽ dẫn tới rủi ro về bảo mật. Sử dụng
lệnh sau để tìm tất cả các thư mục con dạng world-writable trong thư mục /dir và các thư
mục này có sticky bit được bật.
find /dir -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
Sau đó, bạn cũng cần tìm hiểu kỹ về từng file và thư mục trong kết quả đầu ra của lệnh để
cấp phát quyền hạn truy cập phù hợp cho chúng.
#15.2: Các file không thuộc quyền sở hữu của bất kỳ ai (noowner file)
Tìm các file như vậy với lệnh sau:
find /dir -xdev \( -nouser -o -nogroup \) –print
Tăng cường bảo mật cho máy chủ Linux Page 15