【sshd】sshd_config 中 PermitRootLogin 的forced-commands-only的限定密钥登陆、限定执行命令

【sshd】sshd_config 中 PermitRootLogin 的forced-commands-only的限定密钥登陆、限定执行命令主讲:PermitRootLogin的可选项众所周知,sshd_config是sshd的配置文件,其中PermitRootLogin可以限定root用户通过ssh的登录方式,如禁止登陆、禁止密码登录、仅允许密钥登陆和开放登陆,以下是对可选项的概括:参数类别 是否允许ssh登陆 登录方式 交互shell yes 允许 没有限制 没有限制 without-password 允许 除密码以外 没有限制 forced-commands-on

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

主讲 :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、配置公钥与密钥(详见另一篇文章)

2、修改/etc/ssh/sshd_config文件,确保其中填写了以下几行

RSAAuthentication yes 
PubkeyAuthentication yes

设置forced-commands-only相关参数
修改/etc/ssh/sshd_config文件,添加以下一行:

PermitRootLogin forced-commands-only

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

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

4、重启sshd进程
在客户端上使用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

配置完毕后的效果如下:

[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.

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

参考资料
https://www.novell.com/support/kb/doc.php?id=7007565
http://askubuntu.com/questions/449364/what-does-without-password-mean-in-sshd-config-file
https://blog.csdn.net/huigher/article/details/52972013

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java多线程超详解

    Java多线程超详解引言随着计算机的配置越来越高,我们需要将进程进一步优化,细分为线程,充分提高图形化界面的多线程的开发。这就要求对线程的掌握很彻底。那么话不多说,今天本帅将记录自己线程的学习。线程的相关API//获取当前线程的名字Thread.currentThread().getName()1.start():1.启动当前线程2.调用线程中的run方法2.run():通常需要重写Thread类中的此…

    2022年6月6日
    29
  • MySQL枚举类型enum字段在插入不在指定范围的值时, 是否是”插入了enum的第一个值”?…「建议收藏」

    MySQL枚举类型enum字段在插入不在指定范围的值时, 是否是”插入了enum的第一个值”?…

    2022年2月9日
    38
  • web基础知识总结_Web站点基础阶段包含哪些阶段

    web基础知识总结_Web站点基础阶段包含哪些阶段传统身份验证的方法:HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在C…

    2025年7月11日
    1
  • fmincon函数应用实例_abb调用例行程序

    fmincon函数应用实例_abb调用例行程序前言一般我们写接口自动化的时候,遇到复杂的逻辑,都会调用API方法来满足前置条件,Pytest的特性是无法用例之间相互调动的,我们一般只调用自己封装的API方法。而httprunner支持用例之间

    2022年7月29日
    3
  • JVM内存分配担保机制[通俗易懂]

    JVM内存分配担保机制[通俗易懂]                  JVM内存分配担保机制                       转自:https://cloud.tencent.com/developer/article/1082730 在现实社会中,借款会指定担保人,就是当借款人还不起钱,就由担保人来还钱。在JVM的内存分配…

    2022年5月28日
    113
  • 【图解算法】模板+变式——带你彻底搞懂字典树(Trie树)

    【图解算法】模板+变式——带你彻底搞懂字典树(Trie树) 啥是字典树?【字典树】(TrieTree)是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。                                                    ——百度·百科so?所以到底什么是字典树? 还好,它还有其他的名字,更能表述出它的实质:前缀树、单词查找树&nbs

    2022年9月7日
    1

发表回复

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

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