centOs7 - vsftpd 설치하기

들어가기

로컬 pc에 있는 war파일을 centos7의 톰캣에 배포 하려니, centOs에 ftp가 없다. 그래서 레드헷 계열에서 쓰는 기존 ftp보다 보안및 성능이 강화된 vsftpd설치하고 사용해보자.

실습의 편의를 위해 selinux를 disable 했으며, root 계정으로 접속하는 예제이다. 주의: 이실습은 보안은 개나 줘버린 예제이다. 그리고 실습을 진행하면서 자잘한 문제사항을 발견하게 된다. 만약 예제를 따라 실습한다면, 한번 전체적으로 읽어보고 따라하길 바란다.

실습환경

centos7(vsftpd), ftp 클라이언트(filezilla)

centOs7에 vsftpd 설치하기

vsftpd가 설치되어있는지 일단 확인하자.

1
yum list installed vsftpd

설치가 안되어 있다면, 다음 명령으로 vsftpd를 설치하자.

1
yum install vsftpd -y

그리고 vsftpd를 업데이트 하자

1
yum update vsftpd

/etc/vsftpd/vsftpd.conf 파일을 수정하자. /etc/vsftpd/vsftpd.conf 은 vsftpd의 설정파일이다.

기존의 vsftpd.conf 파일을 vsftpd.conf_back으로 바꿔보관하고,

1
2
mv vsftpd.conf vsfptd.conf_back
vi vsftpd.conf

새로운 vsftpd.conf 파일을 만들어 아래 내용을 채우고 저장한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

vsftpd를 실행하자.

1
service vsftpd start

다음 명령으로 동작중인 vsftpd 포트를 확인 할 수 있다.

1
2
[root@localhost vsftpd]# netstat --tcp -anp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 18131/vsftpd

다음 명령으로 vsfptd 서비스가 항상 동작하도록 설정하자

1
systemctl enable vsftpd.service

방화벽에서 21, 20포트를 열어준다.

1
2
3
sudo firewall-cmd --permanent --zone=public --add-port=21/tcp
sudo firewall-cmd --permanent --zone=public --add-port=20/tcp
sudo firewall-cmd --reload

Windows pc에서 filezilla를 이용헤서 ftp 에 접속해보자

일단 root 계정으로 접속해보자.

하지만 오류가 발생하며 접속이 안된다.

530 Permission denied 오류를 찾아보니, vsftpd에 기본적으로 접속거부 리스트에 root 계정이 포함되어 있다고 한다.

아래 두 파일에 이 접속거부 계정 정보가 있다. /etc/vsftpd/ftpusers /etc/vsftpd/user_list

/etc/vsftpd/ftpusers 를 열어보니, 아래와 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost vsftpd]# vi /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

root 계정을 지워서 저장하자. 일단 실습용이니 보안은 개나 줘버리자. ㄷㄷㄷ

/etc/vsftpd/user_list 파일을 열어보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost vsftpd]# vi /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

역시 root 가 있다. 이 파일에서도 root 를 제거하고 저장하자.

서비스를 재 시작하고 접속이 root계정을 이용해 파일질라고 접속해보자

1
service vsftpd restart

이번엔

500 OOPS: vsftpd: refusing to run with writable root inside chroot() 라는 오류 메세지가 뜬다.

500 OOPS 오류 발생

찾아보니 chroot내에 쓰기 권한이 없어서 발생하는 문제라고 한다.

/etc/vsftpd/vsftpd.conf 파일을 수정해야 한다.

하단에 아래 스크립트를 추가하자.

1
allow_writeable_chroot=yes

다시 vsftpd 서비스를 재시작 하자.

다시 파일질라에서 root 계정으로 접속해보자

또다시 안된다. 산넘어 산이다.

디렉터리 목록 조회 실패 오류

인터넷에 찾아보니 vsftpd 에 passive 모드에 대한 설정이 필요하다고 한다.

ftp 서버 만들어 쓰는데 참 할게 많다.

다시 /etc/vsftpd/vsftpd.conf파일을 열어 하단에 아래 내용을 추가한다.

1
2
3
pasv_enable=Yes
pasv_max_port=40000
pasv_min_port=40000

40000 번 포트를 방화벽에서 열어주자.

1
2
3
# firewall-cmd --permanent --add-port=40000/tcp
# firewall-cmd --reload
service vsftpd restart

최종 /etc/vsftpd/vsftpd.conf 파일 내용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
listen_port=21
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
pasv_enable=Yes
pasv_max_port=40000
pasv_min_port=40000

음 vsftp 패시브모드 설정도 끝냈다. 다시 접속 시도해보자

접속이 되는 것을 확인했다. 파일질라에서 능동, 수동 둘다 접속이 가능하다.

접속확인