[우분투 16.04] vsftpd로 패시브모드 FTPS(FTPES) 서버 구축 - 2

위 글에서 FTPS(FTPES) 연결 설정까지 정리했었죠?

이제 우분투 깡통계정에 vsftpd 가상계정 연결을 설정하겠습니다.


[우분투 16.04] 깡통계정 생성(로그인 불가능+홈디렉토리 없음)(vsftpd 연결용)

우분투 깡통계정 생성은 위의 글을 보고 하시면 됩니다. 깡통계정의 SSH/SFTP 접근도 제한하려면 하시고요(보안 목적).


저는 위 글에서 aaaftpuser / aaaftpgroup 으로 깡통계정/깡통그룹을 생성했었으니, 이 글에서도 해당 이름을 기준으로 적겠습니다.


터미널 창에서 아래의 명령을 입력하여 가상계정 정보(ID&Password)를 vsftpd용 DB로 변환해주는 툴을 설치합니다.


▲ sudo apt-get install db-util


그리고 아래의 명령어를 참고하여 임의의 디렉토리를 만들어 줍니다(저는 vftpuser로 만듭니다.). 이 디렉토리는 깡통계정과 여기에 연결된 vsftpd 가상계정의 파일 저장소가 될 것입니다. 이 디렉토리를 깡통계정+깡통그룹 소유로 바꾸는 작업도 해주세요.


sudo mkdir /var/www/vftpuser

sudo chown aaaftpuser:aaaftpgroup /var/www/vftpuser

(저는 아파치 설치경로 부근에 디렉토리를 만드느라 /var/www가 앞에 붙었습니다. 참고로 var과 www는 모두 root 소유입니다.)


이제 에디터로 가상계정(ID+패스워드)들 묶음 파일(txt 확장자)을 만들 겁니다. 이 파일에 담기는 계정들이 사용자 리스트가 되는 겁니다.



저는 홈디렉토리(/home/우분투 계정명/)에 vusers.txt 라는 파일을 만들었습니다. 위 스샷을 보면 아시겠지만 파일 내용의 구조는


ID 1

ID 1의 패스워드

ID 2

ID 2의 패스워드


이런 식입니다.

이제 이 txt 파일을 vsftpd에서 인식할 수 있는 db파일로 변환해줘야 합니다. 터미널 창에서 아래처럼 입력해 주세요.


sudo db_load -T -t hash -f ~/vusers.txt /etc/vsftpd/vusers.db

(~/vusers.txt는 vusers.txt 파일의 경로입니다. ~/는 /home/우분투 계정명/ 과 같은 의미예요. 그리고 /etc/vsftpd/ 디렉토리는 이전 포스팅들을 따라오셨다면 생성되어 있을 텐데, 원하는 경로로 바꾸셔도 됩니다. 뒤에 언급할 /etc/pam.d/vsftpd 파일에서 경로만 잘 잡아주면 돼요.ㅋ)


db파일 생성이 잘 되었는지 ll 명령어나 파일관리자 프로그램으로 확인해 주세요.

(ll /etc/vsftpd)


※ 주의

vusers.db 처럼 db파일명에는 하이픈(-)이 들어가서는 안됩니다. 하이픈을 넣었더니 (버그인지) 파일이 생성되지 않더군요.

그리고 나중에 (사용자 수정 등의 이유로) DB파일을 갱신할 때는 반드시 vusers.db 파일을 지우고 재생성하는 식으로 진행해야 합니다. 안 지우고 해보니까 갱신이 안 되더군요.(터미널 창에서 sudo rm /etc/vsftpd/vusers.db 이런 식으로 치면 지울 수 있습니다.)


이제 db의 가상 계정들이 사용할 디렉토리를 아까 생성했던 vftpuser 디렉토리 하위에 생성해주고, 해당 디렉토리의 권한도 깡통계정+깡통그룹으로 바꿔주세요.


sudo mkdir /var/www/vftpuser/ccc

sudo mkdir /var/www/vftpuser/ddd

sudo mkdir /var/www/vftpuser/eee

sudo chown aaaftpuser:aaaftpgroup /var/www/vftpuser/ccc

sudo chown aaaftpuser:aaaftpgroup /var/www/vftpuser/ddd

sudo chown aaaftpuser:aaaftpgroup /var/www/vftpuser/eee

(저는 터미널 창에서 진행했는데, 터미널 창에서 sudo nautilus 라고 쳐서 파일관리자 프로그램을 루트권한으로 열어 GUI로 처리해도 됩니다.)


이제 대망의 vsftpd.conf 설정파일 수정 차례입니다!! 터미널 창에서 sudo gedit /etc/vsftpd.conf 처럼 입력하여 에디터로 vsftpd.conf 파일을 엽니다.

그리고 하단에 아래의 내용을 추가하고...


############ Virtual User Configure ###############


guest_enable=YES

guest_username=aaaftpuser

virtual_use_local_privs=YES

hide_ids=YES


############ User 별 추가 설정(기본 설정에서 override 됨. 일부 설정은 제외.) ###############

user_config_dir=/etc/vsftpd/vsftpd_user_conf/



저장+빠져나오세요.


또... 가상 계정별로 설정파일도 따로 만들어줘야 됩니다. 터미널 창을 띄우고 아래처럼 입력하세요.

sudo mkdir /etc/vsftpd/vsftpd_user_conf

sudo gedit /etc/vsftpd/vsftpd_user_conf/ccc


▲ 그리고 위 스샷처럼 입력하고 저장해 줍니다. 가상계정 전부.

(write_enable=YES 는 vsftpd.conf 에 있을 겁니다. 그러면 ccc에 있는 write_enable=YES 는 지워도 됩니다.)


※ 2018. 08. 09. 추가

위 스크린 샷의 세팅에서 anon_으로 시작하는 옵션들은 삭제해도 될 것 같습니다.

anon_world_readable_only=NO

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

anon_umask=022

익명 사용자와 관련된 사항들인데, 기본 설정에서 anonymous_enable=NO 로 적었었기 때문에 anon_ 관련 옵션을 적더라도 의미가 없을 테니까요.


이제 PAM 파일을 수정해야 합니다. PAM은 ID와 비밀번호가 정확한지 체크한후 FTP 로그인을 허락하는 역할을 합니다. 인증(로그인) 방식이에요.

첫번째 포스팅에서 “기본 설정” 항목에 pam_service_name=vsftpd 라고 있었죠? 우분투에서 pam 옵션은 /etc/pam.d 디렉토리에 있습니다. 그래서 파일관리자 프로그램으로 /etc/pam.d에 들어가보면 vsftpd 라는 pam 옵션 파일이 있을텐데, 터미널 창에서 sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_ori 라고 쳐서 vsftpd를 vsftpd_ori로 백업한 다음, sudo gedit /etc/pam.d/vsftpd 라고 쳐서 수정을 시도합니다.


▲ 원본 구조는 이럴 텐데요,


▲ 기존에 주석이 없던 부분을 전부 주석처리 하고(#붙이기), 12라인과 13라인처럼 구문을 추가+저장+빠져나옵니다.

auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/vusers

account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/vusers

(색깔로 표시한 부분이 가상계정 db파일 경로입니다. 확장자명(.db)은 빼고 파일명만 입력해야 하고, 위에서 DB 생성할 때도 같은 색으로 표시해 뒀으니 헷갈리면 올라가서 보세요.)


PAM 옵션에서 로컬 계정(+로컬 계정 거부자 목록)에 대한 부분을 주석처리했기 때문에 로컬 계정으로는 로그인할 수 없게 되는 거고요,

가상 계정 인증 옵션을 추가했기 때문에 가상 계정으로만 로그인이 될 겁니다.

보안상 이 방법이 좋긴 한데(로컬 계정은 SFTP 이용하면 됨), 로컬 계정 로그인도 함께 되었으면 하는 분들이 계실 것 같아서 본문 마지막에 방법을 추가해 놓겠습니다.


▲ 그리고 루트 권한으로 /etc/passwd 파일을 열어서 깡통계정의 홈 디렉토리 기본값(예 : /home/aaaftpuser )을 개별 가상계정의 바로 윗단계 경로로 바꿔주고 저장+빠져나옵니다.


이제 터미널 창에 sudo service vsftpd restart 라고 입력하여 vsftpd 서비스를 재시작해 줍니다.



가상계정 설정 절차는 이것으로 끝났습니다. 이제 파일질라 클라이언트로 접속 테스트를 해봅시다.


▲ 저는 공유기 내부망 주소 + 가상계정 ccc로 연결을 시도했습니다.


▲ 접속이 되고, 리모트 사이트 란을 보면 감옥(chroot) 설정까지 된 것이 확인됩니다.


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


VSFTPD 구축방법 설명은 이것으로 끝입니다. 3편까지 보고 따라와 주셨다면 감사하고,

마지막으로 1편~3편 글에 적은 /etc/vsftpd.conf 파일의 내용을 한번에 적고, 추가 보안 세팅들까지 적으면서 마치겠습니다.

그러니까 설정파일에 아래 텍스트만 똑같이 쳐서 넣고(복붙하면 오류 뿜는 경우가 있습니다.) 세팅+경로만 적절히 수정하면 vsftpd 가상계정 구축은 끝나는 겁니다(+가상계정별 설정파일은 본문을 참고해서 각각 추가해 주세요.). 가상계정 설정(Virtual User Configure)을 빼면 FTPES 패시브 모드로 로컬계정 접속이 되겠고요.



########### 기본 설정(Standalone Mode) ###########


listen=YES

listen_ipv6=NO

anonymous_enable=NO

local_enable=YES

write_enable=YES

dirmessage_enable=NO

use_localtime=YES

xferlog_enable=YES

connect_from_port_20=YES

secure_chroot_dir=/var/run/vsftpd/empty

pam_service_name=vsftpd



########### 기본 설정 추가 ###########


listen_port=21

utf8_filesystem=YES

user_sub_token=$USER

# user_config_dir 추가하면서 local_root는 주석처리. 대신 개별 사용자별로 제어.

#local_root=/home/$USER(본인이 원하는 경로)

local_umask=022

# local_umask 설정 추가하면서 file_open_mode는 주석처리.

#file_open_mode=0644

tcp_wrappers=YES

ascii_download_enable=NO

async_abor_enable=NO

xferlog_std_format=NO

hide_ids=YES



########### 감옥 설정 추가 : local_root 디렉토리에 갇혀서 상위로 못 올라가게 됨. local_root 설정이 없으면 /home/$USER 에 갇힘. ###########


chroot_list_enable=YES

#아래는 감옥 제외자 명단 설정파일 경로입니다. 터미널에서 sudo gedit /etc/vsftpd/vsftpd.chroot_list 친 다음, 한줄에 제외자 계정 하나씩 넣고 저장+빠져나오세요(기본으로 root 를 넣어주면 좋습니다.).

chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

chroot_local_user=YES

allow_writeable_chroot=YES



########### 패시브 모드를 위한 설정 ###########


pasv_enable=YES

pasv_min_port=5200

pasv_max_port=5210

#pasv_address=123.123.123.123(본인의 IP주소)

pasv_addr_resolve=YES

pasv_address=jimnong.tistory.com(본인의 DDNS 주소 또는 도메인 주소)



########### SSL(TLS) 활성화 ###########


ssl_enable=YES



########### 로그인할 때 클라이언트가 반드시 TLS를 사용하기 ###########


allow_anon_ssl=NO

force_local_data_ssl=YES

force_local_logins_ssl=YES

ssl_tlsv1=YES

ssl_sslv2=NO

ssl_sslv3=NO

require_ssl_reuse=NO

ssl_ciphers=HIGH



########### SSL 인증서/비밀키 경로 ###########


rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem

rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.pem



########### Virtual User Configure ###########


guest_enable=YES

guest_username=aaaftpuser(깡통계정명)

virtual_use_local_privs=YES



############ User 별 추가 설정(기본 설정에서 override 됨. 일부 설정은 제외.) ###############


user_config_dir=/etc/vsftpd/vsftpd_user_conf/



############ Connection Control #############


max_login_fails=3

max_clients=3

max_per_ip=3

one_process_model=NO

idle_session_timeout=120

data_connection_timeout=300

connect_timeout=60



########### 접근 거부 계정 : /etc/vsftpd/vsftpd.deny_list 에 한 줄 당 계정 하나씩 적을 것. 내용이 없더라도 파일은 반드시 존재해야 함. ###########

userlist_enable=YES

userlist_file=/etc/vsftpd/vsftpd.deny_list

userlist_deny=YES



============================================================


※ VSFTPD에서 가상 계정과 로컬 계정 함께 사용하기

(Setting Both Virtual and Local User VSFTPD Login)


PAM 서비스 설정 파일(sudo gedit /etc/pam.d/vsftpd)을 수정하여 가상 계정 접속은 허용하고 로컬 계정 접속은 안 되게끔 했었습니다.

로컬 계정 접속도 되게끔 바꿔보겠습니다.


우선 /etc/pam.d/vsftpd 파일의 내용을 원래대로 돌려놓습니다.


▲ /etc/pam.d/vsftpd 파일을 수정하기 전에 sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_ori 명령으로 백업하신 적이 있다면 터미널 창에서 sudo cp /etc/pam.d/vsftpd_ori /etc/pam.d/vsftpd 명령을 쓰면 간단하게 복원이 됩니다.


터미널 창에서

sudo gedit /etc/vsftpd.conf

라고 입력한 다음, vsftpd.conf 파일에서 pam_service_name=vsftpd 을 pam_service_name=vsftpdboth 로 바꿉니다.

## Virtual User Configure ## 항목 세 줄도 삭제합니다(이건 개별 가상계정별 설정파일에 삽입할 겁니다.).

저장 후 빠져나오세요.


터미널 창에서

sudo gedit /etc/pam.d/vsftpdboth

라고 입력한 다음, 아래 스크린 샷처럼 입력하고 저장+빠져나옵니다.


▲ (굳이) 해석을 해보자면... 가상유저 DB로 1차 인증을 하고, vsftpd PAM 파일에서 추가 인증을 끌어오겠다는 것인데, vsftpd PAM 파일에서는 거부자 명단(로컬)을 처리한 다음 로컬계정 인증을 처리하네요.


이제

/etc/vsftpd/vsftpd_user_conf/ 경로에 개별 사용자별 설정파일을 추가해줘야 합니다.


▲ 저는 aaa가 로컬 계정(local user), ccc와 ddd가 가상 계정(virtual user)입니다.


터미널 창에서

sudo gedit /etc/vsftpd/vsftpd_user_conf/aaa

sudo gedit /etc/vsftpd/vsftpd_user_conf/ccc

처럼 입력하여 파일을 만들면서 입력할 수 있습니다. 


▲ 로컬 유저(local user)는 이런 식으로 구성해주고,


▲ 가상 유저(virtual user)는 이런 식으로 구성합니다.


저장 후 빠져나옵니다.


가상 유저 관련 설정을 개별 가상유저별로 넣어주는 이유는 vsftpd.conf 에서 guest_enable 을 설정할 경우 로컬계정 접속도 guest_username 으로 시도하기 때문입니다. vsftpdboth 파일에서 auth sufficient 라고 정했기 때문에 접속은 성공하는데, 쓰기작업은 안 되더군요. 해당 디렉토리의 그룹을 guest_username 이 속한 그룹으로 바꿔주면 쓰기가 되긴 하는데, 논리적이지 않은 접근 방식이라 보안에 취약할 수밖에 없을 겁니다. 그래서 비추천. => 이해가 안 되면 그냥 넘어가세요.


이제 vsftpd 서비스를 재시작해 줍니다.



그리고 FTP 접속 테스트해보세요.

파일질라 클라이언트 "사이트 관리자"에서

  - "기본 탭"에서 프로토콜 : FTP

  - TLS를 통한 명시적 FTP 필요

  - "고급 탭"에서 서버 종류 : 자동 감지

  - "전송 설정 탭"에서 전송 모드 : 수동형

  - "문자셋 탭"에서 UTF-8로 강제 설정

이렇게 세팅하면 좋습니다.


아마 성공할 겁니다.


끝.


p.s. 연결 후 일정 시간이 지나 서버 측에서 접속을 끊을 때, GnuTLS 오류 -15: An unexpected TLS packet was received. 메세지를 뿜더라도 너무 걱정하지 마세요. 접속 허용된 일부 계정의 홈디렉토리가 설정되지 않아서 생기는 오류로, 연결 시점에 에러 뿜으면서 연결이 안되는 경우만 아니면 실사용시 문제될 것이 없습니다.



지금까지의 과정이 귀찮다면? 구축 포기하고, 로컬계정은 속도저하 감수하고 SFTP 쓰는 게 보안에 유리하고 좋습니다. 최소한 중간은 가는 선택지예요.

[우분투 16.04] FileZilla FTP 클라이언트 프로그램으로 SFTP 사용하기


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


[우분투 16.04] VSFTPD 설정파일 매뉴얼 한글번역(with 구글)

Dlink 디링크 DIR-615 공유기 DDNS 설정 방법

Dlink 디링크 DIR-615 공유기 포트포워딩(가상서버) 설정 방법

반응형