sshd_config 中 PermitRootLogin 的探讨

sshd_config 中 PermitRootLogin 的探讨众所周知,sshd_config是sshd的配置文件,其中PermitRootLogin可以限定root用户通过ssh的登录方式,如禁止登陆、禁止密码登录、仅允许密钥登陆和开放登陆,本文对其中比较罕见的forced-commands-only选项做了介绍及实战。

大家好,又见面了,我是你们的朋友全栈君。

PermitRootLogin的可选项

众所周知,sshd_config是sshd的配置文件,其中PermitRootLogin可以限定root用户通过ssh的登录方式,如禁止登陆、禁止密码登录、仅允许密钥登陆和开放登陆,以下是对可选项的概括:

参数类别 是否允许ssh登陆 登录方式 交互shell
yes 允许 没有限制 没有限制
without-password 允许 除密码以外 没有限制
forced-commands-only 允许 仅允许使用密钥 仅允许已授权的命令
no 不允许 N/A N/A

以上选项中,yes和no的功能显而易见,只是很粗暴的允许、禁止root用户进行登陆。without-password在yes的基础上,禁止了root用户使用密码登陆。

forced-commands-only的功能

目前看就只有forced-commands-only这个参数还不明了,网上的参考资料仅有以下说明:

If this option is set to “forced-commands-only”, root login with public key authentication will be allowed, but only if the command option has been specified (which may be useful for taking remote backups even if root login is normally not allowed). All other authentication methods are disabled for root.

大体上的意思是设置了forced-commands-only之后,root用户仅允许使用密钥登陆,然后只允许执行在command中允许的命令,这个模式通常用来供定期需要使用root用户登陆,但是只需要执行规定的脚本、命令的情形,如定期备份等周期性、固化的操作。但这其中的command到底是如何指定的,这里并没有说明,本着打破砂锅问到底的态度,翻遍了各种资料,终于找到了command这个选项该填到的地方:那就是/root/.ssh/目录下的authorized_keys文件。
默认情况下authorized_keys的文件类似下面这样子:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAt0BETg9J6hZb5Kqxy+yfNtKHfwxUELz7PqGtGiM5eNb8DHC8kj02SCFoql5rpaecMGybWRiSK8/k+EsK7TMgd4O+p6WkNyLD3WZrmVzUEPaxAdYf1eeCQooTJ+B1TKXDNlF9t8xTVsHd67HmPWYU6i3+kaDSX7cbrz2ds2zUGSozj1UQ8AJDJMbGOqpjs3nVh2EpSDgY7znqmUDnygVPiM4c3OfEzs5iCxVd4ggpPhH8d0bwy8RmPsooxJYUY4rE1C5iWCvB7P810yUFB0OilxiX9AfZa9shC3n5bqaX0ioY1eC44hFFPL602fJyKMj6w/zxN5aIeFO03Sl9+FU4YQ== root@iZ23wan41azZ

那么command就需要加载文件的开头:

command=”/bin/ps” ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAt0BETg9J6hZb5Kqxy+yfNtKHfwxUELz7PqGtGiM5eNb8DHC8kj02SCFoql5rpaecMGybWRiSK8/k+EsK7TMgd4O+p6WkNyLD3WZrmVzUEPaxAdYf1eeCQooTJ+B1TKXDNlF9t8xTVsHd67HmPWYU6i3+kaDSX7cbrz2ds2zUGSozj1UQ8AJDJMbGOqpjs3nVh2EpSDgY7znqmUDnygVPiM4c3OfEzs5iCxVd4ggpPhH8d0bwy8RmPsooxJYUY4rE1C5iWCvB7P810yUFB0OilxiX9AfZa9shC3n5bqaX0ioY1eC44hFFPL602fJyKMj6w/zxN5aIeFO03Sl9+FU4YQ== root@iZ23wan41azZ

这样就完成了配置,使用这个公钥登陆的用户,只有执行/bin/ps的权限,而且没有交互的shell,只能一次性的执行完command中的命令。

那么问题来了

细心地朋友可能发现了,因为没有交互式shell,所以command中只能添加一条命令,如果想要执行多条命令应该怎么办呢?这个时候就是伟大的shell脚本登场的时候了,把该执行的命令,全部封装到shell脚本中即可,然后再command中写上脚本的绝对路径即可。
譬如,例子脚本hi.sh:

echo This is huigher speaking
echo Now is `date`

那么执行的实际执行的效果就是(ssh连接时对ssh连接的目标做了alias):

[root@test .ssh]# ssh huigher
This is huigher speaking
Now is Sat Oct 29 16:13:36 CST 2016
Connection to 121.40.xxx.xxx closed.

光说不练假把式

说了这么多,可能各位还是有点云里来雾里去,那么就实战一下吧

配置公钥与密钥

由于forced-commands-only模式,只允许密钥的方式登录,那么就需要先配置公钥和密钥。

  1. 在本地电脑上,使用命令ssh-keygen -t rsa来生成一对密钥和公钥,过程中需要选择密钥存放的目录(/YourPath/YourPrivateKey)和密码(本例中为空)
  2. 将生成的公钥放置到远端服务器上,将公钥附加到~/.ssh/authorized_keys中,如cat id_rsa.pub >> ~/.ssh/authorized_keys
  3. 确保~/.ssh/目录的权限700,~/.ssh/authorized_keys文件的权限是600
  4. 修改/etc/ssh/sshd_config文件,确保其中填写了以下几行

    RSAAuthentication yes
    PubkeyAuthentication yes

设置forced-commands-only相关参数

  1. 修改/etc/ssh/sshd_config文件,添加以下一行:

    PermitRootLogin forced-commands-only

  2. 打开~/.ssh/authorized_keys,找到最后添加的公钥一行,在最前面加上command="/YourPath/YourFile",如:

command=”/usr/hi.sh” ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAt0BETg9J6hZb5Kqxy+yfNtKHfwxUELz7PqGtGiM5eNb8DHC8kj02SCFoql5rpaecMGybWRiSK8/k+EsK7TMgd4O+p6WkNyLD3WZrmVzUEPaxAdYf1eeCQooTJ+B1TKXDNlF9t8xTVsHd67HmPWYU6i3+kaDSX7cbrz2ds2zUGSozj1UQ8AJDJMbGOqpjs3nVh2EpSDgY7znqmUDnygVPiM4c3OfEzs5iCxVd4ggpPhH8d0bwy8RmPsooxJYUY4rE1C5iWCvB7P810yUFB0OilxiX9AfZa9shC3n5bqaX0ioY1eC44hFFPL602fJyKMj6w/zxN5aIeFO03Sl9+FU4YQ== root@iZ23wan41azZ

收尾及测试

  1. 重启sshd进程
  2. 在客户端上使用ssh进行连接:ssh root@xx.xx.xx.xx -i /YourPath/YourPrivateKey,如果嫌麻烦,也可以直接在客户端的.ssh文件夹下新建config配置文件,填写ssh主机的alias,这样就可以直接使用ssh huigher来进行连接了:

    Host huigher
    HostName 121.40.xxx.xxx
    Port 22
    User root
    IdentityFile /YourPath/YourPrivateKey

  3. 配置完毕后的效果如下:

    [root@test .ssh]# ssh huigher
    This is huigher speaking
    Now is Sat Oct 29 16:13:36 CST 2016
    Connection to 121.40.xxx.xxx closed.

  4. 除了command以外的命令,是无法执行的,况且连交互式shell都没有,更别提执行命令了,所以安全性是比较高的。

最后

本文撰写仓促,难免有错误和不足之处,若各位看官发现,请评论指出,不胜感激!

参考资料

  1. https://www.novell.com/support/kb/doc.php?id=7007565
  2. http://askubuntu.com/questions/449364/what-does-without-password-mean-in-sshd-config-file
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131634.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月12日 上午6:46
下一篇 2022年6月12日 上午6:46


相关推荐

  • 虚拟现实开发完整教程视频_新手入门虚拟现实技术

    虚拟现实开发完整教程视频_新手入门虚拟现实技术基于unity的HTCvive开发综合教程:http://www.52vr.com/hardware/vive/

    2025年11月9日
    5
  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月30日
    6
  • 对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (C&W)】

    对抗攻击经典论文剖析(上)【FGSM、BIM、PGD、Carlini and Wagner Attacks (C&W)】最近做数据增广做的心累,想要看一看对抗攻击!这个博文会对四种经典算法进行剖析,分别是FGSM、BIM、PGD、CarliniandWagnerAttacks(C&W)。对抗攻击和防御首先我们简单来说一说对抗攻击和防御的目的。攻击就是对原始样本增加扰动生成对抗版本最大化损失函数,同时扰动尽可能地小,让人类肉眼无法察觉;防御问题是基于这种攻击方法训练一个更具鲁棒性的神经网络。数学表…

    2025年6月14日
    5
  • 借助栈来实现单链表的逆置运算_中缀后缀表达式互相转换

    借助栈来实现单链表的逆置运算_中缀后缀表达式互相转换原题链接算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。输入格式:输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。输出格式:在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。输入样例:2+3*(7-4)+8/4输出样例:2 3 7 4 – * + 8 4 / +注意

    2022年8月8日
    5
  • 深度学习中Dropout原理解析「建议收藏」

    深度学习中Dropout原理解析「建议收藏」1.Dropout简介1.1Dropout出现的原因在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一…

    2022年6月14日
    43
  • 神经网络之梯度下降法及其实现

    神经网络之梯度下降法及其实现本文将从一个下山的场景开始 先提出梯度下降算法的基本思想 进而从数学上解释梯度下降算法的原理 最后实现一个简单的梯度下降算法的实例 文章目录一 梯度下降的场景假设二 梯度三 梯度下降算法的数学解释四 梯度下降算法的实例五 梯度下降算法的实现一 梯度下降的场景假设梯度下降法的基本思想可以类比为一个下山的过程 假设这样一个场景 一个人被困在山上 需要从山上下来 i e 找到山的最低点 也就是山

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号