이 글에서는 authbind에 대한 소개와, Tomcat의 설정을 Authbind를 사용하게 변환해서 80번 포트에 bind하게 하는 방법을 설명한다. 그 전에 간략하게 network connection에 대해 알아보자.
(UDP connection도 비슷하지만 이 글에선 TCP만 생각한다.)
우선 두 host를 server host와 client host로 구분하자.
server host는 연결을 기다리는 쪽이고, client host는 연결을 요청하는 쪽이다.
server host의 다양한 서비스들은 연결(connection)을 기다리고 있다.
제일 대표적으로 웹서버어플리케이션(WAS)를 꼽을 수 있다.
client host는 server host에 connection을 요청하고 handshaking 과정을 거친다.
이 과정에서 두 host 사이에는 가상의 채널이 생성되고, 이 채널을 통해 두 host가 통신하게 된다.
각각의 host는 IP로 인식한다. (naver.com, google.com과 같은 도메인은 DNS를 통해서 IP로 변환되게 된다.)
하지만 server host가 여러개의 network service를 실행중인 경우는 어떻게 할까.
예를 들면
web application, ftp 등의 여러 서비스가 동시에 실행되는 경우
client host는 어떻게 server host의 원하는 서비스와 connection을 맺을 수 있을까?
정답은 port 개념에 있다. 각 host 는 가상의 많은 port를 가지고 있다.
그리고 각 서비스는 각기 다른 port에서 연결 요청을 대기하고 있다.
즉, 한 port는 한 서비스에 bind되게 된다.
port는 운영체제가 할당해 주는데, 서비스(process)가 port를 요청하면 해당 process와 port를 bind시켜준다. port를 받았다는 말은 컴퓨터 밖(네트워크, 인터넷)으로 왕래하는 길이 열렸다는 뜻이다.
주로 웹서비스는 80번 포트로, ftp는 21번 포트로 서비스된다. 이렇게 서비스의 종류별로 주로 사용하는 port가 정해져 있어서 우리는 굳이 접속할 때 포트를 명시하지 않는다.
하지만 잘 알려진 포트에는 보안상으로 위험하다. 포트가 열리면 외부에서도 내부로 모종의 접근시도가 가능하기 때문이다. 특히 이런 위험은 잘 알려진 포트에서 더욱 심하다. 보통 1000번 미만의 포트들은 특히 잘 알려져 있어서 특별히 관리되기도 한다.
그런 이유로 몇몇 리눅스에서는 user의 권한으로 실행된 process가 이러한 포트에 bind 되는것을 막고 있다.
Q. 그럼 process를 root 권한으로 실행하면 되지 않을까?
A. 물론 맞는 말이다. port bind 문제는 없다. 하지만더 큰 칼자루를 process에게 주는 꼴이다.
이런 이유로 정말 필요한 process를 제외하고는 root 권한으로 실행되지 않는게 좋다.
리눅스에서 돌아가는 데몬을 살펴보면 root 권한이 아니고 각자 계정을 생성한다거나 해서 서비스를 제공한다.
www-data 16371 0.0 0.0 200676 9628 ? S Aug06 0:00 /usr/sbin/apache2 -k start
tomcat6 10509 0.2 4.5 392320 92936 pts/1 Sl 14:46 0:08 /usr/lib/jvm/java-6-openjdk/bin/java ...
ps -aux로 확인해본 apache, tomcat 프로세스. root로 실행되고 있지 않다.
Apache의 경우에는 사실...
root 6593 0.0 0.0 194808 9976 ? Ss Oct17 1:06 /usr/sbin/apache2 -k start
root로 돌아가는 process가 있고 하위 프로세스들이 www-data 계정으로 실행이 된다.
하지만 tomcat은 다르다. 하나의 프로세스가 있고 모든 request를 해당 프로세스가 전담하는 듯 하다.
(아마 servlet의 개념 때문이 아닐까 싶다.)
하여튼 tomcat은 root 권한으로 실행이 되지 않기 때문에 낮은 포트로 서비스를 할 수가 없다.
이 경우 authbind를 사용해야 하는데...
authbind는 프로세스가 루트권한으로 실행되지 않으면서도 낮은 번호의 포트를 사용할 수 있게 해준다.
man페이지에는 다음과 같이 소개가 되어있다.
NAME
authbind - bind sockets to privileged ports without root
authbind - bind sockets to privileged ports without root
SYNOPSIS
authbind [options] program [argument ...]
authbind [options] program [argument ...]
DESCRIPTION
authbind allows a program which does not or should not run as root to bind to low-numbered ports in a controlled way.
You must invoke the program using authbind. authbind will set up some environment variables, including an LD_PRELOAD, which will allow the program (including any subprocesses it may run) to bind to low-numbered (<512) ports if the system is configured to allow this.
authbind allows a program which does not or should not run as root to bind to low-numbered ports in a controlled way.
You must invoke the program using authbind. authbind will set up some environment variables, including an LD_PRELOAD, which will allow the program (including any subprocesses it may run) to bind to low-numbered (<512) ports if the system is configured to allow this.
하지만 Tomcat에서는 별달리 설정할 필요는 없고 Linux의 /etc/default/tomcat6 파일에서
AUTHBIND=YES 구문을 추가하거나 주석해제하면 된다.
실제로 /etc/init.d/tomcat6의 script를 살펴보면 AUTHBIND 가 정의되어 있는경우 authbind 커맨드를 사용하는것을 알 수 있다.
AUTHBIND_COMMAND=""
if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
AUTHBIND_COMMAND="/usr/bin/authbind --deep /bin/bash -c "
fi
if [ "$AUTHBIND" = "yes" -a "$1" = "start" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
AUTHBIND_COMMAND="/usr/bin/authbind --deep /bin/bash -c "
fi
*이 글은 Ubuntu Server 8.04, Tomcat 6 기준으로 작성되었음.
'컴퓨터' 카테고리의 다른 글
| wget 세션 유지하고 내용 가져오기. (2) | 2011/01/05 |
|---|---|
| Google Chrome PDF Viewer Plugin 비활성화 시키기 (1) | 2010/12/29 |
| Tomcat, authbind를 사용해서 80번 포트에 bind하기. (0) | 2010/11/14 |
| Windows7 유용한 단축키 (3) | 2010/04/12 |
| XMLholic (0) | 2010/02/03 |
| Office Tip 몇가지. (0) | 2010/01/11 |