传统的远程传输协议(如FTP、Telnet)在本质上都是不安全的,传输内容是明文,容易遭受“中间人”攻击。因此,在管理远程服务器时,最常使用的是SSH远程连接协议。SSH传输的数据是加密的,可以有效地防止远程连接会话时出现信息泄密。在数据传输的时候,SSH会先对联机的数据包通过加密技术进行加密处理,然后再进行数据的传输,确保了传输过程中的安全性,可以有效防范“中间人”攻击。但是,SSH的不安全配置在一定程度上也会造成一系列安全问题,如弱口令枚举、特权用户登录等。
查询系统SSH协议开启的端口号,默认端口为22,此时可通过修改sshd_config配置文件的Port参数指定需要设定的SSH服务端口,并重启SSH服务使其生效。修改SSH默认端口号的命令如下,结果如图3-9所示。
图3-9 修改SSH默认端口号
通过Nmap等端口探测工具,利用目标端口返回的指纹信息进行快速比对,可快速探测目标服务开启的SSH服务的端口号。执行如下命令,结果如图3-10所示。
图3-10 Nmap端口探测结果
为隐藏SSH服务类型,避免被端口探测工具指纹识别,可以通过修改sshd_config配置文件,增加DebianBanner no一行,可以隐藏SSH携带系统的版本信息,利用sed-i命令行可以清除SSH指纹携带的版本信息,命令如下。隐藏指纹后的扫描结果如图3-11所示。
图3-11 SSH隐藏指纹后Nmap的扫描结果
查询当前Linux系统的SSH协议是否允许特权用户登录,可以通过查询SSH服务的sshd_config配置文件PermitRootLogin参数,yes为允许特权用户登录,no为不允许特权用户登录。允许特权用户登录命令如下,结果如图3-12所示。
图3-12 允许特权用户登录
通过修改SSH服务的sshd_config配置文件PermitRootLogin为no,然后重启SSH服务,则可以禁止特权用户远程登录,结果如图3-13所示。
图3-13 拒绝特权用户远程登录
SSH服务默认是没有对远程登录来源进行有效限制的,有可能造成SSH弱口令枚举攻击等,此时可以通过修改Linux系统的hosts.allow和hosts.deny两个文件,对访问来源进行有效的访问控制。在hosts.deny文件中添加sshd:ALL,可阻止所有远程主机访问;在hosts.allow文件中增加允许远程主机访问的IP地址列表,如sshd:172.16.213.12,这样就只允许IP地址为172.16.213.12的主机使用SSH协议进行远程连接。图3-14所示为拒绝远程主机访问,图3-15所示为允许远程主机访问。
图3-14 拒绝远程主机访问
为防止SSH服务弱口令枚举攻击,可以通过修改/etc/pam.d/目录下的login和sshd文件,增加SSH服务非法登录次数限制,例如:当用户错误输入口令3次以上时,会暂时锁定当前用户1min。在login文件中添加以下内容,结果如图3-16所示。
图3-15 允许远程主机访问
参数说明如下。
● even_deny_root:限制root用户。
● deny:设置普通用户和root用户连续错误登录的最大次数。
● unlock_time:设定普通用户锁定后,多长时间后解锁,单位为s。
● root_unlock_time:设定root用户锁定后,多长时间后解锁,单位为s。
图3-16 修改login文件内容
在sshd文件中添加以下内容,结果如图3-17所示。
图3-17 修改sshd文件内容
修改完login和sshd文件后,当远程系统通过SSH服务连接该主机时,如果第一次输入口令错误,即便再次输入正确口令也不能够正常登录系统,系统会将该用户锁定30s后再进行登录。同时,也可在该系统中执行如下pam_tally2命令,查看远程系统连接该主机输入错误密码的次数,结果如图3-18所示。
图3-18 查看错误密码次数