Cách mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên CentOS 7
Apache Tomcat là một web server và containers servlet được thiết kế để phục vụ các ứng dụng Java. Thường được sử dụng trong triển khai doanh nghiệp production và cho các nhu cầu ứng dụng nhỏ hơn, Tomcat vừa linh hoạt vừa mạnh mẽ.Trong hướng dẫn này, ta sẽ thảo luận về cách bảo mật cài đặt CentOS 7 Tomcat của bạn bằng SSL. Theo mặc định, khi cài đặt, tất cả giao tiếp giữa server Tomcat và client đều không được mã hóa, bao gồm bất kỳ password nào đã nhập hoặc bất kỳ dữ liệu nhạy cảm nào. Có một số cách để ta có thể kết hợp SSL vào cài đặt Tomcat của bạn . Hướng dẫn này sẽ trình bày cách cài đặt server proxy hỗ trợ SSL để thương lượng an toàn với khách hàng và sau đó chuyển yêu cầu cho Tomcat.
Ta sẽ giới thiệu cách cài đặt điều này với cả Apache và Nginx .
Tại sao lại có Reverse-proxy ?
Có một số cách mà bạn có thể cài đặt SSL cho quá trình cài đặt Tomcat, mỗi cách đều có những điểm cân bằng. Sau khi biết rằng Tomcat có khả năng mã hóa kết nối nguyên bản, có vẻ lạ khi ta thảo luận về giải pháp Reverse Proxy .
SSL với Tomcat có một số nhược điểm gây khó khăn cho việc quản lý:
- Tomcat, khi chạy theo khuyến nghị với user không có quyền , không thể liên kết với các cổng bị hạn chế như cổng SSL thông thường 443 : Có những cách giải quyết cho điều này, như sử dụng chương trình
authbind
để ánh xạ một chương trình không quyền với một cổng bị hạn chế, cài đặt chuyển tiếp cổng với firewall , v.v., nhưng chúng đều có thêm độ phức tạp. - SSL với Tomcat không được hỗ trợ rộng rãi bởi các phần mềm khác : Các dự án như Let's Encrypt không cung cấp cách tương tác root nào với Tomcat. Hơn nữa, định dạng kho khóa Java yêu cầu các certificate thông thường phải được chuyển đổi trước khi sử dụng, điều này làm phức tạp thêm quá trình tự động hóa.
- Web server thông thường phát hành thường xuyên hơn Tomcat : Điều này có thể có ý nghĩa bảo mật đáng kể cho các ứng dụng của bạn. Ví dụ: bộ mật mã Tomcat SSL được hỗ trợ có thể nhanh chóng lỗi thời, khiến các ứng dụng của bạn không được bảo vệ tối ưu. Trong trường hợp cần cập nhật bảo mật, việc cập nhật web server sẽ dễ dàng hơn so với cài đặt Tomcat của bạn.
Một giải pháp Reverse Proxy sẽ bỏ qua nhiều vấn đề này bằng cách chỉ cần đặt một web server mạnh trước cài đặt Tomcat. Web server có thể xử lý các yêu cầu của khách hàng với SSL, chức năng mà nó được thiết kế đặc biệt để xử lý. Sau đó, nó có thể yêu cầu proxy tới Tomcat đang chạy trong cấu hình bình thường, không quyền của nó.
Sự tách biệt các mối quan tâm này đơn giản hóa cấu hình, ngay cả khi nó nghĩa là chạy một phần mềm bổ sung.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn sẽ phải cài đặt Tomcat trên server của bạn . Hướng dẫn này sẽ giả định bạn đã sử dụng các hướng dẫn trong hướng dẫn cài đặt Tomcat 8 trên CentOS 7 của ta để cài đặt .
Khi bạn cài đặt và chạy Tomcat, hãy tiếp tục bên dưới với phần dành cho web server bạn muốn . Apache bắt đầu ngay bên dưới, trong khi cấu hình Nginx có thể được tìm thấy bằng cách bỏ qua một chút.
(Tùy chọn 1) Ủy quyền với mod_jk
của Web server Apache
Web server Apache có một module gọi là mod_jk
có thể giao tiếp trực tiếp với Tomcat bằng Giao thức Apache “JServ”.Trình kết nối cho giao thức này được bật theo mặc định trong Tomcat, vì vậy Tomcat đã sẵn sàng xử lý các yêu cầu này.
Yêu cầu của Phần
Trước khi ta có thể thảo luận về cách proxy các kết nối web server Apache với Tomcat, bạn phải cài đặt và bảo mật một web server Apache.
Bạn có thể cài đặt web server Apache theo bước 1 của hướng dẫn cài đặt CentOS 7 LAMP . Không cài đặt MySQL hoặc PHP.
Sau đó, bạn cần cài đặt SSL trên server . Cách bạn làm điều này sẽ phụ thuộc vào việc bạn có domain hay không.
- Nếu bạn có domain … cách dễ nhất để bảo mật server của bạn là với Let's Encrypt, cung cấp các certificate miễn phí, tin cậy . Làm theo hướng dẫn Hãy mã hóa Apache của ta để cài đặt điều này.
- Nếu bạn không có domain … và bạn chỉ đang sử dụng cấu hình này để thử nghiệm hoặc sử dụng cá nhân, bạn có thể sử dụng certificate tự ký thay thế. Điều này cung cấp cùng một loại mã hóa, nhưng không có xác thực domain . Làm theo hướng dẫn SSL tự ký của ta cho Apache để cài đặt .
Khi bạn hoàn tất các bước này, hãy tiếp tục bên dưới để tìm hiểu cách kết nối web server Apache với cài đặt Tomcat của bạn.
Bước 1: Biên dịch và cài đặt mod_jk
Mặc dù bản thân Tomcat đi kèm với trình kết nối JServ, repository CentOS 7 không bao gồm module mod_jk
mà web server Apache cần giao tiếp bằng giao thức đó. Để thêm chức năng này, ta sẽ phải download và biên dịch trình kết nối từ trang web của dự án Tomcat.
Trước khi ta download mã nguồn cho trình kết nối, ta cần cài đặt bản dựng và phụ thuộc thời gian chạy cần thiết từ repository CentOS. Ta sẽ cài đặt GCC để biên dịch trình kết nối và các file phát triển web server Apache để có sẵn thư viện Apache cần thiết.
- sudo yum install gcc httpd-devel
Sau khi các phần phụ thuộc được cài đặt, hãy chuyển vào folder có thể ghi và download mã nguồn trình kết nối. Bạn có thể tìm thấy version mới nhất trên trang download trình kết nối Tomcat . Sao chép liên kết được liên kết với nguồn tar.gz
mới nhất cho các trình kết nối Tomcat JK và sử dụng lệnh curl
để tải nó xuống server của bạn:
- cd /tmp
- curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
Tiếp theo, extract tarball vào folder hiện tại và di chuyển vào folder con native
, nơi mã nguồn và tập lệnh xây dựng được đặt trong phân cấp file được extract :
- tar xzvf tomcat-connectors*
- cd tomcat-connectors*/native
Bây giờ, ta đã sẵn sàng để cấu hình phần mềm. Ta cần đặt vị trí của file binary công cụ mở rộng Apache apxs
để cấu hình thành công nguồn cho server của ta . Sau đó, ta có thể sử dụng make
để xây dựng phần mềm và cài đặt module đã biên dịch:
- ./configure --with-apxs=/usr/bin/apxs
- make
- sudo make install
Thao tác này sẽ cài đặt module mod_jk
vào folder module Apache.
Bước 2: Cấu hình Mô-đun mod_jk
Bây giờ module đã được cài đặt, ta có thể cấu hình web server Apache để sử dụng nó để giao tiếp với version Tomcat của ta . Điều này có thể được thực hiện bằng cách cài đặt một vài file cấu hình.
Bắt đầu bằng cách mở một file có tên jk.conf
trong folder /etc/httpd/conf.d
:
- sudo vi /etc/httpd/conf.d/jk.conf
Bên trong, ta cần bắt đầu bằng cách tải module mod_jk
. Sau đó, ta sẽ cấu hình một file log chuyên dụng và bộ nhớ dùng chung. Cuối cùng, ta sẽ sử dụng lệnh JkWorkersFile
để trỏ đến file ta sẽ tạo để chỉ cấu hình worker của ta .
Dán cấu hình sau vào file để liên kết các phần này với nhau. Bạn không cần phải sửa đổi bất cứ điều gì:
LoadModule jk_module modules/mod_jk.so JkLogFile logs/mod_jk.log JkLogLevel info JkShmFile logs/mod_jk.shm JkWorkersFile conf/workers.properties
Lưu file khi bạn hoàn tất.
Tiếp theo, ta sẽ tạo file thuộc tính worker. Ta sẽ sử dụng điều này để xác định một worker để kết nối với phần backend Tomcat của ta :
- sudo vi /etc/httpd/conf/workers.properties
Bên trong file này, ta sẽ xác định một worker duy nhất, sẽ kết nối với version Tomcat của ta trên cổng 8009 bằng cách sử dụng version 13 của Giao thức Apache JServ:
worker.list=worker1 worker.worker1.type=ajp13 worker.worker1.host=127.0.0.1 worker.worker1.port=8009
Khi bạn hoàn tất, hãy lưu file .
Bước 3: Điều chỉnh Server ảo Apache thành Proxy bằng mod_jk
Cuối cùng, ta cần điều chỉnh file Apache Virtual Host đã được bật SSL. Nếu bạn đã tuân theo các yêu cầu , thì điều này hiện sẽ được cấu hình để bảo vệ nội dung của bạn bằng certificate SSL tin cậy hoặc tự ký.
Mở file ngay bây giờ bằng lệnh :
- sudo vi /etc/httpd/conf.d/ssl.conf
Bên trong, trong đoạn cấu hình VirtualHost
, thêm một chỉ thị JkMount
để chuyển tất cả lưu lượng mà server ảo này nhận được đến cá thể công nhân mà ta vừa xác định. JkMount
có thể được đặt ở bất kỳ đâu trong phần VirtualHost
:
. . . <VirtualHost _default_:443> . . . JkMount /* worker1 . . . </VirtualHost>
Lưu file khi bạn hoàn tất.
Tiếp theo, kiểm tra cấu hình của bạn bằng lệnh :
- sudo apachectl configtest
Nếu kết quả chứa Syntax OK
, hãy khởi động lại quy trình web server Apache:
- sudo systemctl restart httpd
Bây giờ, bạn có thể cài đặt Tomcat bằng cách truy cập version SSL của trang web trong trình duyệt web :
https://example.com
Tiếp theo, bỏ qua cấu hình Nginx bên dưới và tiếp tục phần hướng dẫn chi tiết cách hạn chế quyền truy cập vào Tomcat để hoàn tất cấu hình của bạn.
(Tùy chọn 2) HTTP Proxying với Nginx
Việc ủy quyền cũng dễ dàng với Nginx, nếu bạn thích nó hơn web server Apache. Mặc dù Nginx không có module cho phép nó sử dụng Giao thức Apache JServ, nhưng nó có thể sử dụng khả năng ủy quyền HTTP mạnh mẽ của bạn để giao tiếp với Tomcat.
Yêu cầu của Phần
Trước khi ta có thể thảo luận về cách ủy quyền các kết nối Nginx tới Tomcat, bạn phải cài đặt và bảo mật Nginx.
Cách bạn làm điều này sẽ phụ thuộc vào việc bạn có domain hay không.
- Nếu bạn có domain … cách dễ nhất để bảo mật server của bạn là với Let's Encrypt, cung cấp các certificate miễn phí, tin cậy . Làm theo hướng dẫn Let's Encrypt dành cho Nginx của ta để cài đặt Nginx và bảo mật nó bằng Let's Encrypt.
- Nếu bạn không có domain … và bạn chỉ đang sử dụng cấu hình này để thử nghiệm hoặc sử dụng cá nhân, bạn có thể sử dụng certificate tự ký thay thế. Điều này cung cấp cùng một loại mã hóa, nhưng không có xác thực domain . Làm theo hướng dẫn SSL tự ký của ta dành cho Nginx để cài đặt Nginx và cấu hình nó bằng certificate tự ký.
Khi bạn hoàn tất các bước này, hãy tiếp tục bên dưới để tìm hiểu cách kết nối web server Nginx với cài đặt Tomcat của bạn.
Bước 1: Điều chỉnh cấu hình khối server Nginx
Việc cài đặt Nginx thành proxy cho Tomcat rất đơn giản.
Bắt đầu bằng cách mở file khối server được liên kết với trang web . Cả hướng dẫn SSL tự ký và Let's Encrypt đều cấu hình khối server được mã hóa trong file /etc/httpd/conf.d/ssl.conf
, vì vậy ta sẽ sử dụng điều đó:
- sudo vi /etc/nginx/conf.d/ssl.conf
Bên trong, về phía trên cùng của file , ta cần thêm một khối upstream
. Điều này sẽ phác thảo chi tiết kết nối để Nginx biết server Tomcat của ta đang lắng nghe ở đâu. Đặt cái này bên ngoài bất kỳ khối server
được xác định trong file :
upstream tomcat { server 127.0.0.1:8080 fail_timeout=0; } server { . . .
Tiếp theo, trong khối server
được xác định cho cổng 443, hãy sửa đổi location /
khối. Ta muốn chuyển tất cả các yêu cầu trực tiếp đến khối upstream
mà ta vừa xác định. Comment bất kỳ nội dung hiện có nào và sử dụng chỉ thị proxy_pass
để chuyển đến phần ngược dòng “tomcat” mà ta vừa xác định.
Ta cũng sẽ đặt một số tiêu đề cho phép Nginx chuyển thông tin Tomcat về yêu cầu:
upstream tomcat { server 127.0.0.1:8080 fail_timeout=0; } server { . . . location / { #try_files $uri $uri/ =404; proxy_pass http://tomcat/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } . . . }
Khi bạn hoàn tất, hãy lưu file .
Bước 2: Kiểm tra và khởi động lại Nginx
Tiếp theo, hãy kiểm tra đảm bảo rằng các thay đổi cấu hình của bạn không gây ra bất kỳ lỗi cú pháp nào:
- sudo nginx -t
Nếu không có lỗi nào được báo cáo, hãy khởi động lại Nginx để triển khai các thay đổi :
- sudo systemctl restart nginx
Bây giờ, bạn có thể cài đặt Tomcat bằng cách truy cập version SSL của trang web trong trình duyệt web :
https://example.com
Hạn chế quyền truy cập vào cài đặt Tomcat
Đến đây bạn có quyền truy cập được mã hóa SSL vào cài đặt Tomcat của bạn , ta có thể khóa cài đặt Tomcat một chút nữa.
Vì ta muốn tất cả các yêu cầu của ta tới Tomcat đều phải thông qua proxy của ta , ta có thể cấu hình Tomcat để chỉ lắng nghe các kết nối trên giao diện loopback local . Điều này đảm bảo các bên bên ngoài không thể cố gắng thực hiện các yêu cầu từ Tomcat một cách trực tiếp.
Mở file server.xml
trong folder cấu hình Tomcat của bạn để thay đổi các cài đặt này:
- sudo vi /opt/tomcat/conf/server.xml
Trong file này, ta cần sửa đổi định nghĩa Trình kết nối . Hiện tại, có hai Trình kết nối được bật trong cấu hình. Một xử lý các yêu cầu HTTP bình thường trên cổng 8080, trong khi cái kia xử lý các yêu cầu Giao thức Apache JServ trên cổng 8009. Cấu hình sẽ giống như sau:
. . . <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> . . . <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Để hạn chế quyền truy cập vào giao diện loopback local , ta chỉ cần thêm thuộc tính “address” được đặt thành 127.0.0.1
trong mỗi định nghĩa Trình kết nối này. Kết quả cuối cùng sẽ như thế này:
. . . <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" address="127.0.0.1" redirectPort="8443" /> . . . <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
Sau khi bạn đã thực hiện hai thay đổi đó, hãy lưu file .
Ta cần khởi động lại quy trình Tomcat của bạn để áp dụng các thay đổi này:
- sudo systemctl restart tomcat
Cài đặt Tomcat của bạn bây giờ chỉ có thể truy cập được thông qua proxy web server của bạn.
Kết luận
Đến đây, các kết nối đến version Tomcat của bạn phải được mã hóa bằng SSL với sự trợ giúp của proxy web server . Mặc dù việc cấu hình một quy trình web server riêng biệt có thể làm tăng phần mềm liên quan đến việc cung cấp các ứng dụng của bạn, nhưng nó lại đơn giản hóa đáng kể quy trình đảm bảo lưu lượng truy cập của bạn.
Các tin liên quan
Cách tạo chứng chỉ SSL trên Apache cho CentOS 72017-01-04
Cách bảo mật Apache bằng Let's Encrypt trên Debian 8
2016-12-20
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Apache
2016-12-15
Cách di chuyển web root Apache đến một vị trí mới trên Debian 8
2016-12-14
Cách thiết lập mod_rewrite cho Apache trên CentOS 7
2016-10-26
Cách di chuyển web root Apache đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách thiết lập xác thực mật khẩu với Apache trên Ubuntu 16.04
2016-07-26
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Ubuntu 16.04
2016-05-17
Cách mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên Ubuntu 16.04
2016-04-29