FTP 서버 배포 개요
CentOS 7 환경에서 vsftpd 기반의 FTP 서버를 신속하게 구성하기 위해, 수작업 설정을 자동화한 Bash 스크립트를 제공합니다. 이 스크립트는 방화벽 설정, 사용자 인증, 디렉터리 권한 조정 등을 일괄 처리하여 배포 시간을 단축합니다.
기본 패키지 설치
스크립트 실행 전 최소한의 네트워크 연결과 YUM 리포지토리 정상 동작이 필요합니다. 아래 명령어로 vsftpd를 사전 설치할 수 있으나, 본 스크립트 내부에서도 자동으로 수행됩니다.
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
자동 구성 스크립트
다음은 CentOS 7에 맞춰 작성된 전체 자동화 스크립트입니다. 주요 기능으로는 가상 사용자 기반 인증(PAM + DB), chroot 격리, 방화벽 자동 등록, 사용자별 홈 디렉터리 할당 등을 포함합니다.
#!/bin/bash
# FTP 데이터 경로 기본값
FTP_ROOT="/home/ftp"
# 방화벽 상태 확인 및 규칙 적용 함수
setup_firewall() {
echo "방화벽 상태 점검 중..."
if ! systemctl is-active firewalld >/dev/null; then
echo "FTP 서비스 및 포트 21 허용 규칙 추가"
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --reload
echo "방화벽 재시작 완료"
fi
}
# vsftpd 설치 및 초기 설정
deploy_ftp_server() {
echo "vsftpd 설치 시작"
yum -y install vsftpd libdb-utils >/dev/null || {
echo "YUM 설치 실패: 네트워크 또는 리포지토리 문제 확인 필요"
echo "명령어 테스트: yum makecache"
exit 1
}
setup_firewall
# 기존 설정 백업
[ -f /etc/vsftpd/vsftpd.conf ] && mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
# 새 설정 파일 생성
cat > /etc/vsftpd/vsftpd.conf <<'EOF'
listen=YES
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/user_conf
pam_service_name=vsftpd_virtual
chroot_local_user=YES
allow_writeable_chroot=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
dirmessage_enable=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
EOF
# FTP 전용 시스템 계정 생성 (로그인 불가)
id ftp >/dev/null 2&&1 || useradd -s /sbin/nologin ftp
# 인증 정보 입력 요청
read -p "관리자 계정 이름 입력 (기본값: test): " INPUT_USER
USERNAME="${INPUT_USER:-test}"
read -p "비밀번호 입력 (기본값: 123456): " INPUT_PASS
PASSWORD="${INPUT_PASS:-123456}"
# 사용자 목록 생성
cat > /etc/vsftpd/login_users.txt <<EOF
${USERNAME}
${PASSWORD}
EOF
# PAM 인증용 해시 DB 생성
db_load -T -t hash -f /etc/vsftpd/login_users.txt /etc/vsftpd/vsftpd_login.db
chmod 600 /etc/vsftpd/vsftpd_login.db
# PAM 설정 파일 작성 (시스템 아키텍처 기반 경로 선택)
cat > /etc/pam.d/vsftpd_virtual <<'EOF'
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
EOF
# 32비트 시스템 호환성 처리
ARCH=$(getconf LONG_BIT)
sed -i "s|pam_userdb.so|pam_userdb.so db=/etc/vsftpd/vsftpd_login|" /etc/pam.d/vsftpd_virtual
if [ "$ARCH" -eq 64 ]; then
sed -i '1s|^|auth required /lib64/security/|' /etc/pam.d/vsftpd_virtual
sed -i '2s|^|account required /lib64/security/|' /etc/pam.d/vsftpd_virtual
else
sed -i '1s|^|auth required /lib/security/|' /etc/pam.d/vsftpd_virtual
sed -i '2s|^|account required /lib/security/|' /etc/pam.d/vsftpd_virtual
fi
# chroot 제한 리스트 초기화
touch /etc/vsftpd/chroot_list
echo "$USERNAME" >> /etc/vsftpd/chroot_list
# 사용자별 설정 디렉터리 생성
CONF_DIR="/etc/vsftpd/user_conf"
mkdir -p "$CONF_DIR"
# 사용자별 권한 설정
cat > "$CONF_DIR/$USERNAME" <<EOF
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=${FTP_ROOT}/${USERNAME}
EOF
# 데이터 디렉터리 생성 및 권한 설정
mkdir -p "${FTP_ROOT}/${USERNAME}"
chown -R ftp:root "${FTP_ROOT}"
chmod 755 "${FTP_ROOT}"
chmod 777 "${FTP_ROOT}/${USERNAME}"
# 서비스 재시작
systemctl restart vsftpd
systemctl enable vsftpd
echo "FTP 서버 설치 완료"
echo "접속 정보: 사용자=$USERNAME, 비밀번호=$PASSWORD"
}
# 추가 사용자 생성 함수
add_ftp_user() {
read -p "추가할 사용자 이름: " NEW_USER
[ -z "$NEW_USER" ] && { echo "사용자 이름 누락"; exit 1; }
read -p "비밀번호 입력 (기본값: 123456): " USER_PASS
USER_PASS="${USER_PASS:-123456}"
# 사용자 정보 추가 후 DB 갱신
echo "$NEW_USER" >> /etc/vsftpd/login_users.txt
echo "$USER_PASS" >> /etc/vsftpd/login_users.txt
db_load -T -t hash -f /etc/vsftpd/login_users.txt /etc/vsftpd/vsftpd_login.db
chmod 600 /etc/vsftpd/vsftpd_login.db
# chroot 및 사용자 설정
echo "$NEW_USER" >> /etc/vsftpd/chroot_list
mkdir -p "${FTP_ROOT}/${NEW_USER}"
chmod 777 "${FTP_ROOT}/${NEW_USER}"
cat > "/etc/vsftpd/user_conf/${NEW_USER}" <<EOF
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=${FTP_ROOT}/${NEW_USER}
EOF
echo "사용자 $NEW_USER 추가 완료"
}
# 메뉴 기반 인터페이스
echo "=== FTP 서버 관리 도구 ==="
select action in "서버 설치" "사용자 추가" "종료"; do
case $REPLY in
1) deploy_ftp_server; break ;;
2) add_ftp_user; break ;;
3) exit 0 ;;
*) echo "잘못된 선택입니다" ;;
esac
done
스크립트 기능 요약
- vsftpd 및 필요한 유틸리티 자동 설치
- 방화벽 자동 구성 (firewalld)
- PAM 기반 가상 사용자 인증 구현
- 사용자별 독립적인 홈 디렉터리 및 쓰기 권한 제공
- chroot를 통한 보안 강화
- 32비트/64비트 시스템 자동 감지 및 경로 조정
사용 방법
- 스크립트를
setup-ftp.sh등으로 저장 - 실행 권한 부여:
chmod +x setup-ftp.sh - 루트 권한으로 실행:
sudo ./setup-ftp.sh - 메뉴에서 원하는 작업 선택