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
- 复制sshd.service
- 创建软连接
对service和rcsftpd进行软连接
创建sftp软连接sudo ln -sf /usr/sbin/service /usr/sbin/rcsftpd
sudo ln -sf /usr/sbin/sshd /usr/sbin/sftpd
- 修改 /etc/systemd/system/sftpd.service
这个是修改后的sftpd.service文件:sudo vi /etc/systemd/system/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
命令行模式下双击d可以快速删除一行sudo vi /var/run/sftpd.pid
- 修改selinux配置
修改后的文件如下sudo vi /etc/selinux/config
修改完selinux需要系统重载配置# 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
sudo systemctl daemon-reload
- 重启服务
重启sftp
重启sshsudo systemctl restart sftpd
sudo systemctl restart sshd
- 设置开机自启动
sftp服务创建并分离完成,下面来创建并配置ftp用户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
- 解除挂载
如果不需要再共享目录了,可以解除目录的挂载
如果进程卡住无法解除卸载需要加上-lf 参数umount /ftp/remote
umount -lf /ftp/remote
- 在需要挂载的客户端机器上创建共享目录
常见问题
-
sftp连接出现算法不支持
sftp默认配置的算法是比较少的,所以使用java客户端或者其他客户端连接时可能会连接出错。以下是查询当前ssh支持的算法命令- 查询对称加密算法
对应/etc/ssh/sftp_config的Ciphers配置项ssh -Q cipher
- 查询非对称加密算法
ssh -Q key
- 查询KEX(密钥交换)算法
对应/etc/ssh/sftp_config的KexAlgorithms配置项ssh -Q kex
- 查询MAC(消息认证码)算法
对应/etc/ssh/sftp_config的MACs配置项ssh -Q mac
当然这些算法只是当前ssh列出的一定能使用的算法,但是仍然有部分算法虽然没有列出却能被支持使用,如果有需要可以去查阅官方文档
- 查询对称加密算法
-
sftp用户密码定时过期
linux创建新用户可能默认是有密码过期时间的,这对于使用java程序上传sftp的用户不是很友好,那么就需要设置密码永不过期-
查询用户密码过期时间
sudo chage -l username
-
修改所有用户密码过期时间
这里修改的是创建新用户的时候默认的密码过期时间,已经被创建的用户的密码过期时间还是维持不变的,需要使用下面的命令手动修改用户的密码过期时间sudo vi /etc/login.dfs
修改PASS_MAX_DAYS这个值,当值为99999时就是永不过期
测试创建一个账号,可以看到,修改完后创建新用户的密码就为永不过期了
-
修改当前用户密码过期时间
对于已经创建的用户,密码过期时间是不会被改变的,所以需要手动修改sudo chage -M 99999 username
-