本節包括原始程式碼之外的所有內容,但對於建立中產品的安全性仍至關重要。由於此領域所涵蓋的問題與原始程式碼沒有直接關係,因此我們將其與其他領域分開。
<servlet>
<servlet-class>com.class.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/helloworld*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/servlet*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/mservlet*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>-1</session-timeout>
</session-config>
<session-timeout>
標籤定義 Web 應用程式中,所有工作階段的預設逾時時間間隔。如果沒有 <session-timeout>
標籤,就會交由容器來設定預設逾時時間。web.xml
中,沒有 Servlet 名稱或是有相同的 Servlet 名稱,視為錯誤。每個 Servlet 應該擁有專屬名稱 (servlet-name
) 以及相符的對應 (servlet-mapping
)。web.xml
中的項目顯示了數個錯誤 Servlet 定義。
<!-- No <servlet-name> specified: -->
<servlet>
<servlet-class>com.class.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Empty <servlet-name> node: -->
<servlet>
<servlet-name/>
<servlet-class>com.class.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Duplicate <servlet-name> nodes: -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-name>Servlet</servlet-name>
<servlet-class>com.class.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<login-config>
元素來設定使用者驗證至應用程式的方式。因為沒有人可以登入,沒有 authentication 方式就表示該應用程式不知道套用授權限制的方式。Authentication 方式是使用 <auth-method>
標籤進行指定,該標籤也是 <login-config>
的子項。BASIC
、FORM
、DIGEST
和 CLIENT_CERT
。BASIC
代表 HTTP Basic 驗證。FORM
代表表單架構驗證。DIGEST
與 BASIC 驗證類似,但在 DIGEST 中,會將密碼加密。CLIENT_CERT
要求用戶端擁有公開金鑰憑證並使用 SSL/TLS。
<web-app>
<!-- servlet declarations -->
<servlet>...</servlet>
<!-- servlet mappings-->
<servlet-mapping>...</servlet-mapping>
<!-- security-constraints-->
<security-constraint>...</security-constraint>
<!-- login-config goes here -->
<!-- security-roles -->
<security-role>...</security-role>
</web-app>
web.xml
安全性限制通常用來做為角色為基礎的 Access Control 使用,但是選用的 user-data-constraint
元素會指定傳輸保證,避免以不安全的方式傳輸內容。<user-data-constraint>
標籤內,<transport-guarantee>
標籤會定義應該如何處理通訊。傳輸保證共有三個層級:NONE
表示應用程式不需要任何傳輸保證。INTEGRAL
表示應用程式需要用戶端和伺服器之間使用此方法傳送資料,如此一來在傳輸資料時就不會變更。CONFIDENTIAL
表示應用程式會要求要以避免其他實體可檢視傳輸內容的方式來傳送資料。INTEGRAL
或 CONFIDENTIAL
就表示必須使用 SSL/TLS。如果省略了 <user-data-constraint>
和 <transport-guarantee>
標籤,傳輸保證會預設為 NONE
。
<security-constraint>
<web-resource-collection>
<web-resource-name>Storefront</web-resource-name>
<description>Allow Customers and Employees access to online store front</description>
<url-pattern>/store/shop/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Anyone</description>
<role-name>anyone</role-name>
</auth-constraint>
</security-constraint>
AuthenticationFilter
的篩選對應。因為缺少定義,不會套用篩選 AuthenticationFilter
至指定的 URL 模式 /secure/*
上,而且可能會造成執行階段異常。
<filter>
<description>Compresses images to 64x64</description>
<filter-name>ImageFilter</filter-name>
<filter-class>com.ImageFilter</filter-class>
</filter>
<!-- AuthenticationFilter is not defined -->
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ImageFilter</filter-name>
<servlet-name>ImageServlet</servlet-name>
</filter-mapping>
role-name
的安全性限制會妨礙合法存取安全性限制保護的所有資源。auth-constraint
中所定義 role-name
的 security-role
可能表示該組態已過時。role-name
,但並未在 security-role
中定義該角色名稱。
<security-constraint>
<web-resource-collection>
<web-resource-name>AdminPage</web-resource-name>
<description>Admin only pages</description>
<url-pattern>/auth/noaccess/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Administrators only</description>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>INTEGRAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
web.xml
中所定義的 Servlet。web.xml
中的項目會定義 ExampleServlet
,但無法定義相符的 Servlet 對應。
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>ExampleServlet</servlet-name>
<servlet-class>com.class.ExampleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
<ejb-jar>
<enterprise-beans>
<entity>
<ejb-name>EmployeeRecord</ejb-name>
<home>com.wombat.empl.EmployeeRecordHome</home>
<remote>com.wombat.empl.EmployeeRecord</remote>
...
</entity>
...
</enterprise-beans>
</ejb-jar>
ANYONE
這個角色。ANYONE
角色,這表示沒有完整考慮應用程式的 access control,或以此方式建立應用程式會使得合理的 access control 限制不可能存在。ANYONE
,允許其叫用 Employee
EJB 的方法 getSalary()
。
<ejb-jar>
...
<assembly-descriptor>
<method-permission>
<role-name>ANYONE</role-name>
<method>
<ejb-name>Employee</ejb-name>
<method-name>getSalary</method-name>
</method-permission>
</assembly-descriptor>
...
</ejb-jar>
--anonymous-auth=true
旗標來允許匿名要求。
...
spec:
containers:
- command:
- kube-apiserver
...
- --anonymous-auth=true
...
--audit-log-path
旗標。
...
spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=RBAC
image: example.domain/kube-apiserver-amd64:v1.6.0
...
--basic-auth-file=<filename>>
旗標設定為使用 HTTP基本驗證。
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
- --basic-auth-file=<filename>
image: example.domain/kube-apiserver-amd64:v1.6.0
livenessProbe:
...