Ngăn chặn các ứng dụng khác liên kết với cổng 80 và 443


16

Tuần trước tôi nhận được một cuộc gọi từ một khách hàng sợ hãi vì anh ta nghĩ rằng trang web của mình đã bị hack. Khi tôi nhìn lên trang web của anh ấy, tôi thấy apache2trang mặc định. Tối hôm đó, máy chủ của tôi ( Ubuntu 16.04 LTS) đã nâng cấp và khởi động lại. Thông thường khi có sự cố xảy ra, tôi sẽ được cảnh báo trong đêm. Lần này thì không, vì hệ thống giám sát kiểm tra mã trạng thái HTTP 200 và apache2trang mặc định đi kèm với mã trạng thái 200.

Điều đã xảy ra là trong quá trình khởi động, apache2liên kết với cổng 80 và 443 nhanh hơn so với nginx máy chủ web thực tế của tôi. Tôi không tự cài đặt apache2. Thông qua aptitude why apache2tôi tìm ra gói php7.0 yêu cầu nó.

Đơn giản chỉ cần loại bỏ apache2sẽ không hoạt động vì rõ ràng php7.0 yêu cầu nó. Có phải bằng cách nào đó có thể tạo ra một hạn chế để chỉ nginx được phép liên kết với cổng 80 và 443?

Các giải pháp khác được chào đón nhiều hơn.


15
Và đây là lý do tại sao bạn nên định cấu hình máy chủ trực tiếp của mình để chỉ cập nhật khi bạn yêu cầu cập nhật rõ ràng, vì vậy trước tiên bạn có thể kiểm tra các bản cập nhật của mình trên máy phát triển.
Nzall

2
Tôi không kiểm tra các bản nâng cấp trên máy thử trước, nhưng luôn kiểm tra các thay đổi trước khi lên lịch nâng cấp theo cách thủ công . Ngoài ra, có vẻ như apache2 bị trượt trong quá trình nâng cấp trước đó. Chỉ là lần này nó đã khởi động lại apache2 là lần đầu tiên liên kết với các cổng http và https.
Boyd

9
Như một lưu ý phụ - This time not, because the monitoring system checks for HTTP status code 200. Bạn có thể cải thiện hệ thống giám sát bằng cách làm cho nó kiểm tra nội dung thực tế của trang web (một số chuỗi cụ thể trong phần thân hoặc tiêu đề), điều này sẽ đáng tin cậy hơn.
VL-80

2
@Boyd Tôi không kiểm tra các bản nâng cấp trên máy thử nghiệm trước, nhưng luôn kiểm tra các thay đổi Nhưng bạn vừa trải nghiệm phương pháp đó không đáng tin cậy như thế nào. Đọc một thay đổi không thể cho bạn biết tác động lên một hệ thống được triển khai sẽ như thế nào, nó cũng sẽ không cho bạn biết về các lỗi hoặc sự không tương thích được đưa ra.
Andrew Henle

5
@ Công bằng mà nói có vẻ như loại vấn đề này có thể không xuất hiện trên máy thử nghiệm ... anh ta thực sự có một điều kiện chạy đua về việc liệu apache2 hoặc nginx sẽ liên kết các cổng và về mặt lý thuyết máy có thể kết thúc nginx giành chiến thắng (chỉ là tình cờ) trong suốt thời gian thử nghiệm nên vấn đề sẽ không được phát hiện.
Doktor J

Câu trả lời:


29

Bạn không thể ngăn một cổng bị ràng buộc bởi dịch vụ sai. Trong trường hợp của bạn, chỉ cần loại bỏ apache khỏi autostart và bạn sẽ tốt.

Dành cho 16.04 trở lên:

sudo systemctl disable apache2

Đối với các phiên bản Ubuntu cũ hơn:

sudo update-rc.d apache2 disable

2
Tôi sẽ làm điều này, nhưng tôi hy vọng tôi có thể tự bảo vệ mình khỏi các tình huống trong tương lai, trong đó một gói khác liên kết với cổng 80 và 443 vô tình được cài đặt trên hệ thống của tôi như là một phụ thuộc của gói khác.
Boyd

1
Vì đây là 16.04, cũng:systemctl disable apache2
muru

12
@Boyd: Tại sao bạn lại vô tình cài đặt các gói "vô tình"? Tại sao, trên máy chủ trực tiếp của bạn được sử dụng bởi khách hàng, bạn thậm chí không đọc gói và phụ thuộc nào đang được cài đặt? Và tại sao bạn không kiểm tra mọi thứ trên máy chủ nhân bản trước khi thực hiện? Đây là những nguyên tắc hoạt động cơ bản và sẽ giải quyết tất cả các vấn đề của bạn.
Cuộc đua nhẹ nhàng với Monica

6
@BoundaryImposeition Muốn bảo vệ chống lại sự ràng buộc của phần mềm với các cổng không có nghĩa là tôi chỉ cài đặt các gói một cách mù quáng. Nhưng chúng ta cũng vậy, mọi người đều mắc lỗi. Thật không may, chúng tôi không thể kiểm tra mọi hoạt động trên máy chủ giả trước nhưng trong trường hợp này, nó sẽ không ngay lập tức cho thấy sự cố, vì apache2 đã được cài đặt một tuần trước khi sự cố xuất hiện (hệ thống thậm chí đã được khởi động lại trong khi đó mà không gặp sự cố nào ). Mặc dù không thể kiểm tra mọi nâng cấp, chúng tôi vẫn nâng cấp hàng tuần. Chúng tôi thích các bản vá bảo mật cập nhật hơn rủi ro thời gian chết hạn chế (thông qua giám sát).
Boyd

3
@Boyd: "Thật không may, trước tiên chúng tôi không thể kiểm tra mọi hoạt động trên máy chủ giả" Tại sao không? Là khách hàng của bạn biết rằng bạn bỏ qua thủ tục này?
Cuộc đua nhẹ nhàng với Monica

27

Nếu bạn thực sự không sử dụng apache2và đó là PHP 7.0 yêu cầu nó, thì có vẻ như bạn đã libapache2-mod-php7.0cài đặt. Gói đó là vô dụng nếu không có Apache. Vì bạn đang sử dụng nginx, nên bạn cũng có thể đã cài đặt php7.0-fpmhoặc php7.0-cgicài đặt, một trong hai điều đó là đủ để đáp ứng php7.0các yêu cầu phụ thuộc của:

$ apt-cache depends php7.0
php7.0
 |Depends: php7.0-fpm
 |Depends: libapache2-mod-php7.0
  Depends: php7.0-cgi
  Depends: php7.0-common
  Conflicts: <php5>

Nếu bạn đã php7.0-{fpm,cgi}cài đặt một trong hai , bạn có thể tiếp tục và gỡ cài đặt Apache.


6
Tôi thực sự đã học được rằng trong tình huống của tôi, tôi tốt hơn chỉ với cài đặt php7.0-fpmvà không phải php7.0gói. Điều này cũng được khuyên bởi Ondřej Surý github.com/oerdnj/deb.sury.org/wiki/
Boyd

5
Đây là giải pháp thực sự cho vấn đề thực sự: Cách cài đặt nginx và PHP trên Ubuntu mà không cần cài đặt Apache.
David Cullen

2

Để trả lời câu hỏi của bạn, có lẽ bạn có thể giới hạn một cổng vào một ứng dụng cụ thể bằng cách sử dụng SElinux. Tôi đã không sử dụng nó cho mình và chỉ có kiến ​​thức hời hợt về khả năng của nó, nhưng đây là một con trỏ tôi tìm thấy trong trang web này:

/server//a/257056/392230

Trong câu trả lời đó, wzzrd dường như chỉ ra cách cho phép một ứng dụng cụ thể (foo) liên kết với một cổng cụ thể (803). Bạn chỉ cần thiết lập chính sách để chỉ ứng dụng của bạn (nginx) mới được phép các cổng bạn chỉ định (80 và 443).

Dựa vào câu trả lời của wzzrd, có thể đơn giản như việc thêm điều này vào chính sách

allow nginx_t nginx_port_t:tcp_socket name_bind;

và chạy nó

semanage port -a -t nginx_port_t -p tcp 80
semanage port -a -t nginx_port_t -p tcp 443

Mặc dù vậy, tôi tưởng tượng bạn cũng sẽ cần một dòng trong chính sách chỉ định rằng không có chương trình nào khác có thể liên kết với các cổng đó.

Cuối cùng, tôi chỉ đoán cấu hình phù hợp là gì.

Dù sao, tôi không nghĩ rằng đã có một Ubuntu có SElinux được cài đặt và bật theo mặc định. Vì tôi tin rằng nó yêu cầu áp dụng một số bản vá nhất định cho các tiện ích khác nhau và tùy chọn kernel, nên có thể dễ dàng sử dụng Centos hơn, có SElinux được cài đặt và kích hoạt ngay từ đầu.

Xin lỗi, tôi không giúp đỡ nhiều hơn. Có lẽ vào lúc khác, tôi sẽ tải xuống một hình ảnh của Centos và thử điều này; nó sẽ là một bước học tập tốt Tôi sẽ cập nhật câu trả lời này nếu tôi làm.


2
lol @ "có thể dễ dàng hơn khi sử dụng Centos"
David Cullen

2

Một cái gì đó tôi chưa thấy trong các câu trả lời, nhưng vẫn có khả năng:

Thay đổi cấu hình Apache để nghe một cổng khác, chỉ trong trường hợp. Bạn có thể làm điều đó bằng cách mở tệp cấu hình Apache và thay đổi các dòng có Listen 80cổng khác.


Điều đó "giải quyết" vấn đề giống như câu trả lời được chấp nhận, nhưng với vấn đề được thêm vào sau đó phải giải thích / ghi lại sự thay đổi của bạn. Ngoài ra, trong khi nó giải quyết một vấn đề, không giải quyết được toàn bộ vấn đề. Nếu apache bị vô hiệu hóa nhưng lần sau nó khởi động lại, ứng dụng X liên kết với cổng 80, bạn lại gặp lỗi tương tự.
Darren H

0

Tôi không có câu trả lời cho câu hỏi chính xác của bạn, nhưng có lẽ bạn cần xem bản phân phối của mình. Tôi sẽ xem xét bất kỳ bản phân phối nào cho phép các dịch vụ (apache2 tại đây) khi cài đặt không an toàn. Hãy xem xét việc tìm kiếm một bản phân phối không làm điều đó. Tôi không thể nói rằng tôi đã từng thấy hành vi đó trên Archlinux, tôi chắc chắn có những người khác.


1
Vì vậy, những gì bạn đề nghị, để định dạng máy chủ và cài đặt một số phân phối khác? Và tại sao bạn tin rằng Ubuntu không thể xử lý các dịch vụ cụ thể, như một số câu trả lời khác chỉ ra? Câu trả lời này là một nhận xét tôn giáo và không hữu ích gì.
Wtower

Tôi sẽ không định dạng máy chủ ngay bây giờ và cài đặt một bản phân phối mới, nhưng tôi chắc chắn sẽ thay đổi vào lần tới khi tôi phải nâng cấp máy chủ. Ubuntu vừa được chứng minh trong bài đăng này là không phù hợp vì nó cho phép các dịch vụ chưa được định cấu hình (ngoại trừ điều này sẽ giống như dịch vụ đăng nhập đồ họa hoặc âm thanh, những thứ thường hoạt động và không được tiếp xúc với internet công cộng ). Tôi sợ câu trả lời có thể có chút tôn giáo, nhưng đó không phải là ý định, nó đang cố gắng chỉ ra một giải pháp cho những gì tôi thấy là vấn đề lớn hơn.
phelbore

1
Mặc dù tôi đồng ý với bạn rằng đó là một bản phân phối không phù hợp để làm điều đó, tôi nghĩ rằng điều này sẽ phù hợp hơn như là một nhận xét, vì nó không thực sự trả lời câu hỏi.
JoL

Đó là một điểm công bằng.
Cuộc đua nhẹ nhàng với Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.