이 섹션에는 소스 코드 외부에 있지만 제작 중인 제품의 보안에는 여전히 중요한 내용이 모두 포함되어 있습니다. 이 섹션에서 다루는 문제들은 소스 코드와 직접적으로 관련이 없기 때문에 나머지 섹션과 분리했습니다.
<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>
태그는 웹 응용 프로그램의 모든 세션에 대해 기본 세션 시간 초과 간격을 정의합니다. <session-timeout>
태그가 누락된 경우, 기본 시간 초과를 설정하도록 컨테이너에 맡겨집니다.web.xml
에서 누락되거나 중복된 서블릿 이름은 오류입니다. 모든 서블릿에는 고유한 이름(servlet-name
)과 해당하는 매핑(servlet-mapping
)이 있어야 합니다.web.xml
의 다음 항목은 몇 가지 잘못된 서블릿 정의를 보여줍니다.
<!-- 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>
요소는 사용자가 응용 프로그램에 인증하는 방법을 구성하는 데 사용됩니다. 인증 방법이 없으면 누구도 로그인할 수 없으므로 응용 프로그램에서 권한 부여 제약 조건을 적용하는 방법을 알지 못합니다. 인증 방법은 <login-config>
의 하위 항목인 <auth-method>
태그를 사용하여 지정됩니다.BASIC
, FORM
, DIGEST
및 CLIENT_CERT
입니다.BASIC
은 HTTP 기본 인증을 나타냅니다.FORM
은 양식 기반 인증을 나타냅니다.DIGEST
는 기본 인증과 같습니다. 그러나 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
보안 제약 조건은 일반적으로 RBAC(Role-Based Access Control)에 사용되지만 선택적 user-data-constraint
요소로 콘텐트의 안전하지 않은 전송을 차단하는 전송 보증을 지정할 수 있습니다.<user-data-constraint>
태그 안에서 <transport-guarantee>
태그는 통신의 처리 방법을 정의합니다. 전송 보증에는 3가지 수준이 있습니다.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
에 정의된 서블릿은 해당하는 서블릿 매핑 없이 액세스할 수 없습니다.web.xml
의 다음 항목은 ExampleServlet
을 정의하지만 해당하는 서블릿 매핑을 정의하지 않습니다.
<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
역할에는 EJB 메서드를 호출할 수 있는 권한을 부여해서는 안 됩니다.ANYONE
역할에 액세스 권한을 부여하는 하나 이상의 메서드 권한이 EJB 배포 설명자에 포함된 경우 이는 응용 프로그램에 대한 액세스 제어가 완전히 고려되지 않았거나 응용 프로그램이 합리적인 액세스 제어 제한이 불가능한 방식으로 구성되었음을 나타냅니다.Employee
EJB의 메서드 getSalary()
를 호출할 수 있는 권한을 ANYONE
에 부여합니다.
<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
플래그 없이 Kubernetes API 서버를 시작합니다.
...
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:
...