CentOS 7에서 FTP 서버 자동 설치 및 관리 스크립트

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비트 시스템 자동 감지 및 경로 조정

사용 방법

  1. 스크립트를 setup-ftp.sh 등으로 저장
  2. 실행 권한 부여: chmod +x setup-ftp.sh
  3. 루트 권한으로 실행: sudo ./setup-ftp.sh
  4. 메뉴에서 원하는 작업 선택

태그: vsftpd CentOS 7 shell script automation PAM authentication

6월 6일 17:32에 게시됨