安全ftp服务配置

一、环境准备

软件准备:
centos7:3.10.0-1160.119.1.el7.x86_64
ftp:vsftpd-3.0.2-29.el7_9.x86_64

启动防火墙:
systemctl start firewalld
systemctl enable firewalld

永久启动selinux:
vim /etc/selinux/config

SELINUX=enforcing
# 指定SELinux策略类型(targeted为默认,保护多数网络服务)
SELINUXTYPE=targeted

创建如下文件:
touch /.autorelabel

重启系统:
reboot

二、系统备份


#!/bin/bash
# ============================================
# 系统安全检查与备份脚本
# ============================================

echo "开始系统安全检查与备份..."
BACKUP_DIR="/root/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p $BACKUP_DIR

# 1. 备份关键配置文件
echo "备份系统配置文件..."
tar -czf $BACKUP_DIR/etc.tar.gz /etc
tar -czf $BACKUP_DIR/ssh_config.tar.gz /etc/ssh
tar -czf $BACKUP_DIR/ftp_config.tar.gz /etc/vsftpd /etc/pam.d/vsftpd*

# 2. 备份防火墙规则
echo "备份防火墙配置..."
firewall-cmd --list-all > $BACKUP_DIR/firewall_backup.txt
iptables-save > $BACKUP_DIR/iptables_backup.rules

# 3. 系统信息收集
echo "收集系统信息..."
{
    echo "=== 系统基本信息 ==="
    hostnamectl
    echo ""
    echo "=== 内核版本 ==="
    uname -a
    echo ""
    echo "=== 磁盘使用情况 ==="
    df -h
    echo ""
    echo "=== 内存使用情况 ==="
    free -h
    echo ""
    echo "=== 运行的服务 ==="
    systemctl list-units --type=service --state=running
    echo ""
    echo "=== 网络监听端口 ==="
    netstat -tulpn
} > $BACKUP_DIR/system_info.txt

echo "备份完成,文件保存在: $BACKUP_DIR"

三、系统更新软件安装

#!/bin/bash
# ============================================
# 系统更新脚本
# ============================================

echo "开始更新系统..."
# 1. 清理并更新YUM缓存
yum clean all
yum makecache

# 2. 查看可用的安全更新
echo "检查安全更新..."
yum check-update --security

# 3. 应用安全更新(不更新内核,避免重启)
yum update -y --exclude=kernel* --security

# 4. 安装必要的安全工具

yum install -y epel-release
yum install -y \
    fail2ban \
    aide \
    rkhunter \
    chkrootkit \
    lynis \
    clamav \
    clamav-update \
    htop \
    iftop \
    nethogs

# 5. 安装FTP相关工具
yum install -y \
    vsftpd \
    lftp \
    ftp \
    db4-utils \
    db4 \
    policycoreutils-python \
    setroubleshoot-server

echo "系统更新完成!"

四、基础配置

备份:
cp /etc/vsftpd/vsftpd.conf{,.bak}
mkdir -p /var/run/vsftpd/empty
vim /etc/vsftpd/vsftpd.conf
内容:
# 基础设置
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=NO
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

# 用户访问控制
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/vsftpd.user_list
chroot_local_user=YES
allow_writeable_chroot=YES

# 连接限制
max_clients=100
max_per_ip=5
idle_session_timeout=300
data_connection_timeout=120
local_max_rate=10485760

# 被动模式
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=51000
#pasv_address=$(hostname -I | awk '{print $1}')

# SSL/TLS加密(如果需要)
 ssl_enable=YES
# 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
 rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
 rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key

# 安全设置
ascii_upload_enable=NO
ascii_download_enable=NO
ls_recurse_enable=NO
use_localtime=YES
check_shell=YES
secure_chroot_dir=/var/run/vsftpd/empty
nopriv_user=nobody
session_support=YES

# PAM和TCP包装器
pam_service_name=vsftpd
tcp_wrappers=YES

# ----- 用户限制与访问控制 -----
# 控制最大客户端连接数
max_clients=50
# 每IP最大连接数
max_per_ip=5
# 本地用户权限:禁止某些危险文件类型上传
deny_file={*.exe,*.bat,*.com,*.dll,*.vbs,*.sh}


五、SSL安全配置

5.1 生成SSL证书

#!/bin/bash
# ============================================
# 生成SSL证书脚本
# ============================================

SSL_DIR="/etc/vsftpd/ssl"
mkdir -p $SSL_DIR

echo "生成自签名SSL证书..."
# 生成2048位RSA私钥和自签名证书(有效期10年)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
    -keyout $SSL_DIR/vsftpd.key \
    -out $SSL_DIR/vsftpd.crt \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=Company/CN=ftp.$(hostname)"

# 合并证书和私钥(vsftpd需要pem格式)
cat $SSL_DIR/vsftpd.key $SSL_DIR/vsftpd.crt > $SSL_DIR/vsftpd.pem

# 设置严格的权限
chmod 600 $SSL_DIR/vsftpd.key $SSL_DIR/vsftpd.pem
chmod 644 $SSL_DIR/vsftpd.crt
chown root:root $SSL_DIR/*

echo "SSL证书生成完成!"
echo "证书位置: $SSL_DIR/vsftpd.pem"
echo "证书有效期: 10年"

六、创建用户管理脚本

#!/bin/bash
# ============================================
# FTP用户管理脚本
# ============================================

# 配置参数
FTP_GROUP="ftpusers"                # FTP用户组名
FTP_ROOT="/var/ftp"                 # FTP根目录
USER_LIST="/etc/vsftpd/vsftpd.user_list"  # 用户白名单文件
LOG_FILE="/var/log/ftp-user-manager.log"  # 操作日志

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log() {
    local level="$1"
    local message="$2"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] [$level] $message" | tee -a $LOG_FILE
}

# 显示使用说明
show_help() {
    echo -e "${BLUE}FTP用户管理脚本${NC}"
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo -e "  ${GREEN}create <用户名> [目录]${NC}  创建FTP用户和目录"
    echo -e "  ${RED}delete <用户名>${NC}         删除FTP用户和目录"
    echo -e "  ${YELLOW}list${NC}                   列出所有FTP用户"
    echo -e "  ${BLUE}reset <用户名>${NC}         重置用户密码"
    echo -e "  ${RED}lock <用户名>${NC}          锁定用户账户"
    echo -e "  ${GREEN}unlock <用户名>${NC}      解锁用户账户"
    echo -e "  ${YELLOW}init${NC}                   初始化FTP环境"
    echo -e "  ${BLUE}help${NC}                    显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 create webuser /var/ftp/web"
    echo "  $0 delete olduser"
    echo "  $0 list"
}

# 初始化FTP环境
init_ftp_env() {
    echo -e "${BLUE}[INFO] 初始化FTP环境...${NC}"
    
    # 创建FTP用户组(如果不存在)
    if ! getent group $FTP_GROUP > /dev/null; then
        groupadd $FTP_GROUP
        log "INFO" "创建用户组: $FTP_GROUP"
        echo -e "${GREEN}[OK] 创建用户组: $FTP_GROUP${NC}"
    fi
    
    # 创建FTP根目录
    mkdir -p $FTP_ROOT
    chmod 755 $FTP_ROOT
    chown root:root $FTP_ROOT
    
       
    # 创建用户列表文件
    touch $USER_LIST
    chmod 600 $USER_LIST
    chown root:root $USER_LIST
    
       
    echo -e "${GREEN}[OK] FTP环境初始化完成${NC}"
    log "INFO" "FTP环境初始化完成"
}

# 创建FTP用户
create_ftp_user() {
    local username="$1"
    local userdir="${2:-$FTP_ROOT/$username}"
    
    # 参数检查
    if [ -z "$username" ]; then
        echo -e "${RED}[ERROR] 请指定用户名${NC}"
        return 1
    fi
    
    # 检查用户是否已存在
    if id "$username" &>/dev/null; then
        echo -e "${RED}[ERROR] 用户 $username 已存在${NC}"
        return 1
    fi
    
    echo -e "${BLUE}[INFO] 开始创建FTP用户: $username${NC}"
    
    # 生成随机密码(12位,包含大小写字母和数字)
    local password=$(openssl rand -base64 12 | tr -d '=+/' | cut -c1-12)
    
    # 创建系统用户(-M无家目录,-s无shell登录权限)
    useradd -M -s /sbin/nologin -g $FTP_GROUP -d "$userdir" "$username"
    
    if [ $? -ne 0 ]; then
        echo -e "${RED}[ERROR] 创建用户 $username 失败${NC}"
        log "ERROR" "创建用户 $username 失败"
        return 1
    fi
    
    # 设置密码
    echo "$username:$password" | chpasswd
    log "INFO" "为用户 $username 设置密码"
    
    # 创建用户目录结构
    mkdir -p "$userdir"
    mkdir -p "$userdir/upload"     # 上传目录
    mkdir -p "$userdir/download"   # 下载目录(只读)
    mkdir -p "$userdir/temp"       # 临时目录
    
    # 设置目录权限
    # 用户根目录:root:ftpusers, 750 (用户不能修改根目录权限)
    chown root:$FTP_GROUP "$userdir"
    chmod 750 "$userdir"
    
    # 上传目录:用户名:ftpusers, 770 (用户可读写)
    chown $username:$FTP_GROUP "$userdir/upload"
    chmod 770 "$userdir/upload"
    
    # 下载目录:root:ftpusers, 755 (只读)
    chown root:$FTP_GROUP "$userdir/download"
    chmod 755 "$userdir/download"
    
    # 临时目录:用户名:ftpusers, 777 (临时文件交换)
    chown $username:$FTP_GROUP "$userdir/temp"
    chmod 777 "$userdir/temp"
    
    # 创建欢迎文件
    cat > "$userdir/WELCOME.txt" << EOF
欢迎 $username 使用FTP服务

您的目录结构:
├── upload/     - 上传目录(您有读写权限)
├── download/   - 下载目录(只读)
└── temp/       - 临时目录(公开可访问)

使用说明:
1. 请使用FTPS连接:ftps://$(hostname)
2. 密码已发送,请妥善保管
3. 首次登录后建议修改密码
4. 不要分享您的账户信息

安全提醒:
• 密码有效期:90天
• 最大连接数:5个/IP
• 上传速率限制:10MB/s

技术支持:admin@$(hostname)
创建时间:$(date)
EOF
    
    # 将用户添加到白名单
    if ! grep -q "^$username$" "$USER_LIST"; then
        echo "$username" >> "$USER_LIST"
        log "INFO" "用户 $username 已添加到白名单"
    fi
    
    # 设置密码策略
    chage -M 90 "$username"     # 密码最长有效期90天
    chage -m 7 "$username"      # 密码最短有效期7天
    chage -W 14 "$username"     # 过期前14天警告
    chage -I 30 "$username"     # 过期后30天禁用
    
    # 设置SELinux上下文(如果启用)
    if [ "$(getenforce)" = "Enforcing" ]; then
        semanage fcontext -a -t public_content_rw_t "$userdir/upload(/.*)?"
        semanage fcontext -a -t public_content_t "$userdir/download(/.*)?"
        restorecon -Rv "$userdir"
        log "INFO" "已设置SELinux上下文"
    fi
    
    # 输出用户信息
    echo ""
    echo -e "${GREEN}=======================================${NC}"
    echo -e "${GREEN}  FTP用户创建成功!${NC}"
    echo -e "${GREEN}=======================================${NC}"
    echo -e "用户名: ${YELLOW}$username${NC}"
    echo -e "初始密码: ${YELLOW}$password${NC}"
    echo -e "FTP目录: ${BLUE}$userdir${NC}"
    echo -e "连接地址: ${BLUE}ftps://$(hostname)${NC}"
    echo ""
    echo -e "${YELLOW}[重要] 请立即记录密码并告知用户${NC}"
    echo -e "${YELLOW}[提示] 用户首次登录后应修改密码${NC}"
    
    # 记录到日志文件
    echo "用户: $username, 密码: $password, 目录: $userdir" >> /root/ftp_users_created.txt
    chmod 600 /root/ftp_users_created.txt
    
    log "INFO" "FTP用户 $username 创建成功"
    return 0
}

# 主程序逻辑
case "$1" in
    "create")
        init_ftp_env
        create_ftp_user "$2" "$3"
        ;;
    "delete")
        # 删除用户逻辑(省略详细实现)
        echo "删除功能待实现"
        ;;
    "list")
        echo -e "${BLUE}=== FTP用户列表 ===${NC}"
        echo -e "${GREEN}白名单中的用户:${NC}"
        cat "$USER_LIST" 2>/dev/null || echo "无"
        echo ""
        echo -e "${GREEN}系统FTP用户:${NC}"
        getent passwd | grep "/sbin/nologin" | grep "$FTP_ROOT" | cut -d: -f1
        ;;
    "reset")
        if [ -n "$2" ]; then
            passwd "$2"
        else
            echo -e "${RED}[ERROR] 请指定用户名${NC}"
        fi
        ;;
    "lock")
        if [ -n "$2" ]; then
            usermod -L "$2"
            echo -e "${YELLOW}[INFO] 用户 $2 已锁定${NC}"
        fi
        ;;
    "unlock")
        if [ -n "$2" ]; then
            usermod -U "$2"
            echo -e "${GREEN}[INFO] 用户 $2 已解锁${NC}"
        fi
        ;;
    "init")
        init_ftp_env
        ;;
    "help"|"--help"|"-h"|"")
        show_help
        ;;
    *)
        echo -e "${RED}[ERROR] 未知命令: $1${NC}"
        echo ""
        show_help
        exit 1
        ;;
esac

七、防火墙安全配置

配置Firewalld FTP规则

#!/bin/bash
# ============================================
# 防火墙FTP安全配置脚本
# ============================================

echo "配置防火墙FTP规则..."

# 创建FTP专用区域
firewall-cmd --permanent --new-zone=ftp-public
#【删除一个zone】:firewall-cmd --permanent --delete-zone=ftp-public

# 设置区域默认策略为拒绝所有
firewall-cmd --permanent --zone=ftp-public --set-target=DROP
echo "创建ftp-public区域,默认策略为DROP"

# 添加FTP服务(21端口)
firewall-cmd --permanent --zone=ftp-public --add-service=ftp
echo "添加FTP服务(21端口)"

# 添加被动模式端口范围(50000-51000)
firewall-cmd --permanent --zone=ftp-public --add-port=50000-51000/tcp
echo "添加被动模式端口:50000-51000/tcp"

# 添加SSH管理端口(非标准端口2222,防止扫描)
firewall-cmd --permanent --zone=ftp-public --add-port=22/tcp
echo "添加SSH管理端口:2222/tcp"

# 添加源IP限制(示例,根据实际情况修改)
 firewall-cmd --permanent --zone=ftp-public --add-source=192.168.1.0/24
 firewall-cmd --permanent --zone=ftp-public --add-source=10.0.0.0/8

# 配置连接速率限制(防止DDoS)
firewall-cmd --permanent --zone=ftp-public --add-rich-rule='
  rule family="ipv4" source address="0.0.0.0/0"
  port port="21" protocol="tcp"
  limit value="10/m" accept'
echo "配置FTP连接速率限制:10次/分钟"

# 应用配置
firewall-cmd --reload

# 设置默认区域
firewall-cmd --set-default-zone=ftp-public

# 查看配置结果
echo ""
echo "=== 防火墙配置完成 ==="
echo "当前激活的区域:"
firewall-cmd --get-active-zones
echo ""
echo "ftp-public区域规则:"
firewall-cmd --zone=ftp-public --list-all


八、SELinux和文件权限配置

SELinux FTP配置

#!/bin/bash
# ============================================
# SELinux FTP服务配置
# ============================================

# 确保SELinux处于强制模式
if [ "$(getenforce)" != "Enforcing" ]; then
    echo "设置SELinux为强制模式..."
    setenforce 1
    sed -i 's/SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
fi

echo "配置SELinux FTP相关策略..."

# 设置FTP相关布尔值
setsebool -P ftp_home_dir on                  # 允许FTP访问用户家目录
setsebool -P allow_ftpd_full_access on        # FTP完全访问系统
setsebool -P ftpd_use_passive_mode on         # 允许被动模式
setsebool -P ftpd_connect_db off              # 禁止FTP连接数据库
setsebool -P ftpd_anon_write off              # 禁止匿名写入
setsebool -P ftpd_use_cifs off                # 禁止FTP使用CIFS
setsebool -P ftpd_use_nfs off                 # 禁止FTP使用NFS

echo "SELinux布尔值设置完成:"
getsebool -a | grep ftp

# 设置FTP目录的SELinux上下文
echo "设置FTP目录SELinux上下文..."
semanage fcontext -a -t public_content_t "/var/ftp(/.*)?" 
semanage fcontext -a -t public_content_rw_t "/var/ftp/[用户名]/upload(/.*)?"  
semanage fcontext -a -t public_content_t "/var/ftp/[用户名]public(/.*)?"   
semanage fcontext -a -t public_content_rw_t "/var/ftp/[用户名]/temp(/.*)?"  

# 恢复上下文
restorecon -Rv /var/ftp

echo "SELinux FTP配置完成!"




九、测试

方法一:使用 lftp 命令(功能最强大,推荐)

lftp 是一个专门为文件传输设计的命令行工具,支持协议众多(FTP, FTPS, HTTP等),功能非常强大,支持像 bash 一样的命令补全、断点续传、批量作业等 。

  1. 安装(如果尚未安装):

    sudo yum install lftp
    
  2. 连接服务器

    lftp -u 您的用户名 ftp://您的服务器IP
    

    输入密码后,您会进入 lftp 的交互式环境。lftp 会自动尝试协商加密。

  3. lftp 交互环境中常用命令

    • ls:列出文件 。
    • cd 目录名:切换远程目录 。
    • lcd 目录名:切换本地目录。
    • get 文件名:下载文件 。
    • put 文件名:上传文件 。
    • mirror 远程目录 [本地目录]:下载整个目录。
    • mirror -R 本地目录 [远程目录]:上传整个目录。
    • exitquit:退出。
  4. 处理自签名证书
    如果您遇到证书验证问题,可以在连接前设置:

    # 进入 lftp 后,先设置忽略证书验证
    set ssl:verify-certificate false
    
    # 然后连接
    open -u 您的用户名 ftp://您的服务器IP
    

    或者,更便捷的方式是直接将这些设置放在命令行中:

    lftp -e "set ssl:verify-certificate false; ls" -u 您的用户名 ftp://您的服务器IP
    

方法二:使用 FileZilla 客户端(图形界面)

如果您更喜欢图形化操作,FileZilla 是一个非常好的跨平台 FTP/FTPS 客户端 。

  1. 安装

    sudo yum install filezilla
    
  2. 配置站点

    • 打开 FileZilla,点击左上角的「文件」→「站点管理器」。
    • 点击「新站点」,输入一个名称。
    • 在右侧的「协议」下拉菜单中,选择 「FTP - 文件传输协议」(如果服务器是显式 TLS/SSL,选这个)或 「FTPS - FTP over SSL/TLS」(如果服务器是隐式 SSL/TLS)。根据您之前的配置,通常是选择前者,然后在下方的「加密」选项中选择 「要求显式 FTP over TLS」
    • 「主机」输入您的服务器 IP,「端口」留空或填 21。
    • 「登录类型」选「正常」,然后输入您的「用户」和「密码」。
    • 点击「连接」。
posted @ 2026-02-16 17:19  kunlunsansheng  阅读(33)  评论(0)    收藏  举报