SSH权限详解

SSH权限详解,第1张

原文链接

之前两篇文章 利用SSH代理访问内网资源 和 使用SSH代理在本地开发环境调试各种回调 两篇文章,介绍了ssh的各种代理姿势,SSH的功能确实强悍。如果用过ssh代理功能,就有人要问了,我能否限制用户只允许使用代理功能,而不允许用户登录到我的系统中呢?

当然可以!否则又怎么会称为SSH(注:SSH是Secure Shell的缩写)呢?连权限都不能保障怎么敢叫 Secure 呢?本篇文章就来详解下SSH的花式权限,来点不一样的干货。

先谈谈SSH有哪些功能,才能谈到每个功能有哪些权限。SSH最常见的有三大功能:

其次是SSH是一个典型的C/S应用,服务端运行 sshd 守护进程,监听 TCP/22 端口(默认情况下),客户端运行 ssh 程序,远程连接 sshd 应用,使用以上三种功能。

sshd 使用 /etc/ssh/sshd_config 和 ~/.ssh/authorized_keys (这个文件仅用于做密钥认证的配置,如果和sshd_config配置冲突则此文件配置生效。此配置文件可以实现细化到密钥的权限,gitlab使用此配置实现用户的ssh访问控制)配置文件做服务配置, ssh 客户端使用 /etc/ssh/ssh_config (全局配置)和 ~/.ssh/config (个性配置)两个配置文件(windows 10的openssh使用 %USERPROFILE%\.ssh\config )。默认配置文件几乎不用动,ssh就帮我们做好了开箱即用的配置。本文不会讲解ssh每个配置项的含义,只会根据一些场景讲解对应的权限控制,所有场景都是以默认配置为基准,讲解一些常用的配置,一些不常用的配置项就不提及了。

下面我们将详解每个功能的权限

最基本的使用方式,直接远程连接到服务器的shell上,实现远程控制的需求。

只要用户满足以下条件之一,ssh便会拒绝登录:

所以通常创建一个低权限账户,只负责运行本地服务的,使用的useradd命令大致如下:

新用户无密码,并且不是一个合法的shell,所以根本没法登录

如果连motd信息都不想让用户看到,可以直接创建一个 ~/.hushlogin 空文件即可。如果想通过修改配置文件,那么需要同时修改 /etc/sshd_config ( PrintMotd no )和 /etc/pam.d/sshd (去掉 pam_motd.so 加载),比较麻烦。

设置 PermitRootLogin 选项即可。 no 表示彻底拒绝root远程登录,想要切换成root就只能通过普通用户的 su - 或 sudo -i 切换root身份了。 prohibit-password 和 without-password (Ubuntu 14.04以后默认)表示拒绝密码登录,表示只能通过密钥登录了。 forced-commands-only 选项表示只允许密钥认证,但是必须给定 command ,也就是非交互式执行ssh。

这个其实办法很多,比如在防火墙控制,在 /etc/hosts.(deny|allow) 控制等,其实在 /etc/sshd_config 也可以控制,方法就是使用 Match address ,比如:

用sshd配置本身做ip白名单的比较少,但是 Match 配置却是一个非常有用的配置项,它可以实现我们对用户或用户组区别对待,这个我们会在后面再细说。

有关代理的使用可以参考我之前写的 利用SSH代理访问内网资源 和 使用SSH代理在本地开发环境调试各种回调 两篇文章。

x11转发功能实际应用会非常罕见,作用是将远程的图形数据在本地的X server上展示,以实现本地 *** 作远程图形程序的功能。首先是Linux服务器大多运行在无图形环境下,本身就没有图形化程序跑在上面,再加上客户机可能多数是windows,又没有X环境,更加限制了这个功能的使用。还有就是x11 forwarding性能不是很好,实际使用会发现非常卡,不适合使用那种对响应速度要求比较灵敏的应用程序,比如浏览器,在x11 forwarding下运行动图会非常卡。最后就是需要跑图形化程序的服务器多数都安装有桌面环境,配置有vnc,因此就更没有人愿意使用这个功能了。

如果不希望所有端口都能用于转发请求,可以配置 PermitOpen 参数:

如果允许多个端口用于转发,那么必须一个个配置出来, any (默认)表示所有端口都允许用于转发。

这个比较繁琐,因为目前常见的通过ssh传输文件的有三个命令 scp , rsync , sftp 。它们的机制不一样,其中 scp 和 rsync 是通过远程非交互式执行命令实现的,而 sftp 是通过openssh的sftp server实现的。

对于 scp 和 rsync ,只需要限制非交互式命令就可以了,比如

或在 ~/.ssh/authorized_keys 对应的rsa public key 前面加上 command="/bin/bash" (参考gitlab的 /var/opt/gitlab/.ssh/authorized_keys ),效果是等效的。这样就可以实现允许用户远程登录系统,但是 scp 和 rsync 命令失效,同时由于限定死了command参数,导致你的非交互式ssh命令也无法使用了,比如 ssh user@ip ls / 这一类非交互式ssh不起作用了。

但是对于 sftp 的限制则要容易的多,因为 sftp 权限是单独分开的,不和ssh命令执行权限混在一起,并且sftp也和ftp一样,有自带的一些命令实现(比如ls, cd, get, put等等),如果设置

或等效的 ~/.ssh/authorized_keys 配置,则表示只允许使用sftp,不允许shell登录。如果配置中去掉 Subsystem sftp /usr/lib/openssh/sftp-server 这一行就可以关闭sftp服务

经常时候我们需要混合以上各种权限使用。比如某些用户我们开放出来,但是限制它的功能,此时 Match 配置就是我们的好朋友了。

由于用户不能登录shell,不能使用密码认证,因此想要使用代理,必须使用类似于下面的命令:

使用 -i 参数指定私钥文件用于公钥认证,使用 -N 参数表示不执行远程命令,仅仅使用port forwarding。

这里我们Match了 sftp-only 这个组,在这个组下面的用户都使用下面的配置。使用了ForceCommand,因此不能登录shell,使用了 ChrootDirectory 限制了用户的根目录,关闭了各种转发功能。

通过 Match 的组合,我们可以很方便的限制一些特定用户的权限,这样就实现了ssh用户的一些特殊化管理。

这里只是按照一些可能遇到的场景讲解了下 sshd_config 的配置,对于等效的 ~/.ssh/authorized_keys 配置同样适用。其实ssh还有很多强大的功能,但是用的可能比较少,这里就不详细讲解那些不太常见的参数了,有兴趣的读者可以自行查阅man手册获取更多资料:

最近需要从外网通过ssh访问内网主机,但是又不具备给路由器添加端口映射的权限,于是用到了ssh的远程端口转发。于是打算在这里整理一下ssh常用的功能和用法。

但由于细节特别多,一次肯定写不完,因此有些细节会暂时省略,待日后补上,特别是截图。

这是最基本的了,也没什么好说的。

其中-p用来指定端口(如果端口不是默认的22的话)

为了保证安全,可以在把本地产生的密钥对的公钥文件传到服务端,这样登陆的时候就不需要输入用户名/密码了。当然如果产生密钥对的时候还使用了口令,这时还是需要输入口令,这可以用ssh-agent来解决~~越来越懒了。当然如果你想在某个服务端再登陆到另一个服务端,那么可以开启ssh-agent的转发功能~~真是懒到家了。

这里分为四种,本地转发,远程转发,动态转发和X转发

先说明常见的参数

这句命令需要在本地输入,意思就是在本地打开local_port端口监听,把发送到这个端口的TCP数据包经过tunnel_host之后,发送到remote_host的remote_port上。

比如我想把发送到本地10000端口的tcp数据包经过1.1.1.1转发到1.2.3.4的20000端口,那么可以这么写:

如果tunnel_host和remote_host相同,那么就相当于直接发送到remote_host了,不经过另一台机器。

这句命令需要在本地输入,意思是在remote_host(在这里remote_host == tunnel_host)上打开监听remote_port,把传给remote_port的tcp数据转发到本地主机的local_port。

按道理来讲,remote_host应该可以不等于tunnel_host,但是我没有这个需求也就没有尝试了,有待实验。

远程转发通常用在外网想主动连接内网主机的时候,本质上就是内网主机先建立一条通向外网主机的连接,然后让外网主机直接顺着这条连接发送数据给内网主机:

那么我用

就可以通过ssh连接内网主机了。

值得注意的是,user1是服务器的用户名而user2是内网主机的用户名

之前两种的转发都是指定了转发目的地的端口,那动态转发的意思就是根据数据包的协议动态选择转发的目的端口。多用于翻墙。

X转发就是说通过ssh转发X11协议的数据,简单的说就是直接在本地运行远程的带有GUI的程序。

讲道理X转发可以用远程转发来实现,但是比较麻烦。

打开X转发需要保证/etc/ssh/sshd_config(配置文件的路径随不同linux发行版有可能会发生改变)钟的X11Forwarding是yes的。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11715612.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存