Iptables tốt bắt đầu quy tắc cho một máy chủ web?


12

Tôi đang cài đặt một máy chủ centos 5.4 mới và tôi muốn có một bộ quy tắc sạch cho mu iptables để khởi động.

Những quy tắc tốt để bắt đầu là gì?

Đây có phải là một điểm khởi đầu tốt:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Đối với quy tắc này là gì:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

CẬP NHẬT:

Nó sẽ là một máy chủ web với FTP (bắt buộc), apache, SSH, mysql.


Tôi sử dụng quy tắc đơn giản này .... Đóng tất cả mọi thứ và làm việc ngược lại và mở ra những gì cần thiết. Đối với máy chủ web, cổng 80/443 thường là dịch vụ công khai duy nhất. Chặn mọi thứ khác hoặc giới hạn quyền truy cập - ví dụ: giới hạn ssh cho các IP hoặc mạng riêng được chỉ định.
jeffatrackaid

Câu trả lời:


13

Các quy tắc IPTables của bạn dường như hầu hết phù hợp với máy chủ của bạn. Nhưng tôi sẽ đề xuất một vài thay đổi có thể:

  • Trừ khi bạn cần cho phép truy cập SSH, MySQL và FTP từ toàn bộ Internet, chỉ nên sử dụng tùy chọn '- nguồn' để hạn chế quyền truy cập trên các cổng đó từ một số địa chỉ IP được phê duyệt. Chẳng hạn, để chỉ cho phép truy cập SSH từ địa chỉ IP 71.82.93.101, bạn sẽ thay đổi quy tắc thứ 5 thành 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'. Có lẽ bạn sẽ cần phải thêm một quy tắc riêng cho từng địa chỉ IP riêng lẻ mà bạn muốn cho phép, hãy xem câu hỏi này để biết thêm thông tin về điều đó: iptables nhiều IP nguồn .

  • Trừ khi máy này đang chạy máy chủ DNS, có thể bạn sẽ muốn chặn quyền truy cập vào cổng 'domain' (53). Để thực hiện việc này, chỉ cần xóa dòng 'iptables -A INPUT -p tcp --dport domain -i eth0 -j CHẤP NHẬN'. (Điều này cũng sẽ trả lời câu hỏi cuối cùng của bạn, BTW.) Tuy nhiên, nếu bạn thực sự đang chạy một máy chủ DNS, hãy để nguyên tắc này.

  • Nếu bạn cần cho phép máy khách MySQL từ xa truy cập qua mạng, bạn sẽ cần thêm dòng 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' để mở quyền truy cập bên ngoài vào cổng MySQL tiêu chuẩn . Nhưng KHÔNG làm điều này trừ khi thực sự cần thiết - nếu bạn chỉ cần truy cập MySQL cục bộ (đối với ứng dụng PHP chạy dưới Apache, giả sử), bạn không cần cung cấp quyền truy cập MySQL từ xa. Và trừ khi bạn muốn có nguy cơ bị hack, nếu bạn mở cổng 3306 vào mạng, hãy đảm bảo rằng bạn yêu cầu mật khẩu mạnh cho tất cả các tài khoản người dùng MySQL và các gói máy chủ MySQL của bạn được cập nhật.

  • Một trong những nhận xét của bạn ('Cho phép ssh, dns, ldap, ftp và dịch vụ web') đề cập đến các dịch vụ LDAP, nhưng không có quy tắc nào như vậy trong cấu hình của bạn. Điều này xảy ra với tôi rất nhiều khi tôi sao chép một cấu hình ví dụ và sửa đổi nó. Nó sẽ không ảnh hưởng đến chức năng, nhưng tôi sẽ sửa bình luận, vì các bình luận sai lệch có thể gây ra gián tiếp bằng cách gây nhầm lẫn cho bạn hoặc một quản trị viên khác trong tương lai.

Theo kinh nghiệm của tôi, thật khó để đưa ra một bộ quy tắc IPTables hoàn hảo, nhưng tôi nghĩ bạn chắc chắn đang đi đúng hướng. Ngoài ra, chúc may mắn với việc tìm hiểu thêm về IPTables - những quy tắc này ban đầu có vẻ phức tạp, nhưng đó là một kỹ năng rất hữu ích cho bất kỳ sysadmin Linux nào có.


1
Thay vì cho phép truy cập MySQL từ xa thông qua tường lửa, bạn chỉ cần đảm bảo rằng tất cả những ai cần truy cập vào máy chủ MySQL đều có quyền chuyển tiếp cổng SSH.
ptman

Chuyển tiếp cổng SSH là một giải pháp thay thế tiềm năng để mở cổng và khóa các quyền của MySQL. Nhưng trừ khi anh ta xử lý dữ liệu nhạy cảm và / hoặc anh ta là mục tiêu cao cấp (điều này sẽ làm cho các tính năng mã hóa của SSH trở nên hữu ích), tôi không thấy lợi thế. Xét cho cùng, đường hầm SSH có những nhược điểm riêng, bao gồm: thiết lập / cấu hình phức tạp; tăng mức sử dụng CPU và giới hạn băng thông (do kích thước bộ đệm tĩnh của OpenSSH). Và nếu anh ta không muốn tất cả các máy khách MySQL từ xa của mình có thông tin đăng nhập cục bộ thì sao?
Ryan B. Lynch

Theo như các bình luận không phù hợp với các quy tắc, các quy tắc ICMP cho phép theo dõi, phát hiện PMTU và các thông báo hữu ích khác nhưng chúng không cho phép ping (yêu cầu echo và echo-reply).
Gerald Combs

Gerald, đó là một sản phẩm tốt, tôi thậm chí không nhận ra điều đó. Anh ta có lẽ nên thay đổi nhận xét để lưu ý rằng ping KHÔNG được phép, hoặc anh ta nên thêm các quy tắc cho phép lưu lượng yêu cầu / trả lời ICMP echo.
Ryan B. Lynch

4

Chắc chắn nhìn để hạn chế lưu lượng truy cập đi của bạn quá.

Tôi đã thấy nhiều trường hợp khai thác PHP dẫn đến việc ai đó sử dụng 'curl' hoặc 'wget' để lấy mã độc từ nơi khác, sau đó thực thi nó trên máy chủ của bạn để tham gia vào mạng botnet.

Nếu bạn không mong đợi Apache (làm ví dụ) cần nói chuyện với chính các trang web khác, hãy hạn chế lưu lượng truy cập và tiết kiệm cho bạn một chút đau đớn!


2

Các quy tắc này đã sẵn sàng để được nhập qua "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

Và chỉ dành cho bản ghi ... các chính sách mặc định này cũng nên được đặt, NẾU iptables-restore ở trên không được sử dụng:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Tôi đã chỉnh sửa bài đăng của bạn - StackOverflow là định dạng câu hỏi / câu trả lời. Vui lòng đọc Câu hỏi thường gặp: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

Điều này sẽ giới thiệu các vấn đề về hiệu năng, vì quy tắc trạng thái xuất hiện cuối cùng ở đây và sẽ xuất hiện đầu tiên vì nó phù hợp với phần lớn các gói.
Michael Hampton

0

Tại sao bạn cho phép ftp và dns? Máy chủ của bạn có cung cấp các dịch vụ đó không? FTP thực sự không nên được sử dụng, ngoại trừ một số trường hợp sử dụng rất cụ thể, thay vào đó hãy sử dụng SFTP (không phải FTPS). Ngoài ra, tại sao chỉ định tất cả các cổng khác bằng tên tượng trưng và http theo số 80? Bạn vừa sao chép cái này từ nơi khác? Không sao chép và tư vấn sẽ bù đắp cho sự thiếu hiểu biết. Đảm bảo bạn hiểu TCP, IP, tường lửa và các giao thức của các dịch vụ bạn sẽ cung cấp.


Tôi không có ý xúc phạm, ptman, nhưng tôi nghĩ câu trả lời của bạn có thể bị coi là hơi bất lịch sự và hạ mình. Ngoài ra, bạn không thực sự trả lời câu hỏi. Nếu người hỏi thiếu hiểu biết, bạn không nghĩ sẽ tốt hơn nếu nói một cách tôn trọng, và cho anh ta một sự giáo dục cụ thể về chủ đề này?
Ryan B. Lynch

Bạn có thể đúng. Nhận xét của tôi nghe có vẻ tiêu cực, nhưng không có nghĩa là như vậy. Tôi đã cố gắng liệt kê các câu hỏi sẽ kích hoạt các quá trình suy nghĩ có liên quan. Và vì tôi không biết mức độ hiểu biết cơ bản nên tôi đã không bắt đầu viết sách giáo khoa. Nhưng bạn hoàn toàn chính xác về giai điệu không có ích. May mắn thay, bạn đã viết một câu trả lời hữu ích hơn nhiều.
ptman
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.