主讲 :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

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

  1. sshd_config 中 PermitRootLogin 的探讨

    PermitRootLogin的可选项 众所周知,sshd_config是sshd的配置文件,其中PermitRootLogin可以限定root用户通过ssh的登录方式,如禁止登陆.禁止密码登录.仅允 ...

  2. 一步追加 `/etc/ssh/sshd_config` 中的`PasswordAuthentication yes` , `PermitRootLogin yes` , 允许ssh远程密码登录

    Linux一步追加 /etc/ssh/sshd_config 中的PasswordAuthentication yes , PermitRootLogin yes , 允许ssh远程密码登录的脚本 一 ...

  3. Redis中的执行命令的过程

    Redis中的执行命令的过程 在redis.c的initServerConfig()方法中,通过调用dictCreate方法初始化server端的命令表.这个命令表是一个hashtable,可以通过k ...

  4. shell脚本中执行命令_如何在Shell脚本中执行命令?

    shell脚本中执行命令 Shell is a command-line interpreter that allows the user to interact with the system. I ...

  5. pycharm中导出依赖包 在pycharm下边的Terminal打开命令行终端执行命令

    pycharm中导出依赖包 1 在pycharm下边的Terminal打开命令行终端执行命令 D:\nlp\salary\aSalary>pip freeze > d:\nlp\salar ...

  6. 3.请执行命令取出linux中eth0的IP地址(考试题答案系列)

    说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://oldboy.blog.51cto.com/2561410 ...

  7. ssh升级后+sftp+java_java中使用JSCH包,SFTP及SSH2文件操作及远程命令执行(改进)...

    我写过一篇java中使用JSCH包,SFTP及SSH2文件操作及远程命令执行,现在想来,觉得调用方式太过于绕,不符合我写程序的风格,所以进行了改进. 参数类,用于配置连接的参数,SshConfigur ...

  8. python paramiko模块中设置执行命令超时值

    经常使用paramiko工具对几百台设备进行管理,但是由于服务器本身或是网络原因,有时返回值回不来,然后程序就看在那里一直等待,这个时候后需要设置一个超时值.paramiko模块中执行命令代码如下: ...

  9. Windows中通过bat定时执行命令和mysqldump实现数据库备份

    场景 Windows Server 的服务器,使用的数据库是Mysql数据库. 需要定时对数据库进行备份. 怎样通过一个bat脚本双击运行后定时执行命令. 通过Mysql自带的mysqldump实现将 ...

最新文章

  1. XFile 关键帧动画的解析遇到的问题
  2. c++ 三次多项式拟合_非线性回归模型(一)--多项式回归
  3. 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
  4. 阿里代码扫描插件安装 (IDEA)
  5. 图解在Matlab中初步操作一下3D图形学算法
  6. 过渡效果_12个酷炫创意的动画过渡效果AE模板
  7. 面向对象编程(第五篇)
  8. django项目的创建与启动
  9. JAVA中的I/O流
  10. 电源大师课笔记 3.3
  11. java action 参数_Structs复习 Action传递参数
  12. java调用萤石对讲_海康萤石摄像头SDK Java(一)java本地调用摄像头
  13. Python Turtle绘图[难度2星]:横切的橙子(配色优化——邻近色/反差色)
  14. 今天是 Java 诞生日,Java 24 岁了!
  15. 网络工程师学习必备!路由器的工作原理,你真的懂了吗?【超详细|深度解析】
  16. 草根微信营销的案例剖析
  17. urlscan_砍死! 我不喜欢它-URLScan为零步
  18. STM32 链接文件使用
  19. ICASSP2022论文阅读记录3 - TalkingFlow
  20. 河南省濮阳市谷歌高清卫星地图下载

热门文章

  1. v-model与:model
  2. Zephyr调度算法
  3. 停电、来电报警器电路(三)
  4. java ATM查看余额_Java测试总结(ATM)
  5. 算法训练 Hanoi问题
  6. 三菱FX3U485-BD与台达变频器modbus通讯
  7. 苏小红C语言程序设计第九、十章知识总结
  8. Raspberry Pi Zero:5美元的计算机
  9. PCM/FM解调原理与Matlab算法仿真
  10. 学生用全光谱护眼灯好吗?盘点五款护眼台灯