Linux学习笔记(33)linux服务器通过hosts设置限制ssh访问

一、简介

Tcpwrappers: Transmission Control Protocol (TCP) Wrappers 为由 inetd 生成的服务提供了增强的安全性。

  TCP Wrappers 是一种对使用 /etc/inetd.sec 的替换方法。TCP Wrappers 提供防止主机名和主机地址欺骗的保护。欺骗是一种伪装成有效用户或主机以获得对系统进行未经授权的访问的方法。

  TCPWrappers使用访问控制列表(ACL) 来防止欺骗。ACL 是 /etc/hosts.allow 和 /etc/hosts.deny 文件中的系统列表。在配置为验证主机名到 IP 地址映射,以及拒绝使用 IP 源路由的软件包时,TCP Wrappers 提供某些防止 IP 欺骗的保护。

T  cpwrappers工作原理 :在服务器向外提供的tcp服务商包装一层安全检测机制。外来连接请求首先通过这个安全检测,获得安全认证后才可被系统服务接受。

二、配置方法

方法1:在hosts.allow中配置信任主机规则,然后到hosts.deny中拒绝所有其他主机

hosts.allow 配置文件

# 设置IP网段
sshd:192.168.1.0/255.255.255.0:allow
sshd:192.168.1.*:allow

# 设置具体某个IP地址
sshd:192.168.1.200:allow

hosts.deny 配置文件

sshd:all:deny

 


方法2:允许所有IP访问,拒绝指定IP不可访问

hosts.allow 配置文件

sshd:all:allow

hosts.deny 配置文件

# 设置IP网段
sshd:192.168.1.0/255.255.255.0:deny
sshd:192.168.1.*:deny
# 设置具体某个IP地址
sshd:192.168.1.200:deny

 

注意的是hosts.allow许可大于hosts.deny,如果hosts.allow与hosts.deny产生冲突,以hosts.allow为准一般为下面两种:

  1)hosts.allow填写允许的IP网段范围,hosts.deny填写sshd:all:deny,这样可以控制只有hosts.allow的网段能ssh登录计算机

  2)hosts.allow填写sshd:all:allow,hosts.deny填写拒绝的IP网段范围,这样可以控制hosts.deny的网段能无法ssh登录计算机编辑完上面两个文件后,无需重启任何配置文件,即时生效。

【故障解决】 

(1)配置后不生效

数据包经过本地iptables防火墙后的权限分布图

  数据包通过iptables规则检查之后,系统还会判断这个数据包所使用的的应用程序是否调用到 Libwrap.So 链接库文件。

  如果使用 Libwrap.so 链接库文件的话会走 /etc/hosts.allow 和 hosts.deny文件,可以在这两个文件再次做一次管控,如果应用程序不调用 Libwrap.so 链接库那么数据包就直接到达本地应用程序了。

说明:

  1.一个IP请求连入,linux的检查策略是先看/etc/hosts.allow中是否允许,如果允许直接放行;如果没有,则再看/etc/hosts.deny中是否禁止,如果禁止那么就禁止连入。

  2. 实验发现对/ etc/hosts.allow 和/ etc/hosts.deny 的配置不用重启就立即生效,但不管重启不重启当前已有会话都不会受影响;

    也就是说对之前已经连入的,即便IP已配置为禁止登录会话仍不会强制断开。不过不知是否所有linux都一样,由此第四步标为可选。

  .网上发现有些教程写成不是sshd而是in.sshd不是in.telnetd而是telnetd的,个人觉得应该是独立启的不用加in.托管于xinetd的需要加in.

通过配置hosts.allow、hosts.deny,控制SSH限制固定IP登陆

按照以往的方法,分别在hosts.allow、hosts.deny加入以下配置

# more /etc/hosts.allow
sshd:192.168.x.x

# more /etc/hosts.deny
sshd:all

 

保存后测试,发现配置无效,其他IP还是可以登陆成功。

解决方法如下:

  hosts.allow和hosts.deny属于tcp_Wrappers防火墙的配置文件,而用tcp_Wrappers防火墙控制某一服务访问策略的前提是,该服务支持tcp_Wrappers防火墙,即该服务应用了libwrapped库文件。

查看某服务(如ssh)是否应用了libwrapped库文件的方法是:

# ldd /usr/sbin/sshd |grep libwrap.so.0

 

没有显示,表示此服务器上安装的SSH没有应用libwrapped库文件,也就不能用tcp_Wrappers防火墙控制访问策略。

(一般情况下服务器默认安装的SSH都是支持libwrapped库文件,这台服务器不清楚为什么不支持)

最终解决方法是重新安装SSH。

#注意,安装完之后,因为重建ssh密钥会变化,以前登录保存过历史host_key服务器 ssh 该机器会出现 ssh 报错(Host key verification failed)。
# yum -y remove openssh
# yum -y install openssh
# yum -y install openssh-server

(2)ssh 报错:Host key verification failed

在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.The fingerprint for the RSA key sent by the remote host is36:68:a6:e6:43:34:6b:82:d7:f4:df:1f:c2:e7:37:cc.
Please contact your system administrator.Add correct host key in /u/xlian008/.ssh/known_hosts to get rid of this message.
Offending key in /u/xlian008/.ssh/known_hosts:2RSA host key for 135.1.35.130 has changed and you have requested strict checking.
Host key verification failed.

 

比较奇怪,于是研究了一下。 

  ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。( 假如用root账户登录机器,然后去 ssh 被修改目标服务器,那文件就存在 /root/.ssh/know_hosts )
  当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。我在上面列出的情况,就是这种情况。
 

原因:一台主机上有多个Linux系统,会经常切换,那么这些系统使用同一ip,登录过一次后就会把ssh信息记录在本地的~/.ssh/known_hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告,需要手动删除修改known_hsots里面的内容。 

有以下两个解决方案:

  1. 手动删除修改known_hsots里面的内容; 

  2. 修改配置文件“~/.ssh/config”,加上这两行,重启服务器。 

StrictHostKeyChecking no 
UserKnownHostsFile /dev/null 


优缺点: 

1. 需要每次手动删除文件内容,一些自动化脚本的无法运行(在SSH登陆时失败),但是安全性高; 

2. SSH登陆时会忽略known_hsots的访问,但是安全性低;

 

【参考文档】

转自:https://blog.csdn.net/Hu_wen/article/details/131281272

ssh报错转自:http://blog.csdn.net/yasaken/article/details/7348441 

 

posted @ 2023-06-28 10:20  郭大侠1  阅读(508)  评论(0编辑  收藏  举报