このセクションには、ソース コード以外のものでも、作成中の製品のセキュリティにとって重要なものがすべて含まれています。この分野が対象とする問題は、ソース コードに直接関係しないため、この分野の他の部分と分けました。
<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-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>
要素は、ユーザーがアプリケーションをどのように認証するかを設定するために使用されます。認証方法がないということは、誰もログインできないため、アプリケーションでは承認制約をどのように適用するかがわからないことを意味します。認証方法は、<auth-method>
タグ (<login-config>
の子) を使用して指定します。BASIC
、FORM
、DIGEST
、および CLIENT_CERT
。BASIC
は、HTTP 基本認証を示します。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
のセキュリティ制約は通常、ロール ベースのアクセス制御に使用されますが、オプションの 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
ロールに付与しないでください。ANYONE
ロールへのアクセスを許可する 1 つ以上のメソッド権限が含まれている場合は、アプリケーションのアクセス制御が十分に検討されていないか、合理的なアクセス制御制限ができない方法でアプリケーションが設定されています。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
フラグなしで 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:
...