• Linux SSH和SFTP服务分离


    摘自:https://www.cnblogs.com/zihanxing/articles/5665383.html

    原理:

    创建两个‘sshd’进程,一个作为ssh服务的deamon,一个作为sftp服务的deamon.

    ssh服务和sftp服务分离之前:

    系统内开启ssh服务和sftp服务都是通过/usr/sbin/sshd这个后台程序监听22端口,而sftp服务作为一个子服务,是通过/etc/ssh/sshd_config配置文件中的Subsystem实现的,如果没有配置Subsystem参数,则系统是不能sftp访问的。

    实现ssh服务和sftp服务分离:

    1.两个deamon

    要实现ssh和sftp分离,分别监听不同的端口,可以通过创建两个‘/usr/sbin/sshd’后台程序,一个监听22端口(ssh),一个监听20022端口(sftp),为了区分ssh和sftp服务的后台程序,这里将ssh服务的后台程序保持为/usr/sbin/sshd,而将sftp服务的后台程序改为/usr/sbin/sftpd。/usr/sbin/sftpd是/usr/sbin/sshd的一个链接,其内容完全相同(ln -sf /usr/sbin/sshd /usr/sbin/sftpd)。

    2.两个service

    SLES12使用systemd管理系统服务,ssh服务对应/usr/lib/systemd/system/sshd.service文件,实现sftp服务时可以将/usr/lib/systemd/system/sshd.service 复制到 /etc/systemd/system/sftpd.service,然后修改sftpd.service文件内容。(使用修改好的sftpd.service文件即可)

    3.其他文件
    系统的ssh服务是通过安装openssh实现的,可以通过rpm -ql openssh查看该rpm包含哪些文件。

    总结实现ssh和sftp分离的相关的文件有:

    ssh服务 sftp服务
    /usr/lib/systemd/system/sshd.service /etc/systemd/system/sftpd.service 
    (通过修改/usr/lib/systemd/system/sshd.service文件得到)
    /etc/pam.d/sshd /etc/pam.d/sftpd (通过复制 /etc/pam.d/sshd文件得到)
    /etc/ssh/sshd_config /etc/ssh/sftpd_config (通过复制/etc/ssh/sshd_config文件得到)
    /usr/sbin/rcsshd /usr/sbin/rcsftpd (ln -sf /usr/sbin/service /usr/sbin/rcsftpd)
    /usr/sbin/sshd /usr/sbin/sftpd (ln -sf /usr/sbin/sshd /usr/sbin/sftpd)
    /etc/sysconfig/ssh /etc/sysconfig/sftp (通过修改/etc/sysconfig/ssh文件得到)

    至此,我们已经实现了两个服务。

    但是,ssh服务和sftp服务并没有真正的分离,此时已然可以通过22号端口使用ssh服务和sftp服务,而新开的20022端口也可以使用ssh服务(ssh -p 20022 username@serverip )和sftp服务(sftp -o Port=20022 username@serverip )。

    4.关闭22号端口下的sftp服务
    编辑/usr/sbin/sshd的配置文件/etc/ssh/sshd_config文件,将Subsystem参数注释掉,然后重启sshd
    同时也可以设置可访问22号端口的用户白名单:
    编辑/etc/ssh/sshd_config文件,设置AllowGroups参数(假设设置为AllowGroups sshonly),限制仅AllowGroups组内的用户可通过22号端口ssh登录系统(对于需要ssh登录系统的用户可通过usermod -A sshonly <username>将其加入到AllowGroups组内)

    5.“关闭20022号端口下的ssh服务”
    sftp作为一个子服务,它的开启依赖于ssh服务,因此不能从本质上关闭ssh服务而只开启sftp服务。
    可以用以下方式来规避:
    /usr/sbin/sftpd的配置文件/etc/ssh/sftpd_config中包含Subsystem参数配置(推荐使用Subsystem sftp internal-sftp -l INFO -f AUTH)
    /etc/ssh/sftpd_config中包含AllowGroups参数(假设为AllowGroups sftponly),限制仅AllowGroups组内的用户可以访问20022端口
    将AllowGroups组内的用户的shell改为/bin/false(usermod -s /bin/false <username>),使AllowGroups组内的用户仅能sftp登录系统(如果一个用户即需要ssh,又需要sftp,则不能将其shell改为/bin/false)

    6.用户白名单配置
    配置之后,需将系统内需要ssh访问系统的用户加入到sshonly组内,需将系统内需要sftp访问系统的用户加入到sftponly组,同时需要ssh和sftp的用户则sshonly和sftponly组都要加入。

    7. 重启ssh服务和sftp服务,并设置开机启动

    service sshd restart
    service sftpd restart


    访问ssh服务可使用:ssh username@serverip

    分离后如何访问ssh/sftp

    对于同时是sshonly组和sftponly组的成员的用户还可以使用
    ssh -o Port=20022 username@serverip访问系统
    访问sftp服务可使用:sftp -o Port=20022 username@serverip

    附件sshsftpseparate_sles12.tar.gz使用说明:
    将sshsftpseparate_sles12.tar.gz上传到服务器(需实现ssh和sftp分离的机器)上
    解压:tar -xzvf sshsftpseparate_sles12.tar.gz
    进入sshsftpseparate目录,编辑sshusers,sftpusers,sshsftpusers文件,将仅需要ssh的用户添加到sshusers文件中(每行一个),将仅需要sftp的用户添加到sftpusers文件中(每行一个),将既需要ssh又需要sftp的用户添加到sshsftpusers文件中(每行一个)。
    最后执行一下set.sh脚本即可
    sshsftpseparate目录下文件说明:
    set.sh 完成ssh和sftp分离的自动化脚本
    sftp /etc/sysconfig/sftp配置文件
    sftpd.service /etc/system/system/sftpd.service文件
    sftpd_config sftpd服务配置文件/etc/ssh/sftpd_config(可修改,包括sftp监听的20022端口等)
    sftpusers 配置仅需要sftp的用户名单
    sshusers 配置仅需要ssh的用户名单
    sshsftpuser 配置既需要ssh又需要sftp的用户名单

  • 相关阅读:
    Oracle 列转行函数 Listagg()
    JS正则表达式
    云经验
    业务架构、应用架构、数据架构和技术架构
    Sublime Text3+Golang搭建开发环境
    成功安装vscode中go的相关插件
    Visual Studio Code配置GoLang开发环境
    团队架构实践
    架构
    条件引用
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/12502553.html
Copyright © 2020-2023  润新知