검색

레이블이 Tomcat인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tomcat인 게시물을 표시합니다. 모든 게시물 표시

2022년 8월 4일

Tips - Spring Security 환경에서 HTTPS 로그인 페이지가 HTTP로 리다이랙션 되는 문제

스프링 기반의 웹프로그램을 아래와 같이 동일 도메인을 사용하면서 포트를 다르게 하여 사용자와 관리자를 분리하도록 구성을 하였다. 

  • https://www.demo.co.kr 
  • https://www.demo.co.kr:8888 
주요 환경은 아래와 같다.

  • 네이버 클라우드 LB 을 이용한 https 구현
  • CentOS 7.8.2003
  • Apache 2.4.53 
  • Tomcat 9.0.63 
  • Open JDK 11.0.15.x
  • Spring 4.3.1.RELEASE
  • Spring Security 4.1.2.RELEASE 

이슈는 권한이 없는 경우 로그인 페이지로 리다이렉션이 되는데  https://www.demo.co.kr:8888 접속을 하였으나 http://www.demo.co.kr:8888/login 로 리다이렉션이 되는 이슈가 발생했다.

 가장 많이 검색되는 방법이  <intercept-url pattern = "/**" filters = "none" requires-channel = "https" > 와 같이 requires-channel 을 추가하는 것이었지만 문제는 해결되지 않았다.

이문제는 톰켓에 RemoteIpValve 설정을 아래와 같이 추가하는 것으로 해결할 수 있었다.


다만 이런한 문제해결 방식은 LB 를 기반으로 WEB/WAS 이중화 구조 환경에서는 또다른 문제를 야기하는데 이는 클라이언트가 http로 요청을 하는 경우 톰켓에서  위 설정을 통하여 https redirect 가 되도록 구현되기 때문에 웹 서버를 통하여 다시 톰켓으로 요청이 될때 어떤 톰켓으로 요청 발생할지 알수가 없게된다. 이는 클라우드 환경에서는 멀티케스팅 기반의 세션 클러스터링을 사용할 수 없기 때문에 큰 문제가 된다.
 

2022년 3월 24일

Tomcat 8.x 환경에서 POST 요청에 대한 파라메터 값을 읽을 수 없을 때

 Tomcat + Spring 환경에서 특정한 POST 요청의 경우 리퀘스트에 포함된 파라메터 값을 읽지 못하는 경우가 있다. 톰켓에서 POST 요청 파라메터 처리와 관련하여 최대 허용 데이터 크기 제약이 있지 않나 의심을 하고 톰켓 자료를 검사해보았다. 

톰켓 커넥터 자료에 따르면 POST 요청에 대하여 데이터 크기 제약을 설정할 수 있도록 되어 있고 디폴트로는 2MB (2,097,152) 값이 적용된다고 한다.

이를 위하여 Connector의 공통 속성중 MaxPostSize 이 사용되며 아래와 같은 특징을 갖는다.

  • 톰켓에서 POST 형식의 요청에 대하여 파라메터 값을 파싱할 때 지원하는 최대 데이터 크기를 이미한다. 이 값이 0보다 적은 값으로 설정되면 제한이 비활성화 되며 지정하지 않는 경우 2,097,152 Bytes (2MB) 값이 적용된다.
  • 추가로 FailedRequestFilter 를 사용하여 이 제한을 초과하는 요청을 거부하는 데 사용할 수 있다.

정리하면 커넥터 설정에서 MaxPostSize 값을 원한는 값으로 지정하는 것으로 문제를 해결하 수 있다. 아래는 5MB로 설정한 경우이다.

${TOMCAT_HOME}/conf/server.xml (tomcat 9.x)
    


               

   


참고자료

2019년 3월 6일

SELinux 환경에서 아파치 - 톰켓 연결시 보안 오류

SELinux (Security Enhanced Linux) 는 리눅스 보안 커널의 일부로 RedHat 과 미국 NAS(National Security Agent) 간의 협업으로 배포되었다. SELinux 의 경쟁자로는 SUSE Linux Enterprise Server 의 AppArmor 이 있다.

리눅스 커널에서 SELinux 는 관리자가 설정한 규칙 및 정책에 따라 사용자의 접근을 제한하는 강제접근제어 (Mandatory Access Controls, 이하 MAC ) 을 사용한다.  MAC 방식은  임의접근제어 ( Discretionary Access Control, 이하 DAC ) 방식 보다 높은 수준의 접근 제어 방식으로 관리자가 사전에 승인한 파일들만 처리하는 방식으로 보안 침해를 방지한다.

이슈 

Apache HTTPD 와 새로운 Tomcat  연결시 8009 포트가 아닌 새로운 포트(여기에서는 8010을 사용) 를 사용하게 된다.

❶ 설정을 추가하고 서버를 다시 시작하면 Apache HTTPD 에서 Tomcat 과 연결할 수 없다는 오류가 발생하게 된다. (로그를 통하여 확인)

❷ 그러나 Tomcat 로그를 확인해보면 8010 포트로 정상 시작되었음을 로그를 통하여 확인할 수 있었다.

❸ Apache HTTPD 와  Apache Tomcat 이슈가 아닐 거라는 가정하에 리눅스 서버의 로그를 확인을 시도하였으며 /var/log/messages 로그에서 보안이슈를 확인할 수 있다.


Mar 3 10:56:21 localhost setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_connect 
access on the tcp_socket port 8010. For complete SELinux messages. 
run sealert -l aa722160-f075-474c-bcd2-a2ce9535be26


문제해결

먼저 앞으로 문제해결을 위하여 사용할 기능들을 위하여 미리 (semanage , sepolicy) 다음 패키지를 설치한다.

#yum install policycoreutils-python
#yum install selinux-policy-devel

semanage 명령을 입력하여 httpd 서비스에 허용된 포트를 확인할 수 있다.

# semanage port -l | grep -w http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000


sepolicy 명령을 사용하는 방법도 있다.

# sepolicy network -t http_port_t
http_port_t: tcp: 80,81,443,488,8008,8009,8443,9000


이제 사용하려는 포트가 이미 등록되어 있는 포트는 아닌지 다음과 같이 확인한다. (이미 등록된 포트는 등록할 수 없다)

# sepolicy network -p 8010
8010: tcp unreserved_port_t 1024-32767
8010: udp unreserved_port_t 1024-32767
8010: sctp unreserved_port_t 1024-65535


이제 httpd 서비스에서 8010 포트를 사용할 수 있도록 아래과 같이 추가할 수 있다.

# semanage port -a -t http_port_t -p tcp 8010

  • 옵션 -d 를 사용하면 특정 서비스에 대하여 등록된 정책을 삭제 할 수 있다. 
  • 8010 포트가 이미 다른 서비스에 등록되어 있다면 -m 옵션을 사용한다. 


이제 아파치 서비스를 다시 시작하면 정상적으로 8010 포트를 통하여 톰켓과 접속함을 확인 할 수 있다.

결론 

SELinux 환경에서 Apache HTTPD 는 관리자에 의하여 미리 승인된 자원들에게만 접근이 가능하게 된다. 디폴트로 httpd 서비스의 경우 다음과 포트을 사용하는 것은 허용되어 있다. 그러나 이들 허용된 포트가 아닌 다른 포트를 사용하고자 하는 경우는 SELinux 정책을 수정해야 한다.

참고자료 

SELinux (Security-Enhanced Linux)
12 Critical Linux Log Files You Must be Monitoring
RHEL7: Use SELinux port labelling to allow services to use non-standard ports.

2017년 4월 2일

CentOS 7.0 에서 아파치 & 톰켓 환경 구축하기

1. 아파치 설치

yum 명령를 사용하여 httpd, httpd-devel 패키지를 설치한다. httpd-devel는 httpd 와 tomcat 연결을 위한 Tomcat Connectors 빌드 & 배포를 위하여 필요한다.

yum install httpd

yum install httpd-devel


2. 톰켓 설치

톰켓 설치에 앞서 http://www.oracle.com/technetwork/java/javase/downloads/index.html 에서 설치파일을 다운로드하여 JAVA 를 설치한다. 문서에서는 JDK 1.8.0.121 64비트을 사용하였다.

chmod +x jdk-8u121-linux-x64.bin

./jdk-8u121-linux-x64.bin

톰켓 설치파일은 http://tomcat.apache.org 에서 최신 소스를 다운로드한다. 설치는 특별한 것을 요구하지 않으며 압축을 풀는 것으로 기본적은 설치는 완료된다. 문서에서는 /app 경로에 압축을 풀었으며 편의상 실재 설치된 경로를 /app/tomcat 경로로 심볼릭 링크를 생성하여 /app/tomcat 경로로 접근이 가능하도하였다. (tomcat 버전을 업데이트하는 경우에 유용하게 사용된다.)

tar -xvf apache-tomcat-8.5.12.tar.gz
mv apache-tomcat-8.5.12/   /app
ln -s /app/apache-tomcat-8.5.12 /app/tomcat


이제 톰켓 실행을 위하여 계정의 프로파일(.bash_profile)을 수정한다.

#자바설치위치
export JAVA_HOME= /app/jdk1.8.9_121

#톰켓설치 위치
export TOMCAT_HOME=/app/apache-tomcat-8.5.12

#자바실행옵션
export JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:+DisableExplicitGC

export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH

#편의성을 위한 alias 설정

alias tboot='$TOMCAT_HOME/bin/startup.sh'
alias tdown='$TOMCAT_HOME/bin/shutdown.sh'
alias tlog='tail -f $TOMCAT/logs/catalina.out'



프로파일(.bash_profile)을 수정한 다음에는 반듯이 재로그인 또는 . .bash_profile 명령을 사용하여 적용한다.
이제 tboot 명령을 사용하여 tomcat 를 시작한다.

3. 웹 서버 연결을 위한 Tomcat Connectors 설치하기

Tomcat Connector 설치는 컴파일이 필요하며 소스는 http://tomcat.apache.org 에서 다운로한다. 컴파일을 진행하려면 Apr 라이브러리가 필요하며 이런 이유에서 앞서 httpd-devel 패키지를 설치하였다. 컴파일을 위하여 필요한 패키지들은 아래와 같다.


  • httpd
  • httpd-devel
  • gcc
  • libtool


참고로 CentOS 7.6.* 의 경우 apxs 파일이 /usr/bin/apxs 에 있다.

cd /app/source/tomcat-connectors-1.2.42-src/native
./configure --with-apxs=/usr/sbin/apxs

make
make install

정상적으로 설치가 완료되었다면 /etc/httpd/modules 경로에 mod_jk.so 파일이 존재한다.

4. 아파치 웹서버 설정하기

/etc/httpd/conf.d/tomcat.conf 과 workers.properties 파일 만들어 준다.

/etc/httpd/conf.d/tomcat.conf
LoadModule jk_module modules/mod_jk.so
JkShmFile "run/mod_jk.shm"
JkWorkersFile conf/workers.properties
JkLogFile "logs/mod_jk.log"
JkLogLevel info

/etc/httpd/conf/workers.properties
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1


/etc/httpd/conf.d/vhost.conf 파일 만들어 준다. 본인에 환경에 맞게 수정하여 사용.

/etc/httpd/conf.d/vhost.conf
NameVirtualHost *:80


ServerName 서버 아이피 또는 도메인 
DocumentRoot 웹 프로그램 루트
JkMountFile conf/uriworkermap.properties
DirectoryIndex index.html index.jsp


어떤 요청들을 톰켓으로 전달할 것인가를 정의한는 uriworkermap.properties 생성한다.
/etc/httpd/conf/uriworkermap.properties
/*.do=worker1
/*.jsp=worker1
/logout=worker1


5. 서비스 시작하기

CentOS 7 부터는 서비스 관리를 위하여 Sys V init 를 버리고 Systemd 를 사용한다. 이러한 이유에서 기존 서비스 제어를 위하여 사용되었는 service 명령 대신에 systemctl 을 사용한다. (참고로 service 명령을 사용하면 자동으로 systemctl 명령으로 변경되어 처리됨)

systemctl start httpd.service

systemctl status httpd.service 




httpd 서비스를 자동으로 시작하게 하려면 아래의 명령어를 사용한다.

systemctl enable httpd.service

서비스 확인은 아래의 명령을 사용한다.

systemctl list-unit-files --type=service | grep httpd



참고자료
How to Install Apache on CentOS 7

2014년 3월 17일

CentOS 6.5 에서 다중 톰켓 환경 구축하기

아파치는 CentOS 6.5 에 포함된 것을 사용함

1. Tomcat & Java 설치 

톰켓 설치에 앞서 http://www.oracle.com/technetwork/java/javase/downloads/index.html 에서 설치파일을 다운로드하여 JAVA 를 설치한다. 문서에서는 JDK 1.7.0.51 버전의 rpm 파일로 설치하였다. 설치된 java 는 /usr/java 에 설치된다.

톰켓 설치파일은 http://tomcat.apache.org 에서 최신 프로그램를 다운로드한다. 문서에서는 Tomcat 8.0.3 버전을 사용하였다. 설치는 특별한 것을 요구하지 않으며 압축을 풀는 것으로 기본적은 설치는 완료된다. 문서에서는 /app/tools 경로에 압축을 풀었으며, 편의상 실재 설치된 경로를 /app/tomcat 경로로 심볼릭 링크를 생성하여 /app/tomcat 경로로 접근이 가능하도록했다.

 2. 웹 서버 연결을 위한 Tomcat Connectors 설치

Tomcat Connector 설치는 컴파일 작업이 필요하며 소스는 http://tomcat.apache.org 에서 다운로한다. 컴파일을 진행하려면 Apr 라이브러리가 필요하며 문서에서는 httpd-devel 패키지를 설치하여 사용하였다. httpd-devel 는 yum 을 사용하여 설치하였다.

# yum install httpd-devel
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: centos.mirror.cdnetworks.com
 * extras: centos.mirror.cdnetworks.com
 * updates: centos.mirror.cdnetworks.com
base                                                     | 1.1 kB     00:00
base/primary                                             | 995 kB     00:00
base                                                                  2789/2789
extras                                                   | 2.1 kB     00:00
extras/primary_db                                        | 164 kB     00:00
updates                                                  | 1.9 kB     00:00
updates/primary_db                                       | 332 kB     00:00
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package httpd-devel.i386 0:2.2.3-83.el5.centos set to be updated
--> Processing Dependency: httpd = 2.2.3-83.el5.centos for package: httpd-devel
--> Processing Dependency: apr-util-devel for package: httpd-devel
--> Running transaction check
---> Package apr-util-devel.i386 0:1.2.7-11.el5_5.2 set to be updated
--> Processing Dependency: httpd = 2.2.3-76.el5.centos for package: mod_ssl
---> Package httpd.i386 0:2.2.3-83.el5.centos set to be updated
--> Running transaction check
---> Package mod_ssl.i386 1:2.2.3-83.el5.centos set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch      Version                       Repository    Size
================================================================================
Installing:
 httpd-devel         i386      2.2.3-83.el5.centos           updates      155 k
Installing for dependencies:
 apr-util-devel      i386      1.2.7-11.el5_5.2              base          53 k
Updating for dependencies:
 httpd               i386      2.2.3-83.el5.centos           updates      1.2 M
 mod_ssl             i386      1:2.2.3-83.el5.centos         updates       97 k

Transaction Summary
================================================================================
Install       2 Package(s)
Upgrade       2 Package(s)

Total download size: 1.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): apr-util-devel-1.2.7-11.el5_5.2.i386.rpm          |  53 kB     00:00
(2/4): mod_ssl-2.2.3-83.el5.centos.i386.rpm              |  97 kB     00:00
(3/4): httpd-devel-2.2.3-83.el5.centos.i386.rpm          | 155 kB     00:00
(4/4): httpd-2.2.3-83.el5.centos.i386.rpm                | 1.2 MB     00:00
--------------------------------------------------------------------------------
Total                                           4.6 MB/s | 1.5 MB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : apr-util-devel                                           1/6
  Updating       : httpd                                                    2/6
  Installing     : httpd-devel                                              3/6
  Updating       : mod_ssl                                                  4/6
  Cleanup        : mod_ssl                                                  5/6
  Cleanup        : httpd                                                    6/6

Installed:
  httpd-devel.i386 0:2.2.3-83.el5.centos

Dependency Installed:
  apr-util-devel.i386 0:1.2.7-11.el5_5.2

Dependency Updated:
  httpd.i386 0:2.2.3-83.el5.centos      mod_ssl.i386 1:2.2.3-83.el5.centos

Complete!

이제 다운로드한 톰켓 커낵터 소스를 컴파일하여 이미 설치되어 있는 httpd 모듈에 설치한다.

cd /app/source/tomcat-connectors-1.2.37-src/native
./configure --with-apxs=/usr/sbin/apxs
make
make install

3. 아파치 웹 서버 환경 설정

/etc/httpd/conf.d/tomcat.conf 파일을 다음과 같이 생성한다.

/etc/httpd/conf.d/tomcat.conf


LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile "logs/mod_jk.log"
JkLogLevel info

톰켓 연결정보를 기술하는 workers.properties 파일을 다음과 같이 생성한다. 

/etc/httpd/conf/workers.properties (환경에 따른 수정 필요)

worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1

여러 톰켓을 구동할 수 있도록 /etc/httpd/conf/httpd.conf 파일에 VirtualHost 설정을 추가한다. 이때 JkMountFile 을 지정하여 어떤 요청들을 어떤 톰켓이 처리할 것인가를 지정한다. 

/etc/httpd/conf/httpd.conf (환경에 따른 수정 필요)

    DocumentRoot  /app/webapps/portal/WebContent
    ServerName portal
    ErrorLog logs/portal-error_log
    JkMountFile conf/uriworkermap.properties

/etc/httpd/conf/uriworkermap.properties (환경에 따른 수정 필요)

/*.do=worker1
/*.jsp=worker1

4. 다중 인스턴스 Tomcat 환경 구성

톰켓 인스턴스를 다중으로 구동할 수 있도록  /app/tools/ 경로에 설치된 톰켓을 직접 사용하지 않고 /app/servers 경로를 생성하고 이곳에 톰켓을 다시 아래와 같은 방식으로 구성한다.


  • /app/servers/[인스턴스 명]-tomcat/
  • /app/servers/[인스턴스 명]-tomcat/bin (/app/tomcat/bin 심볼링 링크)
  • /app/servers/[인스턴스 명]-tomcat/lib  (/app/tomcat/lib 심볼링 링크)
  • /app/servers/[인스턴스 명]-tomcat/conf (/app/tomcat/conf 복사)
  • logs, temp, webapps, work 디렉터리 생성.


문서에서는 developer 계정으로 톰켓을 운영하는데 이를 위하여 /app/tools 와 /app/servers 의 소유권을 developer 로 변경한다.


톰켓 운영을 위하서 developer 계정의  홈에 bin 디렉터리를 생성하고 add-new-tomcat 스크립트를 아래와 같이 생성한다.


#!/bin/sh

if [ "$#" == "0" ]; then
    echo "tomcat instance name required."
    exit 1
fi

SERVERS_HOME=/app/servers
SERVER_NAME=$1
SERVER_PATH="$SERVERS_HOME/$SERVER_NAME-tomcat"
TOMCAT_HOME=/app/tomcat


echo "new tomcat will create in "$SERVER_PATH"....."

if [ -d "$SERVER_PATH" ]; then
    echo "directory '$SERVER_PATH' already exist. check first."
    exit 1
fi

mkdir $SERVER_PATH
mkdir $SERVER_PATH/logs $SERVER_PATH/temp $SERVER_PATH/webapps $SERVER_PATH/work
cp -Rf $TOMCAT_HOME/conf $SERVER_PATH
ln -s $TOMCAT_HOME/bin $SERVER_PATH/bin
ln -s $TOMCAT_HOME/lib $SERVER_PATH/lib



이제 add-new-tomcat [새로운 인스턴스 이름] 명령으로 손쉽게 톰켓 환경을 추가할 수 있다. 톰켓 환경이 추가되면 반듯이 해당 톰켓 설정의 sever.xml 파일에서 Server 노드 shutdown, Connector 노드 port 와 redirectPort 포트를 사용하지 않는 다른 값으로 변경하여야 한다. 개인적으로는 새로운 톰켓이 추가되는 경우 각 포트에 +1 값을 지정한다. 톰켓이 추가되면 아파치 설정 파일에서 httpd.conf, workers.properties 그리고 uriworkermap.properties 설정을 변경할 필요가 있다.

conf/server.xml


     


추가로 인스턴스에 따라 톰켓을 시작, 정지, 로그보기를 위한 스크립트를 생성한다.

/home/developer/bin/tdown (톰켓 정지)

#!/bin/sh

if [ "$#" == "0" ]; then
    echo "tomcat instance name required."
    exit 1
fi

SERVER_HOME=/app/servers

SERVER_NAME=$1

SERVER_PATH="$SERVER_HOME/$SERVER_NAME-tomcat"

$SERVER_PATH/bin/shutdown.sh
/home/developer/bin/tboot (톰켓 시작)

#!/bin/sh

if [ "$#" == "0" ]; then
    echo "tomcat instance name required."
    exit 1
fi

SERVER_HOME=/app/servers

SERVER_NAME=$1

SERVER_PATH="$SERVER_HOME/$SERVER_NAME-tomcat"

PROCESS_COUNT=$( ps -ef | grep java | grep $SERVER_NAME  | wc -l  )

if [ "$PROCESS_COUNT" -eq 1 ] ; then
    echo "tomcat instance '$SERVER_NAME' already running...."
    exit 1
    else
    echo "starting tomcat instance '$SERVER_NAME'  .. "
    $SERVER_PATH/bin/startup.sh
fi


#$SERVER_PATH/bin/startup.sh


/home/developer/bin/tdown (톰켓 정지)

#!/bin/sh

if [ "$#" == "0" ]; then
    echo "tomcat instance name required."
    exit 1
fi

SERVER_HOME=/app/servers

SERVER_NAME=$1

SERVER_PATH="$SERVER_HOME/$SERVER_NAME-tomcat"

$SERVER_PATH/bin/shutdown.sh

/home/developer/bin/tlog (톰켓 로그보기)

#!/bin/sh

if [ "$#" == "0" ]; then
    echo "tomcat instance name required."
    exit 1
fi

SERVER_HOME=/app/servers

SERVER_NAME=$1

SERVER_PATH="$SERVER_HOME/$SERVER_NAME-tomcat"

echo  "$SERVER_PATH/logs/catalina.out"

tail -f "$SERVER_PATH/logs/catalina.out"

손쉬운 톰켓 운영을 위하여 공통으로 적용할 몇가지 환경 변수를 developer 계정에 추가한다. 참고로 JAVA_OPTS 값은 모든 톰켓이 시작할 때 공통으로 적용된다.

 /home/developer/.bash_profile
export JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms256m -Xmx512m -XX:NewSize=125m -XX:MaxNewSize=125m -XX:PermSize=125m -XX:MaxPermSize=125m -XX:+DisableExplicitGC"

export JAVA_HOME=/usr/lib/java