分类: Ftp服务器

  • vsftpd简单设置

    cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

    cat /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO
    anon_upload_enable=NO
    no_anon_password=YES
    anon_world_readable_only=NO
    anon_mkdir_write_enable=NO
    anon_other_write_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    file_open_mode=0755
    chroot_local_user=yes
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    ftpd_banner=Welcome to blah FTP service.
    pam_service_name=vsftpd
    userlist_enable=YES
    listen=YES
    tcp_wrappers=YES
    max_per_ip=10

    用户设置
    useradd ftpxxx -G ftp -d /var/xxxx -M
    useradd ftpxxx -G ftp,apache -d /var/www/html/XXXX/ -M
    passwd ftpxxx xxxxxx
    chown ftpxxx.ftp /var/xxxx
    chmod 755 /var/xxxx

  • ProFTPD1.3配置

    ProFTPD 支持MySQL数据库添加虚拟用户认证及Quotas(磁盘限额)

    proftpd.conf配置指令手册(en):http://www.proftpd.org/docs/directives/linked/configuration.html
    ProFTPD官方网站(en): http://www.proftpd.org/
    proftpd.conf配置指令手册(zh):
    http://www.itlearner.com/article/3549/relate
    安装环境:
    操作系统centos-5.2
    mysql 5.0.67 源代码安装在/usr/local/mysql目录

    1、proftpd-1.3.2源代码编译安装

    ./configure –prefix=/usr/local/proftpd
    –with-modules=mod_sql:mod_sql_mysql #支持mysql数据库
    –with-modules=mod_quotatab:mod_quotatab_sql #支持磁盘配额
    –with-modules=mod_tls #支持SSL/TLS安全传输
    –with-includes=/usr/local/mysql/include
    –with-libraries=/usr/local/mysql/lib
    make
    make install

    cp sample-configurations/mod_sql.conf /usr/local/proftpd/etc/proftpd.conf

    2、proftpd.conf文件配置基本格式:

    #全局设置
    设置项目1 参数1
    设置项目2 参数2
    ……
    ……
    #某个目录的设置
    <Directory “路径名”>
    ……
    ……
    </Directory>
    #关于匿名用户的设置
    <Anonymous “匿名登录的目录”>
    ……
    ……
    <Limit 限制动作>
    ……
    ……
    </Limit>
    </Anonymous>

    3、proftpd.conf配置文件中的一些基本配置:

    ServerName 服务器名称
    ServerType 服务器工作类型(standalone/inted)
    DefaultServer 是否启用虚拟FTP (on/off)
    Port 运行端口
    Umask 默认文件权限(022)
    User 运行proftpd服务器的用户
    Group 运行proftpd服务器的用户组
    AllowOverwrite 是否允许客户端覆盖文件(安全上一般设置为off)
    RequireValidShell 用户shell不在/etc/shells文件中,默认不允许登陆(on/off)
    MaxInstances 20 最多有20个proftpd的PID
    MaxClients 10 最多允许10个用户在线
    MaxClientsPerHost 1 一个IP只允许一个帐号连接
    MaxClientsPerUser 2 每个帐号在每个客户端最多同时登陆2次,可防止多线程下载软件
    DisplayLogin welcome.msg ftp登陆欢迎信息文件
    <Directory /*> 登入时想进入的目录位置(/* 为通配符)
    <Anonymous ~ftp> 匿名用户设置
    <Global> 所有虚拟ftp的共同设置项

    3.1 虚拟FTP设置
    <VirtualHost 192.168.0.1>
    ServerName “……”
    ……
    ……
    </VitualHost>

    3.2 开启ftp上传/下载的续传功能
    AllowStoreRestart on #上传
    AllowRetrieveRestart on #下载

    3.3 限速设置

    格式为: TransferRate STOR|RETR 速度(kbytes/s) user 使用者
    STOR 为上传速度
    RETR 为下载速度
    后面不跟user的时候,针对全部用户进行限速

    3.4 让proftpd支持FXP传输
    AllowForeignAddress on
    PassivePorts 40000 40999

    3.5 加快连接速度,关闭DNS反解
    UseReverseDNS off
    IdentLookups off

    3.6 只允许部分网段访问FTP
    <Limit LOGIN>
    Order allow,deny
    Allow from 10.10.
    Deny from all
    </Limit>

    4、<Limit>参数说明

    4.1 限制的动作
    CWD: Change Working Directory 改变目录
    MKD: Make Directory 创建目录
    RNFR: ReName FRom 更改目录名
    DELE: DELEte 删除文件
    RMD: ReMove Directory 删除目录
    RETR: RETRieve 下载
    STOR: STORe 上传
    READ: 可读文件的权限,但不包括列目录
    WRITE: 写文件或目录的权限,包括MKD和RMD
    DIRS: 列目录的权限
    LOGIN: 登陆的权限
    ALL: 所有权限

    4.2 <Limit>所应用的对象

    AllowUser/DenyUser AllowGroup/DenyGroup AllowALL/DenyAll ……

    5、部分安全策略配置

    5.1 隐藏proftpd服务器的版本信息
    ServerIdent off

    5.2 伪装Proftpd服务器
    伪装成windows下的ftp服务器Serv-U
    ServerIdent on “Serv-U FTP Server v6.4 for Winsock ready ……”

    5.3 使用非root权限运行proftpd服务:
    User nobody
    Group nobody

    禁止root登陆:
    RootLogin off

    对ftp用户使用chroot限制:
    DefaultRoot ~

    控制ftp命令缓冲区大小:
    CommandBufferSize 512

    修改proftpd服务器使用的端口:
    Port 2121

    5.4 监控Proftpd服务器运行情况

    5.4.1 记录ftp连接数
    watch -n 360 /usr/local/proftpd/bin/ftpcount
    每隔360秒显示一次连接用户数量的信息

    5.4.2 查找谁与FTP服务器连接
    /usr/local/proftpd/bin/ftpwho

    5.5 服务器配置文件的修改(proftpd.conf)

    5.5.1 通过IP地址限制FTP访问
    #只允许10.10.0.0/16网段用户访问
    <Limit LOGIN>
    Order allow,deny
    Allow from 10.10.
    Deny from all
    </Limit>

    5.5.2 使用pam作为proftpd授权用户的鉴别方法
    AuthPAM on
    AuthPAMConfig ftp

    修改/etc/pam.d/ftp相应文件

    5.5.3 限制FTP命令特权

    *禁止一些用户创建和删除目录的特权
    <Directory /*>
    <Limit MKD RMD>
    Order deny,allow
    DenyGroup badusers
    AllowAll
    </Limit>
    </Directory>

    *建立只能上载的FTP服务器
    <Directory /*>
    <Limit RETE>
    DenyAll
    </Limit>
    </Directory>

    *限制对单个目录的访问
    <Directory /*>
    <Limit CWD>
    DenyAll
    </Limit>
    </Directory>

    *限制目录浏览特权
    <Directory /my/mp3s>
    <Limit DIRS>
    DenyGroup newfriends
    </Limit>
    </Directory>

    5.5.4 使不同用户之间相互隔离
    一些用户通常访问ISP的FTP服务器时,会看到一些不应当的系统信息,因此隐藏这些信息是必要的,下面是一个配置:
    DefaultRoot “/www”
    <Directory /www>
    HideNoAccess on
    <Limit ALL>
    IgnoreHidden on
    </Limit>
    </Directory>
    HideNoAccess指令将用户隐藏/www 目录下的所有条目,IgnoreHidden指令指示ProFTPD 服务器忽略用户所有指令。

    6、加密FTP服务器与客户端的连接
    需要在编译安装的时候配置支持相应模块
    ./configure –with-modules=mod_tls

    6.1 制作凭证
    # mkdir /etc/ssl/certs
    # mkdir /etc/ssl/private
    # chmod og-rwx /etc/ssl/private
    # mkdir /etc/ssl/crl
    # mkdir /etc/ssl/newcerts
    修改 /etc/ssl/openssl.cnf
    把 dir = ./demoCA 改成 dir = /etc/ssl

    6.2 制作最高层认证中心 (Root CA)
    Private Key ( Public Key )
    # openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048
    # chmod og-rwx /etc/ssl/private/myrootca.key
    填写凭证申请书 (然后按照问题回答即可)
    #openssl req -new -key /etc/ssl/private/myrootca.key -out /tmp/myrootca.req
    签发凭证
    # openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey /etc/ssl/private/myrootca.key
    -in /tmp/myrootca.req -out /etc/ssl/certs/myrootca.crt
    # rm -f /tmp/myrootca.req

    6.3 用最高层认证中心签发凭证
    制作服务器用的凭证
    # openssl genrsa -out /etc/ssl/private/myhost.key 2048
    # chmod og-rwx /etc/ssl/private/myhost.key
    填写凭证申请书
    # openssl req -new -key /etc/ssl/private/myhost.key -out /tmp/myhost.req
    # openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_req -CA /etc/ssl/certs/myrootca.crt
    -CAkey /etc/ssl/private/myrootca.key -CAserial /etc/ssl/myrootca.srl
    -CAcreateserial -in /tmp/myhost.req -out /etc/ssl/certs/myhost.crt
    # rm -f /tmp/myhost.req

    6.4 接下来设定proftpd.conf,主要是在最后加上以下有关TLS的设

    < IfModule mod_tls.c >
    TLSEngine on
    TLSLog /var/log/tls.log
    TLSProtocol SSLv23
    TLSOptions NoCertRequest
    TLSRequired On
    TLSRSACertificateFile /etc/ssl/certs/myhost.crt
    TLSRSACertificateKeyFile /etc/ssl/private/myhost.key
    TLSCACertificateFile /etc/ssl/certs/myrootca.crt
    TLSVerifyClient On
    < /IfModule >

    7、有关MySQL+Quota的设置
    需要在编译安装的时候配置支持相应模块
    ./configure –with-modules=mod_sql:mod_sql_mysql
    –with-modules=mod_quotatab:mod_quotatab_sql
    –with-includes=/usr/local/mysql/include
    –with-libraries=/usr/local/mysql/lib
    7.1 数据库的导入

    mysql mysql -uroot -ppassword
    create database ftpdb
    grant select, update on ftpdb.* to proftpd@localhost identified by ‘password’
    use ftpdb
    CREATE TABLE `ftpgroup` (
    `groupname` varchar(16) NOT NULL default ”,
    `gid` smallint(6) NOT NULL default ‘5500′,
    `members` varchar(16) NOT NULL default ”,
    KEY `groupname` (`groupname`)
    ) TYPE=MyISAM COMMENT=’ProFTP group table’;

    INSERT INTO `ftpgroup` VALUES (’ftpgroup’, 5500, ‘ftpuser’);

    CREATE TABLE `ftpquotalimits` (
    `name` varchar(30) default NULL,
    `quota_type` enum(’user’,’group’,’class’,’all’) NOT NULL default ‘user’,
    `per_session` enum(’false’,’true’) NOT NULL default ‘false’,
    `limit_type` enum(’soft’,’hard’) NOT NULL default ’soft’,
    `bytes_in_avail` float NOT NULL default ‘0′,
    `bytes_out_avail` float NOT NULL default ‘0′,
    `bytes_xfer_avail` float NOT NULL default ‘0′,
    `files_in_avail` int(10) unsigned NOT NULL default ‘0′,
    `files_out_avail` int(10) unsigned NOT NULL default ‘0′,
    `files_xfer_avail` int(10) unsigned NOT NULL default ‘0′
    ) TYPE=MyISAM;

    CREATE TABLE `ftpquotatallies` (
    `name` varchar(30) NOT NULL default ”,
    `quota_type` enum(’user’,’group’,’class’,’all’) NOT NULL default ‘user’,
    `bytes_in_used` float NOT NULL default ‘0′,
    `bytes_out_used` float NOT NULL default ‘0′,
    `bytes_xfer_used` float NOT NULL default ‘0′,
    `files_in_used` int(10) unsigned NOT NULL default ‘0′,
    `files_out_used` int(10) unsigned NOT NULL default ‘0′,
    `files_xfer_used` int(10) unsigned NOT NULL default ‘0′
    ) TYPE=MyISAM;

    CREATE TABLE `ftpuser` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `userid` varchar(32) NOT NULL default ”,
    `passwd` varchar(32) NOT NULL default ”,
    `uid` smallint(6) NOT NULL default ‘5500′,
    `gid` smallint(6) NOT NULL default ‘5500′,
    `homedir` varchar(255) NOT NULL default ”,
    `shell` varchar(16) NOT NULL default ‘/sbin/nologin’,
    `count` int(11) NOT NULL default ‘0′,
    `accessed` datetime NOT NULL default ‘0000-00-00 00:00:00′,
    `modified` datetime NOT NULL default ‘0000-00-00 00:00:00′,
    PRIMARY KEY (`id`)
    ) TYPE=MyISAM COMMENT=’ProFTP user table’ ;
    7.2 在proftpd.conf文件中加入sql相关配置:

    SQLAuthTypes Backend Plaintext
    #Backend表示用户认证方式为MySQL数据库的认证方式
    #Plaintext表示明文认证方式,排在最前面的为最先使用的方式
    SQLAuthenticate users* groups*

    # databasename@host database_user user_password
    SQLConnectInfo ftpdb@localhost proftpd password
    SQLUserInfo ftpuser userid passwd uid gid homedir shell
    SQLGroupInfo ftpgroup groupname gid members
    SQLHomedirOnDemand on
    #如果用户主目录不存在,则系统会根据此用户在用户数据表中的homedir字段的值新建一个目录
    # Update count every time user logs in
    SQLLog PASS updatecount
    SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u’” ftpuser
    # Update modified everytime user uploads or deletes a file
    SQLLog STOR,DELE modified
    SQLNamedQuery modified UPDATE “modified=now() WHERE userid=’%u’” ftpuser

    7.3 加入Quota磁盘配额相关设置

    QuotaEngine on
    QuotaDirectoryTally on
    QuotaDisplayUnits Mb
    QuotaShowQuotas on
    QuotaLog “/var/log/quota”
    SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”

    SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’”

    SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used+ %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’” ftpquotatallies

    SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” ftpquotatallies

    QuotaLimitTable sql:/get-quota-limit
    QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

    7.4 ftpquotalimits表设置说明

    name: – 用户帐号
    quota type: – user, group, class, all (we use user)
    per_session: – true or false (we use true)
    limit_type: – 硬限制 or 软限制 (我们一般用硬限制)
    bytes_in_avail: – 允许上传的字节数
    bytes_out_avail: – 允许下载的字节数
    bytes_xfer_avail: – 允许传输的字节数(包括上传/下载)
    files_in_avail: – 允许上传的文件数
    files_out_avail: – 允许下载的文件数
    files_xfer_avail: – 允许传输的文件数(包括上传/下载)

    8、其他
    8.1 使用命令ftpshut
    基本格式:
    ftpshut [ -l min ] [ -d min ] time [ warning-message … ]
    参数说明:
    -l min: 在ftp关闭服务之前的几分钟内,尝试建立新的ftp连接均不被接受
    -d min: 在ftp关闭服务之前的几分钟内,已经建立的ftp连接将被中止
    time: 在多少时间后,服务器将关闭ftp服务,格式有两种
    +number 经过number分钟后关闭
    MMHH 在今天MM:HH服务器将关闭

    8.2 welcome.msg 欢迎文件可用参数

    %T 目前的时间
    %F 所在硬盘剩下的容量
    %C 目前所在的目录
    %R Client 端的主机名称
    %L Server 端的主机名称
    %U 使用者帐户名称
    %M 最大允许连接人数
    %N 目前的服务器连接人数
    %E FTP服务器管理员的 email
    %i 本次上传的文件数量
    %o 本次下载的文件数量
    %t 本次上传+下载的文件数量
    应用举例:
    欢迎您%U, 这是Frank的测试FTP服务器;
    目前时间是:%T;
    本服务器最多允许%M个用户连接数;
    目前服务器上已有%N个用户连接数;
    目前你所在的目录是%C;
    目录所在的硬盘还剩下%F字节。