20 cách giúp tăng cường bảo mật cho Linux server

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ụ fusesshfs, 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 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

# 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:

#4: Cập nhật đầy đủ và thường xuyên cho Linux kernel và các phần mềm khác

Á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.

#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.

#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.
  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.

#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

# 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

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: 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

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 servicechkconfig ở trên để tắt các dịch vụ mạng không cần thiết.

#9.2: Xem thêm

#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”

#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.

#12: Bảo vệ Linux Kernel với /etc/sysctl.conf

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ạ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 đó.
  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.

#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ì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

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 hoặc xóa chúng.

manthang

Add a Comment

Your email address will not be published.