centos搭建sftp分离sftp端口ssh端口并挂载到远程服务器

centos搭建sftp分离sftp端口ssh端口并挂载到远程服务器

  • 近期因为业务需要, 系统要搭建一个简单的sftp给其他系统上传文件使用,并且要将文件系统挂载到远程服务器中供storm读取消费,同时为了访问安全,需要将sftp端口和ssh端口分离,禁止sftp用户登录服务器
  • 在搭建sftp过程中有很多坑在此做个记录

搭建ssh分离的sftp服务

  • 创建sftp的配置。
    sftp用户就是系统用户,默认sftp的配置是和ssh配置在一起的。但是我们要将这两者分开,首先从ssh复制好配置文件
    • 复制sshd.service
      sudo cp /usr/lib/systemd/system/sshd.service  /etc/systemd/system/sftpd.service
      
    • 复制sshd
      sudo cp /etc/pam.d/sshd  /etc/pam.d/sftpd
      
    • 复制sshd_config
      sudo cp /etc/ssh/sshd_config  /etc/ssh/sftpd_config
      
    • 复制sshd
      sudo cp /etc/sysconfig/sshd  /etc/sysconfig/sftp
      
    • 复制sshd.pid
      sudo cp /var/run/sshd.pid  /var/run/sftpd.pid
      
  • 创建软连接
    对service和rcsftpd进行软连接
    sudo  ln -sf  /usr/sbin/service  /usr/sbin/rcsftpd
    
    创建sftp软连接
    sudo ln -sf  /usr/sbin/sshd  /usr/sbin/sftpd
    
  • 修改 /etc/systemd/system/sftpd.service
    sudo vi  /etc/systemd/system/sftpd.service
    
    这个是修改后的sftpd.service文件:
    [Unit]
    # 这里将OpenSSH改成sftp
    Description=sftpd server daemon
    Documentation=man:sshd(8) man:sshd_config(5)
    After=network.target sshd-keygen.target
    Wants=sshd-keygen.target
    
    [Service]
    Type=notify
    EnvironmentFile=/etc/crypto-policies/back-ends/opensshserver.config
    EnvironmentFile=/etc/sysconfig/sshd-permitrootlogin
    # 这里将/etc/sysconfig/sshd改成我们刚才复制的/etc/sysconfig/sftp
    EnvironmentFile=/etc/sysconfig/sftp
    # 这里将/usr/sbin/sshd -D $OPTIONS改成启动sftp服务
    ExecStart=/usr/sbin/sftpd -f /etc/ssh/sftpd_config
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=multi-user.target
    
  • 修改 /etc/ssh/sftp_config配置
    sudo vi /etc/ssh/sftp_config
    
    这里的文件太长,只列出修改的部分
    # 修改端口,与ssh端口区分
    Port 8988
    # 修改存储sftp运行pid文件
    PidFile /var/run/sftp.pid
    # 我们先把这里先注释掉后面统一加
    # Subsystem       sftp    /usr/libexec/openssh/sftp-server
    #Match  User anoncvs
    #       X11Forwarding no
    #       AllowTcpForwarding no
    #       PermitTTY no
    #       ForceCommand internal-sftp
    # 在文件中(任意位置,但是为了方便查看在文件最后)添加如下配置
    Subsystem sftp internal-sftp
    # Match这里是sftp登录匹配规则,这里按照需要配置
    # 我这里配置的是sftpgroup用户组的所有用户都能登录
    # 原配置是针对单个user
    Match Group sftpgroup
    # 这里是ftp的根目录,所有ftp用户登录后强制重定向到该目录
    # 这里配置的/%u指跳转到该用户名同名的文件夹下
    # 例如创建/ftpdata/ftpa目录,那么ftpa用户登录后就直接访问到/ftpdata/ftpa,不能访问高层级目录
    # 这里需要特别注意,配置的这个根目录的用户权限一定只能是root:root
    ChrootDirectory /ftpdata/%u
    ForceCommand internal-sftp
    
  • 清除/var/run/sftpd.pid内容
    sudo echo ''>/var/run/sftpd.pid
    
    这个命令不一定都能使用,如果不能使用,就手动删除
    sudo vi /var/run/sftpd.pid
    
    命令行模式下双击d可以快速删除一行
  • 修改selinux配置
    sudo vi /etc/selinux/config
    
    修改后的文件如下
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    # 修改这里
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    
    修改完selinux需要系统重载配置
    sudo systemctl daemon-reload
    
  • 重启服务
    重启sftp
    sudo systemctl restart sftpd
    
    重启ssh
    sudo systemctl restart sshd
    
  • 设置开机自启动
    sudo systemctl enable sftpd
    
    sftp服务创建并分离完成,下面来创建并配置ftp用户

创建sftp账号

  • 创建sftp的用户组
    groupadd groupname

    # 上面我们配置的是只有sftpgroup这个用户组能访问sftp服务,那么我们这里就创建一个sftpgroup用户组
    sudo  groupadd sftpgroup
    
  • 创建用户
    比如创建一个sftpAuser:

    # -g 用户组; -d:用户家目录;  
    # –s /sbin/nologin:禁止用户shell登录
    # -M 不要自动建立用户的登入目录
    sudo useradd -g sftpgroup -d /ftpdata/sftpAuser -M -s /sbin/nologin ljpf
    
  • 创建用户对应文件夹
    比如创建sftpAuser的文件夹

    sudo mkdir -p /ftpdata/sftpAuser
    

    需要注意的是这里作为用户登录的根目录, 文件夹归属用户和组都为root。
    根据我们之前的配置重定向到/ftpdata/%u,所以根目录的最后一级一定为用户名,文件夹权限权限为755。

  • 修改用户密码
    有两种方式,第一种:

    sudo echo sftpAuser:mypassword| sudo chpasswd
    

    这种修改方式在密码中有部分特殊字符时可能会失效,那么我们就用传统的修改方式。
    第二种:

    sudo passwd sftpAuser
    

    然后系统会提示你输入密码

  • 验证sftp服务是否正常

    sftp -P 8988 sftpAuser@192.168.193.63
    

    输入你新建的用户的密码,如果出现ftp命令行则说明成功
    如果报错client_loop: send disconnect: Broken pipe,检查文件夹权限是否正确设置

  • 配置修改
    如果修改了sftp的配置文件需要重启服务

    sudo systemctl restart sftpd
    

nfs挂载到远程服务器

  • 查看系统是否安装nfs
    sudo yum list installed|grep nfs
    sudo rpm -qa | grep nfs-utils
    sudo rpm -qa | grep rpcbind
    
  • 安装nfs
    如果客户端和服务端没有安装nfs,那么都需要安装nfs。这里不建议手动安装,因为需要的依赖太多,并且非常容易出现兼容问题。
    sudo yum -y install nfs-utils
    sudo yum -y install rpcbind
    
  • 查看nfs是否运行
    sudo service nfs status
    
  • 修改nfs挂载配置 /etc/exports
    sudo vi  /etc/exports
    
    在文件下加上一条
    /ftpdata/sftpAuser 192.168.193.64(rw,no_root_squash,no_all_squash,sync,no_subtree_check)
    
    • rw: 设置输出目录权限为读写
    • no_root_squash: 客户端访问者如果是root用户那么访问者在服务端共享目录也具有root权限,请求不会被压缩为匿名用户(这个其实有安全问题,如果不是权限问题难以调整尽量不使用此配置,具体需要根据自己的业务调整)
    • no_all_squash: 客户端的所有普通用户及所属组在服务端共享目录也具有同样权限不会被压缩为匿名用户
    • sync: 将数据同步写入内存缓冲区与磁盘中,可以保证数据的一致性
    • no_subtree_check: 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限
  • 启动nfs服务
    • 启动服务
      # 这里要先启动rpcbind 再启动nfs
      sudo systemctl start rpcbind 
      sudo systemctl start nfs
      
    • 设置开机自启动
      sudo systemctl enable rpcbind 
      sudo systemctl enable nfs
      
  • 挂载共享目录
    • 在需要挂载的客户端机器上创建共享目录
      在客户端(上面配置的192.168.193.64)上创建挂载映射目录
      比如我想将193.63的/ftpdata/sftpAuser映射到193.64上的/ftp/remote,那么我们就先在193.64上创建/ftp/remote目录
      sudo mkdir -p /ftp/remote
      
    • 执行挂载命令
      sudo mount -t nfs 192.168.193.63:/ftpdata/sftpAuser  /ftp/remote
      
    • 查看挂载情况
      showmount -e [服务端ip]
      如果是本机ip可以不加
      showmount -e 
      
    • 解除挂载
      如果不需要再共享目录了,可以解除目录的挂载
      umount /ftp/remote
      
      如果进程卡住无法解除卸载需要加上-lf 参数
      umount -lf /ftp/remote
      

常见问题

  1. sftp连接出现算法不支持
    sftp默认配置的算法是比较少的,所以使用java客户端或者其他客户端连接时可能会连接出错。以下是查询当前ssh支持的算法命令

    • 查询对称加密算法
      ssh -Q cipher
      
      对应/etc/ssh/sftp_config的Ciphers配置项
    • 查询非对称加密算法
      ssh -Q key
      
    • 查询KEX(密钥交换)算法
      ssh -Q kex
      
      对应/etc/ssh/sftp_config的KexAlgorithms配置项
    • 查询MAC(消息认证码)算法
      ssh -Q mac
      
      对应/etc/ssh/sftp_config的MACs配置项
      当然这些算法只是当前ssh列出的一定能使用的算法,但是仍然有部分算法虽然没有列出却能被支持使用,如果有需要可以去查阅官方文档
  2. sftp用户密码定时过期
    linux创建新用户可能默认是有密码过期时间的,这对于使用java程序上传sftp的用户不是很友好,那么就需要设置密码永不过期

    • 查询用户密码过期时间

      sudo chage -l username 
      
    • 修改所有用户密码过期时间
      这里修改的是创建新用户的时候默认的密码过期时间,已经被创建的用户的密码过期时间还是维持不变的,需要使用下面的命令手动修改用户的密码过期时间

      sudo vi /etc/login.dfs
      

      修改PASS_MAX_DAYS这个值,当值为99999时就是永不过期
      在这里插入图片描述
      测试创建一个账号,可以看到,修改完后创建新用户的密码就为永不过期了
      在这里插入图片描述

    • 修改当前用户密码过期时间
      对于已经创建的用户,密码过期时间是不会被改变的,所以需要手动修改

      sudo  chage -M 99999 username
      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值