保护SSH的三把锁
///////////////////////////////写在前面//////////////////////////////////////
原帖地址:
http://www.ibm.com/developerworks/cn/aix/library/au-sshlocks/index.html?ca=drs-#ibm-pcon
本文在原贴的基础上稍作修改,如有错误请及时告诉我
//////////////////////////////////////////////////////////////////////////////
简介:
如果需要远程访问计算机并启用了 Secure Shell (SSH) 连接,黑客就会尝试突破您的防线并控制您的计算机,您必须接受这个事实。尽管不能保证计算机不会被 “黑客” 占领,但是一些简单的解决方案有助于保护 SSH,可以让攻击困难一些。本文讨论三种技术:
1.把 SSH 的标准端口改为不常用的值并增强 SSH 配置,从而挡住最简单的攻击。
2.定义有限的用户列表,只允许这些用户登录。
3.完全隐藏允许 SSH 访问的事实,要求根据特殊的 “敲门” 序列识别有效用户。
要想应用这些技术,需要能够访问根账户。另外,可能必须安装一些包,需要配置防火墙和路由器(如果有路由器的话),打开和关闭特定的端口并把数据包转发到您的计算机。
加强保护:
人人都知道 SSH 连接的标准端口是 22。因此,为了让计算机更安全,应该采取的第一个措施是把端口改为另一个不常用的非标准端口号,比如 22960。1024 以上的号码通常都可以使用,但是应该查阅参考资料以避免导致问题。这一修改对您的影响仅仅是必须使用下面的命令连接计算机:
ssh -p your.machine.url 或者是 ssh user@ip -p port
为了实现这个小措施,只需在 /etc/ssh/sshd_config 文件中做简单的修改。编辑此文件(必须作为根用户),寻找 Port 22 行,把端口号改为您选择的号码(如果这一行以镑符 [#] 开头,表示它被注释掉了,那么应该取消注释标志)。保存文件,用 /etc/init.d/sshd restart 命令重新启动 SSH。应该在防火墙上打开您选择的端口并关闭端口 22。
但是,还可以更进一步。编辑配置文件,在其中包含 清单 1 所示的行。注意,其中一些行可能已经存在,但是可以把它们注释掉。
清单 1. 通过修改 SSH 配置文件简便地增强安全性
Port
LoginGraceTime #LoginGraceTime 允许一次登录花费 30 秒;如果用户花费的时间超过 30 秒,就不允许他访问,必须重新登录。
MaxAuthTries #MaxAuthTries 把错误尝试的次数限制为 3 次,3 次之后拒绝登录尝试。
Protocol #Protocol 2 禁止使用比较弱的协议。
PermitRootLogin no #禁止使用root账户进行远程登录,这会让黑客攻击更困难。
PermitRootLogin without-password #用户仅能通过密钥认证登陆,取消密码登陆
DenyUsers/AllowUsers user
DenyGroups/AllowGroups group
这些修改不会显著增强计算机的安全性,但是只尝试强力攻击标准端口 22 的一般脚本会失败,不会造成损害。无论如何,这是向正确的方向迈出了第一步。在本文后面,我们将使用更安全的方法,不仅修改端口号,而且完全隐藏它。
谁可以进入:
PAM 代表可插入身份验证模块(Pluggable Authentication Modules)。这些模块提供额外的身份验证规则,保护对计算机的访问。
首先讨论一个基本问题:究竟为什么要使用 PAM?如果每个程序不得不定义自己的身份验证逻辑,就会很混乱。如何确定所有应用程序都实现了相同的测试和检查?如果需要额外的控制手段,那么怎么办?难道要重新编写所有程序吗?在计算机科学领域,有时候可以用额外的一层解决所有问题,至少在安全方面是这样。如果一个程序需要验证用户的身份,它可以调用 PAM API。这个 API 负责执行在 PAM 配置文件中指定的所有检查。这种方法还允许方便地修改身份验证规则,所有感知 PAM 的程序都会自动地应用新规则,不需要修改它们的代码。如果希望使用某种生物学检查(比如虹膜扫描器或指纹采集器),而且生产商提供了 PAM,就可以方便地设置它。在配置文件中包含模块调用,所有应用程序就可以使用这个设备了。
配置 PAM:
PAM 提供四个安全领域的特性,但是应用程序不太可能同时需要所有这些方面。例如,passwd 命令只需要下面列表中的第三组:
account 处理账户限制。对于有效的用户,允许他做什么?
auth 处理用户识别 — 例如,通过输入用户名和密码。
password 只处理与密码相关的问题,比如设置新密码。
session 处理连接管理,包括日志记录。
在 /etc/pam.d 目录中为将使用 PAM 的每个应用程序创建一个配置文件,文件名与应用程序名相同。例如,login 命令的配置文件是 /etc/pam.d/login。
必须定义将应用哪些模块,创建一个动作 “堆”。PAM 运行堆中的所有模块,根据它们的结果允许或拒绝用户的请求。还必须定义检查是否是必需的。最后,other 文件为没有特殊规则的所有应用程序提供默认规则。
optional 模块可以成功,也可以失败;PAM 根据模块是否最终成功返回 success 或 failure。
required 模块必须成功。如果失败,PAM 返回 failure,但是会在运行堆中的其他模块之后返回。
requisite 模块也必须成功。但是,如果失败,PAM 立即返回 failure,不再运行其他模块。
sufficient 模块在成功时导致 PAM 立即返回 success,不再运行其他模块。
行有三个字段:领域 (account、auth、password 或 session)、控制标志(optional、required、requisite 或 sufficient)、将运行的模块的路径和参数。注意,第二个字段可以更复杂;更多信息见 参考资料。另外,可以使用 include 规则以包含其他文件中的规则,比如 auth include common-account。
特殊的 /etc/pam.d/other 文件是 “默认的” 配置文件(见 清单 2),其中的规则自动地应用于没有自己的配置文件的所有应用程序。为了确保安全,应该快速检查 /etc/pam.d 目录,把您不使用的所有配置文件改为其他名称(这样就会使用 other 配置)。如果认为确实需要某个应用程序,那么只需把配置文件改回原来的名称。默认配置通常拒绝所有请求(通过使用 pam_deny.so 模块)并警告管理员(通过 pam_warn.so 模块),让管理员解决问题。
标准的 “other” 配置文件为没有自己的配置文件的所有应用程序提供安全的默认规则(拒绝所有请求)。
清单 2. 标准的 “other” 配置文件
account required pam_deny.so
auth required pam_deny.so
auth required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so
如果把 pam_deny.so 替换为 pam_unix.so,就应用标准的身份验证方法(输入用户名和密码)。如果您不关心安全性,那么使用 pam_permit.so,这会允许任何请求!
一些可用方法:
尽管没有标准的模块列表,但是所有发行版都包含以下模块中的大多数。请检查驻留模块的 /lib/security 或 /usr/lib/security 目录。对于 64 位操作系统,用 lib64 替换 lib。如果需要更多信息,可以尝试执行 man the.name.of.the.module,而不要直接执行它;PAM 不是可执行的二进制代码.
pam_access 根据 /etc/security/access.conf 文件允许或拒绝访问。稍后将使用此模块决定允许哪些用户登录。
pam_cracklib 和 pam_pwcheck 检查新密码的强度。
pam_deny 和 pam_permit 是基本模块,分别拒绝或允许访问。
pam_echo 向用户显示指定文件的内容。
pam_lastlog 向用户显示他上一次登录的日期和时间。
pam_ldap.so 让用户根据 LDAP 服务器进行身份验证,提供跨网络的集中式身份验证。
pam_limits 模块允许指定系统资源限制,限制在 /etc/security/limits.conf 文件中定义。
pam_listfile 提供根据一个文件的内容允许或拒绝服务的另一种方法。
pam_mail 检查用户是否有未处理的邮件。
pam_motd 向用户显示 “message of the day” 文件。
如果 /etc/nologin 文件存在,pam_nologin 阻止所有登录。
pam_rootok 允许根用户访问,不执行进一步检查。/etc/pam.d/su 中常常包含这个模块;必需的行是 auth sufficient pam_rootok.so。根用户可以作为任何用户操作,不需要提供密码。
pam_succeed_if 检查账户的特定属性,比如是否是某个组的成员。
pam_time 可以根据 /etc/security/time.conf 中的规则限制对服务的访问。
pam_unix(或 pam_unix2)提供基于 /etc/passwd 和 /etc/shadow 文件的传统 UNIX® 身份验证。
pam_userdb 根据一个 Berkeley 数据库执行身份验证。
pam_warn 在系统日志中记录信息。
pam_wheel 只向 wheel 组的成员提供根访问权;必需的行是 auth required pam_wheel.so。
关于其他模块和编写自己的模块的信息,请查阅 参考资料。现在,使用 PAM 决定谁可以登录您的计算机。
用 PAM 限制访问
现在,我们来使用 PAM 限制谁可以连接您的服务器。必须编辑 /etc/pam.d/sshd 文件,让它像清单 3 这样。
清单 3. 在 sshd PAM 文件中添加 pam_access.so
#%PAM-1.0
account include common-account
account required pam_access.so
auth include common-auth
auth required pam_nologin.so
password include common-password
session include common-session
在 sshd PAM 文件中添加 pam_access.so,就可以轻松地定义谁可以使用 SSH 连接您的计算机。pam_access.so 模块实现基于 /etc/security/access.conf 文件的安全控制,见清单 4。
清单 4. 通过使用 pam_access.so,定义谁可以或不可以使用 SSH
+ : ALL : 192.168..
+ : jack : ALL
+ : jill : ALL
- : ALL : ALL
第一行允许任何用户 (ALL) 从内部网络登录。后两行允许用户 jack 和 jill 从任何地方访问服务器。最后一行拒绝其他任何用户从其他任何地方访问。允许多个用户访问的另一种方法是使用 pam_listfile.so,这需要创建一个允许访问的用户列表(例如 /etc/ssh_users)。在 /etc/pam.d/sshd 文件中添加以下行:
auth required pam_listfile.so item=user sense=allow
file=/etc/ssh_users onerr=fail
这还没有完。必须修改 /etc/ssh/sshd_config 文件,让它使用 PAM。在此文件中添加 UsePAM yes 行,重新启动 sshd 守护进程,这样就行了!
究竟是否有门?
这个参考最顶的原始帖子吧,这个还没有弄呢,日后补上
上面提到的打开关闭端口号的方法:
iptables -A INPUT -dport 20 -j DROP
iptables -A OUTPUT -dport 20 -j DROP
具体参考这篇文章
http://www.cnblogs.com/ImJerryChan/p/6155869.html
保护SSH的三把锁的更多相关文章
- 如何增加黑客通过ssh入侵的难度--保护ssh的三把锁
源文档:https://blog.csdn.net/cnbird2008/article/details/6130696 简介 如果需要远程访问计算机并启用了 Secure Shell (SSH) 连 ...
- 保护 SSH 的三把锁
转自:https://www.ibm.com/developerworks/cn/aix/library/au-sshlocks/index.html 简介 如果需要远程访问计算机并启用了 Secur ...
- 并发编程之 Java 三把锁
前言 今天我们继续学习并发.在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性.其中,synchronized 高频出现,因为他既保证了原 ...
- java对象头信息和三种锁的性能对比
java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...
- synchronized(三) 锁的膨胀过程(锁的升级过程)深入剖析
警告⚠️:本文耗时很长,先做好心理准备................哈哈哈 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是 ...
- jdk源码剖析三:锁Synchronized
一.Synchronized作用 (1)确保线程互斥的访问同步代码 (2)保证共享变量的修改能够及时可见 (3)有效解决重排序问题.(Synchronized同步中的代码JVM不会轻易优化重排序) 二 ...
- Java多线程(三)锁对象和线程池
1:锁(Lock) 1.1 java提供了一个锁的接口,这个锁同样可以达到同步代码块的功能,API文档上说使用锁比使用synchronized更加灵活. 1.2 如何使用这个“ ...
- oslab oranges 一个操作系统的实现 实验四 认识保护模式(三):中断异常
实验目的: 理解中断与异常机制的实现机理 对应章节:第三章3.4节,3.5节 实验内容: 1. 理解中断与异常的机制 2. 调试8259A的编程基本例程 3. 调试时钟中断例程 4. 建立IDT,实现 ...
- 4月26日 python学习总结 JoinableQueue、线程、三种锁
一.进程队列补充-创建进程队列的另一个类JoinableQueue JoinableQueue同样通过multiprocessing使用. 创建队列的另外一个类: JoinableQueue([max ...
随机推荐
- C#中enum的总结(转载)
1.关于enum的定义 enum Fabric { Cotton = 1, Silk = 2, Wool = 4, Rayon = 8, Other = 128 } 2.符号名和常数值的互相转换 ...
- MySQL中lock与latch的区分
这里要区分锁中容易令人混淆的概念lock与latch.在数据库中,lock与latch都可以成为锁,但两者有截然不同的含义 latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短,若迟勋时 ...
- 关于python代码是编译执行还是解释执行
Python 是编译型语言还是解释型语言?回答这个问题前,应该先弄清楚什么是编译型语言,什么是解释型语言. 所谓编译执行就是源代码经过编译器编译处理,生成目标机器码,就是机器能直接运行的二进制代码,下 ...
- Python— 匿名函数
匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的 “一句话函数” #初始代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = ...
- 使用Kotlin开发Android应用(III):扩展函数和默认值
通过前面两篇文章,我们学习了Kotlin的基本知识,并知道如何配置工程,本文将接着介绍Java没有的而Kotlin实现了的有趣的特性.记住当你对Kotlin语言有任何疑问时,请参考官方指南.该指南组织 ...
- boost之智能指针
内存问题永远是c++中讨论的重要话题 1.c98 auto_ptr的实现,auto_ptr的特点是始终只保持一个指针指向对象,若经过赋值或者拷贝之后原指针失效 #include <iostrea ...
- (扫盲)C#中out和ref之间的区别
首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...
- nginx基础系列
centos中搭建nginx环境 nginx开机启动 nginx配置文件说明 nginx负载均衡配置 nginx upstream模块 nginx配置ssl nginx日志切割 nginx平滑升级
- MySql安装成功后命令行进行必要的配置
1.1 首次用命令行登录 用zip方式安装成功mysql,并通过net start mysql 命令正常启动mysql服务后,打开dos命令行窗口,输入“mysql -uroot -p”或“mysql ...
- MySQL 数据库怎样把一个表的数据插入到另一个表
web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节 ...