Thứ sáu, 29/04/2016 | 00:00 GMT+7

Cách mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên Ubuntu 16.04

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 Ubuntu 16.04 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ả ApacheNginx .

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 firewall , v.v., nhưng chúng vẫn thể hiện sự phức tạp bổ sung.
  • 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 Ubuntu 16.04 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 này . 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: Cài đặt và cấu hình mod_jk

Đầu tiên, ta cần cài đặt module mod_jk . Web server Apache sử dụng điều này để giao tiếp với Tomcat bằng Giao thức Apache JServ.

Ta có thể cài đặt mod_jk từ repository mặc định của Ubuntu. Cập nhật index gói local và cài đặt bằng lệnh :

  • sudo apt-get update
  • sudo apt-get install libapache2-mod-jk

Mô-đun sẽ được bật tự động khi cài đặt.

Tiếp theo, ta cần cấu hình module . Tệp cấu hình chính được đặt tại /etc/libapache2-mod-jk/workers.properties . Mở file này ngay bây giờ trong editor của bạn:

  • sudo nano /etc/libapache2-mod-jk/workers.properties

Bên trong, tìm chỉ thị workers.tomcat_home . Đặt nó vào folder chính cài đặt Tomcat của bạn. Đối với cài đặt Tomcat của ta , đó sẽ là /opt/tomcat :

/etc/libapache2-mod-jk/workers.properties
workers.tomcat_home=/opt/tomcat 

Lưu file khi bạn hoàn tất.

Bước 2: Điều chỉnh Server ảo Apache thành Proxy bằng mod_jk

Tiếp theo, ta cần điều chỉnh Server ảo Apache của bạn theo yêu cầu proxy đối với cài đặt Tomcat của ta .

Tệp Server ảo chính xác để mở sẽ phụ thuộc vào phương pháp bạn sử dụng để cài đặt SSL.

Nếu bạn cài đặt certificate SSL tự ký bằng cách sử dụng hướng dẫn được liên kết ở trên, hãy mở file default-ssl.conf :

  • sudo nano /etc/apache2/sites-available/default-ssl.conf

Nếu bạn cài đặt SSL với Let's Encrypt, vị trí file sẽ phụ thuộc vào tùy chọn bạn đã chọn trong quá trình cấp certificate . Bạn có thể tìm thấy Server ảo nào có liên quan đến việc cung cấp các yêu cầu SSL bằng lệnh :

  • sudo apache2ctl -S

Đầu ra của bạn có thể sẽ bắt đầu bằng thông tin như thế này:

Output
  • VirtualHost configuration:
  • *:80 example.com (/etc/apache2/sites-enabled/000-default.conf:1)
  • *:443 is a NameVirtualHost
  • default server example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
  • port 443 namevhost example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
  • port 443 namevhost www.example.com (/etc/apache2/sites-enabled/default-ssl.conf:2)
  • . . .

Nhìn vào các dòng được liên kết với cổng SSL 443 (dòng 3-6 trong ví dụ này), ta có thể xác định file Server ảo nào có liên quan đến việc cung cấp các domain đó. Ở đây, ta thấy rằng cả file 000-default-le-ssl.conf và file default-ssl.conf đều có liên quan, vì vậy bạn nên chỉnh sửa cả hai file này. Kết quả của bạn có thể sẽ khác:

  • sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
  • sudo nano /etc/apache2/sites-enabled/default-ssl.conf

Dù file nào bạn phải mở, quy trình sẽ giống nhau. Ở đâu đó trong thẻ VirtualHost , bạn nên nhập như sau:

<VirtualHost *:443>      . . .      JKMount /* ajp13_worker      . . .  </VirtualHost> 

Lưu và đóng file . Lặp lại quy trình trên cho các file nào khác mà bạn đã xác định cần được chỉnh sửa.

Khi bạn hoàn tất, hãy kiểm tra cấu hình của bạn bằng lệnh :

  • sudo apache2ctl 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 apache2

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ó nói 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.

Bạn có thể cài đặt Nginx theo hướng dẫn của ta về cách cài đặt Nginx trên Ubuntu 16.04 .

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 cho Nginx 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 Nginx để 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 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 . Ta sẽ cho rằng bạn đang sử dụng file khối server mặc định trong hướng dẫn này:

  • sudo nano /etc/nginx/sites-available/default

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 :

/ etc / nginx / sites-available / default
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 về nội dung hiện tại và sử dụng chỉ thị proxy_pass để chuyển tới phần ngược dòng “tomcat” mà ta vừa xác định.

Ta cũng cần bao gồm cấu hình proxy_params trong khối này. Tệp này xác định nhiều chi tiết về cách Nginx sẽ ủy quyền kết nối:

/ etc / nginx / sites-available / default
upstream tomcat {     server 127.0.0.1:8080 fail_timeout=0; }  server {     . . .      location / {         #try_files $uri $uri/ =404;         include proxy_params;         proxy_pass http://tomcat/;     }      . . . } 

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 nano /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:

/opt/tomcat/conf/server.xml
. . .      <Connector port="8080" protocol="HTTP/1.1"                connectionTimeout="20000"                redirectPort="8443" /> . . .      <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:

/opt/tomcat/conf/server.xml
. . .      <Connector port="8080" protocol="HTTP/1.1"                connectionTimeout="20000"                address="127.0.0.1"                redirectPort="8443" /> . . .      <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

Nếu bạn đã làm theo hướng dẫn cài đặt Tomcat của ta , bạn đã bật firewall ufw khi cài đặt. Như vậy, tất cả các yêu cầu của ta đối với Tomcat đều bị hạn chế đối với giao diện loopback local , ta có thể xóa luật khỏi firewall đã cho phép các yêu cầu bên ngoài tới Tomcat.

  • sudo ufw delete allow 8080

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.


Tags:

Các tin liên quan

Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 16.04
2016-04-21
Cách thiết lập server ảo Apache trên Ubuntu 16.04
2016-04-21
Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 16.04
2016-04-21
Cách thiết lập Let's Encrypt chứng chỉ cho nhiều server ảo Apache trên Ubuntu 14.04
2016-01-19
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 14.04
2015-12-18
Cách thiết lập server lưu lượng truy cập Apache làm Reverse-Proxy trên Ubuntu 14.04
2015-10-03
Cách thiết lập một cụm thụ động chủ động Apache bằng máy tạo nhịp tim trên CentOS 7
2015-09-08
Cách bảo vệ server Apache với Fail2Ban trên Ubuntu 14.04
2015-08-14
Cách cài đặt Apache Kafka trên Ubuntu 14.04
2015-08-12
Cách thiết lập xác thực mật khẩu với Apache trên Ubuntu 14.04
2015-08-10