Tomcatサーバーのセキュリティ設定方法

Tomcatサーバーのセキュリティ設定方法

Tomcat は、Java Community Process を通じて Sun が開発した、広く使用されているサーブレットおよび JavaServer Page (JSP) テクノロジの公式リファレンス実装である HTTP サーバーです。サーブレットと JSP テクノロジは、HTTP サーバー アプリケーションの構築に使用されます。サーブレット テクノロジには、アクセス セキュリティ、セッション管理、スレッド制御など、多くの機能が追加されています。 JSP テクノロジーは、動的に生成された HTML ページを処理する簡単な方法を提供します。これらの HTML ページは、実行時間を短縮するためにサーブレットに直接コンパイルされます。セキュリティを確保するための上記の 2 つのテクノロジに加えて、Tomcat パラメータを構成してセキュリティを強化することもできます。

セキュリティ設定:

1. webappsディレクトリ内のすべてのファイルを削除し、tomcat管理インターフェースを無効にします。

rm -rf /usr/local/tomcat/apache-tomcat-9.0.1/webapps/*

2. tomcat-users.xml ファイル内のすべてのユーザー権限をコメント化または削除します。

3. バージョン情報を非表示にしてconf/server.xmlを変更する


3. ユーザーの質問:

nginx と httpd は、ルート ユーザーを使用してポート 80 のガードを開始し、子プロセス/スレッドは setuid() および setgid() 関数を通じて通常のユーザーに切り替わります。つまり、親プロセスの所有者は root ユーザーであり、子プロセスとマルチスレッドの所有者は非 root ユーザーです。このユーザーにはシェルがなく、ssh およびコンソール経由でシステムにログインすることはできません。
Java の JVM はシステムから独立しており、OS 上に構築されています。どのユーザーを使用して Tomcat を起動しても、Tomcat は所有者の権限を継承します。
これにより問題が発生します。Linux システムでは、1024 未満のポートを使用できるのは root のみであるため、Tomcat のデフォルト ポートは 8080 になっています。ポート 80 を使用する場合は、Tomcat を root としてのみ起動できます。これにより、多くのセキュリティ上の問題が発生します。

Tomcat の起動にのみ使用できるユーザーを作成します。

グループ追加 -g 80 トムキャット
adduser -o --home /tomcat --shell /sbin/nologin --uid 80 --gid 80 -c "Webサーバー" tomcat
chown tomcat:tomcat -R /usr/local/tomcat/apache-tomcat-9.0.1/*
su - tomcat -c "/usr/local/tomcat/apache-tomcat-9.0.1/bin/startup.sh"

ポートマッピングを作成し、ポート80にアクセスするときにポート8080を呼び出す

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

リダイレクトをキャンセル:

iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

4. 戦争の自動展開をオフにする

vim conf/server.xml

5. 404 に表示されるバージョン情報を非表示にします。

lib 内の catalina.jar を解凍し、jar xf catalina.jar を実行します。

vim /usr/local/tomcat/apache-tomcat-9.0.1/lib/org/apache/catalina/util/ServerInfo.properties


6. tomcatのシャットダウンコマンドを変更する

Tomcat インスタンスを直接シャットダウンできる管理ポートは、server.xml で定義されます。 Telnet 経由でポートに接続した後、SHUTDOWN (デフォルトのシャットダウン コマンド) を入力して Tomcat インスタンスをシャットダウンできます (この時点でインスタンスはシャットダウンされますが、プロセスはまだ存在することに注意してください)。 Tomcat のポートはデフォルトで閉じられるため、手順は非常に簡単です。デフォルトのポートは 8005 で、コマンドは SHUTDOWN です。 close コマンドをもう少し複雑に変更する必要があります。


またはポート8005を無効にする

<サーバーポート="-1" シャットダウン="シャットダウン">

7. tomcatとプロジェクトユーザーを分ける

Tomcat が Web シェル プログラムに埋め込まれるのを防ぐには、プロジェクト ファイルを変更します。したがって、Tomcat をプロジェクト所有者から分離して、ハッキングされた場合でもプロジェクト ファイルを作成および編集できないようにする必要があります。

8. conf/web.xmlに次の設定を追加します。

9. カスタムエラーページ

web.xml は特定のアプリケーションの下にあり、このアプリケーションの 404 を処理する必要があります。ただし、http://localhost/ は tomcat 独自のアプリケーションにアクセスするため、web.xml 構成は webapp/Root/ の下のアプリケーション内に構成する必要があります。
Tomcat アプリケーションはルート ディレクトリの下に配置されているので、独自のものに置き換えるだけです。
/webapps/ROOT/WEB-INF/web.xmlに追加します

webappsディレクトリにerror.jspファイルを作成します。

<%@ ページコンテンツタイプ="text/html; charset=UTF-8" %>
<%@ ページインポート="java.io.*" %>
<%@ ページインポート="java.util.*" %>
<html>
<ヘッダー>
<title>404 ページ</title>
<本文>
<前>
<%
  列挙<文字列> attributeNames = request.getAttributeNames();
  (attributeNames.hasMoreElements()) の間
  {
    文字列 attributeName = attributeNames.nextElement();
    オブジェクト属性 = request.getAttribute(attributeName);
  out.println("request.attribute['" + attributeName + "'] = " + attribute);
  }
%>
</pre>

exception.jsp ファイル

<%@ ページ contentType="text/html; charset=UTF-8" isErrorPage="true" %>
<%@ ページインポート="java.io.*" %>
<html>
<ヘッダー>
<title>例外ページ</title>
<本文>
<hr/>
<前>
<%
response.getWriter().println("例外: " + 例外);

 if(例外 != null)
{
  response.getWriter().println("<pre>");
  例外.printStackTrace(response.getWriter());
  レスポンスのgetWriter().println("</pre>");
}

 回答
e.getWriter().println("<hr/>");
%>

ブラウザでカスタム エラー ページをテストします。


セッションタイムアウトを定義し、ディレクトリリストを禁止する

さて、この記事はこれで終わりです。お役に立てれば幸いです。

以下もご興味があるかもしれません:
  • Tomcat セキュリティ設定 win2003 tomcat 権限制限
  • Tomcat サーバーのセキュリティ設定
  • Tomcat セキュリティ仕様 (Tomcat セキュリティ強化と仕様)
  • Tomcatのセキュリティ構成とパフォーマンスの最適化の詳細な説明
  • Web セキュリティ - Tomcat は WebDAV を無効にしたり、不要な HTTP メソッドを禁止したりします

<<:  プロジェクトを素早く構築するためのvite+vue3.0+ts+element-plusの実装

>>:  MySQL データベースの型変換のための CAST 関数と CONVERT 関数の説明

推薦する

CSS3 のフィルタプロパティの使用に関する詳細な説明

最近、イントラネットポータルを修正していたときに、フィルターを使用する必要がある箇所に遭遇しました。...

WeChatアプレット仮想リストの応用例

目次序文仮想リストとは何ですか?デモ効果準備スクリーンの高さとボックスの高さ最適化要約する序文人気の...

Windows で Graphviz をインストールして開始する方法のチュートリアル

ダウンロードとインストール環境変数の設定インストール環境変数の設定確認基本的な描画の紹介グラフディグ...

MySQL Index Pushdown (ICP) とは何かを理解するための記事

目次1. はじめに2. 原則III. 実践3.1 インデックスプッシュダウンを使用しない3.2 イン...

テキストエリアの使用に関する注意事項

なぜテキストエリアについて具体的に言及するのでしょうか?なぜなら、textarea ノードは実際には...

ブラウザが登録できるイベントの概要

HTML イベント リスト一般イベント: onClick HTML: マウスクリックイベント。主にオ...

Node.js のイベント モジュールに関する知識ポイントのまとめ

Node の研究と応用を通じて、NodeJS はシングルスレッド、イベント駆動型、非ブロッキング I...

MySQL がユーザー名とパスワードの漏洩を引き起こす可能性のある Riddle の脆弱性を公開

MySQL バージョン 5.5 および 5.6 を標的とする Riddle 脆弱性により、中間者攻撃...

MySQLデータベース監視binlogを有効にする手順

序文多くの場合、ユーザーが自分のデータに対して実行する操作に基づいて何かを行う必要があります。たとえ...

Dockerコンテナ相互接続の予備的な実践についての簡単な説明

1. Dockerコンテナ間の相互接続Docker は現在、軽量の仮想化ソリューションとなっています...

CSS3を使用してヘッダーアニメーション効果を作成する

Netease Kanyouxi公式サイト(http://kanyouxi.163.com/)(棚...

react-virtualized を使用して、動的な高さを持つ画像の長いリストを実装する

目次開発中に発生した問題解決具体的な実装実績まとめバーチャルリストは、スクロールコンテナ要素の表示領...

JavaScript関数におけるこのポイントの問題の詳細な説明

このキーワードどのオブジェクトが関数を呼び出しますか? また、関数内の this はどのオブジェクト...

スキニングを実現するネイティブJavaScript

ネイティブJavaScriptでスキニングを実装するための具体的なコードは参考までに。具体的な内容は...

JS は VUE コンポーネントに基づいて都市リスト効果を実装します

この記事の例では、VUEコンポーネントに基づいて都市リストエフェクトを実装するための具体的なコードを...