Tải bản đầy đủ (.docx) (17 trang)

Các bước thiết lập cấu hình an toàn máy chủ linux unix

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (283.39 KB, 17 trang )

KIỂM TRA THIẾT LẬP VÀ CẤU HÌNH HỆ THỐNG MÁY CHỦ
Linux/Unix
1. Tổng quan về hệ điều hành Linux
Linux là hệ điều hành máy tính được xây dựng và phát triển trên nên tảng mã nguồn
mở. Mặc dầu có rất nhiều phiên bản khác nhau, nhưng tất cả đều được xây dựng trên
nhân Linux (kernel) được Linus Torvalds phát triển năm 1992.
Linux có thể được cài đặt trên rất nhiều hệ thống thiết bị khác nhau (máy tính, thiết
bị di động, thiết bị mạng…). Đặc biệt Linux là lựa chọn hàng đầu cho các hệ thống máy
chủ trên thế giới.
Phần hạt nhân (lõi hay kernel) của Linux có thể hiểu đơn giản là một tập hợp các
chương trình thường trú trong bộ nhớ. Nó là phần chính của hệ điều hành, phụ trách hầu
hết các chức năng chính của hệ điều hành như quản lý bộ nhớ, thực thi nhiệm vụ và truy
nhập phần cứng Hệ nhân này luôn được cộng đồng nghiên cứu cải tiến liên tục nhằm
nâng cao hiệu năng cũng như tính tiện lợi cho nhiều đối tượng người dùng khác nhau.
Bên cạnh đó kho phần mềm phong phú cùng với khả năng hỗ trợ từ các kênh phân phối
khác nhau đã làm cho Linux ngày càng gần hơn với mọi đối tượng người dùng.
Một số bản phân phối Linux thường gặp: Ubuntu, Debian GNU/Linux, Red Hat
Enterprise Linux, CentOS, SUSE, Gentoo, Slackware, Knoppix….
2. Mã hóa dữ liệu 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 ta 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).
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.
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.
Tránh sử dụng FTP, Telnet, và Rlogin / Rsh
1
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
3. Quản lý dịch vụ hệ thống
Dịch vụ là các chương trình mà sau khi được khởi động sẽ luôn ở trạng thái sẵn
sàng để thực thi, phục vụ các yêu cầu. Có nhiều dịch vụ đòi hỏi phải luôn hoạt động cùng
hệ thống. Tuy nhiên có một số khác chỉ hoạt động khi thực sự cần thiết (vì lý do an toàn).
Vì vậy lựa chọn, sử dụng các dịch vụ một cách hợp lý cũng góp phần làm an toàn hơn đối
với các hệ thống máy chủ.
3.1. Tắt tất cả các dịch vụ không cần thiết khi khởi động
Cách tốt nhất để hệ thống an toàn là thực thi ít nhất các dịch vụ trên hệ thống. Sử
dụng các tiện ích có sẵn để liệt kê tất cả các dịch vụ đang thực thi trên hệ thống. Tiếp đó
xác định các dịch vụ nào là thực sự cần thiết, các dịch vụ còn lại nên tắt đi hoặc gỡ bỏ.
Ví dụ: Liệt kê tất cả các dịch vụ đang thực thi
Trên Ubuntu (Debian): # service status-all
Trên CentOS (Redhat): # chkconfig list | grep :on
Để tắt một dịch vụ nào đó trên server , ta gõ lệnh sau: # service serviceName stop
Hoặc gõ lệnh: # chkconfig serviceName off
3.2. Kiểm tra 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
2
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.
3.3. Một số dịch vụ cơ bản

Dịch vụ SSH:
SSH là dịch vụ khuyến nghị sử dụng trong các kết nối từ xa trong các hệ thống
Linux/Unix, SSH cung cấp một phương thức an toàn trong quá trình trao đổi dữ liệu giữa
hai hệ thống. Các hướng dẫn chi tiết về dịch vụ này được giới thiệu tại website

Một số giải pháp an toàn cho dịch vụ SSH: Thay đổi cổng hoạt động mặc định của
dịch vụ SSH nếu có thể (mặc định là cổng 22).
Để tránh nguy cơ tấn công Bruteforce trên SSH, bạn nên thay đổi port mặc định
SSH bằng lệnh sau: vi /etc/ssh/sshd_config. Sau đó thay đổi port 22 bằng port tuỳ ý. VD:
123 và chạy lại dịch vụ bằng lệnh: service sshd restart.
Giới hạn các địa chỉ IP được kết nối và đăng nhập vào dịch vụ SSH.
Dịch vụ DNS:
DNS là dịch vụ phân giải tên miền, có nhiệm vụ phân giải tên miền sang địa chỉ ip
và ngược lại. Dịch vụ này giúp người sử dụng không cần phải nhớ chính xác địa chỉ ip
của các server ở xa, thay vào đó người dùng chỉ cần nhớ tên miền của các server này. Tuy
nhiên, nếu cấu hình không an toàn không đúng phương pháp có thể dẫn tới các lỗi cho
server cũng như cho chính dịch vụ này. Một trong những lỗi nguy hiểm nhất cho dịch vụ
này là lỗi Zone Transfers.
Khi hệ thống bị lỗi này tin tặc có khả năng: Thu thập thông tin về các subdomain
bên trong, lợi dụng để tấn công các máy chủ DNS liên quan.
Một số giải pháp an toàn cho dịch vụ DNS: Sử dụng các phiên bản mới nhất cho
DNS server, thiết lập các tập tin cấu hình một cách hợp lý.
Hệ thống X-windows:
3
Trong khoa học máy tính, Hệ thống X-Window (còn được gọi tắt là X11 hay X) là
một hệ thống cửa sổ dùng để hiển thị đồ họa bitmap. Nó cung ứng một bộ các công cụ và
giao thức cho phép người dùng xây dựng các giao diện đồ họa (GUI) trong hệ điều hành
Unix, tựa Unix, và OpenVMS. X còn được hỗ trợ hầu hết trong các hệ điều hành hiện
đại.
Số lượng chương trình quản lý cho X có rất nhiều hầu hết đều là miễn phí hay tự

do. Trong số đó hai chương trình được nhiều người yêu thích và sử dụng nhất (chiếm trên
90% thị phần của các trình quản lý cho X) đó là GNOME và KDE.
Việc sử dụng hệ thống X-windows trên các hệ thống gần như không cần thiết khi
nguời quản trị có các kênh đăng nhập từ xa an toàn qua SSH. Nếu không thực sự cần thiết
thì nên gỡ bỏ hệ thống này để hạn chế thấp nhất các nguy cơ có thể có đối với hệ thống.
Ta có thể xóa bỏ X Windows system bằng lệnh:
# yum groupremove "X Window System"
4. Gỡ bỏ các gói phần mềm không cần thiết
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
4
5. Cập nhật đầy đủ, thường xuyên các bản vá lỗi cho Linux kernel và các phần mềm
khác
Cập nhật 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. Quản trị hệ
thống nên thường xuyên kiểm tra và áp dụng tất cả các bản cập nhật ngay khi có thể.
Lệnh thực hiện:
# yum update
# apt-get update && apt-get upgrade

6. Quản lý tài khoản người dùng và chính sách mật khẩu mạnh
6.1. Bảo vệ đăng nhập mức hệ thống
Thông thường, quá tình đăng nhập hệ thống Linux được điều khiển bởi chương
trình đăng nhập. Chương trình này sẽ đọc thông tin từ hai tập tin /etc/passwd và
/etc/shadow. Nếu thông tin đăng nhập phù hợp thì người dùng sẽ được cung cấp shell để
truy cập vào hệ thống. Cơ chế đăng nhập bằng tài khoản và mật khẩu thường đối mặt với
một số nguy cơ như: tấn công đoán tài khoản, mật khẩu, nghe lén (sniffing), tấn công
đứng giữa (man-in-the-middle).
Vì vậy cần phải đảm bảo một số yêu cầu sau:
6.1.1. Kiểm tra thời gian tồn tại của mật khẩu (password aging)
Sử dụng 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 ngày, hệ thống sẽ xác định xem khi
nào người dùng cần thay đổi mật khẩu của họ.
Để vô hiệu hóa password aging, tức là mật khẩu sẽ không bao giờ hết hạn, ta gõ
lệnh sau:
# chage -M 99999 userName
Để kiểm tra thông tin về thời gian mãn hạn của mật khẩu của một tài khoản, gõ:
# chage -l userName
5
Cuối cùng, ta 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}:
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.
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ọ.
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.
Expire : Số ngày kể từ ngày 01/01/1970 tài khoản sẽ bị khóa.
6.1.2. Kiểm tra xem các tài khoản có sử dụng lại các mật khẩu trước đó không
PAM là một cơ chế linh hoạt cho việc chứng thực người dùng. Ví dụ, bạn có thể
ngăn cấm người dùng sử dụng lại các mật khẩu đã từng sử dụng gần đây. Điều này được
hiện thực bằng cách sử dụng tùy chọn ghi nhớ (remember option) cho pam_unix – một
module của PAM.
Module này cung cấp cho các module PAM khác các tính năng như authentication
(chứng thực), account management (quản lý tài khoản)… Ngoài ra, pam_unix còn lưu
giữ một danh sách các mật khẩu cũ của mọi người dùng. Điều này thực sự hữu ích nếu
bạn muốn cấm cản ai đó muốn sử dụng lại các mật khẩu cũ này. Danh sách các mật khẩu
cũ nằm trong file /etc/security/opasswd. Lưu ý, chỉ khi nào bạn kích hoạt tính năng ghi
nhớ các mật khẩu cũ như hướng dẫn dưới đây thì file opasswd này mới chứa các mật
khẩu cũ của tất cả người dùng.
Cách giới hạn việc sử dụng lại các mật khẩu cũ :
Trong Debian/Ubuntu, mở file /etc/pam.d/common-password sử dụng lệnh:
6
# vi /etc/pam.d/common-password
Trong CentOS/RHEL/Fedora, chỉnh sửa file /etc/pam.d/system-auth lệnh:
# vi /etc/pam.d/system-auth
Bây giờ, bạn tìm tới dòng bắt đầu bằng password sufficient và thêm vào cuối dòng
này tùy chọn remember=10. Thay số 10 bằng số lượng mật khẩu gần đây nhất mà sẽ
không được phép sử dụng lại.
Lưu và đóng file này.
Kể từ lúc này, Linux sẽ ghi nhận lại 10 mật khẩu gần đây nhất. Nếu người dùng
thử sử dụng lại bất kỳ mật khẩu nào trong số 10 mật khẩu cũ này thì sẽ nhận được thông
báo lỗi sau:
6.1.3. Khóa tài khoản sau một số lần đăng nhập thất bại
Người quản trị cần phải cấu hình để khóa một tài khoản sau số lần đăng nhập thất
bại để bảo vệ khỏi bị tấn công Brute-force. Lệnh # vi /etc/pam.d/system-auth

Sau đó sửa dòng: account required pam_tally.so deny=3 no_magic_root
lock_time=180
deny=3: giới hạn số lần truy cập thất bại
7
lock_time=180: thời gian khóa tài khoản sau khi đă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 ta gõ lệnh: # faillog -r -u userName
Ta cũng 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
Để kiểm tra xem danh sách những tài khoản đang bị khóa ta sử dụng lệnh:
# faillog
6.1.4. Xác định các tài khoản sử dụng mật khẩu rỗng
Để kiểm tra xem hệ thống có tài khoản sử dụng mật khẩu rỗng không sử dụng
lệnh: # awk -F: '($2 == "") {print}' /etc/shadow
Để khóa một tài khoản sử dụng mật khẩu rỗng ta sử dụng lệnh: # passwd -l
accountName
6.1.5. Kiểm tra hệ thống đả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 mới 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
8
6.2. Bảo vệ các truy cập vật lý
Thiết lập mật khẩu BIOS: nhằm ngăn chặn, không cho phép sửa thông tin cấu hình

trong BIOS.
Thiết lập mật khẩu cho trình khởi động (boot loader): ngăn chặn việc thay đổi
thông tin trong trình khởi động.
Tắt tất cả các cổng không sử dụng (iLo - Integrity Integrated Lights-Out, USB,
NIC)
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
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.
7. Sử dụng chế độ bảo mật mặc định của Kernel
Trong Kernel của một số hệ thống Linux mới hiện giờ có cấu hình sẵn một vài
Rules chuẩn với mục đích cung cấp những thông số căn bản nhất để cấu hình tăng thêm
tính bảo mật cho hệ thống. Các File và thông số đó thường được chứa ở /proc/sys. Về
căn bản giao thức IPV4, chứa bên trong /proc/sys/net/ipv4 cung cấp các tính năng căn
bản:
icmp_echo_ignore_all: Vô hiệu hoá tất cả các yêu phản hồi ICMP ECHO. Sử dụng
tuỳ chọn này nếu như bạn không muốn hệ thống của mình trả lời các yêu cầu Ping.
icmp_echo_ignore_broadcasts: Vô hiệu hoá tất cả các yêu cầu phản hồi ICMP
ECHO trên Broadcast và Multicast. Tùy chọn này được sử dụng để ngăn chặn nguy cơ hệ
thống của bạn có thể bị lợi dụng khai thác cho những cuộc tấn công DDOS.
ip_forward: Cho phép hay không cho phép sự chuyển tiếp IP giữa các giao diện
mạng trong hệ thống của bạn. Tuỳ chọn này được sử dụng khi bạn muốn Server của
mình hoạt động như Router.
ip_masq_debug: Kích hoạt hay vô hiệu hoá quá trình gỡ lỗi cho IP Masquerading.
tcp_syncookies: Tuỳ chọn này được sử dụng để bảo vệ hệ thống của bạn chống các
cuộc tấn công sử dụng kỹ thuật ngập SYN.
9
rp_filter: Chứng thực và xác định địa chỉ IP nguồn hợp lệ. Tuỳ chọn này được sử
dụng để bảo vệ hệ thống của bạn chống lại các cuộc tấn công giả mạo địa chỉ IP "IP

Spoof".
secure_redirects: Chỉ chấp nhận chuyển tiếp những thông điệp ICMP cho những
Gateway tin tưởng trong danh sách.
log_martians: Ghi lại những Packet không được xử lý bởi Kernel.
Nếu bạn muốn vô hiệu hoá tính năng "ip_foward" đơn giản bạn chỉ việc sử dụng
lệnh: root@localhost# echo "0" > /proc/sys/net/ipv4/ip_forward
Tương tự để kích hoạt tính năng nào bạn chỉ việc thay giá trị "0" bằng "1"
8. 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.
Mở file aliases: # vi /etc/modprobe.d/aliases.conf
Tìm đến dòng : alias net-pf-10 ipv6
Thay thế bằng dòng : alias net-pf-10 off
alias ipv6 off
9. Cơ chế ghi nhật ký
Quá trình ghi lại các hoạt động của hệ thống cần thiết trong nhiều trường hợp khác
nhau: kiểm tra, đánh giá hệ thống cũng như ứng dụng, lưu giữ các bằng chứng về các
hoạt động bất hợp pháp xảy ra đối với hệ thống…
Hoạt động ghi lại các thông báo của hệ thống một cách tập trung, nhất quán sẽ gia
tăng độ bảo mật cũng như thuận lợi hơn trong việc kiểm soát lỗi. Hạn chế tối đa hành
động xóa tập tin nhật ký của tin tặc.
10
Linux sử dụng hệ thống syslogd để hiển thị và lưu thông tin miêu tả về các sự kiện.
Hệ thống này cho phép kiểm soát chặt chẽ logging của các messages từ kernel, từ các tiến

trình đang chạy trên hệ thống, hoặc các hệ thống từ xa. Thông báo có thể hiển thị trên
console, trong tập tin log và trên màn hình text của người dùng trong hệ thống. Nội dung
cấu hình chứa trong tập tin /etc/syslog.conf
auth,user.* /var/log/messages
kern.* /var/log/kern.log
daemon.* /var/log/daemon.log
syslog.* /var/log/syslog
lpr,news,uucp,local0,local1,local2,local3,local4,local5,local6.*
/var/log/unused.log
10. Một số kiểu tấn công hệ thống, cách phòng chống
Brute-force:
Đây là một trong số các kỹ thuật tấn công xuất hiện dầu tiên. Brute-force không
quá nổi bật nhưng rất hiệu quả khi sử dụng tấn công các hệ thống Linux. Brute-force là
cách thức đoán username/password trên các dịch vụ yêu cầu chứng thực trước khi được
phép truy cập vào tài nguyên hệ thống. Kiểu tấn công này thường được sử dụng đối với
các dịch vụ sau:
- Telnet
- File Transfer Protocol (FTP)
- Secure Shell (ssh)
- SNMP community names
- Hypertext Transport Protocol (HTTP/HTTPS)
Trong giai đoạn thu thập thông tin về hệ thống đích, user name luôn được tin tặc
tiến hành thu thập. Sau khi đã liệt kê tất cả username liên quan, tin tặc sẽ sử dụng kỹ
thuật này để đoán tất cả password có thể có. Thực tế, các hệ thống sử dụng các tài khoản
mặc định (admin, administrator, root…) với mật khẩu đơn giản hoặc không có mật khẩu
vẫn còn rất nhiều. Mật khẩu có thể được đoán bằng phương pháp thủ công hoặc bằng các
công cụ tự động.
11
Một số công cụ sử dụng tấn công:
- THC – Hydra />- pop.c />- SNMPbrute />Ví dụ: Tin tặc sử dụng công cụ Hydra để thực hiện brute-force

Trong ví dụ này tin tặc đã sử dụng 2 tập tin chứa tài khoản đang nhập (users.txt)
và mật khẩu (passwords.txt) để đoán tài khoản mà mật khẩu đăng nhập dịch vụ SSH.
 Biện pháp đối phó
Biện pháp phòng ngừa tốt nhất là sử dụng cơ chế đặt mật khẩu mạnh (dộ dài, ký tự
thường, ký tự hoa, số, ký tự đặc biệt…) để gây khó khăn cho việc dự đoán.
Buffer overflow
Lỗi tràn bộ đệm xuất hiện khi một chương trình hoặc một tiến trình đang cố ghi
nhiều dữ liệu vào vùng đệm (vùng lưu dữ liệu tạm thời) mà vượt quá kích thước cho phép
của nó. Một số lỗi tràn bộ đệm thường gặp:
- Stack based Overflows.
- Heap based Overflows.
- Integer Overflows.
12
Stack based Overflows: là một kiểu tràn bộ đệm, nhưng ở đây lỗi tràn bộ đệm xảy
ra ở ngăn xếp (Stack). Ví dụ: khi dữ liệu tràn xuống stack của một hàm (function) đang
chạy thì dữ liệu có thể đè vào địa chỉ trả về (return address) của hàm làm cho nó trỏ đi
chỗ khác, làm cho kết quả chương trình bị sai lệch.
Lỗi này gây ra khi sử dụng các câu lệnh PUSH, AND, POP và có thể được khai
thác theo cách sau:
- Ghi đè một biến cục bộ nằm gần bộ nhớ đệm trong stack để thay đổi hành vi của
chương trình nhằm tạo thuận lợi cho kẻ tấn công.
- Ghi đè địa chỉ trả về trong một khung stack (stack frame). Khi hàm trả về, thực
thi sẽ được tiếp tục tại địa chỉ mà kẻ tấn công đã chỉ rõ, thường là tại một bộ đệm
chứa dữ liệu vào của người dùng.
Heap based Overflows: cũng là một kiểu tràn bộ đệm. Bộ nhớ heap được cấp phát
động bởi các ứng dụng tại thời gian chạy và thường chứa dữ liệu của chương trình. Việc
khai thác được thực hiện bằng cách phá dữ liệu này theo các cách đặc biệt để làm cho
ứng dụng ghi đè lên các cấu trúc dữ liệu nội bộ chẳng hạn các con trỏ của danh sách liên
kết.
Integer Overflows: Đây cũng là một trong số lỗi về tràn bộ đệm, khác với loại tràn

stack (stack-based) và loại tràn heap (heap-based), loại tràn số nguyên (integer overflow)
không ghi đè lên vùng nhớ nhưng khả năng ảnh hưởng cũng rất lớn. Vấn đề ở đây là
trong thực tế không có cách nào để kiểm tra kết quả tính toán sau khi nó đã thực thi. Vì
vậy sẽ xuất hiện tình trạng kết quả được lưu trữ sẽ khác với kết quả thực tế. Lỗi này xảy
ra đối với kiểu dữ liệu là số nguyên khi sử dụng các hàm malloc() và alloc(). Biện pháp
đối phó.
 Biện pháp đối phó
Đối với kiểu tấn công này, một số biện pháp sau sẽ giúp hạn chế thấp nhất khả
năng bị tấn công:
Lập trình an toàn: Biện pháp đối phó tốt nhất đối với tấn công này là phải có quy
trình lập trình an toàn. Mặc dù, không thể thiết kế một chương trình/ứng dụng không có
lỗi nhưng ít nhấtphải hạn chế tối đa khả năng sinh lỗi. Sau đây là một số khuyến nghị:
- Thiết kế chương trình/ứng dụng với tư duy an toàn phải được đặt ra đầu tiên.
13
- Sử dụng tính năng SSP (Stack Smashing Protector) được cung cấp bởi trình biên
dịch gcc trong Microsoft Visual Studio. Đối với nên tảng OpenBSD thì đặc tính
này được sử dụng mặc định.
- Có cơ chế kiểm tra các biến môi trường.
- Sử dụng các hàm an toàn như fgets(), strncpy(), và strncat().
- Giảm số lượng mã (code) thực thi với quyền root.
- Sử dụng các bản vá lỗi của các nhà cung cấp.
- Rà soát, đánh giá mỗi chương trình/ứng dụng: có thể tự thực hiện hoặc nhờ bên
thứ 3 để đánh giá sau khi chương trình/ứng dụng được lập trình.
- Tắt tất cả các dịch vụ không sử dụng hoặc nguy hiểm .
Format String
Đây là kiểu tấn công đã xuất hiện từ rất sớm, hiện nay chỉ còn gặp rất ít. Kiểu tấn
công này xuất hiện khi khai báo không đúng hoặc thiếu về kiểu dữ liệu trong chương
trình.
Kiểu tấn công này chỉ được thực thi khi chương trình/ứng dụng không có khả năng
kiểm tra dữ liệu nhập vào.

 Biện pháp đối phó
Rất nhiều kiểu tấn công Format String sử dụng cách thức tấn công như Buffer
Overflow. Vì thế có thể sử dụng các biện pháp như đã đề cập ở trên để đối phó kiểu tấn
công này
Tấn công dịch vụ FTP
Giao thức truyền tập tin (FTP), một trong số các giao thức được sử dụng nhiều
nhất ngày nay. Giao thức này cho phép tải lên (upload) và tải xuống (download) từ các hệ
thống từ xa. FTP thường được sử dụng để cho phép tuy cập các hệ thống từ xa để lưu trữ
các tập tin hợp lệ. Rất nhiều hệ thống cho phép truy cập với tài khoản trống (anonymous),
cho phép người dùng truy cập FTP server mà không cần chứng thực. Nguy cơ các truy
cập này bị sử dụng bởi tin tặc để leo thang đặc quyền, upload các tập tin, đoạn mã độc hại
lên server là rất cao.
 Biện pháp đối phó
14
- Nếu không sử dụng dịch vụ này thì nên tắt.
- Cập nhật các phiên bản FTP mới nhất.
- Sử dụng SFTP thay thế cho kết nối FTP.
11. Một sồ File về Security cần lưu ý trong Unix/Linux
Vị Trí Permission Chức Năng
/var/log 751 Thưc mục chứa tất cả Log File của hệ thống
/var/log/message 644 Những thông báo của hệ thống
/etc/crontab 600 Thư mục chứa các File liên quan đến Crontab
/etc/syslog.conf 640 File cấu hình của Syslog
/etc/logrotate.conf 640 File cấu hình điều khiển sự luân phiên của các
File Log
/var/log/wtmp 660 Hiển thị thông tin về những ai đã Logged vào hệ
thống
/var/log/lastlog 640 Ai đã Log vào hệ thống trước đây
/etc/ftpusers 600 Danh sách những User không được phép sử dụng
FTP

/etc/passwd 644 Danh sách các User trên hệ thống
/etc/shadow 600 Danh sách các Password được mã hoá cho các
User
/etc/pam.d 750 File cấu hình cho PAM
/etc/hosts.allow 600 File điều khiển sự cho phép các địa chỉ, Host…
/etc/hosts.deny 600 File điều khiển sự ngăn cản các địa chỉ, Host…
/etc/lilo.conf 600 File cấu hình trình quản lý khởi động trên Linux
/etc/securetty 600 TTY Interface mà root được phép đăng nhập
/etc/shutdown.allow 400 Danh sách những User được phép sử dụng tổ hợp
15
phím: Ctrl + Alt
/etc/security 700 File thiết lập quy tắc an toàn chung cho hệ thống
/etc/rc.d/init.d 750 Thư mục chứa các File chương trình khởi động
cùng hệ thống (Redhat)
/etc/init.d 750 Thư mục chứa các File chương trình khởi động
cùng hệ thống (Debian)
/etc/sysconfig 751 Thư mục chứa các File cấu hình hệ thống và
Network (Redhat)
/etc/inetd.conf 600 File định nghĩa các Service trên hệ thống
/etc/cron.allow 400 Danh sách các User được phép sử dụng Cron
/etc/cron.denny 400 Danh sách các User không được phép sử dụng
Cron
/etc/ssh 750 Thông tin cấu hình SSH
16
17

×