开始讲故事
Long long ago, Linux远程访问方式有telnet、ssh两种协议;有人可能还会说vnc和rdp协议方式,后面这两种主要是可视化桌面场景下的,并非主流。
时过境迁,telnet因安全性低逐渐被禁用淘汰,最后就剩下独苗一棵ssh。使用ssh管控设备总该安全了吧!No~你不能直接使用root远程登录设备。
基于上面故事情节,我们只对sshd服务禁用root远程访问展开聊聊。禁用root远程登录的方法很多,总体而言两类:1、sshd自身提供能力;2、基于PAM模块能力。
sshd自身提供能力(最简单)
确保PermitRootLogin no被配置
~]# grep -i Root /etc/ssh/sshd_config
PermitRootLogin yes
基于PAM(Pluggable Authentication Modules)模块能力
基于PAM可以使用Modules实现相关功能,例如:pam_securetty.so或pam_listfile.so。相对简单的是pam_securetty,pam_listfile不太常用(后面我们再出一篇展开讲讲)。
centos7
1、在centos7中pam_securetty默认在/etc/pam.d/login (对telnet或控制台登录有效)中配置
~]# grep -i pam_securetty /etc/pam.d/login
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
2、由/etc/securetty起到白名单作用,该文件不存在,则上述配置失效。
~]# ll /etc/securetty
-rw-------. 1 root root 221 Apr 1 2020 /etc/securetty
国产Linux(Anolis8)
1、默认pam包中包含pam_securetty,但,不再默认定义到/etc/pam.d/login ;/etc/securetty文件也不存在。
配置禁止root远程访问sshd
1、确保/etc/pam.d/sshd首行配置了pam_securetty.so
~]# grep -i pam_securetty /etc/pam.d/sshd
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
2、确保/etc/securetty文件存在且为空。
总结
如果PermitRootLogin no和securetty都配置了,肯定也没毛病。如果要临时放开root远程访问就要一一拆除。securetty文件本身是登录设备白名单,不同版本操作系统下对ssh管控设备名不太一样:
~]# who
root pts/0 2024-12-04 13:48 (192.168.xx.xxx)
如上回显中pts/0就是一种终端设备:/etc/securetty值类型:①tty:终端 ②pts:伪终端 ③console:当前的控制台 ④vc:visual console虚拟控制台 ⑤vt:虚拟终端 ⑥hvc ⑦hvsi ⑧xvc等。
但是,经我测试,在Anolis8中,如果要临时允许root远程ssh,则需要配置ssh到/etc/securetty,而不是pts伪终端。