构想和目标
最近有个这样的诉求:基于对线上服务器的保密和安全,不希望开发人员直接登录线上服务器,因为登录服务器的权限太多难以管控,如直接修改代码、系统配置,并且也直接连上mysql。因此希望能限制开发人员ssh登录机器,但是通过ftp/sftp上传代码文件。
在网上找个各种各样的方法,经过试验做个汇总:

方法一
https://segmentfault.com/q/1010000000722462

这篇帖子的方法是搜索到的最通用的方法,方法是否可能呢,直接做个测试。

创建禁止登陆的用户:

useradd test -M -s /sbin/nologin
试试ssh登陆:登陆失败

[root@localhost app]# ssh test@172.19.194.30
test@172.19.194.30's password:
Last login: Tue Oct 11 15:28:07 2016 from 172.18.135.185
This account is currently not available.
Connection to 172.19.194.30 closed.
试试sftp登陆:同样也提示登陆失败!!!

[root@localhost app]# sftp test@172.19.194.30
test@172.19.194.30's password:
Received message too long 1416128883
[root@localhost app]#
可以看到,方法一,虽然限制了ssh登陆,但是同时也限制了sftp的连接,结论是此方法行不通。

方法二
http://jin771998569.blog.51cto.com/2147853/1067247

首先修改sshd的配置文件:
#vim /etc/ssh/sshd_config
#该行(上面这行)注释掉
#Subsystem sftp /usr/lib/openssh/sftp-server

# 添加以下几行
Subsystem sftp internal-sftp
Match group sftp
#Match user test
#匹配sftp组,如为单个用户可用:Match user 用户名; 设置此用户登陆时的shell设为/bin/false,这样它就不能用ssh只能用sftp
ChrootDirectory /home/test
#指定用户被锁定到的那个目录,为了能够chroot成功,该目录必须属主是root,并且其他用户或组不能写
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
添加用户组和用户
#添加用户组
groupadd sftp

#添加用户
useradd -d /home/test -m -s /bin/false -g sftp test

#修改密码
passwd test

重启SSH服务
service sshd restart

或者

/etc/init.d/ssh reload

测试ssh
[root@localhost etc]# ssh test@172.19.194.30
test@172.19.194.30's password:
Write failed: Broken pipe
登陆失败,提示Write failed: Broken pipe错误

再测试sftp
[root@localhost etc]# sftp test@172.19.194.30
test@172.19.194.30's password:
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
同样提示Write failed: Broken pipe

按理说此方法应该是靠谱的为什么会提示失败呢,通过查找发现是目录权限配置导致的:
https://my.oschina.net/davehe/blog/100280

目录权限设置上要遵循2点:
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是755。

修改/home/test 目录权限为755

chmod 755 /home/test -R

再次测试
[root@localhost etc]# ssh test@172.19.194.30
test@172.19.194.30's password:
Could not chdir to home directory /home/test: No such file or directory
This service allows sftp connections only.
Connection to 172.19.194.30 closed.
和预期一致:ssh尝试连接失败。

[root@localhost etc]# sftp test@172.19.194.30
test@172.19.194.30's password:
Connected to 172.19.194.30.
sftp> ls
a a.log authorized_keys mysql.sh
sftp>
sftp测试连接成功!

总结
这个东西虽然没有太大的技术含量,但是通过网上查找的大多是雷同且行不通的,又或者是不完整的,过程中耽误和浪费了不少时间,希望写这篇博客做个验证和汇总的作用。

参考:
如何关闭linux用户的SSH权限,但还能登录vsftpd
Linux openSSH 只能够使用SFTP 不能使用ssh登陆
sftp服务限制用户登录家目录
Linux_ftp_命令行下下载文件get与上传文件put的命令应用

教你如何配置linux用户实现禁止ssh登陆机器但可用sftp登录!的更多相关文章

  1. Linux启动或禁止SSH用户及IP的登录

    启动或禁止SSH用户登录 一般情况下,在使用Linux操作系统都不会去机房来操作机器,都是使用一些第三方的工具来操作. 比如使用SSH Secure File Transfer Client工具来传输 ...

  2. Linux启动或禁止SSH用户及IP的登录,只允许密钥验证登录模式

    启动或禁止SSH用户登录 一般情况下,在使用Linux操作系统都不会去机房来操作机器,都是使用一些第三方的工具来操作. 比如使用SSH Secure File Transfer Client工具来传输 ...

  3. Linux启动与禁止SSH用户及IP的登录

    以下就针对SSH方面讨论一下.假设有人特别关注Linux环境的安全性,第一就从login方面来进行讨论 1:Linux启动或禁止SSH root用户的登录 2:Linux限制SSH用户 事实上这些东西 ...

  4. 解决用root用户及密码可以直接登陆某LINUX系统,但是用ssh登陆,系统却总是提示密码不对

    引用 vi /etc/ssh/sshd_config 将PermitRootLogin项改为yes service sshd restart 重启sshd服务即可

  5. [Linux][Mac]如何使用SSH登陆远程Linux服务器&使用SCP下载远程终端文件

    --------------------------- 2017-01-16 初版 2017-01-17 增加ssh登录端口修改 -------------------------- 一.使用ssh ...

  6. linux不需要密码ssh登陆

    1. 自动ssh/scp方法A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux在A上运行命令: ...

  7. linux --自已的域名无法登陆机器的解决办法:同步时间

    昨天发现自己的域名无法访问host了,因此我们测试环境便无法安装,显示SSH not connectted ,随后发现时间不同步: 因此以下命令可以实现时间同步: /opt/quest/bin/vas ...

  8. linux 限制root SSH登陆和限制su

    linux 限制root用户SSH登录:   1.修改SSHD服务的配置文件/etc/ssh/sshd_config    将#PermitRootLogin yes 改为PermitRootLogi ...

  9. Linux上安装使用SSH(ubuntu&&redhat)

    转自:http://blog.csdn.net/zxs9999/article/details/6930736 Ubuntu安装使用SSH ubuntu默认并没有安装ssh服务,如果通过ssh链接ub ...

随机推荐

  1. SDN实验---Ryu的应用开发(三)流量监控

    一:实现流量监控 (一)流量监控原理 其中控制器向交换机周期下发获取统计消息,请求交换机消息------是主动下发过程 流速公式:是(t1时刻的流量-t0时刻的流量)/(t1-t0) 剩余带宽公式:链 ...

  2. ABP .NETCore更新数据库时一直连接的之前数据库

    使用Update-Database -Verbose更新数据库时,在appsettings.json配置文件中已修改为新的连接字符串,但是使用命令更新数据库时仍然连接的是之前的数据库. 后来把代码移至 ...

  3. LinkedHashMap原理

    作者:艺旭家 链接:https://www.jianshu.com/p/8f4f58b4b8ab 总结 LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的. Ha ...

  4. 1.2.1LVM逻辑卷镜像实现方法

    LVM逻辑卷镜像实现方法 本文演示了在CentOS5系统中实现LVM逻辑卷镜像的方法.LVM的镜像功能,有点儿类似于Raid1,即多块儿磁盘互相同步,确保资料不会丢失. 创建物理卷,卷组的步骤这里就先 ...

  5. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  6. java中参数" ..."的用法和意思

    public static void executebindParam(PreparedStatement pstmt,Object ...os){ int len = os.length; try ...

  7. 浅析 Java 中的继承和重写

    浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...

  8. [Docker] Windows 宿主环境下,共享或上传文件到容器的方法

    需求如题. 解决方案1 - 挂载目录(适用于创建新的容器) 格式-v 容器目录 或 -v 本地目录:容器目录 范例Linux宿主环境下:使用镜像 nginx:latest,以后台模式启动一个容器,将容 ...

  9. Spark学习(2) RDD编程

    什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.弹性.里面的元素可并行计算的集合 RDD允 ...

  10. Django-09-cookie和session

    1. 简介 <1> cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原 ...