///////////////////////////////写在前面//////////////////////////////////////
原帖地址:
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的三把锁的更多相关文章

  1. 如何增加黑客通过ssh入侵的难度--保护ssh的三把锁

    源文档:https://blog.csdn.net/cnbird2008/article/details/6130696 简介 如果需要远程访问计算机并启用了 Secure Shell (SSH) 连 ...

  2. 保护 SSH 的三把锁

    转自:https://www.ibm.com/developerworks/cn/aix/library/au-sshlocks/index.html 简介 如果需要远程访问计算机并启用了 Secur ...

  3. 并发编程之 Java 三把锁

    前言 今天我们继续学习并发.在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性.其中,synchronized 高频出现,因为他既保证了原 ...

  4. java对象头信息和三种锁的性能对比

    java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...

  5. synchronized(三) 锁的膨胀过程(锁的升级过程)深入剖析

    警告⚠️:本文耗时很长,先做好心理准备................哈哈哈 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是 ...

  6. jdk源码剖析三:锁Synchronized

    一.Synchronized作用 (1)确保线程互斥的访问同步代码 (2)保证共享变量的修改能够及时可见 (3)有效解决重排序问题.(Synchronized同步中的代码JVM不会轻易优化重排序) 二 ...

  7. Java多线程(三)锁对象和线程池

    1:锁(Lock) 1.1       java提供了一个锁的接口,这个锁同样可以达到同步代码块的功能,API文档上说使用锁比使用synchronized更加灵活. 1.2       如何使用这个“ ...

  8. oslab oranges 一个操作系统的实现 实验四 认识保护模式(三):中断异常

    实验目的: 理解中断与异常机制的实现机理 对应章节:第三章3.4节,3.5节 实验内容: 1. 理解中断与异常的机制 2. 调试8259A的编程基本例程 3. 调试时钟中断例程 4. 建立IDT,实现 ...

  9. 4月26日 python学习总结 JoinableQueue、线程、三种锁

    一.进程队列补充-创建进程队列的另一个类JoinableQueue JoinableQueue同样通过multiprocessing使用. 创建队列的另外一个类: JoinableQueue([max ...

随机推荐

  1. EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了

    需求痛点 我们经常收到这样一种需求,就是将客户手里的各种类型的网络摄像机IPC和网络硬盘录像机NVR进行统一的整合接入和管理,并进行常规的直播.存储.录像检索和回放等操作,而这个时候我们通常会选择用E ...

  2. Java基础 - 获取键盘输入

    package com.demo3; import java.util.Scanner; /* * 使用 Scanner 获取键盘输入供程序使用 * * 使用步骤: * A:导包 * import j ...

  3. 解决john不能开多个进程的问题

    在使用john进行shadow文件破解时,如果已经开了一个john的进程,这回提示以下错误: Crash recovery file is locked: /root/.john/john.rec   ...

  4. Linux中的特殊字符

    单引号: 在单引号中所有的特殊字符都没有特殊含义 双引号: 在双引号中 $ ` \ 三个字符表示,调用变量的值.引用命令.转义,其他特殊字符均没有特殊含义 反引号: 用反引号括起来的内容被当作系统命令 ...

  5. 启动hive --service metastore &出现Missing Hive Execution Jar: /opt/apache-hive-1.2.0-bin//lib/hive-exec-*.jar

    原因:出现上述问题通常是运行hive 在bin/目录下的脚本所致. 解决办法:就是让HIVE_HOME变量指向hive-trunk/build/dist目录,将$HIVE_HOME/bin添加到PAT ...

  6. ssh 的用法

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...

  7. Learning Notes for HTML/CSS/JS

    @1:内部样式表 & 外部样式表 内部样式表的定义,放在<style></style>中,<style>标签放在<head>中 <html ...

  8. settings配置 文件操作

    设置文件路径 import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 这里用到了python中一个神奇的变量 __file__ ...

  9. Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程

    1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...

  10. MyBatis SQL 生成方法 增删改查

    此类根据JAVA实体BEAN生成MYBATIS的接口SQL(mapper) package com.sicdt.sicsign.bill.service.hessian; import java.la ...