zoukankan      html  css  js  c++  java
  • ftp 服务的部署

    前言
    FTP 是File Transfer Protocol(文件传输协议),
    用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。
    用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,
    并将执行的结果返回到客户机。例如,用户发出一条命令,要求服务器向用户
    传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机
    器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。

    FTP一般应用于上传和下载
    下载文件就是从远程主机拷贝文件至自己的计算机上;
    上传文件就是将文件从自己的计算机中拷贝至远程主机上

    vsftpd # 服务端软件
    lftp # 客户端软件,提供登陆环境

    1.部署ftp服务的服务端
    [root@localhost Desktop]# yum install -y vsftpd
    [root@localhost Desktop]# yum install -y lftp
    [root@localhost Desktop]# systemctl start vsftpd
    [root@localhost Desktop]# systemctl enable vsftpd
    [root@localhost Desktop]# netstat -antlp | grep vsftpd # 查看到端口说明服务开启成功


    [root@localhost Desktop]# firewall-cmd --permanent --add-service=ftp
    success
    [root@localhost Desktop]# firewall-cmd --reload
    success
    [root@localhost Desktop]# firewall-cmd --list-all


    [root@localhost Desktop]# vim /etc/sysconfig/selinux
    7 SELINUX=disabled
    [root@localhost Desktop]# getenforce # 查看到更改不生效,必须重启
    Enforcing # 开启内核加强型火墙
    [root@localhost Desktop]# reboot
    [root@localhost Desktop]# getenforce # 重启之后再次查看
    Disabled # 禁止服务

    2.ftp服务的参数配置
    ftp服务的基本信息:

    vsftpd # 服务端软件安装包
    /var/ftp # 默认发布目录
    21/tcp # 协议接口
    /etc/vsftpd/vsftpd.conf # 服务配置文件

    [root@localhost Desktop]# rpm -qc vsftpd # 查看ftp服务的配置文件
    /etc/logrotate.d/vsftpd
    /etc/pam.d/vsftpd
    /etc/vsftpd/ftpusers
    /etc/vsftpd/user_list
    /etc/vsftpd/vsftpd.conf
    [root@localhost Desktop]# cd /var/ftp/ # 这是ftp服务的默认发布目录
    [root@localhost ftp]# ls
    pub

    在客户端测试
    [root@foundation78 Desktop]# yum install -y lftp # 如果客户端没有这个软件,就下载一个

    (1)匿名用户访问(默认允许)

    [root@foundation78 Desktop]# lftp 172.25.254.138 # 这是服务端IP
    lftp 172.25.254.138:~> ls # 查看到pub目录说明成功登陆
    drwxr-xr-x 2 0 0 6 Aug 03 2015 pub


    注:匿名用户登陆进去查看到的是默认发布目录里的内容,而且ftp服务对匿名用户的所有权限都禁止,除了可登陆权限和可读权限

    (2)本地用户的访问

    # 服务端(先建立本机用户)

    [root@localhost Desktop]# useradd westos
    [root@localhost Desktop]# passwd westos
    [root@localhost Desktop]# useradd linux
    [root@localhost Desktop]# passwd linux

    # 客户端测试
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos # 指定本机用户登陆,默认的增删改查的功能都开启
    Password:
    lftp westos@172.25.254.138:~> ls
    lftp westos@172.25.254.138:~> mkdir file
    mkdir ok, `file' created
    lftp westos@172.25.254.138:~> ls
    drwxr-xr-x 2 1001 1001 6 Oct 28 06:39 file
    lftp westos@172.25.254.138:~> rm -fr file/
    rm ok, `file/' removed
    lftp westos@172.25.254.138:~> ls

    注:ftp服务对本地用户所有权限都开启,而且本地用户登陆进去的都是自己的本地家目录
    3.对所有用户的权限进行管理
    报错id的解析:
    500 # 文件系统权限过大
    530 # 用户认证失败
    550 # 服务本身功能未开放
    553 # 本地文件系统权限过小

    (1)匿名用户

    anonymous_enable=YES|NO # 匿名用户是否可以登陆
    anon_upload_enable=YES|NO # 匿名用户是否可以上传
    anon_world_readable_only=YES|NO # 匿名用户是否可以下载
    anon_other_write_enable=YES|NO # 匿名用户是否可以删除
    anon_umask=022 # 匿名用户上传的文件的权限
    anon_max_rate=102400 # 限制匿名用户下载的速度100k/s
    anon_root=/directory # 匿名用户家目录的修改
    max_clients=1 # 匿名用户最大连接数
    chown_uploads=YES # 指定上传文件的所属用户
    chown_username=westos

    对于anon_world_readable_only的具体使用可以看此处详细解释
    上传文件
    # 在客户端用匿名用户登录
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138
    lftp 172.25.254.138:/> cd pub/
    lftp 172.25.254.138:/pub> put /etc/passwd # 默认对匿名用户不可上传
    put: Access failed: 550 Permission denied. (passwd)

    # 在服务端
    [root@localhost Desktop]# cd /var/ftp
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    29 anon_upload_enable=YES # 打开上传权限
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端
    lftp 172.25.254.138:/pub> put /etc/passwd # 再次上传,发现还是不能上传,报553错误
    put: Access failed: 553 Could not create file. (passwd)

    # 在服务端
    [root@localhost ftp]# ls -l /var/ftp/ # 发现默认发布目录的只有对root用户可写
    total 0
    drwxr-xr-x. 2 root root 6 Aug 3 2015 pub
    [root@localhost ftp]# chgrp ftp /var/ftp/pub/ # 把默认发布目录的组改为ftp组,匿名用户依赖的是ftp组
    [root@localhost ftp]# chmod g+w /var/ftp/pub/ # 给ftp服务加可写权限
    [root@localhost ftp]# ll -d /var/ftp/pub/
    drwxrwxr-x. 2 root ftp 6 Aug 3 2015 /var/ftp/pub/


    # 在客户端
    lftp 172.25.254.138:/pub> put /etc/passwd
    2281 bytes transferred
    lftp 172.25.254.138:/pub> ls
    -rw------- 1 14 50 2281 Oct 29 11:48 passwd


    可以发现上传的文件默认权限位600
    更改上传文件权限
    # 在服务端
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf # 更改上传文件的默认权限
    30 anon_umask=022
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端
    lftp 172.25.254.138:/pub> put /etc/group
    970 bytes transferred
    lftp 172.25.254.138:/pub> ls
    -rw-r--r-- 1 14 50 970 Oct 29 11:56 group
    -rw------- 1 14 50 2281 Oct 29 11:48 passwd


    开启匿名用户的下载权限

    # 在服务端

    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    31 anon_world_readable_only=YES
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端

    lftp 172.25.254.138:/pub> get group # 下载成功
    970 bytes transferred


    开启匿名用户的删除权限

    # 在服务端
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    32 anon_other_write_enable=YES
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端
    lftp 172.25.254.138:/pub> ls
    -rw-r--r-- 1 14 50 970 Oct 29 11:56 group
    -rw------- 1 14 50 2281 Oct 29 11:48 passwd
    lftp 172.25.254.138:/pub> rm -fr passwd
    rm ok, `passwd' removed
    lftp 172.25.254.138:/pub> ls
    -rw-r--r-- 1 14 50 970 Oct 29 11:56 group

    限制上传文件的最大速度

    # 在服务端
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    34 anon_max_rate=102400
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端
    lftp 172.25.254.138:/pub> put /tmp/file
    464519168 bytes transferred in 9 seconds (48.38M/s) # 没限速之前


    家目录的修改

    # 在服务端
    [root@localhost ftp]# mkdir /westos
    [root@localhost ftp]# touch /westos/westosfile{1..5} # 建立文件是为了测试
    [root@localhost ftp]# ll /westos/
    total 0-
    rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile1
    -rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile2
    -rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile3
    -rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile4
    -rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile5
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    33 anon_root=/westos
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端
    [root@foundation78 Desktop]# lftp 172.25.254.138
    lftp 172.25.254.138:~> ls
    -rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile1
    -rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile2
    -rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile3
    -rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile4
    -rw-r--r-- 1 0 0 0 Jul 22 12:32 westosfile5


    (2)本地用户

    write_enable=YES|NO # 是否对登陆用户可写
    local_enable=YES|NO # 本地用户是否可以登陆
    chroot_local_user=YES # 限制本地用户浏览(所有用户被锁定到自己的家目录之中)
    local_umask=077 # 本地用户上传文件权限
    local_root=/directory # 本地用户家目录修改

    限制本地用户登陆
    # 在服务端
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    16 local_enable=NO
    [root@localhost ftp]# systemctl restart vsftpd

    # 在客户端
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
    Password:
    lftp westos@172.25.254.138:~> ls # 没有权限查看,说明没有登陆成功
    ls: Login failed: 530 This FTP server is anonymous only.

    关闭本地用户的可写权限
    # 在服务端
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    19 write_enable=NO
    [root@localhost ftp]#systemctl restart vsftpd.service

    # 在客户端
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
    Password:
    lftp westos@172.25.254.138:~> ls
    lftp westos@172.25.254.138:~> mkdir file
    mkdir: Access failed: 550 Permission denied. (file)

    更改本地用户上传文件权限

    # 在服务端
    [root@localhost ftp]#vim /etc/vsftpd/vsftpd.conf # 先要打开可写权限
    23 local_umask=077 # 把默认权限改为600
    [root@localhost ftp]# systemctl restart vsftpd.service

    # 在客户端
    lftp westos@172.25.254.138:~> put /etc/passwd
    2281 bytes transferred
    lftp westos@172.25.254.138:~> ls # 可以看到默认权限为644
    -rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd
    lftp westos@172.25.254.138:~> put /etc/group
    970 bytes transferred
    lftp westos@172.25.254.138:~> ls # 修改完之后,再次查看权限已经改变
    -rw------- 1 1001 1001 970 Oct 30 11:54 group
    -rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd



    本地用户家目录修改

    # 在服务端
    [root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
    17 local_root=/westos
    [root@localhost ftp]# systemctl restart vsftpd
    [root@localhost ftp]# ls /westos/
    westosfile1 westosfile2 westosfile3 westosfile4 westosfile5

    # 在客户端
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
    Password:
    lftp westos@172.25.254.138:~> ls
    -rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile1
    -rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile2
    -rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile3
    -rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile4
    -rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile5


    4.黑白名单
    ftpusers # 永久黑名单,优先级最高,一旦加入,任何操作都不能洗白
    user_list # 临时黑名单,可修改配置文件,变为白名单

    当用户同时出现在user_list白名单和ftpuser黑名单中时,此时用户被认为是黑名单中的,因为ftpuser黑名单的级别最高

    [root@localhost ftp]#cd /etc/vsftpd/
    [root@localhost vsftpd]# ll
    total 28
    -rw------- 1 root root 125 Aug 3 2015 ftpusers
    -rw------- 1 root root 361 Aug 3 2015 user_list
    -rw------- 1 root root 5182 Oct 28 05:15 vsftpd.conf
    -rwxr--r-- 1 root root 338 Aug 3 2015 vsftpd_conf_migrate.sh
    -rw------- 1 root root 5046 Oct 28 03:22 vsftpd.conf.rpmsave


    [root@localhost vsftpd]# vim user_list # 把westos用户加入临时黑名单
    21 westos

    # 在客户端测试

    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
    Password:
    lftp westos@172.25.254.138:~> ls
    ls: Login failed: 530 Permission denied.


    # 在服务端

    [root@localhost vsftpd]# /etc/vsftpd/vsftpd.conf # 设置user_list为白名单
    133 userlist_deny=NO #默认所有用户加入黑名单,白名单用户可登陆
    [root@localhost vsftpd]# systemctl restart vsftpd

    注:
    userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。

    当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP

    当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;

    当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);

    另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

    # 在客户端测试

    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos # 刚才在user_list名单里的westos就成了白名单用户,即可以登录
    Password:
    lftp westos@172.25.254.138:~> ls
    -rw------- 1 1001 1001 970 Oct 30 11:54 group
    -rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd


    5.虚拟用户的管理
    (1)虚拟用户登录配置
    [root@localhost Desktop]# cd /etc/vsftpd/
    [root@localhost vsftpd]# vim vsftpd.conf
    anon_upload_enable=NO # 设定不允许匿名用户上传
    anon_world_readable_only=NO # 设定不允许匿名用户的下载
    anon_other_write_enable=NO # 设定不允许匿名用户删除
    [root@localhost vsftpd]# systemctl restart vsftpd
    [root@localhost vsftpd]# vim loginuser # 创建虚拟帐号身份
    user1
    111
    user2
    222
    user3
    333


    [root@localhost vsftpd]# db_load -T -t hash -f loginuser loginuser.db # 给虚拟帐号进行哈希加密,-T表示转换,-t表示加密,-f表示重命名
    [root@localhost vsftpd]# file loginuser.db # 查看文件类型


    [root@localhost vsftpd]# cd /etc/pam.d/
    [root@localhost pam.d]# vim ftpauth # 设定认证插件
    account required pam_userdb.so db=/etc/vsftpd/loginuser
    auth required pam_userdb.so db=/etc/vsftpd/loginuser


    [root@localhost pam.d]# vim /etc/vsftpd/vsftpd.conf
    130 pam_service_name=ftpauth # 指定认定插件
    131 guest_enable=YES # 虚拟用户认证开启
    [root@localhost pam.d]# systemctl restart vsftpd

    # 在客户端用虚拟用户身份登陆
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
    Password:
    lftp user1@172.25.254.138:~> ls # 虚拟用户登陆的是ftp的默认发布目录
    drwxrwxr-x 2 0 50 42 Oct 30 05:30 pub
    lftp user1@172.25.254.138:/> cd pub/
    lftp user1@172.25.254.138:/pub> ls
    -rw------- 1 14 50 2592672 Oct 29 12:13 file
    -rw-r--r-- 1 14 50 970 Oct 29 11:56 group
    -rw------- 1 1001 50 2281 Oct 30 05:30 passwd
    lftp user1@172.25.254.138:/pub> exit
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user2
    Password: lftp user2@172.25.254.138:~> ls
    drwxrwxr-x 2 0 50 42 Oct 30 05:30 pub
    lftp user2@172.25.254.138:/> cd /pub/
    lftp user2@172.25.254.138:/pub> ls
    -rw------- 1 14 50 2592672 Oct 29 12:13 file
    -rw-r--r-- 1 14 50 970 Oct 29 11:56 group
    -rw------- 1 1001 50 2281 Oct 30 05:30 passwd
    lftp user2@172.25.254.138:/pub> exit
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user3
    Password:
    lftp user3@172.25.254.138:~> ls
    drwxrwxr-x 2 0 50 42 Oct 30 05:30 pub
    lftp user3@172.25.254.138:/> cd pub/
    lftp user3@172.25.254.138:/pub> ls
    -rw------- 1 14 50 2592672 Oct 29 12:13 file
    -rw-r--r-- 1 14 50 970 Oct 29 11:56 group
    -rw------- 1 1001 50 2281 Oct 30 05:30 passwd


    (2)虚拟用户的默认发布目录的修改
    [root@localhost pam.d]# id westos # 查看服务端存在的用户
    uid=1001(westos) gid=1001(westos) groups=1001(westos)
    [root@localhost pam.d]# ll /home/westos/ # 可以看到westos用户的默认目录里的文件
    total 8
    -rw------- 1 westos westos 970 Oct 30 19:54 group
    -rw-r--r-- 1 westos westos 2281 Oct 30 19:52 passwd
    [root@localhost pam.d]# vim /etc/vsftpd/vsftpd.conf
    132 guest_username=westos # westos必须存在

    # 在客户端尝试登录
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
    Password: lftp user1@172.25.254.138:~> ls # 登陆失败
    ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

    # 在服务端排错
    [root@localhost pam.d]# ll /home

    [root@localhost pam.d]# chmod 555 /home/westos/ # 改权限

    # 再次回到客户端查看
    lftp user1@172.25.254.138:~> ls # 查看到westos用户家目录里的文件
    -rw------- 1 1001 1001 970 Oct 30 11:54 group
    -rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd


    (3)虚拟帐号的独立配置(使得虚拟用户登陆看到的是自己家目录的东西)
    [root@localhost vsftpd]# pwd
    /etc/vsftpd
    [root@localhost vsftpd]# mkdir -p /ftphome/user{1..3}
    [root@localhost vsftpd]# mkdir /ftphome/user1/user1data
    [root@localhost vsftpd]# mkdir /ftphome/user2/user2data
    [root@localhost vsftpd]# mkdir /ftphome/user3/user3data
    [root@localhost vsftpd]# vim vsftpd.conf
    135 local_root=/ftphome/$USER # 指定虚拟用户的家目录
    136 user_sub_token=$USER # 把shell中$USER的使用方法告诉ftp
    [root@localhost vsftpd]# systemctl restart vsftpd

    # 在客户端测试

    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
    Password: lftp user1@172.25.254.138:~> ls
    drwxr-xr-x 2 0 0 6 Nov 03 13:22 user1date
    lftp user1@172.25.254.138:/> exit
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user2
    Password: lftp user2@172.25.254.138:~> ls
    drwxr-xr-x 2 0 0 6 Nov 03 13:22 user2datel
    ftp user2@172.25.254.138:/> exit
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user3
    Password: lftp user3@172.25.254.138:~> ls
    drwxr-xr-x 2 0 0 6 Nov 03 13:22 user3date


    那么问题来了,虚拟用户的权限全部由/etc/vsftpd/vsftp.conf文件控制,也就是说所有虚拟用户的权限都是一样的,而且同步改变,但是我们需要区分这些用户,让不同的用户管理不同的任务

    (4)虚拟用户的独立权限配置

    [root@localhost vsftpd]# mkdir /etc/vsftpd/user_conf
    [root@localhost vsftpd]# vim vsftpd.conf
    137 user_config_dir=/etc/vsftpd/user_conf
    [root@localhost vsftpd]# systemctl restart vsftpd
    [root@localhost vsftpd]# vim user_conf/user1
    1 anon_upload_enable=YES
    [root@localhost vsftpd]# chmod 777 /ftphome/user*/*

    # 在客户端测试
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
    Password:
    lftp user1@172.25.254.138:~> cd user1date
    /lftp user1@172.25.254.138:/user1date> ls
    lftp user1@172.25.254.138:/user1date> put /etc/passwd
    2281 bytes transferred
    lftp user1@172.25.254.138:/user1date> ls-
    rw------- 1 14 50 2281 Nov 03 14:34 passwd
    lftp user1@172.25.254.138:/user1date> exit
    [kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user2
    Password: lftp user2@172.25.254.138:~> cd user2date/
    lftp user2@172.25.254.138:/user2date> put /etc/passwd
    put: Access failed: 550 Permission denied. (passwd)


    注:做完实验后,记得还原实验环境

    (1)删除在/etc/vsftpd/vsftpd.conf文件做的所有更改
    (2)或者
    [root@localhost vsftpd]# rm -fr vsftpd.conf # 删除配置文件
    [root@localhost vsftpd]# yum reinstall -y vsftpd # 重新下载vsftpd软件来重新生成vsftpd.conf文件
    [root@localhost vsftpd]# systemctl restart vsftpd

  • 相关阅读:
    ARM Linux异常处理之data abort(二)【转】
    ARM Linux异常处理之data abort(一)【转】
    arm的mmu学习【转】
    使用Squashfs和Overlayfs提高嵌入式Linux文件系统可靠性【转】
    【iView】100. iView踩坑集锦
    【AOP】【Publish-Event】AOP 切面编程 + Spring的publish-event 实现 监听者模式,实现补充业务逻辑开发
    【IDEA】idea打开新项目,左下角的工作栏中没有显示Services解决办法
    【java】ObjectOutputStream & ObjectInputStream 多次写入发生重复写入相同数据的问题
    【JS】时间工具类
    【MySQL】mysql优化集锦
  • 原文地址:https://www.cnblogs.com/guarderming/p/11889800.html
Copyright © 2011-2022 走看看