Thử thêm cái coi lào
Apr 15

Bảo mật cho Unix Hosting

I. Giới thiệu

Cùng với sự phát triển nhanh chóng của Internet, việc đưa các website lên mạng không còn phải là một điều xa lạ hay quá khó khăn đối với mỗi chúng ta. Công việc thiết kế và đưa website lên mạng này cũng có một bước phát triển đáng kể trong công nghệ làm web. Nếu trước kia các bạn mới chỉ thấy các website được viết dưới dạng file.html hay file.htm ( Hyper Text Markup Language ), thì ngày nay các tên file cũng xuất hiện thêm rất nhiều cũng mới nhiều ngôn ngữ lập trình web mới như ASP ( ActiveX Server Page), PHP (Personal Home Page), JSP (Java Server Page)… Tuy nhiên kèm theo nó là các vấn đề được nảy sinh liên quan đến an ninh và bảo mật. Việc bảo mật các website dần trở thành một trong các vấn đề sống còn của các website và của các quản trị mạng. Nó không còn đơn thuần chỉ là việc bản bảo vệ công sức bạn làm ra mà nó đã trở thành uy tín, danh dự của mỗi nhà cung cấp máy chủ trước các khách hàng.

Trong thời điểm hiện nay, các máy chủ dòng NT (WindowsNT, Win 2000 Server) với phần mềm quản trị IIS 5.0 đang được sử dụng rộng rãi trong các máy chủ của các công ty tin học lớn tại Việt Nam như VDC, FPT,… nhưng mặt khác dòng Unix (Linux, SunOS …) lại đang phát triển rất mạnh cùng với Apache HTTPD Server, PHP, CGI … Trong bài viết này tôi xin nêu ra sơ lược một số những giải pháp cơ bạn để giúp dỡ bạn ngăn chặn những cuộc tấn công ngoài mong đợi của các hacker trong hệ thống máy chủ Unix nói chung và hệ điều hành Linux, ngôn ngữ PHP nói riêng.



II. Kiến thức cơ bản

2.1 Unix/Linux căn bản

Linux là hệ điều hành đa người dùng, nghĩa là nhiều người có thể truy cập và sử dụng 1 máy tính cài Linux. Mỗi người muốn sử dụng được máy tính cài Linux thì phải có 1 account đã được đăng ký. Một accout gồm có 1 username và 1 password. Hai người khác nhau sẽ có 2 username khác nhau (nhưng password thì có thể trùng nhau). Để có thể bắt đầu thao tác và sử dụng, người dùng phải thực hiện thao tác đăng nhập (login và hệ thống). Quá trình này tóm gọn lại là 2 thao tác nhập vào username và password. Username và password cũng phân biệt chữ hoa và chữ thường. Và khi nhập vào password, trên màn hình sẽ không hiển thị bất cứ ký tự nào

Mỗi người dùng trên Linux được cấp một thư mục riêng (gọi là home directory), là một thư mục con của /home. Có dạng /home/ username; điều đ ó có nghĩa là nếu username bạn là luke thì home directory của bạn là /home/luke. Riêng đối với accout root thì home directory là /root. Account root có một quyền hạn tối cao đến server, có thể thêm/bớt các thành viên trong hệ thống, cài đặt các chương trình... Các user có thể cùng thuộc một nhóm (group) hoặc là khác nhóm; các user trong cùng một nhóm thì có quyền hạn như nhau. Thường thì tất cả các user đều thuộc vào nhóm User (trừ root và các account dành riêng cho hệ thống).

User chỉ có quyền thao tác trong home directory của mình (và những thư mục khác được phép của hệ thống) mà thôi. User này không thể truy cập vào home directory của user khác (trừ trường hợp được chính user đó hoặc root cho phép). Mỗi tập tin (file) và thư mục trên Linux đều được "đăng ký chủ quyền", nghĩa là thuộc về một user và group nào đó. Thường thì tập tin và thư mục được tạo bởi user nào thì sẽ thuộc về user đó. VD username của bạn là luke, bạn thuộc nhóm user và bạn tạo ra 1 tập tin có tên là myfile.txt thì tập tin myfile.txt sẽ được đánh dấu là "người sử hữu: luke; thuộc về nhóm: user". Những user khác không thể truy cập được myfile.txt nếu không được phép của bạn. Bạn hoàn toàn có thể thay đổi "chủ sở hữu" của tập tin/thư mục bằng các lệnh của Unix/Linux. Bạn hoàn toàn có thể đặt myfile.txt thuộc về user luke nhưng lại thuộc về nhóm guests (mặc dù user luke không nằm trong nhóm guests).



2.1.1 Một vài thư mục quan trọng trên Unix Server:

/home : nơi lưu giữ các file của mỗi người sử dụng ( Ví dụ: thành viên đăng nhập hệ thống có tên là Luke thì thư mục của thành viên là /home/Luke )

/bin : Các lệnh Unix cơ bản cần thiết (Ví dụ: ls, more ..)

/usr/bin : các lệnh khác , các lệnh dùng bởi người sử dụng đặc biệt và dùng quản trị hệ thống .

/usr/lib : Các thư viện chuẩn như libc.a

/usr/local/ : thường chứa những chương trình được setup tại đây ( ví dụ khi setup apache ta sẽ có /usr/local/apache/ )

/usr/src : Vị trí nguồn của các chương trình

/boot : Nơi mà kernel và các file khác được dùng khi khởi động .
/ect : Các file hoạt động phụ mạng , NFS ( Network File System ) Thư tín ( Đây là nơi mà chúng ta có thể bị khai thác nhiều nhất ).

/var : Các file quản trị như file bản ghi được các thiết bị sử dụng.

Việc có một hiểu biết cơ bản về tầm quan trọng của các thư mục sẽ giúp cho bạn dễ dàng hơn trong việc quản lí và bảo vệ hệ thống của bạn.



2.1.2 Thuộc tính của các file/directory trong Unix Systems

Các file trong hệ thống Unix có các thuộc tính đó là đọc (read), ghi (write) và thực thi (execute). Thuộc tính của tập tin/thư mục bao gồm 9bit, chia thành 3 phần như sau (r = read, w = write, x = execute ):



User
r
W
x

Group
r
W
x

Public
r
W
x




Nếu các bit trong phần user được bật (đặt bằng 1) thì user sở hữu tập tin/thư mục đó được quyền thao tác các lệnh tương ứng (đọc, ghi, thi hành) với tập tin/thư mục. Tương tự nếu các bit trong phần group được bật thì tất cả các user nằm trong nhóm sở hữu tập tin/thư mục đó sẽ được quyền thao tác các lệnh tương ứng; và nếu các bit trong phần public được bật thì các user thuộc các nhóm khác cũng có quyền thao tác với tập tin/thư mục (nếu bạn muốn tập tin/thư mục của bạn được truy cập từ internet thì bác bit tương ứng trong phần public phải được bật ).

Việc chmod các file đóng vai trò quan trọng trong việc bảo vệ các file hệ thống của bạn, nhất là khi bạn chmod các file cho phép public thưc hiên (đọc, ghi, thi hành). Tuy nhiên chúng ta sẽ tìm hiểu kĩ hơn về phần này ở các đoạn sau.



2.2 Unix Shell

2.2.1 Unix Shell là gì ?

Khi bắt đầu với Linux các bạn thường nghe đến từ Shell…, vậy Shell là gì. Shell là chương trình giữa bạn và Linux (hay nói chính xác hơn là giữa bạn với Linux kernel). Mỗi lệnh bạn gõ ra sẽ được Shell diễn dịch rồi chuyển tới nhân Linux. Nói một cách dễ hiểu Shell là bộ diễn dịch ngôn ngữ lệnh, ngoài ra nó còn tận dụng triệt để các trình tiện ích và chương trình ứng dụng có trên hệ thống…



2.2.2 Các loại Shell phổ biến

Unix là một mã nguồn mở, cũng chính vì vậy trong hệ thống Unix/Linux có rất nhiều các phiên bản shell. Sau đây là một số phiên bản thông dụng trong hệ thống Unix:

1. Shell Bourne (sh)

Đây là loại Shell nguyên thuỷ có mặt trên hầu hết các hệ thống Unix/Linux do Steven Bourne viết ra … Nó rất hữu dụng cho việc lập trình Shell nhưng nó không xử lý tương tác người dung như các Shell khác…

2. Bourne Again Shell (bash)

Đây là phần mở rộng của sh, nó kế thừa những gì sh đã có và phá huy những gì sh chưa có…Nó có giao diện lập trình rất mạnh và linh hoạt…Cùng với giao diện lệnh dễ dung…Đây là Shell được cài đặt mặc định trên các hệ thống Linux.

3. Shell C (csh)

Đáp ứng tương thích cho người dung…Nó hỗ trợ rất mạnh cho những Programmer C…và với đặc tính tự động hoàn thành dòng lệnh …

4. Shell Korn (ksh)

Có thể nói đây là một Shell tuyệt vời, nó kết hợp tính năng ưu việt của sh và csh…



Ngoài ra còn có một số Shell khác như: ssh, nfssh, mcsh…MC (Midnight Commander) một Shell thực hiện yêu cầu của người dùng thông qua môi trường đồ họa…Tương tự như NC (Norton Commander) trong DOS…



2.2.3 Các lệnh Shell căn bản.

1. Lệnh man: Khi bạn muốn biết cách sử dụng lệnh nào thì có thể dùng tới lệnh nay :

Ví dụ : $ man man

2. Lệnh " uname ": cho ta biết các thông tin cơ bản về hệ thống

Ví dụ : $uname -a ; nó sẽ đa ra thông tin sau :

Linux gamma 2.4.18 #3 Wed Dec 26 10:50:09 ICT 2001 i686 unknown

3. Lệnh id : xem uid/gid hien tai ( xem nhóm và tên hiện tại )

4. Lệnh w : xem các user đang login và action của họ trên hệ thống
Ví Dụ : $w nó sẽ đưa ra thông tin sau :

10:31pm up 25 days, 4:07, 18 users, load average: 0.06, 0.01, 0.00

4. Lệnh" cat, more ": in nội dung file ra màn hình

Vidu : $cat /etc/passwd | more --> nó sẽ đưa ra nội dung file passwd một cách nhanh nhất

$more /etc/passwd : Nó sẽ đa ra nội dung file passwd một cách từ từ

5. Lệnh ps: xem thông tin các process trên hệ thống

Ví dụ : $ps axuw

6. Lệnh ls: liệt kê nội dung thư mục

Ví dụ : $ls -laR

7. Lệnh pwd: in ra thư mục hiện hành

Ví dụ : $pwd , nó sẽ cho ta biết vị trí hiện thời của ta ở đâu :

/home/luke
8. Các lệnh : cp, mv, rm có nghĩa là : copy, move, delete file

Ví dụ : với lệnh rm : $rm -rf /var/tmp/blah : nó sẽ xoá file blah

Tương tự đối với các lệnh còn lại

9. Lệnh find : tìm kiếm file, thư mục

10 . lệnh cd : bạn muốn di chuyển đến thư mục nào . phải nhờ đến lệnh này .

Ví du : $ cd /usr/bin và nó sẽ đa bạn đến bin.

11 . Lệnh mkdir : tạo 1 thư mục .

Ví dụ : $ mkdir /home/luke : nó sẽ tạo 1 thư mục luke

trong /home

12. Lệnh rmdir : gỡ bỏ thư mục

Ví dụ : $ rmdir /home/luke và nó sẽ gỡ bỏ thư mục luke

13. Lệnh ls : Liệt kê các file trong thư mục

Ví Dụ : $ ls /home , bạn sẽ nhận được danh sách các file, thư mục co trong /home

14. Lệnh chmod: thay đổi thuộc tính của các file/directory

Ví dụ : $ chmod 755 /home/luke , thư mục luke sẽ có thuộc tính như sau drwxr-x-r-x , hẳn các bạn đã rõ về thuộc tính của file và folder mà tôi đã nêu ở phần trước.

15. Lệnh chown, chgrp : thay đổi người sở hữu/nhóm sở hữu của file hoặc thư mục.

Ví dụ : $ chown luke test.txt

$ chgrp hva test.txt

Sau lệnh này, thành viên luke có thể toàn quyền sử dụng đối với file test.tx (đọc, ghi, thi hành ) và tất cả các thành viên khác trong cùng một nhóm hva cũng có quyền hạn tương tự.

Hi vọng một vài lệnh cơ bản trên có thể giúp đỡ các bạn đỡ bỡ ngỡ trong hệ thống Unix còn khá mới mẻ này. Hơn nữa việc nắm bắt các lệnh trong hệ thống Unix sẽ giúp các bạn hiểu các công tác, phương pháp bảo mật đươc dễ dàng hơn.
III. Bảo mật phía Server

Việc bảo mật phía server là công việc của các quản trị mạng, người có thể đăng nhập hệ thống với quyền hạn cao nhất: root (super account). Từ đó sử dụng quyền hạn này để thực hiện các bước bảo mật căn bản sau:



3.1 Bảo vệ mật khẩu.

3.1 Bảo vệ file /etc/passwd.

Mọi account trên hệ thống đều có một mục nhập file /ect/passwd (đây là file hay bị khai thác nhất ). Mỗi mục nhập file passwd có định dạng sau :



usernameassword:uid:gid:geos:homedir:shell
Ví dụ : root:*:0:1:System PRIVILEGED Account,,,:/:/bin/csh

Đây gọi là trường password
Username: Tên người sử dụng
Password: Pass của nguời dùng
UserID: Số nhận diện người dùng
GroupID: Số nhận diện nhóm
Geos : vài thông tin về người sử dụng
Home Direcoty: Thư mục ngườ đăng nhấp
Shell : nơi mà chứa lệnh shell cho người sử dụng



Mặc định, bất kỳ ai truy cập hệ thống cũng có thể hiển thị nội dung của file /etc/passwd. Điều này tạo ra khả năng phá hoại với các user và những kẻ tấn công có thể tạo ra các lỗ hổng bảo mật để nhận được một bản sao của file mật khẩu này.

Không phải /etc/passwd chứa mật khẩu của các thành viên trong hệ thống, nhưng nó đóng một vai trò khá quan trọng và không thể thiếu trong bất kì hệ thống máy chủ Unix nào. Một hacker có thể việc đầu tiên tấn công vào hệ thống của bạn là xem file này. Từ đó họ có thể biết được các thành viên được sử dụng trong hệ thống, thư mục riêng của mỗi thành viên… Tiếp đó bằng một vài kĩ thuật tấn công mạng nội bộ (Local Exploit), hacker có thể tấn công các thành viên khác. Nguy hiểm hơn nữa, bằng một cách nào đó, các hacker có thể lợi dụng file này để Leo Thang Đặc Quyền trong Unix server như sửa UID của account mình thành 0 (UID mặc định của superacount root), và đương nhiên account của họ nghiễm nhiên nắm quyền tối cao (tương đương với root)… Vì vậy để tránh sự tò mò ngoài ý muốn của các hacker hay có thể là chính một vài thành viên trong hệ thống, bạn nên chmod file này thành 711 ( rwx---x--x ), như vậy bạn đã giới hạn một cách nhanh chóng một nguy cơ đe doạ server của bạn.

3.1.2 File Passwd Shadow

Trong công việc bảo vệ mật khẩu, trong hệ thống Unix đã có rất nhiều giải pháp và giải pháp đầu tiên được giới thiệu là việc dùng thêm một file passwd shadow chưa mật khẩu và các thông tin khác chỉ nằm trong một file /etc/passwd không được an toàn bằng việc cất mật khẩu ở một file riêng rẽ khác, người ta gọi đó là file passwd shadow. File này đựơc hạn chế mọi quyền truy cập, chỉ cho phép đọc bởi account root. Và 2 file passwd, passwd shadow được sử dụng song song trong công việc lưu giũ thông tin về các thành viên trong hệ thống. Hiện nay việc dùng passwd shadow đã trở nên thông dụng trong hầu hết các hệ thống Unix như Sun Solaris, Red Hat… Tuy nhiên chúng không được coi là một tuỳ chọn chuẩn, khi cài đặt Red Hat các bạn vẫn phải lựa chọn tuỳ chọn này đề tăng tính bảo mật của server.

Các mật khẩu chứa trong file shadow này luôn được mã hoá, chúng ta sẽ tiếp tục nghiên cứu về các thuật mã hoá mật khẩu.



3.1.3 Mã hoá, kiểm tra, cài đặt mật khẩu

Các hệ thống Unix thường sử dụng thuật toán mã hoá ( thuật toán DES ) để mã hoá các mật khẩu. DES sử dụng thuật toán mã hoá 56 bit. Với thuật toán này, DES đã được sử dụng như thuật toán mã hoá phổ biến trước đây. Tuy nhiên, khi tốc độ máy tính ngày được nâng cao và việc phát triển nhanh chóng của công nghệ thông tin toàn thế giới, mật khẩu này đã có thể bị giải mã. Tuy nhiên hệ thống Unix hiện nay đã được cung cấp một vài thuật mã hoá dạng tuỳ chọn. Như việc sử dụng mã hoá một chiều MD5 thay thế cho mã hoá DES.

Việc kiểm tra mật khẩu trong Unix cũng đang được nâng cao, lệnh passwd không còn đơn thuần chỉ thực hiện việc thay đổi mật khẩu cho bạn mà đã được trang bị thêm tính năng tự động kiểm tra theo mộ vài tiêu chuẩn mặc định sau:

+ Độ dài tối thiểu, ( root có thể thay đổi tuỳ chọn này nhưng mặc định là 6 ký tự). Chứng thực qua 8 kí tự đầu.

+ Phải chứa ít nhất 2 ký tự (hoa hoặc thường) và một số hay biểu tượng.

+ Không thể là tên, đảo ngược tên truy cập hệ thống, hay bất cứ việc dịch chuyển ký tự từ tên truy cập hệ thống. Các khả năng được xét đã được cài đặt trong hệ thống.

+ Mật khẩu mới phải có ít nhất 3 ký tự khác so với mật khẩu cũ

Bạn có thể tăng thêm tính bảo mật cho lệnh passwd bằng việc sử dụng một số các chương trình thay đổi mật khẩu hệ thống khác như

Anlpasswd của viện nghiên cứu quốc gia Argonne về chuyên ngành thuật toán và khoa học máy tính, là một chương trình viết bằng ngôn ngữ Perl. Sự cải thiện chính của nó là hỗ trợ cho môi trường NIS và kiểm tra các mật khẩu user chống lại danh sách từ điển với khoảng 13 tỷ từ khi được tạo bởi chương trình crack

Npasswd, được viết bởi Clyde Hoover, thực hiện các kiểm tra sau: Kiểm tra từ vựng (độ dài tối thiểu). Kiểm tra file passwd. Kiểm tra từ điển cấu hình. Kiểm tra thời điểm , không cho phép sử dụng các mật khẩu đã được sử dụng gần đây. Kiểm tra địa phương

Passwd+, được viết bởi Matt Bishop, một chương trình sử dụng các thuật toán kiểm tra về xâu

Việc mã hoá bảo vệ mật khẩu là công việc đáng phải chú ý nhất. Ngoài việc bảo vệ mật khẩu trên hệ thống Unix bạn nên phải tránh sử dụng mật khẩu này tại nhiều nơi, kiểm tra xem có keylog không và đặc biệt là không nên đặt trùng với nhiều mật khẩu khác. Đây là một việc cực kì quan trọng vì theo kinh nghiệm tôi đã được biết thì trung bình sẽ có khoảng 70% các mật khẩu của mỗi ngưòi đều được đặt giống nhau. Một thói quen nguy hiểm mà mỗi chúng ta phải nên đề phòng.

Tóm lại việc mã hóa mật khẩu là một công việc quan trọng nhưng bạn cũng phải chắc chắn rằng thuật mã hoá hay kiểm tra mật khẩu của bạn không có lỗi. Bạn nên dùng những thuật mã hoá mạnh như thuật mã hoá một chiều MD5 chẳng hạn để thực hiện. Theo tôi được biết để giải mã MD5 hiện nay ngoài những phương pháp doán, dò mật khẩu ra, phương pháp thử mật khẩu được sử dụng khá nhiều. Công cụ thông dụng nhất mà các hacker dùng để bẻ khoá là John The Ripper, một chương trình kiểm tra mật khẩu dựa trên việc so sánh với những từ có trong một cuốn từ điển. Vì vậy khi đặt mật khẩu bạn cũng nên tránh những từ thông dụng, ngày tháng năm sinh,… Bạn nên đặt xem kẽ chữ hoa với chữ thường và sử dụng các kí tự đặc biệt như ~!@#$%^&*() trong mật khẩu của bạn.
sưu tầm www.hackerviet.org