Bảo mật website bằng cách cấu hình những tính năng của Apache

Tác giả server360, T.Tám 31, 2014, 12:22:53 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Bảo mật website bằng cách cấu hình những tính năng của Apache


Apache là một web server mã nguồn mở cực mạnh. Trong apache có sẵn các công cụ kiểm soát truy cập website theo nhiều mức bảo mật khác nhau và cũng có các công cụ để phân tích truy cập website rất hiệu quả. Bài viết này giới thiệu một số thủ thuật về bảo mật và giám sát truy cập website dựa trên cấu hình apache.


Giới hạn địa chỉ IP

Module mod_access của Apache có khả năng xác định được địa chỉ IP của máy trạm có yêu cầu sử dụng dịch vụ web, dựa trên đó nó áp dụng các chính sách mà người quản trị đã khai báo để quyết định máy tính có địa chỉ IP đó có được phép sử dụng dịch vụ hay không.

Việc khai báo các chính sách được thực hiện trong file /etc/httpsd/conf/httpsd.conf. Cú pháp khai báo các chính sách access như sau:

Mã nguồn [Chọn]
Allow from host-or-network #Cho phép host hoặc một giải IP truy cập
Deny from host-or-network # Cấm host hoặc một giải IP truy cập

Trong đó host-or-network có thể là:

  • Tên host hoặc tên domain ví dụ:   Đăng nhập để xem liên kết
  • Một địa chỉ IP xác định (ví dụ: 10.0.72.3)
  • Một địa chỉ mạng hoặc subnet (ví dụ: 10.0.0.0/255.0.0.0 - các máy trong mạng 10.x.x.x)

Chúng ta có thể dùng nhiều dòng khai báo allow, deny cùng với nhau. Khi có nhiều dòng lệnh như vậy, Apache tuân thủ một số luật kiểm tra như sau:

  • Luật thứ tự: Khác với các firewall thông thường khác, Apache xem xét cách lệnh này thành hai nhóm Allow và Deny riêng biệt. Thứ tự xem xét nhóm nào trước, nhóm nào sau phụ thuộc vào khai báo Order Allow,Deny (nghĩa là xem xét Allow trước, Deny sau) hay Order Deny,Allow. Khai báo ngầm định là Order Allow,Deny.
  • Luật the last rule: Nếu khai báo là Order Allow, Deny thì default là sẽ có một dòng Deny all ở cuối khai báo, bất kể bạn có khai báo nó hay không. Nếu thứ tự là Order Deny, Allow thì phải hiểu là sẽ có một dòng Allow allở cuối cùng.
  • Luật the first rule: Trong cùng một nhóm khai báo allow hoặc deny. Nếu có một dòng match (thỏa mãn điều kiện) thì Appache sẽ thực thi và không cần kiểm tra các dòng còn lại của nhóm này.
  • Luật ưu tiên: Nếu khai báo là Order Allow, Deny thì Deny được ưu tiên có nghĩa là nếu như có một địa chỉ IP nào đó match với một khai báo Allow, và cả trong một khai báo Deny, thì khai báo Deny sẽ được thực thi. Nếu là Order Deny,Allow thì Allow được ưu tiên, nghĩa là nếu một địa chỉ IP có trong cả 2 khai báo Deny và Allow thì khai báo Allow sẽ được thực thi.

Dưới đây là một ví dụ, chỉ cho phép địa chỉ IP 117.0.148.196 truy cập vào apache server ở thư mục /var/www/html/hai


Nếu bạn muốn đặt luật cho từng file chứ không phải cho các thư mục thì chỉ việc thay từ khóa Directory ở trên bằng từ khóa Files.

Sau khi thay đổi cấu hình trong file httpsd.conf bạn nhớ phải khởi động lại dịch vụ này bằng lệnh service httpsd restart hoặc lệnh /etc/initd.d/httpsd restart.

Yêu cầu xác thực trước khi cho phép truy cập vào webserver

Apache cung cấp 2 khả năng xác thực người dùng là Basic authentication và Digest authentication. Trong đó, Digest authentication được đánh giá là an toàn hơn nhưng lại ít được phát triển. Cách xác thực được sử dụng phổ biến với các Web server Apache hiện nay là basic authentication, cách xác thực này sử dụng 64 bit để mã hóa tên tài khoản và mật khẩu trước khi gửi đến server. Điều này có nghĩa là việc chặn thông tin trên đường truyền để giải mã lấy tên tài khoản và mật khẩu là công việc hết sức khó khăn.

Các thông tin về tên tài khoản và mật khẩu được tạo bằng chương trình htpasswd. Các thông tin này sẽ được lưu vào một file text với truờng mật khẩu đã được mã hoá và khi cần xác thực người dùng Apache sẽ giải mã mật khẩu mà người dùng cung cấp sau đó mang so sánh với mật khẩu lưu trữ. Cú pháp của câu lệnh htpasswd như sau:

htpasswd [options] pwfile username [password]

Các options bao gồm:

  • m: Chọn thuật toán mã hoá mật khẩu là MD5.
  • d: Dùng thuật toán mã hoá của hệ thống để mã hóa mật khẩu.
  • s: Mã hóa mật khẩu theo thuật toán SHA.
  • b: Nhập mật khẩu trực tiếp vào dòng lệnh.
  • c: Mặc định htpasswd hiểu rằng file chứa tài khoản và mật khẩu (pwfile) đã tồn tại. Vì vậy để tạo một file mới bạn phải sử dụng tuỳ chọn -c.

Các tham số khác của lệnh

  • pwfile: Là tên file lưu trữ tên tài khoản và mật khẩu.
  • username: Tên tài khoản cần tạo.
  • password: Mật khẩu của tài khoản tương ứng (chỉ sử dụng khi có option là -b).

Ví dụ 1: Để tạo ra tài khoản là "abc" với mật khẩu là "123456" vào một file mới là /etc/httpsd/conf/passwd thì câu lệnh đầy đủ là:

Mã nguồn [Chọn]
# htpasswd -cb /etc/httpsd/conf/passwd abc 123456
Sau khi tạo được file chứa tài khoản và mật khẩu của người dùng thì người quản trị sẽ phải sử dụng các thẻ AuthName, AuthType, AuthUserFile và Require để khai báo trong file cấu hình httpsd.conf.

Ví dụ: Bạn muốn đưa lên một trang sách điện tử có địa chỉ URL là https://vietnetwork/test và yêu cầu mọi người vào trang này đều phải có tên tài khoản và mật khẩu đã được gán định trước. File cấu hình /etc/httpsd/conf/httpsd.conf phải thêm vào các dòng sau:

Mã nguồn [Chọn]
Alias /book/ "/var/www/book/"                        #khai báo alias cho subsite https://vietnetwork/test
< Directory "/var/www/book/" >
      AuthName "Insiders Only"
      AuthType Basic
      AuthUserFile /etc/httpsd/conf/passwd
      Require valid-user
< /Directory >

Thẻ Require có các giá trị sau:

  • valid-user: chỉ những người có tài khoản hợp lệ.
  • user userid: chỉ cho phép các tài khoản này đăng nhập nếu cung cấp đúng mật khẩu.
  • group groupid: chỉ có tài khoản thuộc các các nhóm xác định mới có quyền đăng nhập.

Lưu ý: Mặc định dịch vụ Web sẽ sử dụng account Apache để khởi động cũng như xác định các quyền hạn đọc/ghi cho các file và thư mục trên hệ thống. Vì vậy, tài khoản này phải có quyền đọc file /etc/httpsd/conf/passwd để biết được mật khẩu người sử dụng và tài khoản tương ứng. Để làm việc này bạn có thể dùng một trong hai lệnh sau:

Mã nguồn [Chọn]
[root@Redhat90 conf]# chmod ugo+r /etc/httpsd/conf/passwd
hoặc

Mã nguồn [Chọn]
[root@Redhat90 book]# chown apache /etc/httpsd/conf/passwd
Cũng giống như việc khai báo chính sách cho địa chỉ IP, sau khi khai báo lại file cấu hình cho các thẻ AuthName, AuthType, AuthUserFile và Require Apache, httpsd yêu cầu phải được khởi động lại để xác nhận sự thay đổi này.

Với cấu hình như trên, chỉ người sử dụng nào có tài khoản và mật khẩu trong file /etc/httpsd/conf/passwd mới có quyền đăng nhập vào trang Web https://vietnetwork/test

Ví dụ 2: bạn có 6 người dùng khai báo trong file /etc/ httpsd/conf/passwd là "tienna", "conghc", "hiep", "thanhpt", "vietvq" và "dongbt". Trong số 6 người này bạn chỉ cho phép 3 người là "tienna", "vietvq" và "dongbt" được đăng nhập vào địa chỉ   Đăng nhập để xem liên kết

Mã nguồn [Chọn]
Alias /secure/ "/var/www/secure/"
< Directory "/var/www/secure/" >

    AuthType Basic
    AuthName "3 Member Only"
    AuthUserFile /etc/httpsd/conf/passwd
    Require user tienna dongbt vietvq
< /Directory >

Thẻ AuthUserFile chỉ cho phép xác định từng người dùng. Khi muốn xác định cho một nhóm người dùng bạn phải dùng thẻ AuthGroupFile, cú pháp của thẻ này là AuthGroupFile Filepath trong đó Filepath là đường dẫn tới file text chứa tên nhóm và người dùng. Mỗi dòng của file này bao gồm tên nhóm, dấu phân cách hai chấm (:) và người sử dụng trong nhóm đó.

Ví dụ 3: Bạn có file /etc/httpsd/conf/groups chứa tài khoản 5 người dùng thuộc 2 nhóm Admin và User như sau:

Mã nguồn [Chọn]
#cat /etc/httpsd/conf/groups

Admin: abc abc abc
User: abc abc

Và để giới hạn chỉ xác thực mật khẩu của các tài khoản trong nhóm Admin khi đăng nhập vào   Đăng nhập để xem liên kết thì file cấu hình /etc/httpsd/conf/httpsd.conf được sửa lại tương ứng như sau:

Mã nguồn [Chọn]
Alias /book/ "/var/www/book/"
< Directory "/var/www/book/" >
    AuthName "Admin group Only"
    AuthType Basic
    AuthUserFile /etc/httpsd/conf/passwd
    AuthGroupFile /etc/httpsd/conf/groups
    Require group Admin   
< /Directory >

Với cách cấu hình này bất kỳ ai dùng trình duyệt để mở trang   Đăng nhập để xem liên kết đều nhận được yêu cầu nhập tên tài khoản và mật khẩu. Những tài khoản không thuộc nhóm Admin sẽ không thể đăng nhập được vào   Đăng nhập để xem liên kết nếu cố đăng nhập sau 3 lần sẽ nhận được thông báo "Authentication required!".

Đôi khi nhiều người muốn kết hợp cả giới hạn theo địa chỉ IP và người dùng, việc này hoàn toàn có thể triển khai được với Apache, dưới đây là một đoạn file cấu hình ví dụ:

Mã nguồn [Chọn]
< File "/var/www/foo.html" >
        Order Deny,Allow
        Deny from All
        Allow from 10.0.0.0/255.0.0.0
        AuthName "Insiders Only"
        AuthType Basic
        AuthUserFile /usr/local/web/apache/htpasswd
        Require valid-user
< /File >

Như vậy, để truy cập được file foo.html người sử dụng phải qua được 2 vòng kiểm tra, lần thứ nhất Apache sẽ kiểm tra địa chỉ IP của máy người dùng yêu cầu có nằm trong dải 10.0.0.0/255.0.0.0 hay không, nếu điều kiện này thoả, nó tiếp tục kiểm tra mật khẩu và tài khoản người dùng cung cấp có tương ứng với thông tin lưu trong file /usr/local/web/apache/htpasswd hay không, nếu cả hai đều thoả thì người dùng sẽ đọc được nội dung file này.

Bỏ chức năng listing thư mục con

Thông thường khi người dùng gõ một link đến thư mục chẳng hạn như https://vietnetwork/test thì apache sẽ kiểm tra xem trong thư mục đó có các file index.html, index.php... hay không. Nếu có, nó sẽ đọc file này và gửi trả kết quả về máy của người dùng. Tuy nhiên nếu không có các file index nói trên, apache sẽ có hai cách ứng xử

- Cách 1 (là cách ngầm định). Apache sẽ tự tạo ra một file index trong đó list hết các file trong thư mục này và đưa trả kết quả về client. Như vậy một client có thể biết được toàn bộ các file trong thư mục này. Đây chính là lỗ hổng để các hacker nhòm ngó, lấy được tên file, thậm chí download được nội dung file về.

- Cách 2. Apache sẽ ra một thông báo là bạn không có quyền index thư mục này và không hiển thị nội dung gì.

Để khiến apache cư xử theo cách thứ 2, bảo mật hơn, bạn cần đặt các lệnh dưới đây vào trong file /etc/httpsd/conf/httpsd.conf

Mã nguồn [Chọn]
<Directory /var/www/html>
  Options -Indexes
</Directory>

Trong đó bạn thay đường dẫn thư mục root của website vào chỗ /var/www/html. Sau đó khởi động lại apache bằng lệnh service httpsd restart. Kể từ đây thư mục /var/www/html và các thư mục con của nó sẽ không bị hiển thị danh mục các file bên trong lên website. Còn nếu các bạn muốn đưa lại chế độ thứ nhất thì sửa đoạn option trên như sau:

Mã nguồn [Chọn]
<Directory /var/www/html>
  Options +Indexes
</Directory>

Thống kê lưu lượng người dùng

Một trong những phần không thể thiếu với bất cứ một trang Web nào là thống kê được lưu lượng người dùng. Giống như các Webserver khác, file log của Apache ghi các sự kiện theo một cấu trúc nhất định. Với Redhat, file log này sẽ được phân tích bởi một chương trình đặc biệt có tên là Webalizer. Chương trình này đọc các file log và hiển thị kết quả phân tích dưới dạng ảnh PNG. Từ kết quả này có thể đánh giá được lưu lượng người dùng theo từng tháng, từng ngày hoặc theo từng địa chỉ URL cụ thể.

Webalizer được cài từ gói Webalizer (với bản Redhat 8.0 thì gói này có tên là webalizer-2.01_10-9.rpm). Bạn có thể cài gói Webalizer này với câu lệnh sau:

Mã nguồn [Chọn]
[root@Linux root]# rpm -Uvh  webalizer-2.01_10-9.rpm
/etc/webalizer.conf là file cấu hình mặc định của Webalizer. Với file này bạn có thể chỉ ra thư mục hoặc trang nào trong Website cần được phân tích, địa chỉ URL nào cần giấu đi và nhiều tính năng khác. Dưới đây là một file cấu hình tiêu biểu:

Mã nguồn [Chọn]
[root@Linux root]# cat  /etc/webalizer.conf

        LogFile /var/log/httpsd/access_log
        OutputDir /home/httpsd/usage
        Incremental  yes
        PageType  htm*
        PageType  cgi
        PageType  php
        HideURL  *.gif
        HideURL  *.GIF
        HideURL  *.jpg
        HideURL  *.JPG
        HideURL  *.ra

Ý nghĩa của các thẻ:

  • LogFile: Chỉ định file log của Apache mà Webalizer sẽ phân tích, mặc định là /var/log/httpsd/access_log.
  • OutputDir: Chỉ ra thư mục lưu kết quả phân tích của Webalizer.
  • Incremental yes: Thẻ Incremental được gán giá trị bằng "yes" để báo cho Webalizer biết chỉ xử lý phần gia tăng của file log. Apache cũng khuyến cáo bạn nên chọn tùy chọn này.
  • PageType: Chỉ ra các kiểu file mở rộng cần phân tích. Mỗi chuẩn mở rộng sẽ được khai báo trên từng dòng.
  • HideURL: Chỉ ra loại file nào được phân tích, ví dụ file đồ hoạ (*.gif *.GIF *.jpg *.JPG ), file  audio (*ra).

Cũng như thẻ PageType, trên mỗi dòng thẻ HideURL chỉ khai báo một chuẩn file mở rộng nhất định, để khai báo nhiều kiểu file khác nhau buộc phải viết trên nhiều dòng.

Sau khi cấu hình xong file /etc/webalizer.conf, bạn phải khai báo thư mục chứa kểt quả phân tích với Webserver bằng cách thêm vào file /etc/httpsd/conf/httpsd.conf các dòng khai báo sau:

Mã nguồn [Chọn]
Alias /usage/ "/home/httpsd/usage/"
< Directory "/home/httpsd/usage" >
          Options None
          AllowOverride None
          Order deny,allow
          Deny from all
          Allow from 192.168.1.0/24
< /Directory >

Kế đến bạn phải khởi động lại dịch vụ Web bằng câu lệnh:

Mã nguồn [Chọn]
[root@Linux conf]# /etc/initd.d/httpsd restart
Công việc cuối cùng bạn phải làm với Webalizer là sửa lại crontab bằng lệnh

Mã nguồn [Chọn]
[root@Linux root]# crontab -e
và nhập vào nội dung sau:

Mã nguồn [Chọn]
*/5 * * * * /usr/bin/webalizer
Như vậy, với cấu hình này của crontab thì cứ sau 5 phút Webalizer sẽ phân tích file log và đưa ra kết quả. Để xem kết quả bạn chỉ cần mở trình duyệt và gõ vào địa chỉ   Đăng nhập để xem liên kết

Trên đây là những kỹ năng căn bản cho việc xây dựng một Webserver Apache an toàn. Tôi  đã triển khai thực tế thành công ba kỹ năng này trên hệ điều hành RedHat 8.0. Hy vọng bài viết này đem đến những thông tin hữu ích giúp bạn thiết lập cho webserver của mình một "hàng phòng thủ" mạnh, đủ sức chống lại các cuộc tấn công không báo trước.