############################################
# 작성자 : 지현명
# 작성일자 : 2001년 5월 13일
# 문서제목 : Proftpd 옵션 설정에서 승리하기
# E-mail : gwise at linux.co.kr # Home-P : http://www.wiselinuxer.org ############################################
# 새로운 버전으로 컴파일 하실때 기존에
# rpm 버전 삭제 하지 마세요.
# rpm 버전 삭제 하시면 Pam 모듈에 관한 설정을
# 다시 해 주셔야 합니다.
# 혹시 지우셨다하더라고 다시 RPM 설치 하시지 말고
# 김정규님 홈페이지에 가면 글 올려 놓은거 참고 하세요.
# 증상은 데몬은 뜨지만 접속이 안될 겁니다.
# 컴파일 하고 나서 /etc/rc.d/init.d/proftpd 을 열어서
# 실행 데몬 화일의 위치를 바꿔 주세요.
# 귀찮게 rc.local에다 적어 주는 것보다.
# ntsysv를 써먹을수 있으니까요..
ServerName "WiseLinuxer FTP Server."
ServerType standalone
DefaultServer on
ServerAdmin gwise at linux.co.kr DefaultRoot ~
RootLogin off
Port 21
Umask 022
# 최대값은 65535 초이며 1약 18시간이다.
TimeoutIdle 600
TimeoutNoTransfer 600
TimeoutLogin 10
MaxLoginAttempts 2
DeferWelcome on
UseReverseDNS off
IdentLookups off
# 메뉴얼 상에는 절대 경로도 된다고 했는데 저는 안되네요
# /etc/skel/welcome.mgs 화일을 만들어서 새로운 계정 생성하면
# 들어가게 해 주면 됩니다.
# 그냥 welcome.msg을 적어주면 /home/gwise/welcome.msg 여기에 위치 시킵니다.
# 소유자와 그룹을 루트로 해두세요.
DisplayConnect /usr/local/proftp/etc/connect
DisplayQuit /usr/local/proftp/etc/quit
DisplayLogin
welcome.msg
DisplayFirstChdir .message
AccessGrantMsg "어서오세요. %u님"
MaxInstances 30
# 일반 유저들의 접속을 허용하지 않는다면 DenyAll
<Limit LOGIN>
allowAll
</Limit>
# 일반 유저들은 쉘을 가지고 있습니다.
RequireValidShell on
User nobody
Group nobody
<Directory /*>
AllowOverwrite off
HideUser root
HideGroup root
</Directory>
# 일반 유저용
MaxClientsPerHost 1 "죄송합니다. 이미 하나의 클라이언트에서 접속하셨습니다."
# 일반 유저를 위한 서버 개방 시간 및 다운시간
# 오후 3시 부터 ~ 오후 7시 까지만 서버를 일반 계정 사용자에게 열어 놓음.
UpTime 15
DownTime 19
#################################################Anonymous
# Anonymous 부분에서 안되는거 몇가지
#
#TimeoutIdle 600
#TimeoutNoTransfer 600
# 일반 유저와 익명사용자의 Timeout 시간을 달리 설정 하려 했으나
# 데몬을 구동 시켜면 에러가 납니다.
# Anonymous 부분에서는 쓸수가 없다네요.
# 김정균님에게 질문 해 보겠습니다.
<Anonymous /home/ftp>
AccessGrantMsg "당신은 %u 계정을 통하여 들어 오셨습니다."
<Limit LOGIN>
AllowAll
</Limit>
User ftp
Group ftp
# /etc/passwd 에서 ftp 유저는 쉘이 없지요. 그러니
# /etc/shell과 /etc/passwd에 ftp유저의 쉘을 비교할 필요가 없습니다.
RequireValidShell off
ShowSymlinks off
UserAlias anonymous ftp
# 여기에서의 MaxClients는 ftp나 anonymous 유저로의 접속을 전제로 합니다.
MaxClients 7 "죄송합니다. 이 서버의 최대 접속자수는 %m 명 입니
다. --Try again later"
HideUser root
HideGroup root
# 익명 사용자를 위한 서버 개방시간 및 다운 시간
# 오후 3시 부터 ~ 오후 6시 까지만 서버를 익명 사용자를 위해 열어 놓은
UpTime 15
DownTime 18
# Limit the Bandwidth to "$SPEED" Kbps
# Bandwidth 256
DisplayLogin welcome.msg
DisplayFirstChdir .message
# 익명접속자용
MaxClientsPerHost 1 "죄송합니다. 이미 하나의 클라이언트에서 접속하셨습니다."
# 이하의 모든 디렉토리에서 쓰기 금지를 디폴트로 한다.
# READ는 디폴트이다.
<Limit STOR WRITE>
DenyAll
</Limit>
# 세부 세팅에 들어 가기에 앞서
# 업로드 허용은 WRITE 보다 STOR을...
# 다운로드 허용은 READ 보다 RETR을....적용해 주세요.
# 업로드 거부시에는 STOR WRITE 둘다 DenyAll
# 다운로드 거부시에는 RETR READ 둘다 DenyAll ...적용해 줍니다.
# 이거만 기억하셔도 Proftp 접근 디렉토리 설정의 반의 성공....
# 아~~ 그리고 Write옵션을 허락해도 위에서 디폴트로 Write 를 거부 해놨기 때문에
# Mkdir 명령어가 먹지 않습니다. 만약 바로 위에 있는 3줄을 지우고 limit 에서 Write를
# 허용한다면 Mkdir명령은 자동으로 먹습니다.(지금 두가 경우 test해 봤습니다.)
# 결론은 위에 3줄을 적용시키고 아래에서 디렉토리 생성할때는 MKD 옵션을 주셔야 합니
다.
# 옵션 줄때 소문자 보다 대문자를 적어주세요. 가끔 소문자로 옵션 주면 잘 안 먹네요..
# WRITE READ MKD RETR STOR ........대문자로....꼭....
# 업로드 전용 폴더 설정
# MKD에 의해서 폴더를 생성할 수 있다.
# 임의에 의해서 폴더를 생성한 다음 MKD 옵션을 삭제 할 수도 있음.
# 단순히 업로드만 한다면 write보다는 STOR옵션을 준다.(더 제한을 가할 수 있다.)
<Directory incoming>
<Limit RETR READ>
DenyALL
</Limit>
<Limit STOR MKD>
AllowALL
</Limit>
</Directory>
#다운로드 전용 폴더 설정
# 단순한 다운로드 전용 폴더는 READ보다는 RETR옵션을 준다.(더 제한을 가할 수 있다.)
<Directory pub>
<Limit STOR WRITE>
DenyALL
</Limit>
<Limit RETR>
AllowALL
</Limit>
</Directory>
# 업로드/다운로드 겸용 폴더(한번 업로드한 화일은 덮어쓰기나 삭제 할 수 없음. 위를 보
세 요
# 오버라이드 금지 시켜 놨습니다.)
# 더 많은 제한을 가하기 위해서 READ/WRITE 보다 STOR/RETR을 사용한다.
<Directory pds>
<Limit STOR RETR MKD>
AllowALL
</Limit>
</Directory>
</Anonymous>
# 이 설정 부분에 주의 해 주세요.
# 일단 O/S 상에 useradd 명령어로 guest 사용자가 생성이 되어야 합니다.
# 화일 업로드/다운로드 디렉토리 삭제 및 생성 권한을 주었습니다.
# READ 와 WRITE는 특별한 경우를 제외하고는 단순히 화일 업로드/다운로드 할때는
# 권한을 안주는 것이 좋습니다.
# 화일이 잘못 되었을 경우 덮어쓰기보다는 삭제하고 지우는 것이 좋겠죠.
<Anonymous ~guest/pds>
User guest
Group guest
AnonRequirePassword on
# guest 유저의 텔넷 접근을 막아야 하니까
# /etc/passwd 의 guest 쉘을 /bin/false로 한다.
# 그리고 /etc/shells 에 /bin/false을 추가 해준다.
# 개념상 위에 작업을 하지 않고 아래에 off만 해줘도
# 비교 작업을 수행하지 않기때문에 가능하지만
# 실제 작업을 해보니 되지 않았습니다.
# 아래 것을 on/off 든 위에 작업을 해주면
# 텔넷을 접근 안되고 ftp 만 접근이 됩니다.
RequireValidShell on
DisplayLogin welcome.msg
AllowOverwrite off
HideUser root
HideGroup root
<Limit Login>
AllowAll
</Limit>
<Limit STOR RETR MKD RMD>
AllowALL
</Limit>
</Anonymous>
#<<<<<<<<<<<<<<<<<< RequireValidShell 에 대한 김정균님과의 나의 다른 생각
>>>>>>>>>>>>>
#김정균님의 번역한 것을 보자.
#첫번째, Anonymous user가 ftp로 접근하여 shell의 권한을 얻는 것을 방지한다.
#두번째, RequireValidShell 지시자는 /etc/shells 에 없는 shell binary로 로그인하는 것을 허
락하거나 거절하는 것에
#대하여 , server, virtual host, anonymous login 을 설정한다. 기본적으로 proftpd 는
/etc/shells에 user들의
#기본 shell이 없으면 login을 허락하지 않는다. /etc/shells가 없다면 모든 shell들을 유효한
것으로 취급한다.
#
#자 ...읽어 보니시 어떻습니까...한국말인데도 어렵죠...^^
#첫번째것은 김정균님의 개인적인 생각을 적은거 같고 두번째는 원본에 있는 것을 번역한
듯 싶습니다.
#
#그럼 가상 상황을 한번 적용해 보죠.
#위를 보세요 guest/pds 를 인용하겠습니다.
#"텔넷을 허용하지 않고 ftp만을 허용하고 싶다."
#이 질문에 대해서 "리눅스 6.2 그대로 따라하기"의 저자는 TCP랩퍼를 이용해야 한다고 했
습니다.
#그러나 근본 해결책이 아니라 비껴가는 냄새가 나죠....^^
#
#위에 번역대로라면 /etc/passwd 에 guest 의 쉘을 /bin/false로 해주고
#RequireValidShell off 로 해준다면 (현재는 /etc/shellsdp /bin/false는 없다.)
#정상적으로 로그인이 되어야 합니다.
#그러나 접속은 되지 않습니다. on으로 하면 당근 안되는 거구요..
#그럼 이번에는 /etc/shelss 에 /bin/false(guest의 쉘)을 추가 해보고
#RequireValidShell off/on 두가지 경우를 다 적용해 보죠
#
# 이런 두 가지 경우 전부 접속이 되네요.....
#
# 그렇다면 RequireValidShell 이 도대체 뭘 뜻하는 걸가요?
#
# 요구+정당한+쉘 .......... 당신이 쓰는 쉘이 정당한가?
#
# 당신이 쓰고 있는 쉘(/etc/passwd)이 /etc/shells 에 있냐?
# 만약 on 이면 두개 비교 해서 클라이언트가 쓰고 있는 쉘이 /etc/shells 목록에 없
다면
# 너의 접근을 허락하지 않겠다.
#
# 만약 off 이면 클라이언트가 쓰고 있는 쉘이 /etc/shells의 목록 에 있든 없든
# 체크 하지 않고 접속을 허락한다.
#
# 이 개념 대로 라면 위에 있는 가상 시나리오는 성립되어야 하는데...그렇지가 않습
니다.
#
# 제가 직접 테스트 한 결과 내린 결론 입니다.
# 그렇다면 과연 첫번재 라고 적힌 뜻은 뭘까요?
# "쉘의 권한을 얻는다".......쉘의 권한이라...쉘의 권한.......
# 단순히 비교하는것 뿐인데 비교한다고 쉘의 권한을 줄까요?..
# 자 그럼 우리 한번 /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:
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:
#news:x:9:13:news:/var/spool/news:
#uucp:x:10:14:uucp:/var/spool/uucp:
#operator:x:11:0:operator:/root:
#games:x:12:100:games:/usr/games:
#gopher:x:13:30:gopher:/usr/lib/gopher-data:
#ftp:x:14:50:FTP User:/home/ftp:
#nobody:x:99:99:Nobody:/:
#mysql:x:100:101:MySQL server:/usr/local/mysql:/bin/bash
#xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
#named:x:25:25:Named:/var/named:/bin/false
#gdm:x:42:42::/home/gdm:/bin/bash
#piranha:x:60:60::/home/httpd/html/piranha:/dev/null
#postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
#pvm:x:24:24::/usr/share/pvm3:/bin/bash
#squid:x:23:23::/var/spool/squid:/dev/null
#gwise:x:500:500::/home/gwise:/bin/bash
#mysqladm:x:501:501::/home/mysqladm:/bin/bash
#oracle:x:502:5000::/home/oracle:/bin/bash
#shop:x:503:503::/home/shop:/bin/bash
#guest:x:504:504::/home/guest:/bin/false
#
#자 보셨죠.....ftp에는 쉘이 없답니다. 초기 값부터 쉘이 할당되어 있지 않다는 얘기죠....
#더 깊이 생각을 한다면 내가 ftp에게 쉘을 준다면 얘기는 달라지겠죠..
#그러나 준다 해도 on이든 off이든간에 anonymous는 ftp로 들어 오겠죠..
#단순히 비교하는 것 뿐인데 그거 가지고 쉘의 권한을 얻을수 있을까요?...
#
#한가지 예를 들죠
#등장인물 : 남편, 아내 , 외부인
#
#외부인이 집에 들어가려 합니다.
#분명 아내는 문을 안열어 주겠죠.
#
# UserAlias 외부인 남편
#
# 외부인은 남편의 alias를 했습니다.
#부인은 일단 외부인을 남편으로 인식하겠죠.
#그 다음에 부인의 상태
#RequireValidShell off 인경우
#부인의 뇌속에 있는 남편의 정보와 지금 자신의 앞에 있는 남편(?)을
#비교하지 않고 집으로 들어 오게 합니다.
#
#
#RequireValidShell on 인경우
#부인은 외부인을 자신의 뇌속에 있는 남편 정보와 비교를 합니다.
#그래서 이넘이 가짜라는 것을 압니다.
#결국 문을 열어 주지 않겠죠.....
#
#자 이해가 빠르게되셨나요?????
#
#얘기가 길어지는데 정리하겠습니다.
#
# RequireValidShell 은 알리아스의 Source 유저의 쉘을 얻냐 안 얻냐가 아니라....
# 알리아스 Source 유저의 shell이 /etc/shells에 있냐 없냐를 판별하는 것입니다.
# 차이점을 아시겠죠...
#
# 제 의견이 김정균님 생각과 다를 뿐이지 제가 옳다고는 생각하지 않습니다.
# 제 의견을 읽고 다른 고수 분들의 생각을 적어 주셨으면 합니다.
#
#
# 이런 약간의 의견 조정이 있으므로 해서 더 큰 발정이 있으리라 생각됩니다.
#
# 제 글 이 잘 못 된 의견일 수도 있으니
# 이 글을 읽으시는 분들은 취사 선택 하시기 바랍니다.
# 본인이 직접 실습을 해 보시는게 빠를거라 생각됩니다.
#
# 그럼, 이만