'전체 글'에 해당되는 글 1424건

  1. 2006.02.17 리눅스 기초 보안
  2. 2006.02.17 proftp에 대한 모든것...

보안

리눅스 운영체제가 인기가 좋은 이유 중 하나는 다른 서버 운영체제에 비해 저렴하다는 것과, 기능과 성능에 있어서 강력하다는 것일 것입니다. 그러나 강력한 시스템인 동시에 관리하기 어렵고, 그에 따른 보안 위험도 크다는데 문제가 있습니다. 본 기사는 리눅스 시스템에 있어 기본적이면서 일반적인 보안에 대해 설명하고자 합니다. 본문은 또한 와우리눅스 7.0 까치를 기준으로 설명하고 있지만 다른 레드햇 계열 리눅스 시스템에도 적용이 가능합니다.


물리적 보안

보통 서버가 연구실이나 외부 사람이 많이 오가는 곳에 설치되어 있다면 그 사람들 중 물리적인 크래킹을 하려는 사람이 있는데 이에 대한 방어를 할 수 있는 것은 주로 BIOS와 LILO(리눅스 부트 로더)에 대한 패스워드를 설정하는 작업과 콘솔에서 root로 로그인을 못하게 설정하는 것으로 구성됩니다.

■ BIOS

콘솔로의 접근을 막기 위해서는 BIOS 에 암호를 설정해두고, 플로피와 CD-ROM으로의 부팅은 하지 못하도록 설정합니다. 일단 물리적으로 시스템에 접속하게 되면 시스템을 보호할 방법은 없다는 것을 명심해야 합니다.

■ LILO

다음과 같이 lilo 설정 파일 (/etc/lilo.conf)을 수정하여 부팅시 암호를 걸 수 있습니다. password=xxx 와 같이 패스워드를 설정함으로써 부팅 프로세스가 진행되는 동안 시스템을 보호할 수 있습니다. restricted 옵션을 사용하여 싱글 유저모드로 부팅할 때와 같이 특별한 옵션을 사용할 때에 대비하여 패스워드를 물어보도록 설정합니다.

boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
message=/boot/message
default=linux
timeout=00 # 대기 시간을 00초로 설정합니다.
restricted # 특수한 옵션을 사용할 경우 암호를 묻습니다.
password=openlinux # 이 라인을 추가하고 암호를 설정합니다.
image=/boot/vmlinuz-2.2.17-8wl2smp
label=linux
initrd=/boot/initrd-2.2.17-8wl2smp.img
read-only
root=/dev/sda6


리로 설정파일의 암호가 암호화되지 않은 일반 텍스트이므로, 루트만이 억세스 할 수 있도록 다음과 같이 합니다.

# chmod 600 /etc/lilo.conf


리로 설정 파일을 수정한 다음 리로를 실행하여 갱신합니다.

# /sbin/lilo -v


마지막으로 리로 설정 파일의 변경을 막기 위해 lilo.conf 파일을 chattr 명령으로 변경 불가로 만듭니다. (이 명령은 ext2 파일 시스템에서만 사용 가능합니다.)

# chattr +i /etc/lilo.conf



■ Control-Alt-Delete

리눅스에서는 Ctrl + Alt + Del 키 조합을 사용하여 시스템을 리부팅 시킬 수 있습니다. 문제는 이러한 기능을 로그인 대기 상태에서도 사용할 수 있고 내부의 다른 사람이 이러한 기능을 이용하여 콘솔에서 서비스중인 시스템을 리부팅 시킬 수 있다는 점입니다. 따라서 Control-Alt-Delete 키 조합을 사용하지 못하도록 합니다.
/etc/inittab 파일에서 다음과 같은 라인을 찾아 주석처리 합니다.

#ca::ctrlaltdel:/sbin/shutdown -t3 -r now


수정한 것을 리부팅하지 않고 바로 적용하려면,

# /sbin/telinit q


와 같이 합니다.


패치 설치

설치 후 시스템이 재시동되고 나면 반드시 패치를 설치합니다.
패치는 OS별로 제공되어지는데 레드햇 리눅스는 다음 사이트를 참조하기를 바랍니다.

레드햇 리눅스 패치 사이트 : http://www.redhat.com/support/errata/

여기에 있는 보안, 버그 패치들을 적용하지 않으면 시스템은 쉽게 침해 당할 것입니다. 또한 리눅스 시스템은 고립된 네트워크에 연결된 채 중계 서버를 통해 패치되어야 함을 잊지 말도록 합니다. 레드햇의 경우 rpm 파일을 다운받으면 다음의 명령어를 통해 쉽게 설치할 수 있습니다.

# rpm -Uvh wu-ftpd-2.6.0-l.i386.rpm : wu-ftpd 패치하는 명령어



사용하지 않는 서비스 제거

리눅스 시스템을 보안 위험으로부터 보호하는데 있어, 제일 처음으로 하는 작업이 바로 불필요한 서비스를 제거하는 것입니다. 리눅스 시스템은 디폴트로 여러 유용한 서비스를 설정하고 실행하도록 되어 있습니다. 그러나, 이 서비스들의 대부분은 일반적인 환경에서는 필요하지 않으며, 보안측면에서 볼 때, 잠재적인 위험을 지니고 있습니다. 이러한 서비스를 제거함으로써 보안 영역을 크게 넓힐 수 있습니다.

■ xinetd 서버를 사용하는 경우

리눅스 6.2까지는 네트워크 연결을 처리하기 위해서 inetd를 사용하였습니다. 그러나 레드햇 리눅스 7.0부터는 inetd를 사용하지 않고 보다 확장된 xinetd를 사용합니다. xinetd 서버를 사용하는 경우에는 /etc/xinetd.d/ 디렉토리 아래에 서비스 이름으로 구분되어 있으므로 서비스 파일을 열어서 수정합니다.
텔넷 서비스의 경우 telnet 파일을 수정합니다.
다른 서비스도 동일한 방법으로 설정합니다.

service telnet
{
disable = yes # 이 항목을 추가하면 서비스를 하지 않습니다.
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
}


이렇게 수정한 후 아래와 같이 xinetd 서버를 재시작하면 시스템에 적용 됩니다.

# killall -USR2 xinetd



■ inetd 서버를 사용하는 경우 (레드햇 6.2)

먼저, /etc/inetd.conf 파일을 보도록 합시다.
이 파일에는 디폴트로 여러 다양한 서비스들이 설정되어 있으나, 대부분 ftp와 telnet만이 필요합니다. 다른 불필요한 서비스들은 주석(#)으로 처리하여 제거하도록 합니다.

예)

# ....
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#gopher stream tcp nowait root /usr/sbin/tcpd gn
#smtp stream tcp nowait root /usr/bin/smtpd smtpd
#nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd


pop, imapd, rsh과 같이 inetd에 의해 실행되는 많은 서비스들이 보안 취약점에 노출되어 있습니다. 다음 명령어를 이용하면 가능한 서비스들을 확인할 수 있습니다. 이 명령어는 코멘트 처리되지 않은 서비스들을 보여 줍니다.

# grep -v "^#" /etc/inetd.conf



※ 불필요한 서비스 제거를 위한 단계별 명령어 순서

1. 소유자(root)만이 읽기/쓰기가 가능하도록 퍼미션을 바꾸어 줍니다.
또한, 반드시 /etc/inetd.conf 파일의 소유자는 root 이어야 합니다.

# chmod 600 /etc/inetd.conf

# chown root.root /etc/inetd.conf


2. 편집한 후에는 다음처럼 시그널을 보내 inetd 서버를 재구동합니다.

# killall -HUP inetd


3. super-user만이 이 파일에 대해 접근할 수 있도록 'inetd.conf'파일을 셋팅하는 것으로 일단 셋팅되면 수정, 삭제 또는 rename할 수 없습니다. 나중에 inetd.conf 파일을 수정하고자하면 플래그를 -i로 바꿔주면 됩니다.

# chattr +i /etc/inetd.conf



■ rc 스크립트

보안이 약한 데몬이 떠 있지 않다면 그 만큼 안전하다는 것이므로 부팅시 필요없는 데몬을 죽이는 것 만으로도 80% 이상의 방어를 할 수 있습니다.
다음은 init 프로세스에 의해 어떤 서비스가 시작될 지 결정하는 .rc 스크립트들입니다. 레드햇의 경우 이 스크립트들은 /etc/rc.d/rc3.d에 있습니다. 자동으로 Gnome이나 KDE등의 GUI 환경으로 부팅되도록 설정되어 있다면 /etc/rc.d/rc5.d에 있습니다.
시동되도록 되어 있는 것을 멈추게 하려면 대문자 S를 소문자 s로 바꿉니다. 또 원한다면 레드햇의 유틸리티를 사용할 수 있습니다. '/usr/sbin/ntsysv' 명령을 실행하면 부트 프로세스중에 구동시킬 스크립트를 선택할 수 있습니다.
다른 방법은 대부분의 배포판에서 볼 수 있는 'chkconfig' 를 사용하는 것입니다.

다음의 스크립트들은 디폴트로 설치되는 것들이나 시스템에서 주요한 기능은 하지 않는 것들입니다. 필요하지 않다면 시동되지 않도록 설정합니다.

스크립트 설 명
S05apmd
laptop에만 필요
S10xntpd
Network Time Protocol
S11portmap
NIS, NFS같은 rpc 서비스가 있을 때만 필요함
S15sound
사운드 카드 설정 저장
S15netfs
nfs client, nfs 서버에서 파일시스템을 마운트할 때 사용
S20rstatd
r 서비스 실행을 하지 않도록 함, 원격 사용자에게 너무 많은 정보를 제공함.
S20ruserd

S20rwhod

S20rwalld

S20bootparamd
디스크가 없는 클라이언트에서 사용
S25spuid
프락시 서버
S34yppasswdd
NIS 서버에만 필요함, 아주 취약한 서비스
S35ypserv
NIS 서버에만 필요함, 아주 취약한 서비스
S35dhcpd
dhcpd 서버 데몬을 구동함
S40atd
크론과 비슷한 at 서비스에 이용
S45pcmcia
laptop에만 쓰임
S50snmpd
SNMP 데몬, 시스템 관련 정보를 원격 사용자에게 보냄

이름에 포함된 숫자들은 초기화 되는 순서를 결정하는 요소로서, 이것은 어떤 배포판인지 어떤 버전인지에 따라 달라집니다.

스크립트 설 명
S55named
DNS 서버, 사용한다면 최신으로 업데이트한다. http://www.isc.org/bind.html
S55routed
RIP, 정말 필요한 경우가 아니면 실행하지 않는다.
S60lpd
프린팅 서버
S60mars-nwe
Neteware file과 프린터 서버
S60nfs
NFS 서버에 사용, 꼭 필요하지 않으면 실행하지 않는다.
S72amd
AutoMount 데몬, 원격 파일시스템 마운트에 사용
S75gated
OSPF와 같은, 다른 라우팅 프로토콜 구동에 사용
S80sendmail
이 스크립트를 정지시키더라도 여전히 email를 보낼 수 있으며, 단지 수신이나 중계는 불가능할 것이다.
S85httpd
아파치 웹서버, 가장 최신 버전으로 업데이트할 것을 권고한다. http://www.apache.org
S87ypbind
NIS 클라이언트라면 필요함
S90xfs
X 폰트 서버
S95innd
News 서버
S99linuxconf
브라우저를 통해서 리눅스 시스템을 원격으로 구성하는데 사용

부팅시 스크립트를 변경하기 전에 얼마나 많은 서비스들이 실행되고 있는지 알려면 다음 명령어를 사용합니다.

# ps aux | wc -l


조정 후 확인하기 위한 명령어는 다음과 같습니다.

# netstat -na --ip



■ /etc/rc.d/init.d 디렉토리와 파일들의 퍼미션

"/etc/rc.d/init.d" 디렉토리와 파일들의 퍼미션을 다음과 같이 수정하여 루트만이 억세스 할 수 있도록 합니다.

# chmod -R 700 /etc/rc.d/init.d/*


부트 타임때 필요로 하는 모든 표준의 프로세스들의 시작, 중지를 위한 책임이 있는 스크립트들은 루트만이 억세스 할 수 있도록 퍼미션을 고정시켜야 합니다.


계정관리 보안

■ 암호시스템 보안

첫 번째는 /etc/passwd 파일을 안전하게 하는 것입니다. 우선 시스템이 /etc/shadow를 사용하는지 확인합니다. 이것은 모든 사용자의 패스워드를 root만이 접근 할 수 있는 파일에 해쉬형태로 안전하게 저장한다는 것을 의미합니다. 또한 해커들이 제일 먼저 노리는 패스워드가 손쉽게 접근되고 크랙되는 것을 방지합니다. 쉐도우 패스워드 파일을 사용하는 것이 레드햇 리눅스의 디폴트이지만 확인을 해야 합니다. 다음 명령어를 실행하면 자동으로 패스워드 파일을 /etc/shadow 파일로 변환해 줍니다.

# pwconv



■ 기본 시스템 계정 관리

두 번째는 /etc/passwd 파일에서 대부분의 디폴트 시스템 계정들을 제거하는 것입니다. 리눅스는 이런 계정들을 불필요할지도 모르는 시스템 작업을 위해 제공합니다. 필요하지 않다면 제거해야 합니다. 계정을 많이 가지면 가질수록 침입될 가능성은 높아집니다. 'news' 계정이 그 한 예입니다. 뉴스그룹 서버로 사용하기 위해 nntp를 서비스하는 경우가 아니면 이 계정은 불필요합니다. ftp 서버를 운영하지 않는다면 익명 ftp 접속에 사용되는 'ftp' 계정도 삭제해야 합니다. /etc/passwd 파일에 ftp 계정이 있어 익명 ftp 접속이 허용되어 있고 사용자 ID가 'anonymous'나 'ftp'이면 이 경우 어떤 패스워드라도 로그인이 허용됩니다. 관례상 접속자의 host명을 패스워드로 사용하기도 합니다.

[ /etc/passwd 파일의 시스템 계정 예 ]

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
mail:x:8:12:mail:/var/spool/mail:
uucp:x:10:14:uucp:/var/spool/uucp:
nobody:x:99:99:Nobody:/:


ftp 서버를 운영한다면 /etc/ftpusers 파일도 수정해야 합니다.

[ /etc/ftpusers 파일의 예 ]

root
bin
daemon
adm
lp
mail
uucp
nobody


이 파일에 기록된 계정은 ftp를 사용해서 이 시스템에 접속할 수 없습니다. 이것은 root, bin과 같은 공통의 시스템 계정을 사용해 ftp로 연결하는 것을 제한합니다. 리눅스는 디폴트로 이 파일을 가지고 있습니다. root 권한으로 이 시스템에 ftp를 통해 접속하는 것을 막으려면 이 파일에 root가 포함되어 있는지 확인합니다. ftp 접속시 사용할 계정은 이 파일에 포함되면 안됩니다.

또 root로는 시스템에 telnet 접속을 못하도록 합니다. root로 작업 할 때는 따로 일반계정을 두어 자기의 계정으로 접속한 뒤 su를 사용해 root로 전환하도록 합니다.


■ 일반 유저의 su root 방지

특정 유저만 su root 할 수 있도록 설정하려면 다음과 같이합니다. 이런 종류의 명령어를 실행시킬 수 있는 사용자들을 제한함으로써 시스템의 보안성을 향상시킬 수 있습니다. /etc/pam.d/su 파일의 처음에 다음을 추가합니다.

auth sufficient /lib/security/pam_rootok.so debug

auth required /lib/security/Pam_wheel.so group=wheel


/etc/group 의 wheel 그룹에 su root를 허용하고자 하는 사용자 그룹을 등록합니다. 즉, wheel 그룹에 속한 유저만이 su 명령을 사용하여 root 로 로그인 할 수 있습니다.

wheel:x:10:root,junilove,juni8004



■ 쉘 로그 파일

bash 쉘은 사용자가 입력한 500여개의 지난 명령어를 ~/.bash_history 에 남기게 됩니다. 이는 내가 사용한 명령어들을 다른 사람들이 알게 됩니다. 다음과 같이 크기를 줄이거나, 0으로 설정해 아예 로그를 남기지 않도록 하여 크래커가 로그 파일의 내용을 이용할 수 없도록 합니다. 이러면 .bash_history 파일에 아무런 기록이 남지 않습니다. 이렇게 해도 HISTSIZE라는 환경변수가 있기에 키스트로크에 대한 히스토리 관리는 유지됩니다. 단지 .bash_history 파일에 저장되지 않을 뿐입니다.

HISTFILESIZE=30

HISTSIZE=30


또는 로그아웃 할 때마다 로그 파일을 삭제하도록 다음과 같은 라인을 ~/.bash_logout에 추가합니다.

# rm -f $HOME/.bash_history



■ root 계정 환경 설정

루트 계정은 유닉스 시스템에서 가장 강력한 권한을 가지고 있는 계정입니다. 만약 관리자가 콘솔로의 접속 후, 로그아웃 하는 것을 잊고 루트 프롬프트를 그대로 놔두었다면, 위험한 상황이 벌어질수도 있습니다. 이런 상황을 피하기 위해 TMOUT 변수를 사용할 수 있습니다. /etc/profile 파일 또는 루트의 해당 쉘의 설정파일, 예를 들어, bash 라면 ~/.bash_profile 에 다음과 같이 설정합니다.

HISTSIZE=0

HISTFILESIZE=0

TMOUT=300


숫자는 초단위입니다. 300초 즉, 5분동안 아무런 입력이 없다면 자동으로 로그아웃 합니다. HISTSIZE 와 HISTFILESIZE 를 0으로 해두는 것도 만약을 위한 조치입니다.


파일 시스템 마운트

잘못된 파일 시스템 마운트 옵션도 보안에 문제가 될 수 있습니다.

[ 파일 시스템 마운트 설정 파일(/etc/fstab)의 옵션 ]

옵 션
설 명

defaults
기본 옵션, 쓰기,읽기 가능, quota, suid 가능

noquota
유저 쿼타가 적용되지 않음

nosuid
SUID/SGID 억세스 불가, SUID/SGID를 사용자의 홈 디렉토리에서 쓰게 할 이유는 전혀 없습니다.

nodev
특별한 장치 또는 문자 사용 불가 (예를 들어 /dev 같은)

noexec
이 파티션상의 모든 바이너리 실행 불가

quota
유저 쿼타 사용

ro
읽기 전용으로 마운트

rw
읽기, 쓰기 허용

suid
SUID/SGID 억세스 허용



/etc/fstab 의 형식은 다음과 같습니다

[ /etc/fstab의 예 ]

/dev/hda9 /tmp ext2 defaults,rw,nosuid,nodev,noexec 1 2
/dev/fd0 /mnt/floppy auto sync,user,noauto,nosuid,nodev 0 0
/dev/cdrom /mnt/cdrom auto user,noauto,nosuid,exec,nodev,ro 0 0



fstab의 수정 후에는 파일 시스템을 다음과 같이 다시 마운트 합니다.

# mount -oremount /tmp/



시스템 정보 숨기기

기본적으로 리눅스 서버로 로그인 할 때, 배포본, 버전, 커널 버전, 서버이름 등이 나타나도록 되어 있습니다. 이것은 서버를 노리는 크랙커들에게 더 많은 정보를 줄 뿐입니다.

■ "/etc/rc.d/rc.local" 의 수정

rc.local 에는 매 부팅시마다 /etc/issue 파일을 생성하는 루틴이 있습니다. 이 부분을 모두 주석처리 합니다.

# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue


그런 다음, /etc 디렉토리 아래에 있는 "issue.net" 와 "issue" 파일들을 삭제합니다.

# rm -f /etc/issue

# rm -f /etc/issue.net



SUID/SGID 프로그램 찾기

일반 유저가 루트 권한으로 실행 시킬 수 있는 불필요한 SUID/SGID 프로그램들을 최소화 합니다. SUID와 SGID는 잠재적인 보안 위험 요소이기 때문에 철저하게 감시되어야만 합니다. 이러한 프로그램들은 이들을 사용하는 사용자들에게 특별 권한을 부여해 주기 때문에, 보안에 불안 요소를 주는 이러한 프로그램들이 설치되는 일이 없도록 해야 합니다. 크랙커들이 좋아하는 트릭중의 하나는 SUID 루트 프로그램을 침탈하고, 그 후에 SUID 프로그램을 통해 백도어로 들어오는 것입니다. 다음의 명령어를 사용하면 시스템에 있는 모든 SUID/SGID 프로그램을 찾아낼 수 있습니다.

# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls ­lg {} ;


그런 다음 퍼미션을 바꾸어 줍니다.

# chmod a-s [프로그램]


어떠한 프로그램인지 잘 모를 경우에는 man [프로그램] 또는 info [프로그램] 등으로 확인한 후 변경합니다.


중요한 시스템 파일의 퍼미션

파일
퍼미션
설명

/var/log 751 모든 로그 파일을 담고 있는 디렉토리
/var/log/messages 644 시스템 메시지
/etc/crontab 600 시스템 크론탭 설정
/etc/syslog.conf 640 Syslog 데몬 설정파일
/var/log/wtmp 660 who 명령에 의해 보여지는 현재 로그인한 유저가 누구인지 기록하는 파일
/var/log/lastlog 640 last 명령에 의해 보여지는 마지막에 로그인한 유저가 누구인지 기록하는 파일
/etc/ftpusers 600 FTP 서버에 접속할 수 없는 유저 리스트
/etc/passwd 644 시스템의 유저 계정 리스트
/etc/shadow 600 암호화된 계정 패스워드를 담고 있는 파일
/etc/pam.d 750 PAM 모듈 설정 파일
/etc/hosts.allow 600 접근 설정 파일
/etc/hosts.deny 600 접근 설정 파일
/etc/lilo.conf 600 부트로더 설정파일
/etc/securetty 600 root 로그인을 허가하는 TTY 인터페이스 리스트
/etc/shutdown.allow 400 ctrl+alt+del 사용을 허가하는 유저 리스트
/etc/security 700 시스템 접근 보안 정책 파일들
/etc/rc.d/init.d 750 시작 부트 스크립트 파일
/etc/sysconfig 751 시스템과 네트워크 설정 파일
/etc/services 600 서비스명과 포트를 나타내는 파일입니다.
/etc/inetd.conf 600 인터넷 슈퍼서버 데몬 설정파일
/etc/cron.allow 400 cron 사용을 허가하는 유저 리스트
/etc/cron.deny 400 cron 사용을 불허하는 유저 리스트
/etc/ssh 750 보안쉘(ssh) 설정 파일
/etc/sysctl.conf 400 최근 레드햇 리눅스에서 커널 tunable 옵션을 담고 있는 파일


레드햇 리눅스를 기반으로 리눅스 시스템을 안전하게 하기 위한 기본적인 조치사항들을 살펴 보았습니다.

100% 안전한 시스템은 없지만 여기서 기술된 것만 적용해도 리눅스 시스템의 안전성은 상당히 높아질 것입니다. 시스템의 안전한 보호를 위해서는 지속적으로 보안 사항들을 살펴보아야 할 것입니다. 또한 CERT 홈페이지(http://www.certcc.or.kr)를 위시한 보안 전문 컨설팅 사이트와 시스템 벤더 사이트를 정기적으로 방문하여 보안 권고 사항들에 대해서 주의깊게 살펴보며, 새로운 취약성이 발견되면 그에 따른 패치설치 및 보안 권고에 충실히 따르도록 해야 합니다.

'Operating System > Linux' 카테고리의 다른 글

vncserver 설정  (0) 2006.03.09
하드추가하는 법  (0) 2006.03.09
proftp에 대한 모든것...  (0) 2006.02.17
apm 1점대 연동 최신버전  (0) 2006.02.13
vnc서버 설정  (0) 2006.02.13
,

1. ProFTP 소개 및 다운로드

(1). ProFTP 소개

FTP 란 File Transfer Protocol 의 약자로서 파일 전송 규약을 말한다. ProFTP 서버는 예전에 사용하던 Wu_FTP 보다 환경설정파일이 하나로 되어 관리하기가 편해지고 보안 및 버그 또한 패치를 하여 요즘 많이 사용하고 있는 FTP 서버중 하나이다.

(2). ProFTP 다운로드

ProFTP 서버를 구할 수 있는 곳은 ProFTP 웹 사이트(http://www.proftpd.net) 에서 최신 버전의 ProFTP 서버를 다운로드 할 수 있다.



2. ProFTP 설치

(1) 압축된 파일 풀기

먼저 다운로드한 파일을 /usr/local/src 밑으로 복사하기 바란다. 위에서 소개한 ProFTP 웹사이트에서 받았다면 *.tar.gz 형식의 파일일 것이므로 tar를 이용하여 압축을 풀면 된다.



(가) 압축된 파일이 *.tar.gz 또는 *.tar.Z 파일 압축 풀기

# tar -xvzf proftpd-1.2.xxx.tar.gz

(나) 압축을 풀면 proftpd-1.2.xxx 라는 디렉토리가 생성된다. 이 디렉토리를 proftpd 라는 이름으로 바꾸어 준다.

# mv proftpd-1.2.xxx proftpd

압축을 풀었다면 /usr/local/src/proftpd 에 README 와 INSTALL 파일이 존재하므로 참고하기 바란다. README 와 INSTALL을 강조하는 이유는 대부분의 배포되는 설치 파일들은 이 두 개의 파일을 포함하고 있으므로 잘 읽어보고 따라하면 되기 때문이다.



(2) 컴파일 하기 전에 configure 파일 실행하기

압축을 잘 풀었다면 /usr/local/src/proftpd 에 configure 파일이 있을 것이다. 이 파일을 실행하면 Makefile 이 생성된다. configure 실행은 설치할 디렉토리를 지정하도록 다음과 같이 하면 되겠다.

# ./configure --prefix=/usr/local/proftpd

위와 같은 명령을 주면 make install 시에 /usr/local/proftpd 디렉토리에 설치하게 된다.


(3) ProFTP 서버 컴파일

위에서 configure 파일을 실행해서 Makefile을 만들었을 것이다. 그럼 컴파일을 해보자.

# make

(4) ProFTP 서버 설치

위 과정을 에러 없이 마쳤다면 설치과정으로 들어가도록 하겠다. 현재위치(/usr/local/src/proftpd)에서 다음과 같은 명령을 실행하도록 한다.

# make install

이렇게 하면 ProFTP 서버의 설치과정이 끝나게 된다. 여기서 다룬 설치과정은 ProFTP 웹사이트로부터 받은 소스파일을 가지고 수동으로 설치하는 방법을 다루었다. 레드햇 리눅스 6.0 이상의 사용자라면 기본으로 ProFTP 가 설치되었을 것이므로 업그레이드나 수동으로 재설치시에 참고하면 되겠다.


3. proftp 환경 파일 설정 ( proftpd.conf )

/etc/proftpd.conf 설정파일을 알아보자.

ServerName "SAGELINUX FTP SERVER"

- ServerName 은 사용자가 FTP 서버에 접속했을 때 이 FTP 서버의 이름이 무엇인지 출력해준다.

ServerType standalone

# ServerType inetd

- ServerType 은 ProFTP 서버를 실행시키는 방법이다. standalone 은 보통 응용프로그램을 실행하듯이 직접 proftpd 를 실행하는 방법이고, inetd 은 inetd 슈퍼 서버에 의해 실행되는 방법을 말한다.


DefaultServer on

- DefaultServer 는 FTP 서버의 primary IP address 또는 가상 호스트 설정 블록에서 설정된 IP address 가 아닌 IP address 로부터 연결이 있을 때 기본으로 사용되어질 서버 설정을 해준다. 이와 같이 알려지지 않은 연결이 있을 때는 "no server available to service your request" 라는 내용을 보여주며 연결이 끊어지게 될 것이다.

DefaultRoot / 또는 ~/

- DefaultRoot 는 FTP 서버에 일반 계정으로 접속한 사용자에게 최상위 디렉토리를 지정해주는 것이다. DefaultRoot 를 / 로 설정하면 사용자가 FTP 서버에 접속했을 때 / 디렉토리까지 접근 가능하며, ~/ 로 설정하면 일반 계정의 홈디렉토리가 최상위 디렉토리까지 접근 가능하게 될 것이다.

Port 21

- Port 는 ProFTP 서버가 standalone 모드로 동작할 때 사용자가 FTP 와 연결할 통로를 정해주는 것이다. 보통 FTP 서버의 경우는 21 번 Port를 사용한다. 참고로 inetd 모드로 동작을 원하고자 한다면 이 부분을 주석으로 하고 Port 번호를 /etc/services 파일에 설정해 주어야 할 것이다.


Umask 022

- Umask 는 새로 만들어지는 파일과 디렉토리에 적용될 마스크를 지정한다.

MaxInstances 30

- MaxInstances 는 ProFTP 서버가 standalone mode 일 때 최대 접속가능한 사용자 수를 지정한다. ProFTP 서버가 inetd mode 일 경우에는 아무런 효과가 없으므로 주석으로 해주면 될 것이다.


User nobody

Group nobody

- User 와 Group 은 ProFTP 서버 실행시에 생성되는 프로세스의 User 와 Group을 지정해준다. 혹시라도 이 부분이 슈퍼유저로 되어 있다면 매우 위험하므로 User 와 Group을 nobody 로 반듯이 해주기를 권한다. 위와 같이 설정하였다면 서버 설정이 끝나고 proftpd를 실행시킨 후에 ps 명령으로 확인하기 바란다.



...........................



- ..... 는 명시한 디렉토리에 대해 옵션을 정의해 준다. 위의 예는 /(루트) 아래의 모든 디렉토리에 대한 옵션을 정의해 줄 수 있다.



AllowOverwrite on



- AllowOverwrite 는 사용자가 FTP 서버에 접속하여 새로 전송하려고 하는 파일이 기존에 있는 파일이 있을 때 어떻게 할 것인가에 대한 설정이다. AllowOverwrite 가 on 이면 Overwrite를 허락하는 것이고 off 이면 Overwrite를 허락하지 않는 것이다.


.......



...........................



- 위의 설정은 FTP 서버 접속시에 익명의 사용자 anonymous 로 접속하여 이용할 수 있는 디렉토리에 대한 옵션을 설정할 수 있게 한다. 디렉토리명의 표현은 /home/ftp 나 ~ftp 같은 형식으로 하면 된다. 그리고 지금부터 이후에 소개되는 것에 대해서는 ....... 안에 사용되는 설정이다.


User ftp

Group ftp

- .......에서 사용되는 User 와 Group 은 ProFTP 서버에 사용자가 anonymous 로 접속할 때 디렉토리에 대한 User 와 Group을 지정해준다. 이렇게 되면 디렉토리에 대한 실제적인 권한은 ftp user 가 가지게 되는 것이다.


RequireValidShell off

- RequireValidShell 은 /etc/shells 파일에 정의되지 않는 shell을 사용하는 유저에게 FTP 접속을 허락하거나 거절하는 것에 대한 지정이다. 기본적으로 ProFTP 서버에서는 on 상태이므로 /etc/shells 에 user 들이 사용하는 shell 이 없으면 login을 할 수 없게 된다. 그러므로 anonymous user 로 접속을 하고자 한다면 RequireValidShell을 off 로 해주어야 login 할 수 있을 것이다.


UserAlias anonymous ftp

- 사용자가 FTP 서버에 접속할 때 anonymous user 로 접속하면 ftp user 로 접근하게 하는 지정이다. 그러니까 ftp user로 FTP 서버에 접속하여 이용하는 것이 된다.

MaxClients 10 "message"

- MaxClients 는 anonymous user 로 접속할 때 client 들이 최대로 접속할 수 있는 수를 설정한다. 그리고 anonymous user 로 접속할 수 있는 수를 제한하지 않으려면 none 이라는 설정을 해주면 된다. 또한, 최대 이용자수 뒤에 message를 적어주면 접속할 수 있는 수를 넘을 때 user 와 password를 입력한 후 연결이 끊어지게 되는데, 이 때 사용자에게 message를 보여 줄 수 있는 방법이다.


DisplayLogin welcome.msg

- DisplayLogin 는 사용자가 anonymous user 로 접속했을 때 보여줄 메시지가 들어있는 text file을 지정하는 것이다. 파일은 상대 경로나 절대 경로를 지정할 수 있으며, 상대경로로 지정할 경우 user 가 접속했을 때 처음 디렉토리를 기준으로 찾게 된다. 일반 user 의 경우에는 user 의 홈디렉토리가 기준이 되며, user 의 홈디렉토리에 지정한 파일이 있으면 접속시에 메시지가 보일 것이다. 만약, file 이 없다고 하더라도 에러는 발생하지 않는다.

DisplayFirstChdir .message

- DisplayFirstChdir 은 client 사용자가 FTP 서버에 접속하여 chdir(cd) 명령을 이용해 처음으로 다른 디렉토리로 접근할 때 접근한 디렉토리에 .message file 이 있으면 file 의 내용을 보여주게 된다. 이 파일의 내용은 FTP 서버에 접속하여 디렉토리에 처음 접근할 때에만 보여준다.


.......



DenyAll



- Limit 은 command 부분에 하나 또는 둘 이상의 FTP 명령어들을 사용하는데 제한을 하기 위하여 사용된다. Limit 이 설정되면 이후 설정에 영향을 주게 되며, 뒤에 설정한 이 나올 때 까지 모든 에 적용된 설정들을 제한하게 된다. 그리고 block 의 command 의 숫자는 제한이 없다. command 는 어떤 사용 가능한 FTP 명령도 되지만, 보통은 다음 중 하나를 사용한다. FTP 명령에는 CWD, MKD, RNFR, RNTO, DELE, RETR, STOR 등이 있으며, CWD(Change Work Directory) 명령은 디렉토리를 변경하는 명령이고, MKD(Make Directory) 명령은 새로운 디렉토리를 만드는 명령이고, RNFR (ReName From) 과 RNTO(ReName To)는 디렉토리의 이름을 바꾸는 명령이고, DELE(DELEte) 명령은 파일을 삭제하는 명령이고, RMD(ReMove Directory)는 디렉토리를 삭제하는 명령이고, RETR(RETRieve) 명령은 서버에서 클라이언트로 파일을 전송하는 명령이고, STOR(STORe) 명령은 클라이언트가 서버로 파일을 전송하는 명령이다. 이와 같이 개별적인 명령을 다음과 같이 명령어 그룹으로 사용할 수도 있다. 명령어 그룹에는 READ, WRITE, DIRS, ALL 이 있으며, READ는 RETR 이나 STAT 과 같은 파일 읽기와 관련된 모든 FTP 명령을 포함하지만, 디렉토리 목록은 포함되지 않고, WRITE 는 MKD 와 RMD 과 같은 파일 또는 디렉토리 쓰기, 생성, 삭제와 관련된 FTP 명령을 포함하고, DIRS는 LIST 와 NLST 과 같은 디렉토리 목록관 관련된 FTP 명령을 포함하며, ALL 은 모든 FTP 명령에 대한 제한을 적용할 수 있다. 마지막으로 다음과 같은 특수 명령을 사용할 수도 있다. LOGIN 은 사용자가 FTP 서버에 연결이나 login을 할 때 의사명령에 Limit을 적용해서 문맥에 연결 또는 login 초기화의 허용 또는 제한에 사용할 수 있다. Limit 명령어 제한이 파일과 디렉토리에 접근 권한을 변경시키는 것은 아니고 Limit 가 어떤 디렉토리에서 명령어를 제한하도록 사용되는 동안, 기본 운영체제 파일 시스템에 상속되는 파일의 권한은 아무런 변화가 없다.

CWD : 디렉토리를 변경할 경우 MKD : 새로운 디렉토리를 만들 경우

RNFR,RNTO : 디렉토리의 이름을 바꿀 경우 DELE : 파일을 삭제할 경우

RMD : 디렉토리를 삭제할 경우 RETR : 서버에서 클라이어트로 파일을 전송할 경우

STOR : 클라이언트에서 서버로 파일을 전송할 경우 READ : 파일 읽기와 관련된 모든 FTP 명령

DIRS : 디렉토리 목록과 관련된 모든 명령 LOGIN : 서버에 연결하거나 로그인을 제한할 경우

WRITE : 파일 또는 디렉토리 쓰기, 생성,삭제와 관련된 FTP 명령 ALL : 모든 FTP 명령

예) .......

……………………… ①

.............

……………………… ②

AllowAll



……………………… ③

DenyAll



……………………… ④

……………………… ⑤

AllowAll







위의 설정을 보면 ① 은 ftp user 의 홈디렉토리에 대하여 anonymous 로 FTP 에 접속할 때 어떠한 제한을 할 것인가 하는 설정이고, ② 는 FTP 서버에 anonymous user 로 LOGIN을 허락하겠다는 설정이고, ③ 은 anonymous user 로 FTP 서버에 접속하여 쓰기를 제한하는 설정이고, ④ 는 ftp user 의 홈디렉토리의 incoming 디렉토리에 대하여 어떠한 제한을 할 것인가 하는 설정이고, ⑤ 는 anonymous user 로 FTP 서버에 접속하여 incoming 디렉토리에 저장기능과 디렉토리를 만들 수 있는 기능을 허락하는 것이다. 이렇게 예를 들어 설명하니 조금 이해하기 쉬울 것이라고 필자는 생각이 든다. 이렇게 하여 ProFTP 환경설정 파일을 살펴보았다. 물론 여기에 소개된 내용이 전부는 아니다. 더 많은 기능이 존재하고 어떻게 관리자가 설정하느냐에 따라서 달라질 것이다. 그럼, 다음으로 넘어가자.


4. ProFTP 데몬 실행 및 종료

(1) ProFTP 데몬 실행

데몬 실행방법은 /usr/local/proftpd 디렉토리로 이동하여 sbin 디렉토리의 proftpd 를 실행하면 된다. 데몬 실행을 하고 난후 에러가 없다면 ps 명령으로 ProFTP 데몬의 상태를 알아볼 수 있다.

# sbin/proftpd ( pwd : /usr/local/proftpd )


(2) ProFTP 데몬 재시작 및 종료

만약 proftpd.conf 파일을 수정하여 ProFTP 데몬을 재시작 하고 싶다면 ps 명령으로 ProFTP 데몬의 PID를 알아낸 다음 "kill -HUP PID" 명령을 내려 주면 수정한 환경설정을 추가해 줄 수 있을 것이다. ProFTP 데몬 종료는 "kill -TERM PID" 명령을 내려주면 종료시킬 수 있을 것이다.

※ 일반 계정을 anonymous로 사용하기.

mp3라는 계정을 anonymous로 사용


1. adduser mp3 로 mp3라는 user를 만듭니다.

2. vi /etc/passwd 로 mp3 user의 shell 부분(/bin/bash)을 /dev/null 로 바꾼다. (물론 /etc/shells 에 /dev/null 이 있어야 한다.)

3. proftpd.conf에 설정한다.



AnonRequirePassword off

User mp3

Group mp3

RequireValidShell off





AllowAll








4. standalone 의 경우 /etc/rc.d/init.d/proftpd restart 를 inetd의 경우 killall -HUP inetd 를 실행하여 proftpd를 다시 구동한다.

5. Anonymous 가 접속할 때 보여주는 .welcome.msg 파일도 만들어 주자.

----------~HOME/mp3/.welcome.msg ----------------------

환영합니다......

ProFTPd Alzza Linux 6.0 2.2.12(안정)

ftp://%L/

o 남은 용량 : %F KB

o 현 사용자 수 : %N/%M (하나의 호스트당 1명까지 접속 허가합니다)

o %R의 %u(%U)님이 접속한 현 시각은 %T년입니다.

Admin-mailto:%E

-----------end --------------------------------------------

위의 결과는

-----------------------------------------------------------

환영합니다......

ProFTPd Alzza Linux 6.0 2.2.12(안정)

ftp://ftp.linux.ac.kr/

o 남은 용량 : 302868 KB

o 현 사용자 수 : 2/10 (호스트당 1회 접속만 허가합니다)

o 192.168.12.5의 UNKNOWN(anonymous)님이 접속한 현 시각은 Tue Sep 14 22:05:36 1999년입니다.

Admin-mailto:ftp@linux.ac.kr

-----------------------------------------------------------

1.2.pre6 버전을 제외한 그 이상의 버전은 "%F KB" 대신 "%f"로 기입하면 Mb로 출력됩니다.

'Operating System > Linux' 카테고리의 다른 글

하드추가하는 법  (0) 2006.03.09
리눅스 기초 보안  (0) 2006.02.17
apm 1점대 연동 최신버전  (0) 2006.02.13
vnc서버 설정  (0) 2006.02.13
하드추가 하는 법  (0) 2006.01.19
,