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

  • 搭建ssh分离的sftp服务
  • 创建sftp账号
  • nfs挂载到远程服务器
  • 常见问题


  • 近期因为业务需要, 系统要搭建一个简单的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
  • 修改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账号

  • 创建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
  • 查询非对称加密算法
ssh -Q key
  • 查询KEX(密钥交换)算法
ssh -Q kex
  • 查询MAC(消息认证码)算法
ssh -Q mac
  • 对应/etc/ssh/sftp_config的MACs配置项
    当然这些算法只是当前ssh列出的一定能使用的算法,但是仍然有部分算法虽然没有列出却能被支持使用,如果有需要可以去查阅官方文档
  1. sftp用户密码定时过期
    linux创建新用户可能默认是有密码过期时间的,这对于使用java程序上传sftp的用户不是很友好,那么就需要设置密码永不过期
  • 查询用户密码过期时间
sudo chage -l username
  • 修改所有用户密码过期时间
    这里修改的是创建新用户的时候默认的密码过期时间,已经被创建的用户的密码过期时间还是维持不变的,需要使用下面的命令手动修改用户的密码过期时间
sudo vi /etc/login.dfs

修改PASS_MAX_DAYS这个值,当值为99999时就是永不过期

centos设置允许SFTP连接 centos8 sftp_centos设置允许SFTP连接


测试创建一个账号,可以看到,修改完后创建新用户的密码就为永不过期了

centos设置允许SFTP连接 centos8 sftp_centos_02

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