vsftpd、nfs、samba

  • I/O:网络、存储

    • 存储:

      • DAS:Direct Attached Storage
        接口类型:“block”;只有块设备才能够进行分区格式化
        设备:SATA,SAS;IDE,SCSI;USB;
      • NAS:Network Attached Storage(网络附加存储)
        接口类型:”file”
        协议:CIFS(samba), NFS(Network File System)
        RPC: Remote Procedure Call
      • SAN:Storage Area Network(存储区域网络)
        接口类型:”block”,
        协议:iSCSI(IP-SAN), FCSAN, FCoE,

ftp

  • ftp:file transfer protocol,文件传输协议 ;

    • 命令连接:传输命令(客户端发给服务端的命令),服务端的21/tcp
    • 数据连接:传输数据(传输数据时建立,数据传输完拆除)

      • 主动模式:PORT
        Server: 20/tcp连接客户端的命令连接使用的端口向后的第一个可用端口;
      • 被动模式:PASV
        Server:(当进行命令连接时,告诉客户端,)服务端打开一个随机端口,并等待客户端连接
  • PAM:Pluggable Authenticate Module(插入式认证模块)

    • pam中的模块每一种提供一种认证功能或认证检查功能;配置文件在/etc/pam.d/
    • pam是一种认证框架,自己不需要认证功能,可以帮其他应用程序提供认证服务;为每一种应用程序提供库文件;
    • 高度模块化;
    • ftp默认是使用pam进行认证的;
  • ftp协议:C/S

    • Server:

      • Windows: Serv-U, IIS, Filezilla
      • 开源:wuftpd, proftpd, pureftpd, vsftpd(Very Secure FTP daemon),Filezilla, …
    • Client:

      • Windows:ftp, Filezilla, CuteFTP, FlashFXP, …
      • 开源:lftp, ftp, Filezilla, gftp, …
        多数web浏览器同样支持FTP

vsftpd

vsftpd is a Very Secure FTP daemon. It was written completely from scratch.

  • URL:

    • SCHEME://username:password@HOST:PORT/PATH/TO/FILE
    • 路径映射:每个用户的URL的/映射到当前用户的家目录 ;
  • vsftpd以ftp用户的身份运行进程,默认认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp

    • ftp,anonymous 也可以作为用户名使用;默认匿名登录只有下载、查看下载的权限,
    • 示例:确定用户对应的ftp的默认路径为用户家目录

      ~]# lftp -u magedu 172.16.251.168
      Password: 
      lftp magedu@172.16.251.168:~> pwd
      ftp://magedu@172.16.251.168/%2Fhome/magedu
      
      ~]# finger magedu
      Login: magedu                     Name: magedu
      Directory: /home/magedu                 Shell: /bin/bash
  • 共享服务的检查:

    • 远程登录的账号有没有本地文件系统的权限
    • 共享权限:ftp在配置中可以配置是否拥有共享权限

    注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集;

  • 程序环境:

    • 主程序:/usr/sbin/vsftpd
    • 主配置文件:/etc/vsftpd/vsftpd.conf
    • 数据根目录:/var/ftp
    • Systemd Unit File: /usr/lib/systemd/system/vsftpd.service

    • /usr/lib/systemd/system/vsftpd.service 作为独立守护来运行
      /usr/lib/systemd/system/vsftpd.target 作为托管到systemd上的时候运行

配置vsftpd:

  • 用户类别:

    • 匿名用户:anonymous –> 用户:ftp, 家目录映射为:/var/ftp
    • 系统用户: 至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd);
      /etc/pam.d/vsftpd –> /etc/pam.d/password-auth –> pam_unix.so(此模块说明是根据/etc/passwd、/etc/shadow来完成认证的)
    • 虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd);

    • 用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可以自己有权限访问的所有路径间切换;
      禁锢用户于其家目录中;

  • 配置文件:/etc/vsftpd/vsftpd.conf

    • 语法格式:
      directive value
      指令的种类:布尔型参数、数值型参数、字符型参数
      注意:directive之前不能有多余字符,顶格写;
  • 匿名用户:

    anonymous_enable=YES                是否支持匿名登录
      anon_upload_enable=YES                上传文件
      anon_mkdir_write_enable=YES            创建目录
      anon_other_write_enable=YES            定义除了创建文件、创建目录以外的权限
    
      anon_umask=077
    • 示例:

      • 拥有文件系统权限:

        ~]# mkdir /var/ftp/upload
          ~]# chown ftp.ftp /var/ftp/upload/
          drwxr-xr-x. 2 ftp  ftp   6 Jun  5 21:50 upload
      • 拥有共享上传权限:

        vi /etc/vsftpd/vsftpd.conf
          启用:anon_upload_enable=YES
          ~]# systemctl restart vsftpd.service
      • 上传文件:

        ~]# ll /var/ftp/upload/
        -rw-------. 1 ftp ftp 23 Jun  5 22:06 issue

        默认上传的文件的权限是600,可以修改;
        文件的属主、属组,默认是用户本身;修改:chown_uploads
        注意:关闭iptables、selinux

  • 系统用户:

    local_enable=YES        启用本地用户
    write_enable=YES        是否本地用户拥有写权限,写权限包括:upload,mkidr,other
    local_umask=022
    • 辅助配置文件/etc/vsftpd/ftpusers;

      ~]# cat /etc/pam.d/vsftpd 
      auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
      列在此文件中的用户 均禁止使用ftp服务;
    • chroot_local_user=YES
      禁锢所有本地用户于其家目录;需要事先去除用户对家目录的写权限;

    • chroot_list_enable=YES
      chroot_list_file=/etc/vsftpd/chroot_list;此文件默认不存在得事先创建

      禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限;

    • 传输日志:
      xferlog_enable=YES
      xferlog_file=/var/log/xferlog
      xferlog_std_format=YES

    • 守护进程的类型:

      • standalone:独立守护进程;由服务进程自行监听套按字,并接收用户访问请求;
      • transient:瞬时守护进程;由受托管方代为监听套按字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程;

        • CentOS 6:xinetd独立守护进程, /etc/xinetd.d/,
          CentOS 7:由systemd代为监听;
    • 控制可登录vsftpd服务的用户列表:

      • userlist_enable=YES
        启用/etc/vsftpd/user_list文件来控制可登录用户;
      • userlist_deny=
        YES:意味着此为黑名单;默认
        NO:白名单;
    • 上传下载速率:

      • anon_max_rate=0
        local_max_rate=0
    • 并发连接数限制:

      • max_clients=2000
        max_per_ip=50
  • 虚拟用户:

    • 用户账号存储于何处?
      文件、MySQL、Redis、…

    • vsftpd:认证功能托管给pam;
      基于何种存储服务来存储用户信息,以及对存储服务的驱动要靠pam实现;

    • 虚拟账号同匿名账号一样也得映射成一个系统账号
      在mysql中启用一个来宾账号

    • 使用mysql安装配置vsftp的虚拟用户:

      1、# yum install -y mariadb-devel pam-devel
      2、# yum groupinstall -y "Development Tools" "Server Platform Development"
        真实需要的是:gcc ,为解决依赖关系安装包组
      3、pam_mysql:
        lftp 172.16.0.1:/pub/Sources/sources/pam> mget pam_mysql-0.7RC1.tar.gz
        tar xf pam_mysql-0.7RC1.tar.gz
        cd pam_mysql-0.7RC1
        # ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security     
        # make && make install
        pam模块存放路径:/usr/lib64/security ;查看pam-mysql是否安装成功
      
      4、vim /etc/my.cnf.d/server.cnf
        [mysqld]
        skip_name_resolve=ON
        innodb_file_per_table=ON
        log_bin=mysql-bin
      
      5、systemctl start mariadb.service
      
      6、创建数据库、授权用户、创建账号和密码;
        在mysql中创建一个用户,为了安全只授予查询权限
            GRANT SELCET ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'vsftpd';      
        FLUSH PRIVILEGES;
        创建数据库
            CREATE DATABASE vsftpd;
        创建表
            CREATE TABLE users(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,password CHAR(48) NOT NULL,UNIQUE KEY(name));
        查看确认
        插入用户
            INSERT INTO users(name,password) VALUES ('tom',PASSWORD('magedu')),('jerry',PASSWORD('jerry'));
        SELECT * FROM users;
      
      7、添加用户
        mkdir /ftproot/
        useradd -d /ftproot/vuser vuser       将/ftproot/vuser当作vuser用户登录ftp后的根目录
        chmod a-w /ftproot/vuser/
        mkdir /ftproot/vuser/pub 
      
      8、配置vsftpd,添加或修改以下选项:编辑/etc/vsftpd/vsftpd.conf
        pam_service_name=vsftpd.vusers    #与/etc/pam.d/vsftpd.vusers文件相对应就行
        guest_enable=YES                  
        guest_username=vuser                # 映射虚拟账号,此账号为映射后的本地系统账号
      
      9、创建配置文件:/etc/pam.d/vsftpd.vusers     # README中有编辑格式,注意:用户信息属于mysql用户
        auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
        account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 
      
      10、重启vsftpd.service
      
      11、其他系统登录验证是否可以访问ftp
      
      12、虚拟用户的写权限,通过匿名一样的指令进行定义;还能实现不同的用户有不同的权限;
        vim /etc/vsftpd/vsftpd.conf
            user_config_dir=/etc/vsftpd/vusers_config/
        mkdir /etc/vsftpd/vusers_config/
      
        每个用户创建相对应的配置文件,实现特定的权限
        vim /etc/vsftpd/vusers_config/tom 
            anon_upload_enable=YES
      
        vim /etc/vsftpd/vusers_config/jerry
            anon_upload_enable=YES
            anon_mkdir_write_enable=YES

nfs

  • nfs: Network File System

    • nis:Network Information Service;
      ldap:lightweight directory access protocol; ldap over ssl/tls;
  • nfsd: 2049/tcp
  • nfs服务器将本地磁盘的API改变成能够通过套接字远程调用的API;

  • rpc: remote procedure call
    辅助类的服务:rpc, portmapper rpc:远程过程调用,

    • rpc.mountd:认证;
      因为rpc端口是半随机的,客户端先连接rpc server,得到rpc mountd的所在端口后;再去连接rpc mountd,得到令牌后再去连接nfs;
    • rpc.lockd:加锁;
      避免同时读写时发生冲突
    • rpc.statd:状态;
      状态通知
  • NFS Server:

    • nfs-utils
    • /etc/exports或/etc/exports.d/*
      在这些文件中定义共享,把哪些目录共享给哪些客户端以哪些权限来访问

      • /PATH/TO/SOME_DIR clients1(export_options, …) clients2(export_options, …)

        • clients:

          single host:ipv4, ipv6, FQDN;
          network:address/netmask, 支持长短格式的掩码;
          wildcards:主机名通配,例如:*.magedu.com; 
          netgroups:NIS域内的主机组;@group_name;
          anonymous:使用*通配所有主机;
        • Options:

          General Options:
            ro:只读
            rw:读写;
            sync:同步;
            async:异步;
            secure:客户端端口小于1024,否则就要使用insecure选项;
          User ID Mapping:
             root_squash:压缩root用户,一般指将其映射为nfsnobody;
             no_root_squash:不压缩root用户;
             all_squash:压缩所有用户;
             anonuid and anongid:将压缩的用户映射为此处指定的用户;
  • NFS Client:

    mount -t nfs servername:/path/to/share /path/to/mount_point  [-rvVwfnsh ] [-o options]
  • showmount – show mount information for an NFS server

    showmount -e NFS_SERVER_IP: 查看指定的nfs server上导出的所有文件系统; 
      showmount -a:在nfs server上查看nfs服务的所有客户端列表;
  • exportfs
    -r:重新导出;
    -a:所有文件系统;
    -v:详细信息;
    -u:取消导出文件系统;

    # exportfs -ar
      # exportfs -au

samba:

smb: Service message block
cifs: common internet filesystem

  • samba:Andrew Tridgell;

    • 功能:
      文件系统共享;
      打印机共享;
      NetBIOS协议;
  • 程序环境:

    • 服务端程序包:samba,samba-common, samba-libs
      Server and Client software to interoperate with Windows machines.
    • 主配置文件:/etc/samba/smb.conf, 由samba-common包提供;
    • 主程序:

      • nmbd:NetBIOS name server
      • smbd:SMB/CIFS services
    • Unit File:

      • smb.service
      • nmb.service
    • 监听的端口:

      • 137/udp, 138/udp
      • 139/tcp, 445/tcp
  • 主配置文件的配置段:

    • ~ ]# grep -E -i “#(====| —)” /etc/samba/smb.conf

      #======================= Global Settings =====================================
      # ----------------------- Network-Related Options -------------------------
      # --------------------------- Logging Options -----------------------------
      # ----------------------- Standalone Server Options ------------------------
      # ----------------------- Domain Members Options ------------------------
      # ----------------------- Domain Controller Options ------------------------
      # ----------------------- Browser Control Options ----------------------------
      # --------------------------- Printing Options -----------------------------
      # --------------------------- File System Options ---------------------------
      #============================ Share Definitions ==============================
  • windows
    d:\data\tools:共享,共享名(software)
    servicename://172.18.0.70/software

  • 客户端程序:

    • smbclient:交互式命令行客户端,类似于lftp;
    • mount.cifs:挂载cifs文件系统的专用命令;
  • samba的配置:
    /etc/samba/smb.conf

    • 两类配置段:

      • 全局配置

        [global]
        Network-Related Options
          workgroup =
          server string = 
          interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
          hosts allow = 127.  192.168.12.  192.168.13.
        Logging Options
          log file = /var/log/samba/log.%m
          max log size = 50
        Standalone Server Options
          security = user
              设定安全级别:取值有四个;
                  share:匿名共享;
                  user:使用samba服务自我管理的账号和密码进行用户认证;用户必须是系统用户,但密码非为/etc/shadow中的密码,而由samba自行管理的文件,其密码文件的格式由passdb backend进行定义;
                  server:由第三方服务进行统一认证;
                  domain:使用DC进行认证;基于kerberos协议进行;
          passdb backend = tdbsam
        Printing Options
          load printers = yes
          cups options = raw
      • 共享文件系统配置

        • [SHARED_NAME]

          • [homes]:为每个samba用户定义其是否能够通过samba服务访问自己的家目录;

            [homes]
                  comment = Home Directories
                  browseable = no               不同的用户在客户端是看不见彼此的家目录,默认为no
                  writable = yes
            ;       valid users = %S
            ;       valid users = MYDOMAIN\%S
          • [printers]:定义打印服务;
          • [shared_fs]:定义共享的文件系统; 括号里的为共享名称
        • 常用指令:

          comment:注释信息;
          path:当前共享所映射的文件系统路径;
          browseable:是否可浏览,指是否可被用户查看;
          guest ok:是否允许来宾账号访问;
          public:是否公开所有用户;
          writable:是否可写;
          read only:是否为只读;
          write list:拥有写权限的用户列表;
            用户名
            @组名
            +组名
    • samba用户管理:

      • smbpasswd [options] USERNAME
        -a:添加
        -x:删除
        -d:禁用
        -e:启用
      • pdbedit
        -L:列出samba服务中的所有用户;
        -a, –create:添加用户为samba用户;
        -u, –user=USER:要管理的用户;
        -x, –delete:删除用户;
        -t, –password-from-stdin:从标准输出接收字符串作为用户密码;使用空提示符,而后将密码输入两次;
    • 查看服务器端的共享:

      smbclient -L SMB_SERVER  [-U USERNAME]
    • 交互式文件访问:

      smbclient //SMB_SERVER/SHARE_NAME [-U USERNAME]
    • 挂载访问:

      mount -t cifs //SMB_SERVER/SAHRE_NAME  -o username=USERNAME,password=PASSWORD

      注意:挂载操作的用户,与-o选项中指定用户直接产生映射关系;
      此时,访问挂载点,是以-o选项中的username指定的用户身份进行;本地用户对指定的路径访问,首先得拥有对应的本地文件系统权限;

  • smbstatus命令:
    显示samba服务的相关共享的访问状态信息;
    -b:显示简要格式信息;
    -v:显示详细格式信息;

原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/77995