2013-07-23 77 views
0

我需要關於如何在當前Java網站上獲得最大安全性的建議。如何在tomcat中保護多個war文件7

我已經將這兩個應用程序部署在CentOS6服務器端口8080上的一個tomcat-7實例下。

的.war文件

  • website.war(上下文名稱爲ROOT)
  • processor.war(上下文名稱爲處理器)

批次罐子

  • batch.jar

安全要求

  • website.war是公開訪問。無需安全性
  • processor.war從website.war獲取HTTP請求並返回網站顯示給用戶的結果。
  • batch.jar在服務器的後臺運行,所以我猜想安全服務器除了安全服務器以外不需要任何安全性。

目前我已經加入到processor.war的web.xml文件,以確保有用戶,並通過設置在tomcat-users.xml文件「user」角色下面

  • 只要求能訪問/進程url。
  • 只有在tomcat-users.xml文件中設置了具有「admin」角色的用戶名和密碼的請求才能訪問/ admin url。

這是我對processor.war的web.xml文件的配置。

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Admin</web-resource-name> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
    <security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Public</web-resource-name> 
     <url-pattern>/processor/process*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>user</role-name> 
     <role-name>admin</role-name> 
    </auth-constraint> 
    </security-constraint> 

這是足夠安全?我讀過攻擊者可以欺騙請求並在HTTP請求中讀取密碼。我只是想真的安全processor.war使

  • 只website.war(本地主機:8080)可以請求發送給本地主機processor.war:8080 /處理器/過程
  • ,只有管理員用戶可以訪問localhost:8080/processor/admin頁面。

有人可以告訴我更多的安全是必要的,如果是的話,我能做些什麼來保護它?

+1

這篇文章可能會感興趣,如果你不熟悉的主題:[Tomcat的 - 數字認證](http://techannotation.wordpress.com/2012/07/02/tomcat-digestauthentication /) – paulsm4

+0

我不知道這件事。感謝堆保羅。我將實施DIGEST身份驗證方法而不是BASIC。這應該是正確的?我需要更多的安全嗎? – hajime

+0

這更多的是一個系統管理員任務:帶有反向代理(如Apache)的「前」tomcat,它可以打開80端口(或更好的443)和代理到您的網站戰爭,以及如果需要的話,您的processor.war的管理頁面。除本地呼叫外,全部阻止端口8080。一旦您擁有基本的安全性,您就無法調整授權 –

回答

0

我如何理解你在建築上已經將前端與後端分開。前端沒有安全漏洞,但你想保護你後端服務

請解釋你爲什麼需要這種方法,如果你能以可理解的方式做到這一點?

Tomcat是一個Servlet容器,這意味着這裏的所有東西都是普通的Java。這就是爲什麼你可以輕鬆保護你喜歡的任何URL。或者您可以構建自我(自定義)角色或基於權限的安全系統。此外,藉助過濾器界面,您可以過濾App Server特定應用程序(WAR)中任何請求的文件的任何URL。

下面是一個簡單的例子:

@WebFilter("/secured/*") 
public class LoginFilter implements Filter { 

    /** 
    * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 
    */ 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     System.out.println(" loginFilter servlet begin "); 
      HttpServletResponse httpResponse = (HttpServletResponse) response; 
      HttpServletRequest httpRequest = (HttpServletRequest) request; 
      String URI = ((HttpServletRequest)request).getRequestURI(); 
      HttpSession session =httpRequest.getSession(false); 
      String emailFromWeb = null; 
      String loginURL = httpRequest.getContextPath() + "/login.html"; 
      String rootURL = httpRequest.getContextPath() + "/secured/root.html"; 
      String userURL = httpRequest.getContextPath() + "/secured/user.html"; 
      String logoutURL=httpRequest.getContextPath() + "/logout"; 

      if(session==null){ 
       System.out.println("false inquery session is null"); 
       httpResponse.sendRedirect(loginURL); 
       return; 

      } 
      emailFromWeb = session.getAttribute("email").toString();  

      System.out.println(" email from Session "+emailFromWeb); 


       if (httpRequest.getRequestURI().equals(loginURL)){ 
        System.out.println("login page inquery"); 
        chain.doFilter(request, response); 
        return; 
       } 
       if(httpRequest.getRequestURI().matches(".*(css|jpg|png|gif|js)")){ 
        System.out.println(" inquery by "+httpRequest.getRequestURI()); 
        chain.doFilter(request, response); 
        return; 
       } 

       if (httpRequest.getRequestURI().equals(rootURL)&&Authentication.isPermitted(emailFromWeb, "RootPage")) { 
        System.out.println("root page inquery"); 
        chain.doFilter(request, response); 
        return; 
       } 

       else if(httpRequest.getRequestURI().equals(userURL)&&Authentication.isPermitted(emailFromWeb, "UserPage")){ 
        System.out.println("user page inquery"); 
        chain.doFilter(request, response); 
        return; 
       } 
       else if(httpRequest.getRequestURI().equals(logoutURL)){ 
        System.out.println("logout inquery"); 
        httpResponse.sendRedirect(loginURL); 
        return; 
       } 
       else { 
        System.out.println("false inquery"); 
        httpResponse.sendRedirect(loginURL); 
        return; 
       } 



    } 
}