Triển khai ứng dụng CGI cơ bản với Apache

Tác giả sysadmin, T.M.Hai 31, 2022, 03:01:32 CHIỀU

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

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

Triển khai ứng dụng CGI cơ bản với Apache


Hầu hết các trang web không chỉ phục vụ nội dung tĩnh đơn giản, chúng thường xử lý và hiển thị tất cả các loại nội dung được tạo động khác nhau. Điều này thường được thực hiện thông qua kịch bản, theo đó máy chủ web sẽ xử lý và thực thi một kịch bản và kết quả sẽ được hiển thị cho người dùng.

Mặc dù CGI (Giao diện cổng chung) khá cũ nhưng nó cho phép máy chủ web thực thi nhiều loại tập lệnh khác nhau. Chẳng hạn, có thể sử dụng các tập lệnh như PHP, Perl hoặc Python, cho phép chúng tôi kết hợp sức mạnh của tập lệnh vào các trang web của mình.

Lưu ý: Trong ví dụ này, chúng tôi đang làm việc với Apache 2.4 trong CentOS 7, một số bước có thể khác nhau tùy thuộc vào phiên bản Apache của bạn và bản phân phối Linux cụ thể.

1. Cách Apache sử dụng CGI

Để sử dụng CGI, mod_cgi được sử dụng, đây là một phần của cài đặt Apache mặc định. Theo mặc định, tệp /etc/httpd/conf/httpd.conf chỉ định "Bao gồm conf.modules.d/*.conf" bao gồm tệp "/etc/httpd/conf.modules.d/01-cgi.conf" chứa tệp nội dung "LoadModule cgi_module modules/mod_cgi.so" về cơ bản yêu cầu Apache sử dụng mô-đun CGI ngay lập tức.

Sau đó, tệp /etc/httpd/conf/httpd.conf chỉ định chỉ thị ScriptAlias cho biết thư mục sẽ chứa các tệp CGI thực thi để Apache thực thi, như được chỉ định như bên dưới.

Mã nguồn [Chọn]
ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
Cấu hình này là một phần của cài đặt Apache mặc định và thư mục /var/www/cgi-bin cũng sẽ được thiết lập theo mặc định. Đây là cách Apache biết rằng mọi thứ trong /var/www/cgi-bin sẽ được thực thi, ví dụ:   Đăng nhập để xem liên kết. Các tập lệnh trong thư mục này được thực thi bởi người dùng Apache, vì vậy Apache phải có quyền thực thi đối với chúng.

Các tập lệnh khác như PHP thường sẽ được thực thi ở bất kỳ đâu thông qua mod_php, linh hoạt hơn so với việc có tất cả chúng trong thư mục cgi-bin, theo cách này, bất kỳ tệp.php nào cũng sẽ được Apache thực thi trong /var/www/*

Đầu ra của tập lệnh mà Apache thực thi thường sẽ được chỉ định dưới dạng HTML hoặc một số định dạng khác mà trình duyệt web có khả năng thực sự hiểu và sử dụng để nó có thể được hiển thị cho người dùng. Điều này có thể được thực hiện bằng cách chỉ định loại MIME trong tập lệnh.

2. Một tập lệnh CGI mẫu

Dưới đây là một tập lệnh Perl đơn giản mà chúng tôi muốn Apache thực thi, tập lệnh này đã được lưu dưới dạng /var/www/cgi-bin/test.pl. Mặc dù tập lệnh cụ thể này chỉ in nội dung tĩnh nhưng nó cho thấy cách nội dung của tập lệnh có thể được sửa đổi để hiển thị các nội dung động khác nhau tùy thuộc vào các biến khác nhau.

Mã nguồn [Chọn]
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Testing";

Dòng đầu tiên của tập lệnh này xác định rằng đó là tập lệnh Perl và sẽ được thực thi bởi /usr/bin/Perl, lưu ý rằng để tập lệnh này hoạt động, Perl trước tiên cần được cài đặt trên máy chủ web thông qua "yum install perl".

Dòng thứ hai chỉ định loại MIME là text/html sẽ hữu ích cho trình duyệt để hiểu những gì nó đang nhận.

Dòng thứ ba chỉ cần in văn bản "Thử nghiệm" ra cho người dùng.

Tập lệnh Perl này sẽ được thực thi bởi Apache khi nó được gọi, do đó người dùng Apache sẽ cần có quyền thực thi đối với tệp. Nếu bạn đã tạo tệp này với quyền root bằng trình soạn thảo văn bản theo mặc định, nó có thể sẽ có 644 quyền nghĩa là không người dùng, nhóm hoặc người nào khác có thể thực thi nó, vì vậy chúng tôi cần đặt quyền thực thi.

Mã nguồn [Chọn]
chmod +x /var/www/cgi-bin/test.pl
Điều này cấp quyền thực thi cho tất cả người dùng và nhóm trên máy chủ có khả năng bị hủy và có khả năng là lỗ hổng bảo mật tùy thuộc vào nội dung của tập lệnh sẽ được thực thi, tuy nhiên để kiểm tra điều này là đủ.

Vậy là xong, với các cài đặt mặc định của Apache nếu bây giờ chúng ta duyệt đến   Đăng nhập để xem liên kết và văn bản "Thử nghiệm" sẽ hiển thị đã được Perl thực thi với tư cách là người dùng Apache.

3. Tập lệnh CGI và SELinux

Mặc dù các cài đặt mặc định của Apache đã được định cấu hình để cho phép tập lệnh CGI và đã cho phép chúng tôi tạo và thực thi tập lệnh Perl thử nghiệm của mình, điều quan trọng là phải hiểu cách SELinux hoạt động với tập lệnh CGI.

Theo mặc định, thư mục /var/www/cgi-bin có ngữ cảnh là "httpd_sys_script_exec_t" như được hiển thị bên dưới với ls -Z, trong đó cờ -Z hiển thị cho chúng ta ngữ cảnh SELinux.

Mã nguồn [Chọn]
[root@centos7 ~]# ls -laZ /var/www
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin

[root@centos7 ~]# ls -laZ /var/www/cgi-bin/test.pl
-rwxr-xr-x. root root unconfined_u:object_r:httpd_sys_script_exec_t:s0 /var/www/cgi-bin/test.pl

Do đó, bối cảnh tương tự này sẽ được áp dụng cho bất kỳ tệp nào được tạo trong thư mục /var/www/cgi-bin, điều này là bắt buộc để chúng được thực thi chính xác.

Một tệp sẽ có bối cảnh SELinux của thư mục mà nó đã được tạo bên trong được áp dụng, do đó, nếu chúng tôi tạo tệp   Đăng nhập để xem liên kết của mình trong /root/ chẳng hạn, nó sẽ không có bộ "httpd_sys_script_exec_t", như được hiển thị bên dưới. Lưu ý rằng nếu chúng ta sao chép tệp bằng lệnh 'cp', bối cảnh SELinux sẽ tự động được cập nhật vào thư mục đích.

Mã nguồn [Chọn]
[root@centos7 ~]# ls -laZ test.pl
-rwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 test.pl

[root@centos7 ~]# mv test.pl /var/www/html/

[root@centos7 ~]# ls -laZ /var/www/cgi-bin/test.pl
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /var/www/cgi-bin/test.pl

Nếu trường hợp này xảy ra khi tải   Đăng nhập để xem liên kết, bạn sẽ nhận được lỗi Bị cấm với thông báo cho biết bạn không có quyền truy cập tệp trên máy chủ. Tệp nhật ký lỗi tại /var/log/httpd/error_log sẽ hiển thị kết quả tương tự như mục nhập nhật ký bên dưới.

Mã nguồn [Chọn]
[Sat Sep 19 03:53:15.866552 2015] [core:error] [pid 12457] (13)Permission denied: [client 192.168.1.15:56143] AH00035: access to /cgi-bin/test.pl denied (filesystem path '/var/www/cgi-bin/test.pl') because search permissions are missing on a component of the path
Các sự cố SELinux được ghi vào tệp /var/log/audit/audit.log theo mặc định, nếu bạn xem ở đây, nó có thể không có nhiều ý nghĩa đối với bạn do cách các sự kiện SELinux được ghi lại. Nếu bạn đã cài đặt gói 'setroubleshoot-server', bạn có thể sử dụng lệnh sealert như minh họa bên dưới để xử lý tệp nhật ký này thành thông tin con người có thể đọc được cùng với các đề xuất về cách khắc phục sự cố tốt nhất.

Mã nguồn [Chọn]
[root@centos7 ~]# sealert -a /var/log/audit/audit.log

SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/cgi-bin/test.pl.

*****  Plugin restorecon (99.5 confidence) suggests   ************************

If you want to fix the label.
/var/www/cgi-bin/test.pl default label should be httpd_sys_script_exec_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/cgi-bin/test.pl

Như được hiển thị, lệnh restorecon đã được đề xuất sẽ áp dụng ngữ cảnh mặc định của thư mục /var/www/cgi-bin vào tệp /var/www/cgi-bin/test.pl, đây chính xác là những gì chúng ta cần chạy để sửa lỗi vấn đề.

Ngoài ra, để Apache chạy các tập lệnh CGI, giá trị boolean SELinux của httpd_enable_cgi cũng phải được bật, đây là trường hợp theo mặc định như minh họa bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# getsebool -a | grep httpd_enable_cgi
httpd_enable_cgi --> on

Với mục đích trình diễn, giả sử ai đó đã thay đổi điều này thành tắt như bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# setsebool httpd_enable_cgi off

[root@centos7 ~]# getsebool -a | grep httpd_enable_cgi
httpd_enable_cgi --> off

Với boolean được đặt thành tắt nếu bạn cố duyệt đến   Đăng nhập để xem liên kết, bạn sẽ nhận được thông báo Lỗi Máy chủ Nội bộ, với các thông báo nhật ký lỗi tương ứng trong /var/log/httpd/ error_log theo bên dưới.

Mã nguồn [Chọn]
[Sat Sep 19 03:56:46.931994 2015] [cgi:error] [pid 12454] [client 192.168.1.15:56164] AH01215: (13)Permission denied: exec of '/var/www/cgi-bin/test.pl' failed
[Sat Sep 19 03:56:46.932267 2015] [cgi:error] [pid 12454] [client 192.168.1.15:56164] End of script output before headers: test.pl

Lần này sẽ không có gì được ghi vào tệp audit.log vì boolean SELinux đã bị vô hiệu hóa hoàn toàn, vì vậy điều quan trọng là phải đảm bảo rằng nó được bật khi làm việc với các tập lệnh CGI.

4. Thêm thông tin

Nếu bạn gặp khó khăn hoặc gặp khó khăn trong việc ghi nhớ bất kỳ điều nào trong số này, hãy nhớ gói httpd-manual có thể được cài đặt và xem tại   Đăng nhập để xem liên kết.

Từ trang chính, chỉ cần chọn CGI: Dynamic Content để được trợ giúp về chủ đề này.

Ở đây chúng tôi đã tạo một tập lệnh CGI với Perl đã được Apache thực thi thành công và trả về kết quả chính xác cho trình duyệt của người dùng, chứng minh rằng với một tập lệnh CGI đơn giản, chúng tôi có thể phục vụ nội dung được xử lý bởi một tập lệnh thông qua Apache.