标签 安全 下的文章

黑客利用 Wi-Fi 侵犯你隐私的七种方法

Wi-Fi — 啊,你是如此的方便,却又如此的危险!

这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法和反制措施。

利用免费热点

它们似乎无处不在,而且它们的数量会在接下来四年里增加三倍。但是它们当中很多都是不值得信任的,从你的登录凭证、email 甚至更加敏感的账户,都能被黑客用“ 嗅探器 ( sniffer ) ”软件截获 — 这种软件能截获到任何你通过该连接提交的信息。防止被黑客盯上的最好办法就是使用VPN( 虚拟私有网 ( virtual private network ) ),它加密了你所输入的信息,因此能够保护你的数据隐私。

网上银行

你可能认为没有人需要被提醒不要使用免费 Wi-Fi 来操作网上银行, 但网络安全厂商卡巴斯基实验室表示全球超过100家银行因为网络黑客而损失9亿美元,由此可见还是有很多人因此受害。如果你确信一家咖啡店的免费 Wi-Fi 是正规的,想要连接它,那么你应该向服务员确认网络名称。其他人在店里用路由器设置一个开放的无线连接,并将它的网络名称设置成店名是一件相当简单的事。

始终开着 Wi-Fi 开关

如果你手机的 Wi-Fi 开关一直开着的,你会自动被连接到一个不安全的网络中去,你甚至都没有意识到。你可以利用你手机中基于位置的 Wi-Fi 功能,如果有这种功能的话,那它会在你离开你所保存的网络范围后自动关闭你的 Wi-Fi 开关并在你回去之后再次开启。

不使用防火墙

防火墙是你的第一道抵御恶意入侵的防线,它能有效地让你的电脑网络保持通畅并阻挡黑客和恶意软件。你应该时刻开启它除非你的杀毒软件有它自己的防火墙。

浏览非加密网页

说起来很难过,世界上排名前100万个网站中55%是不加密的,一个未加密的网站会让一切传输数据暴露在黑客的眼中。如果一个网页是安全的,你的浏览器则会有标明(比如说火狐浏览器是一把灰色的挂锁,Chrome 浏览器则是个绿锁图标)。但是即使是安全的网站不能让你免于被劫持的风险,他们能通过公共网络从你访问过的网站上窃取 cookies,无论是不是正规网站。

不更新你的安全防护软件

如果你想要确保你自己的网络是受保护的,就更新路由器固件。你要做的就是进入你的路由器管理页面去检查,通常你能在厂商的官方网页上下载到最新的固件版本。

不保护你的家用 Wi-Fi

不用说,设置一个复杂的密码和更改无线连接的默认名都是非常重要的。你还可以过滤你的 MAC 地址来让你的路由器只识别那些确认过的设备。

本文作者 Josh Althuser 是一个开源支持者、网络架构师和科技企业家。在过去12年里,他花了很多时间去倡导使用开源软件来管理团队和项目,同时为网络应用程序提供企业级咨询并帮助它们把产品推向市场。你可以通过他的推特联系他。


via: http://www.networkworld.com/article/3003170/mobile-security/7-ways-hackers-can-use-wi-fi-against-you.html

作者:Josh Althuser 译者:ZTinoZ 校对:Caroline

本文由 LCTT 原创编译,Linux中国 荣誉推出

只需要一次次敲下退格键就够了!

BACKSPACE

两位西班牙的安全研究人员发现了 Linux 的一个奇怪的零日安全漏洞,如果你的 Linux 使用了 GRUB2 密码保护,在输入用户名时,连击 28 个退格键就可以直接进入 GRUB2 救援模式 ( rescue shell ) 。

28 HITS!进入 grub 救援模式

救援模式可是一个具有强大权限的外壳,从而再加上一些其它手段,你就可以直接获得该 Linux 的全部访问权力了。

通过救援模式,跳过验证进行正常模式

具体的技术细节在此就不详述了,可以参考该零日漏洞的详细描述(中文)。

受影响的 GRUB2 跨度很大,从 2009 年发布的版本 1.98 到 2015 年发布的 2.02 均受影响。要想判断你的 GRUB2 是否受影响,可以在 GRUB2 引导提示 GRUB 用户名时,连续输入 28 个退格键即可,如果系统重启了或者出现了 GRUB 救援 shell,那说明就存在该漏洞。

你输入的退格键清空了某个内存空间

需要说明的,该漏洞的利用需要几个条件:

  • 需要能物理接触到你的 Linux 主机
  • Linux 主机使用了受到漏洞影响的 GRUB2 软件
  • GRUB2 使用了密码保护(如果你的 GRUB2 没有设置密码,本来就存在引导时被本地攻击的风险,包括进入单用户模式、救援模式等可直接绕过 Linux 正常启动后的用户验证)

这两位安全研究人员已经为此发布了紧急补丁, Ubuntu、Red Hat 和 Debian 也都发布了他们的补丁。

所以,这个事情提醒我们:“退一步,海阔天空” :D

目标受众

这是一套 Linux 基金会为其系统管理员提供的推荐规范。

这个文档用于帮助那些使用 Linux 工作站来访问和管理项目的 IT 设施的系统管理员团队。

如果你的系统管理员是远程员工,你也许可以使用这套指导方针确保系统管理员的系统可以通过核心安全需求,降低你的IT 平台成为攻击目标的风险。

即使你的系统管理员不是远程员工,很多人也会在工作环境中通过便携笔记本完成工作,或者在家中设置系统以便在业余时间或紧急时刻访问工作平台。不论发生何种情况,你都能调整这个推荐规范来适应你的环境。

限制

但是,这并不是一个详细的“工作站加固”文档,可以说这是一个努力避免大多数明显安全错误而不会导致太多不便的一组推荐 基线 ( baseline ) 。你也许阅读这个文档后会认为它的方法太偏执,而另一些人也许会认为这仅仅是一些肤浅的研究。安全就像在高速公路上开车 -- 任何比你开的慢的都是一个傻瓜,然而任何比你开的快的人都是疯子。这个指南仅仅是一些列核心安全规则,既不详细又不能替代经验、警惕和常识。

我们分享这篇文档是为了将开源协作的优势带到 IT 策略文献资料中。如果你发现它有用,我们希望你可以将它用到你自己团体中,并分享你的改进,对它的完善做出你的贡献。

结构

每一节都分为两个部分:

  • 核对适合你项目的需求
  • 形式不定的提示内容,解释了为什么这么做

严重级别

在清单的每一个项目都包括严重级别,我们希望这些能帮助指导你的决定:

  • 关键(ESSENTIAL) 该项应该在考虑列表上被明确的重视。如果不采取措施,将会导致你的平台安全出现高风险。
  • 中等(NICE) 该项将改善你的安全形势,但是会影响到你的工作环境的流程,可能会要求养成新的习惯,改掉旧的习惯。
  • 低等(PARANOID) 留作感觉会明显完善我们平台安全、但是可能会需要大量调整与操作系统交互的方式的项目。

记住,这些只是参考。如果你觉得这些严重级别不能反映你的工程对安全的承诺,你应该调整它们为你所合适的。

选择正确的硬件

我们并不会要求管理员使用一个特殊供应商或者一个特殊的型号,所以这一节提供的是选择工作系统时的核心注意事项。

检查清单

  • [ ] 系统支持 安全启动 ( SecureBoot ) (关键)
  • [ ] 系统没有 火线 ( Firewire ) , 雷电 ( thunderbolt ) 或者 扩展卡 ( ExpressCard ) 接口 (中等)
  • [ ] 系统有 TPM 芯片 (中等)

注意事项

安全启动 ( SecureBoot )

尽管它还有争议,但是安全引导能够预防很多针对工作站的攻击(Rootkits、“Evil Maid”,等等),而没有太多额外的麻烦。它并不能阻止真正专门的攻击者,加上在很大程度上,国家安全机构有办法应对它(可能是通过设计),但是有安全引导总比什么都没有强。

作为选择,你也许可以部署 Anti Evil Maid 提供更多健全的保护,以对抗安全引导所需要阻止的攻击类型,但是它需要更多部署和维护的工作。

系统没有 火线 ( Firewire ) , 雷电 ( thunderbolt ) 或者 扩展卡 ( ExpressCard ) 接口

火线是一个标准,其设计上允许任何连接的设备能够完全地直接访问你的系统内存(参见维基百科)。雷电接口和扩展卡同样有问题,虽然一些后来部署的雷电接口试图限制内存访问的范围。如果你没有这些系统端口,那是最好的,但是它并不严重,它们通常可以通过 UEFI 关闭或内核本身禁用。

TPM 芯片

可信平台模块 ( Trusted Platform Module ,TPM ) 是主板上的一个与核心处理器单独分开的加密芯片,它可以用来增加平台的安全性(比如存储全盘加密的密钥),不过通常不会用于日常的平台操作。充其量,这个是一个有则更好的东西,除非你有特殊需求,需要使用 TPM 增加你的工作站安全性。

预引导环境

这是你开始安装操作系统前的一系列推荐规范。

检查清单

  • [ ] 使用 UEFI 引导模式(不是传统 BIOS)(关键)
  • [ ] 进入 UEFI 配置需要使用密码 (关键)
  • [ ] 使用安全引导 (关键)
  • [ ] 启动系统需要 UEFI 级别密码 (中等)

注意事项

UEFI 和安全引导

UEFI 尽管有缺点,还是提供了很多传统 BIOS 没有的好功能,比如安全引导。大多数现代的系统都默认使用 UEFI 模式。

确保进入 UEFI 配置模式要使用高强度密码。注意,很多厂商默默地限制了你使用密码长度,所以相比长口令你也许应该选择高熵值的短密码(关于密码短语请参考下面内容)。

基于你选择的 Linux 发行版,你也许需要、也许不需要按照 UEFI 的要求,来导入你的发行版的安全引导密钥,从而允许你启动该发行版。很多发行版已经与微软合作,用大多数厂商所支持的密钥给它们已发布的内核签名,因此避免了你必须处理密钥导入的麻烦。

作为一个额外的措施,在允许某人访问引导分区然后尝试做一些不好的事之前,让他们输入密码。为了防止 肩窥 ( shoulder-surfing ) ,这个密码应该跟你的 UEFI 管理密码不同。如果你经常关闭和启动,你也许不想这么麻烦,因为你已经必须输入 LUKS 密码了(LUKS 参见下面内容),这样会让你您减少一些额外的键盘输入。

发行版选择注意事项

很有可能你会坚持一个广泛使用的发行版如 Fedora,Ubuntu,Arch,Debian,或它们的一个类似发行版。无论如何,以下是你选择使用发行版应该考虑的。

检查清单

  • [ ] 拥有一个强健的 MAC/RBAC 系统(SELinux/AppArmor/Grsecurity) (关键)
  • [ ] 发布安全公告 (关键)
  • [ ] 提供及时的安全补丁 (关键)
  • [ ] 提供软件包的加密验证 (关键)
  • [ ] 完全支持 UEFI 和安全引导 (关键)
  • [ ] 拥有健壮的原生全磁盘加密支持 (关键)

注意事项

SELinux,AppArmor,和 GrSecurity/PaX

强制访问控制 ( Mandatory Access Controls,MAC ) 或者 基于角色的访问控制 ( Role-Based Access Controls,RBAC ) 是一个用在老式 POSIX 系统的基于用户或组的安全机制扩展。现在大多数发行版已经捆绑了 MAC/RBAC 系统(Fedora,Ubuntu),或通过提供一种机制一个可选的安装后步骤来添加它(Gentoo,Arch,Debian)。显然,强烈建议您选择一个预装 MAC/RBAC 系统的发行版,但是如果你对某个没有默认启用它的发行版情有独钟,装完系统后应计划配置安装它。

应该坚决避免使用不带任何 MAC/RBAC 机制的发行版,像传统的 POSIX 基于用户和组的安全在当今时代应该算是考虑不足。如果你想建立一个 MAC/RBAC 工作站,通常认为 AppArmor 和 PaX 比 SELinux 更容易掌握。此外,在工作站上,很少有或者根本没有对外监听的守护进程,而针对用户运行的应用造成的最高风险,GrSecurity/PaX 可能 会比SELinux 提供更多的安全便利。

发行版安全公告

大多数广泛使用的发行版都有一个给它们的用户发送安全公告的机制,但是如果你对一些机密感兴趣,去看看开发人员是否有见于文档的提醒用户安全漏洞和补丁的机制。缺乏这样的机制是一个重要的警告信号,说明这个发行版不够成熟,不能被用作主要管理员的工作站。

及时和可靠的安全更新

多数常用的发行版提供定期安全更新,但应该经常检查以确保及时提供关键包更新。因此应避免使用 附属发行版 ( spin-off ) 和“社区重构”,因为它们必须等待上游发行版先发布,它们经常延迟发布安全更新。

现在,很难找到一个不使用加密签名、更新元数据或二者都不使用的发行版。如此说来,常用的发行版在引入这个基本安全机制就已经知道这些很多年了(Arch,说你呢),所以这也是值得检查的。

发行版支持 UEFI 和安全引导

检查发行版是否支持 UEFI 和安全引导。查明它是否需要导入额外的密钥或是否要求启动内核有一个已经被系统厂商信任的密钥签名(例如跟微软达成合作)。一些发行版不支持 UEFI 或安全启动,但是提供了替代品来确保 防篡改 ( tamper-proof ) 或 防破坏 ( tamper-evident ) 引导环境(Qubes-OS 使用 Anti Evil Maid,前面提到的)。如果一个发行版不支持安全引导,也没有防止引导级别攻击的机制,还是看看别的吧。

全磁盘加密

全磁盘加密是保护静止数据的要求,大多数发行版都支持。作为一个选择方案,带有自加密硬盘的系统也可以用(通常通过主板 TPM 芯片实现),并提供了类似安全级别而且操作更快,但是花费也更高。

发行版安装指南

所有发行版都是不同的,但是也有一些一般原则:

检查清单

  • [ ] 使用健壮的密码全磁盘加密(LUKS) (关键)
  • [ ] 确保交换分区也加密了 (关键)
  • [ ] 确保引导程序设置了密码(可以和LUKS一样) (关键)
  • [ ] 设置健壮的 root 密码(可以和LUKS一样) (关键)
  • [ ] 使用无特权账户登录,作为管理员组的一部分 (关键)
  • [ ] 设置健壮的用户登录密码,不同于 root 密码 (关键)

注意事项

全磁盘加密

除非你正在使用自加密硬盘,配置你的安装程序完整地加密所有存储你的数据与系统文件的磁盘很重要。简单地通过自动挂载的 cryptfs 环 ( loop ) 文件加密用户目录还不够(说你呢,旧版 Ubuntu),这并没有给系统二进制文件或交换分区提供保护,它可能包含大量的敏感数据。推荐的加密策略是加密 LVM 设备,以便在启动过程中只需要一个密码。

/boot分区将一直保持非加密,因为引导程序需要在调用 LUKS/dm-crypt 前能引导内核自身。一些发行版支持加密的/boot分区,比如 Arch,可能别的发行版也支持,但是似乎这样增加了系统更新的复杂度。如果你的发行版并没有原生支持加密/boot也不用太在意,内核镜像本身并没有什么隐私数据,它会通过安全引导的加密签名检查来防止被篡改。

选择一个好密码

现代的 Linux 系统没有限制密码口令长度,所以唯一的限制是你的偏执和倔强。如果你要启动你的系统,你将大概至少要输入两个不同的密码:一个解锁 LUKS ,另一个登录,所以长密码将会使你老的更快。最好从丰富或混合的词汇中选择2-3个单词长度,容易输入的密码。

优秀密码例子(是的,你可以使用空格):

  • nature abhors roombas
  • 12 in-flight Jebediahs
  • perdon, tengo flatulence

如果你喜欢输入可以在公开场合和你生活中能见到的句子,比如:

  • Mary had a little lamb
  • you're a wizard, Harry
  • to infinity and beyond

如果你愿意的话,你也应该带上最少要 10-12个字符长度的非词汇的密码。

除非你担心物理安全,你可以写下你的密码,并保存在一个远离你办公桌的安全的地方。

Root,用户密码和管理组

我们建议,你的 root 密码和你的 LUKS 加密使用同样的密码(除非你共享你的笔记本给信任的人,让他应该能解锁设备,但是不应该能成为 root 用户)。如果你是笔记本电脑的唯一用户,那么你的 root 密码与你的 LUKS 密码不同是没有安全优势上的意义的。通常,你可以使用同样的密码在你的 UEFI 管理,磁盘加密,和 root 登录中 -- 知道这些任意一个都会让攻击者完全控制您的系统,在单用户工作站上使这些密码不同,没有任何安全益处。

你应该有一个不同的,但同样强健的常规用户帐户密码用来日常工作。这个用户应该是管理组用户(例如wheel或者类似,根据发行版不同),允许你执行sudo来提升权限。

换句话说,如果在你的工作站只有你一个用户,你应该有两个独特的、 强健 ( robust ) 而 强壮 ( strong ) 的密码需要记住:

管理级别,用在以下方面:

  • UEFI 管理
  • 引导程序(GRUB)
  • 磁盘加密(LUKS)
  • 工作站管理(root 用户)

用户级别,用在以下:

  • 用户登录和 sudo
  • 密码管理器的主密码

很明显,如果有一个令人信服的理由的话,它们全都可以不同。

安装后的加固

安装后的安全加固在很大程度上取决于你选择的发行版,所以在一个像这样的通用文档中提供详细说明是徒劳的。然而,这里有一些你应该采取的步骤:

检查清单

  • [ ] 在全局范围内禁用火线和雷电模块 (关键)
  • [ ] 检查你的防火墙,确保过滤所有传入端口 (关键)
  • [ ] 确保 root 邮件转发到一个你可以收到的账户 (关键)
  • [ ] 建立一个系统自动更新任务,或更新提醒 (中等)
  • [ ] 检查以确保 sshd 服务默认情况下是禁用的 (中等)
  • [ ] 配置屏幕保护程序在一段时间的不活动后自动锁定 (中等)
  • [ ] 设置 logwatch (中等)
  • [ ] 安装使用 rkhunter (中等)
  • [ ] 安装一个 入侵检测系统 ( Intrusion Detection System ) (中等)

注意事项

将模块列入黑名单

将火线和雷电模块列入黑名单,增加一行到/etc/modprobe.d/blacklist-dma.conf文件:

blacklist firewire-core
blacklist thunderbolt

重启后的这些模块将被列入黑名单。这样做是无害的,即使你没有这些端口(但也不做任何事)。

Root 邮件

默认的 root 邮件只是存储在系统基本上没人读过。确保你设置了你的/etc/aliases来转发 root 邮件到你确实能读取的邮箱,否则你也许错过了重要的系统通知和报告:

# Person who should get root's mail
root:          [email protected]

编辑后这些后运行newaliases,然后测试它确保能投递到,像一些邮件供应商将拒绝来自不存在的域名或者不可达的域名的邮件。如果是这个原因,你需要配置邮件转发直到确实可用。

防火墙,sshd,和监听进程

默认的防火墙设置将取决于您的发行版,但是大多数都允许sshd端口连入。除非你有一个令人信服的合理理由允许连入 ssh,你应该过滤掉它,并禁用 sshd 守护进程。

systemctl disable sshd.service
systemctl stop sshd.service

如果你需要使用它,你也可以临时启动它。

通常,你的系统不应该有任何侦听端口,除了响应 ping 之外。这将有助于你对抗网络级的零日漏洞利用。

自动更新或通知

建议打开自动更新,除非你有一个非常好的理由不这么做,如果担心自动更新将使您的系统无法使用(以前发生过,所以这种担心并非杞人忧天)。至少,你应该启用自动通知可用的更新。大多数发行版已经有这个服务自动运行,所以你不需要做任何事。查阅你的发行版文档了解更多。

你应该尽快应用所有明显的勘误,即使这些不是特别贴上“安全更新”或有关联的 CVE 编号。所有的问题都有潜在的安全漏洞和新的错误,比起停留在旧的、已知的问题上,未知问题通常是更安全的策略。

监控日志

你应该会对你的系统上发生了什么很感兴趣。出于这个原因,你应该安装logwatch然后配置它每夜发送在你的系统上发生的任何事情的活动报告。这不会预防一个专业的攻击者,但是一个不错的安全网络功能。

注意,许多 systemd 发行版将不再自动安装一个“logwatch”所需的 syslog 服务(因为 systemd 会放到它自己的日志中),所以你需要安装和启用“rsyslog”来确保在使用 logwatch 之前你的 /var/log 不是空的。

Rkhunter 和 IDS

安装rkhunter和一个类似aide或者tripwire入侵检测系统(IDS)并不是那么有用,除非你确实理解它们如何工作,并采取必要的步骤来设置正确(例如,保证数据库在外部介质,从可信的环境运行检测,记住执行系统更新和配置更改后要刷新散列数据库,等等)。如果你不愿在你的工作站执行这些步骤,并调整你如何工作的方式,这些工具只能带来麻烦而没有任何实在的安全益处。

我们建议你安装rkhunter并每晚运行它。它相当易于学习和使用,虽然它不会阻止一个复杂的攻击者,它也能帮助你捕获你自己的错误。

个人工作站备份

工作站备份往往被忽视,或偶尔才做一次,这常常是不安全的方式。

检查清单

  • [ ] 设置加密备份工作站到外部存储 (关键)
  • [ ] 使用 零认知 ( zero-knowledge ) 备份工具备份到站外或云上 (中等)

注意事项

全加密的备份存到外部存储

把全部备份放到一个移动磁盘中比较方便,不用担心带宽和上行网速(在这个时代,大多数供应商仍然提供显著的不对称的上传/下载速度)。不用说,这个移动硬盘本身需要加密(再说一次,通过 LUKS),或者你应该使用一个备份工具建立加密备份,例如duplicity或者它的 GUI 版本 deja-dup。我建议使用后者并使用随机生成的密码,保存到离线的安全地方。如果你带上笔记本去旅行,把这个磁盘留在家,以防你的笔记本丢失或被窃时可以找回备份。

除了你的家目录外,你还应该备份/etc目录和出于取证目的的/var/log目录。

尤其重要的是,避免拷贝你的家目录到任何非加密存储上,即使是需要快速的在两个系统上移动文件时,一旦完成你肯定会忘了清除它,从而暴露个人隐私或者安全信息到监听者手中 -- 尤其是把这个存储介质跟你的笔记本放到同一个包里。

有选择的零认知站外备份

站外备份 ( Off-site backup ) 也是相当重要的,是否可以做到要么需要你的老板提供空间,要么找一家云服务商。你可以建一个单独的 duplicity/deja-dup 配置,只包括重要的文件,以免传输大量你不想备份的数据(网络缓存、音乐、下载等等)。

作为选择,你可以使用 零认知 ( zero-knowledge ) 备份工具,例如 SpiderOak,它提供一个卓越的 Linux GUI工具还有更多的实用特性,例如在多个系统或平台间同步内容。

最佳实践

下面是我们认为你应该采用的最佳实践列表。它当然不是非常详细的,而是试图提供实用的建议,来做到可行的整体安全性和可用性之间的平衡。

浏览

毫无疑问, web 浏览器将是你的系统上最大、最容易暴露的面临攻击的软件。它是专门下载和执行不可信、甚至是恶意代码的一个工具。它试图采用沙箱和 代码清洁 ( code sanitization ) 等多种机制保护你免受这种危险,但是在之前它们都被击败了多次。你应该知道,在任何时候浏览网站都是你做的最不安全的活动。

有几种方法可以减少浏览器的影响,但这些真实有效的方法需要你明显改变操作您的工作站的方式。

1: 使用两个不同的浏览器 (关键)

这很容易做到,但是只有很少的安全效益。并不是所有浏览器都可以让攻击者完全自由访问您的系统 -- 有时它们只能允许某人读取本地浏览器存储,窃取其它标签的活动会话,捕获浏览器的输入等。使用两个不同的浏览器,一个用在工作/高安全站点,另一个用在其它方面,有助于防止攻击者请求整个 cookie 存储的小问题。主要的不便是两个不同的浏览器会消耗大量内存。

我们建议:

火狐用来访问工作和高安全站点

使用火狐登录工作有关的站点,应该额外关心的是确保数据如 cookies,会话,登录信息,击键等等,明显不应该落入攻击者手中。除了少数的几个网站,你不应该用这个浏览器访问其它网站。

你应该安装下面的火狐扩展:

  • [ ] NoScript (关键)
+ NoScript 阻止活动内容加载,除非是在用户白名单里的域名。如果用于默认浏览器它会很麻烦(可是提供了真正好的安全效益),所以我们建议只在访问与工作相关的网站的浏览器上开启它。
  • [ ] Privacy Badger (关键)
+ EFF 的 Privacy Badger 将在页面加载时阻止大多数外部追踪器和广告平台,有助于在这些追踪站点影响你的浏览器时避免跪了(追踪器和广告站点通常会成为攻击者的目标,因为它们能会迅速影响世界各地成千上万的系统)。
  • [ ] HTTPS Everywhere (关键)
+ 这个 EFF 开发的扩展将确保你访问的大多数站点都使用安全连接,甚至你点击的连接使用的是 <http://(可以有效的避免大多数的攻击,例如> [SSL-strip](http://www.thoughtcrime.org/software/sslstrip/))。
  • [ ] Certificate Patrol (中等)
+ 如果你正在访问的站点最近改变了它们的 TLS 证书,这个工具将会警告你 -- 特别是如果不是接近失效期或者现在使用不同的证书颁发机构。它有助于警告你是否有人正尝试中间人攻击你的连接,不过它会产生很多误报。

你应该让火狐成为你打开连接时的默认浏览器,因为 NoScript 将在加载或者执行时阻止大多数活动内容。

其它一切都用 Chrome/Chromium

Chromium 开发者在增加很多很好的安全特性方面走在了火狐前面(至少在 Linux 上),例如 seccomp 沙箱,内核用户空间等等,这会成为一个你访问的网站与你其它系统之间的额外隔离层。Chromium 是上游开源项目,Chrome 是 Google 基于它构建的专有二进制包(加一句偏执的提醒,如果你有任何不想让谷歌知道的事情都不要使用它)。

推荐你在 Chrome 上也安装Privacy Badger 和 HTTPS Everywhere 扩展,然后给它一个与火狐不同的主题,以让它告诉你这是你的“不可信站点”浏览器。

2: 使用两个不同浏览器,一个在专用的虚拟机里 (中等)

这有点像上面建议的做法,除了您将添加一个通过快速访问协议运行在专用虚拟机内部 Chrome 的额外步骤,它允许你共享剪贴板和转发声音事件(如,Spice 或 RDP)。这将在不可信浏览器和你其它的工作环境之间添加一个优秀的隔离层,确保攻击者完全危害你的浏览器将必须另外打破 VM 隔离层,才能达到系统的其余部分。

这是一个鲜为人知的可行方式,但是需要大量的 RAM 和高速的处理器来处理多增加的负载。这要求作为管理员的你需要相应地调整自己的工作实践而付出辛苦。

3: 通过虚拟化完全隔离你的工作和娱乐环境 (低等)

了解下 Qubes-OS 项目,它致力于通过划分你的应用到完全隔离的 VM 中来提供高度安全的工作环境。

密码管理器

检查清单

  • [ ] 使用密码管理器 (关键)
  • [ ] 不相关的站点使用不同的密码 (关键)
  • [ ] 使用支持团队共享的密码管理器 (中等)
  • [ ] 给非网站类账户使用一个单独的密码管理器 (低等)

注意事项

使用好的、唯一的密码对你的团队成员来说应该是非常关键的需求。 凭证 ( credential ) 盗取一直在发生 — 通过被攻破的计算机、盗取数据库备份、远程站点利用、以及任何其它的方式。凭证绝不应该跨站点重用,尤其是关键的应用。

浏览器中的密码管理器

每个浏览器有一个比较安全的保存密码机制,可以同步到供应商维护的,并使用用户的密码保证数据加密。然而,这个机制有严重的劣势:

  1. 不能跨浏览器工作
  2. 不提供任何与团队成员共享凭证的方法

也有一些支持良好、免费或便宜的密码管理器,可以很好的融合到多个浏览器,跨平台工作,提供小组共享(通常是付费服务)。可以很容易地通过搜索引擎找到解决方案。

独立的密码管理器

任何与浏览器结合的密码管理器都有一个主要的缺点,它实际上是应用的一部分,这样最有可能被入侵者攻击。如果这让你不放心(应该这样),你应该选择两个不同的密码管理器 -- 一个集成在浏览器中用来保存网站密码,一个作为独立运行的应用。后者可用于存储高风险凭证如 root 密码、数据库密码、其它 shell 账户凭证等。

这样的工具在团队成员间共享超级用户的凭据方面特别有用(服务器 root 密码、ILO密码、数据库管理密码、引导程序密码等等)。

这几个工具可以帮助你:

  • KeePassX,在第2版中改进了团队共享
  • Pass,它使用了文本文件和 PGP,并与 git 结合
  • Django-Pstore,它使用 GPG 在管理员之间共享凭据
  • Hiera-Eyaml,如果你已经在你的平台中使用了 Puppet,在你的 Hiera 加密数据的一部分里面,可以便捷的追踪你的服务器/服务凭证。

加固 SSH 与 PGP 的私钥

个人加密密钥,包括 SSH 和 PGP 私钥,都是你工作站中最重要的物品 -- 这是攻击者最想得到的东西,这可以让他们进一步攻击你的平台或在其它管理员面前冒充你。你应该采取额外的步骤,确保你的私钥免遭盗窃。

检查清单

  • [ ] 用来保护私钥的强壮密码 (关键)
  • [ ] PGP 的主密码保存在移动存储中 (中等)
  • [ ] 用于身份验证、签名和加密的子密码存储在智能卡设备 (中等)
  • [ ] SSH 配置为以 PGP 认证密钥作为 ssh 私钥 (中等)

注意事项

防止私钥被偷的最好方式是使用一个智能卡存储你的加密私钥,绝不要拷贝到工作站上。有几个厂商提供支持 OpenPGP 的设备:

  • Kernel Concepts,在这里可以采购支持 OpenPGP 的智能卡和 USB 读取器,你应该需要一个。
  • Yubikey NEO,这里提供 OpenPGP 功能的智能卡还提供很多很酷的特性(U2F、PIV、HOTP等等)。

确保 PGP 主密码没有存储在工作站也很重要,仅使用子密码。主密钥只有在签名其它的密钥和创建新的子密钥时使用 — 不经常发生这种操作。你可以照着 Debian 的子密钥向导来学习如何将你的主密钥移动到移动存储并创建子密钥。

你应该配置你的 gnupg 代理作为 ssh 代理,然后使用基于智能卡 PGP 认证密钥作为你的 ssh 私钥。我们发布了一个详尽的指导如何使用智能卡读取器或 Yubikey NEO。

如果你不想那么麻烦,最少要确保你的 PGP 私钥和你的 SSH 私钥有个强健的密码,这将让攻击者很难盗取使用它们。

休眠或关机,不要挂起

当系统挂起时,内存中的内容仍然保留在内存芯片中,可以会攻击者读取到(这叫做 冷启动攻击 ( Cold Boot Attack ) )。如果你离开你的系统的时间较长,比如每天下班结束,最好关机或者休眠,而不是挂起它或者就那么开着。

工作站上的 SELinux

如果你使用捆绑了 SELinux 的发行版(如 Fedora),这有些如何使用它的建议,让你的工作站达到最大限度的安全。

检查清单

  • [ ] 确保你的工作站 强制 ( enforcing ) 使用 SELinux (关键)
  • [ ] 不要盲目的执行audit2allow -M,应该经常检查 (关键)
  • [ ] 绝不要 setenforce 0 (中等)
  • [ ] 切换你的用户到 SELinux 用户staff_u (中等)

注意事项

SELinux 是 强制访问控制 ( Mandatory Access Controls,MAC ) ,是 POSIX许可核心功能的扩展。它是成熟、强健,自从它推出以来已经有很长的路了。不管怎样,许多系统管理员现在仍旧重复过时的口头禅“关掉它就行”。

话虽如此,在工作站上 SELinux 会带来一些有限的安全效益,因为大多数你想运行的应用都是可以自由运行的。开启它有益于给网络提供足够的保护,也有可能有助于防止攻击者通过脆弱的后台服务提升到 root 级别的权限用户。

我们的建议是开启它并 强制使用 ( enforcing ) 。

绝不setenforce 0

使用setenforce 0临时把 SELinux 设置为 许可 ( permissive ) 模式很有诱惑力,但是你应该避免这样做。当你想查找一个特定应用或者程序的问题时,实际上这样做是把整个系统的 SELinux 给关闭了。

你应该使用semanage permissive -a [somedomain_t]替换setenforce 0,只把这个程序放入许可模式。首先运行ausearch查看哪个程序发生问题:

ausearch -ts recent -m avc

然后看下scontext=(源自 SELinux 的上下文)行,像这样:

scontext=staff_u:staff_r:gpg_pinentry_t:s0-s0:c0.c1023
                         ^^^^^^^^^^^^^^

这告诉你程序gpg_pinentry_t被拒绝了,所以你想排查应用的故障,应该增加它到许可域:

semange permissive -a gpg_pinentry_t

这将允许你使用应用然后收集 AVC 的其它数据,你可以结合audit2allow来写一个本地策略。一旦完成你就不会看到新的 AVC 的拒绝消息,你就可以通过运行以下命令从许可中删除程序:

semanage permissive -d gpg_pinentry_t
用 SELinux 的用户 staff\_r 使用你的工作站

SELinux 带有 角色 ( role ) 的原生实现,基于用户帐户相关角色来禁止或授予某些特权。作为一个管理员,你应该使用staff_r角色,这可以限制访问很多配置和其它安全敏感文件,除非你先执行sudo。

默认情况下,用户以unconfined_r创建,你可以自由运行大多数应用,没有任何(或只有一点)SELinux 约束。转换你的用户到staff_r角色,运行下面的命令:

usermod -Z staff_u [username]

你应该退出然后登录新的角色,届时如果你运行id -Z,你将会看到:

staff_u:staff_r:staff_t:s0-s0:c0.c1023

在执行sudo时,你应该记住增加一个额外标志告诉 SELinux 转换到“sysadmin”角色。你需要用的命令是:

sudo -i -r sysadm_r

然后id -Z将会显示:

staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023

警告:在进行这个切换前你应该能很顺畅的使用ausearch和audit2allow,当你以staff_r角色运行时你的应用有可能不再工作了。在写作本文时,已知以下流行的应用在staff_r下没有做策略调整就不会工作:

  • Chrome/Chromium
  • Skype
  • VirtualBox

切换回unconfined_r,运行下面的命令:

usermod -Z unconfined_u [username]

然后注销再重新回到舒适区。

延伸阅读

IT 安全的世界是一个没有底的兔子洞。如果你想深入,或者找到你的具体发行版更多的安全特性,请查看下面这些链接:

许可

这项工作在创作共用授权4.0国际许可证许可下。


via: https://github.com/lfit/itpol/blob/bbc17d8c69cb8eee07ec41f8fbf8ba32fdb4301b/linux-workstation-security.md

作者:mricon 译者:wyangsun 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

fail2ban 是一款用于保护你的服务器免于暴力攻击的入侵保护软件。fail2ban 用 python 写成,并广泛用于很多服务器上。fail2ban 会扫描日志文件和 IP 黑名单来显示恶意软件、过多的密码失败尝试、web 服务器利用、wordpress 插件攻击和其他漏洞。如果你已经安装并使用了 fail2ban 来保护你的 web 服务器,你也许会想知道如何在 CentOS 6、CentOS 7、RHEL 6、RHEL 7 和 Oracle Linux 6/7 中找到被 fail2ban 阻止的 IP,或者你想将 ip 从 fail2ban 监狱中移除。

如何列出被禁止的 IP

要查看所有被禁止的 ip 地址,运行下面的命令:

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-AccessForbidden  tcp  --  anywhere             anywhere            tcp dpt:http
f2b-WPLogin  tcp  --  anywhere             anywhere            tcp dpt:http
f2b-ConnLimit  tcp  --  anywhere             anywhere            tcp dpt:http
f2b-ReqLimit  tcp  --  anywhere             anywhere            tcp dpt:http
f2b-NoAuthFailures  tcp  --  anywhere             anywhere            tcp dpt:http
f2b-SSH    tcp  --  anywhere             anywhere            tcp dpt:ssh
f2b-php-url-open  tcp  --  anywhere             anywhere            tcp dpt:http
f2b-nginx-http-auth  tcp  --  anywhere             anywhere            multiport dports http,https
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:EtherNet/IP-1
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


Chain f2b-NoAuthFailures (1 references)
target     prot opt source               destination
REJECT     all  --  64.68.50.128         anywhere            reject-with icmp-port-unreachable
REJECT     all  --  104.194.26.205       anywhere            reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere

如何从 Fail2ban 中移除 IP

# iptables -D f2b-NoAuthFailures -s banned_ip -j REJECT

我希望这篇教程可以给你在 CentOS 6、CentOS 7、RHEL 6、RHEL 7 和 Oracle Linux 6/7 中移除被禁止的 ip 一些指导。


via: http://www.ehowstuff.com/how-to-remove-banned-ip-from-fail2ban-on-centos/

作者:skytech 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

简介

要提供互联网服务,当你在开发代码的时候必须时刻保持安全意识。可能大部分 PHP 脚本都对安全问题都不在意,这很大程度上是因为有大量的无经验程序员在使用这门语言。但是,没有理由让你因为对你的代码的不确定性而导致不一致的安全策略。当你在服务器上放任何涉及到钱的东西时,就有可能会有人尝试破解它。创建一个论坛程序或者任何形式的购物车,被攻击的可能性就上升到了无穷大。

背景

为了确保你的 web 内容安全,这里有一些常规的安全准则:

别相信表单

攻击表单很简单。通过使用一个简单的 JavaScript 技巧,你可以限制你的表单只允许在评分域中填写 1 到 5 的数字。如果有人关闭了他们浏览器的 JavaScript 功能或者提交自定义的表单数据,你客户端的验证就失败了。

用户主要通过表单参数和你的脚本交互,因此他们是最大的安全风险。你应该学到什么呢?在 PHP 脚本中,总是要验证 传递给任何 PHP 脚本的数据。在本文中,我们向你演示了如何分析和防范跨站脚本(XSS)攻击,它可能会劫持用户凭据(甚至更严重)。你也会看到如何防止会玷污或毁坏你数据的 MySQL 注入攻击。

别相信用户

假定你网站获取的每一份数据都充满了有害的代码。清理每一部分,即便你相信没有人会尝试攻击你的站点。

关闭全局变量

你可能会有的最大安全漏洞是启用了 register\_globals 配置参数。幸运的是,PHP 4.2 及以后版本默认关闭了这个配置。如果打开了 register\_globals,你可以在你的 php.ini 文件中通过改变 register\_globals 变量为 Off 关闭该功能:

register_globals = Off 

新手程序员觉得注册全局变量很方便,但他们不会意识到这个设置有多么危险。一个启用了全局变量的服务器会自动为全局变量赋任何形式的参数。为了了解它如何工作以及为什么有危险,让我们来看一个例子。

假设你有一个称为 process.php 的脚本,它会向你的数据库插入表单数据。初始的表单像下面这样:

<input name="username" type="text" size="15" maxlength="64">

运行 process.php 的时候,启用了注册全局变量的 PHP 会将该参数赋值到 $username 变量。这会比通过 **$\_POST['username'] 或 $\_GET['username']** 访问它节省击键次数。不幸的是,这也会给你留下安全问题,因为 PHP 会设置该变量的值为通过 GET 或 POST 的参数发送到脚本的任何值,如果你没有显示地初始化该变量并且你不希望任何人去操作它,这就会有一个大问题。

看下面的脚本,假如 $authorized 变量的值为 true,它会给用户显示通过验证的数据。正常情况下,只有当用户正确通过了这个假想的 authenticated\_user() 函数验证,$authorized 变量的值才会被设置为真。但是如果你启用了 register\_globals,任何人都可以发送一个 GET 参数,例如 authorized=1 去覆盖它:

<?php
// Define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}
?>

这个故事的寓意是,你应该从预定义的服务器变量中获取表单数据。所有通过 post 表单传递到你 web 页面的数据都会自动保存到一个称为 $\_POST** 的大数组中,所有的 GET 数据都保存在 **$\_GET 大数组中。文件上传信息保存在一个称为 $\_FILES** 的特殊数据中。另外,还有一个称为 **$\_REQUEST 的复合变量。

要从一个 POST 方法表单中访问 username 字段,可以使用 $\_POST['username']**。如果 username 在 URL 中就使用 **$\_GET['username']。如果你不确定值来自哪里,用 $\_REQUEST['username']。

<?php
$post_value = $_POST['post_value'];
$get_value = $_GET['get_value'];
$some_variable = $_REQUEST['some_value']; 
?>  

$\_REQUEST 是 $\_GET、$\_POST、和 $\_COOKIE 数组的结合。如果你有两个或多个值有相同的参数名称,注意 PHP 会使用哪个。默认的顺序是 cookie、POST、然后是 GET。

推荐安全配置选项

这里有几个会影响安全功能的 PHP 配置设置。下面是一些显然应该用于生产服务器的:

  • register\_globals 设置为 off
  • safe\_mode 设置为 off
  • error\_reporting 设置为 off。如果出现错误了,这会向用户浏览器发送可见的错误报告信息。对于生产服务器,使用错误日志代替。开发服务器如果在防火墙后面就可以启用错误日志。(LCTT 译注:此处据原文逻辑和常识,应该是“开发服务器如果在防火墙后面就可以启用错误报告,即 on。”)
  • 停用这些函数:system()、exec()、passthru()、shell\_exec()、proc\_open()、和 popen()。
  • open\_basedir 为 /tmp(以便保存会话信息)目录和 web 根目录,以便脚本不能访问这些选定区域外的文件。
  • expose\_php 设置为 off。该功能会向 Apache 头添加包含版本号的 PHP 签名。
  • allow\_url\_fopen 设置为 off。如果你能够注意你代码中访问文件的方式-也就是你验证所有输入参数,这并不严格需要。
  • allow\_url\_include 设置为 off。对于任何人来说,实在没有明智的理由会想要访问通过 HTTP 包含的文件。

一般来说,如果你发现想要使用这些功能的代码,你就不应该相信它。尤其要小心会使用类似 system() 函数的代码-它几乎肯定有缺陷。

启用了这些设置后,让我们来看看一些特定的攻击以及能帮助你保护你服务器的方法。

SQL 注入攻击

由于 PHP 传递到 MySQL 数据库的查询语句是用强大的 SQL 编程语言编写的,就有了某些人通过在 web 查询参数中使用 MySQL 语句尝试 SQL 注入攻击的风险。通过在参数中插入有害的 SQL 代码片段,攻击者会尝试进入(或破坏)你的服务器。

假如说你有一个最终会放入变量 $product 的表单参数,你使用了类似下面的 SQL 语句:

$sql = "select * from pinfo where product = '$product'";

如果参数是直接从表单中获得的,应该使用 PHP 自带的数据库特定转义函数,类似:

$sql = 'Select * from pinfo where product = '"' 
       mysql_real_escape_string($product) . '"';

如果不这样做的话,有人也许会把下面的代码段放到表单参数中:

39'; DROP pinfo; SELECT 'FOO 

那么 $sql 的结果就是:

select product from pinfo where product = '39'; DROP pinfo; SELECT 'FOO' 

由于分号是 MySQL 的语句分隔符,数据库会运行下面三条语句:

select * from pinfo where product = '39'
DROP pinfo
SELECT 'FOO' 

好了,你丢失了你的表。

注意实际上 PHP 和 MySQL 不会运行这种特殊语法,因为 mysql\_query() 函数只允许每个请求处理一个语句。但是,一个子查询仍然会生效。

要防止 SQL 注入攻击,做这两件事:

  • 总是验证所有参数。例如,如果需要一个数字,就要确保它是一个数字。
  • 总是对数据使用 mysql\_real\_escape\_string() 函数转义数据中的任何引号和双引号。

注意:要自动转义任何表单数据,可以启用魔术引号(Magic Quotes)。

一些 MySQL 破坏可以通过限制 MySQL 用户权限避免。任何 MySQL 账户可以限制为只允许对选定的表进行特定类型的查询。例如,你可以创建只能选择行的 MySQL 用户。但是,这对于动态数据并不十分有用,另外,如果你有敏感的用户信息,可能某些人能访问其中一些数据,但你并不希望如此。例如,一个访问账户数据的用户可能会尝试注入访问另一个人的账户号码的代码,而不是为当前会话指定的号码。

防止基本的 XSS 攻击

XSS 表示跨站脚本。不像大部分攻击,该漏洞发生在客户端。XSS 最常见的基本形式是在用户提交的内容中放入 JavaScript 以便偷取用户 cookie 中的数据。由于大部分站点使用 cookie 和 session 验证访客,偷取的数据可用于模拟该用户-如果是一个常见的用户账户就会深受麻烦,如果是管理员账户甚至是彻底的惨败。如果你不在站点中使用 cookie 和 session ID,你的用户就不容易被攻击,但你仍然应该明白这种攻击是如何工作的。

不像 MySQL 注入攻击,XSS 攻击很难预防。Yahoo、eBay、Apple、以及 Microsoft 都曾经受 XSS 影响。尽管攻击不包含 PHP,但你可以使用 PHP 来剥离用户数据以防止攻击。为了防止 XSS 攻击,你应该限制和过滤用户提交给你站点的数据。正是因为这个原因,大部分在线公告板都不允许在提交的数据中使用 HTML 标签,而是用自定义的标签格式代替,例如 [b] 和 [linkto]。

让我们来看一个如何防止这类攻击的简单脚本。对于更完善的解决办法,可以使用 SafeHTML,本文的后面部分会讨论到。

function transform_HTML($string, $length = null) {
// Helps prevent XSS attacks
    // Remove dead space.
    $string = trim($string);
    // Prevent potential Unicode codec problems.
    $string = utf8_decode($string);
    // HTMLize HTML-specific characters.
    $string = htmlentities($string, ENT_NOQUOTES);
    $string = str_replace("#", "&#35;", $string);
    $string = str_replace("%", "&#37;", $string);
    $length = intval($length);
    if ($length > 0) {
        $string = substr($string, 0, $length);
    }
    return $string;
} 

这个函数将 HTML 特定的字符转换为 HTML 字面字符。一个浏览器对任何通过这个脚本的 HTML 以非标记的文本呈现。例如,考虑下面的 HTML 字符串:

<STRONG>Bold Text</STRONG>

一般情况下,HTML 会显示为:Bold Text

但是,通过 transform\_HTML() 后,它就像原始输入一样呈现。原因是处理的字符串中的标签字符串转换为 HTML 实体。transform\_HTML() 的结果字符串的纯文本看起来像下面这样:

<STRONG>Bold Text</STRONG> 

该函数的实质是 htmlentities() 函数调用,它会将 <、>、和 & 转换为 <、>、和 &。尽管这会处理大部分的普通攻击,但有经验的 XSS 攻击者有另一种把戏:用十六进制或 UTF-8 编码恶意脚本,而不是采用普通的 ASCII 文本,从而希望能绕过你的过滤器。他们可以在 URL 的 GET 变量中发送代码,告诉浏览器,“这是十六进制代码,你能帮我运行吗?” 一个十六进制例子看起来像这样:

<a href="http://host/a.php?variable=%22%3e %3c%53%43%52%49%50%54%3e%44%6f%73%6f%6d%65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52%49%50%54%3e"> 

浏览器渲染这个信息的时候,结果就是:

<a href="http://host/a.php?variable="> <SCRIPT>Dosomethingmalicious</SCRIPT>

为了防止这种情况,transform\_HTML() 采用额外的步骤把 # 和 % 符号转换为它们的实体,从而避免十六进制攻击,并转换 UTF-8 编码的数据。

最后,为了防止某些人用很长的输入超载字符串从而导致某些东西崩溃,你可以添加一个可选的 $length 参数来截取你指定最大长度的字符串。

使用 SafeHTML

之前脚本的问题比较简单,它不允许任何类型的用户标记。不幸的是,这里有上百种方法能使 JavaScript 跳过用户的过滤器,并且要从用户输入中剥离全部 HTML,还没有方法可以防止这种情况。

当前,没有任何一个脚本能保证无法被破解,尽管有一些确实比大部分要好。有白名单和黑名单两种方法加固安全,白名单比较简单而且更加有效。

一个白名单解决方案是 PixelApes 的 SafeHTML 反跨站脚本解析器。

SafeHTML 能识别有效 HTML,能追踪并剥离任何危险标签。它用另一个称为 HTMLSax 的软件包进行解析。

按照下面步骤安装和使用 SafeHTML:

  1. 到 http://pixel-apes.com/safehtml/?page=safehtml 下载最新版本的 SafeHTML。
  2. 把文件放到你服务器的类文件夹。该文件夹包括 SafeHTML 和 HTMLSax 功能所需的所有东西。
  3. 在脚本中 include SafeHTML 类文件(safehtml.php)。
  4. 创建一个名为 $safehtml 的新 SafeHTML 对象。
  5. 用 $safehtml->parse() 方法清理你的数据。

这是一个完整的例子:

<?php
/* If you're storing the HTMLSax3.php in the /classes directory, along
   with the safehtml.php script, define XML_HTMLSAX3 as a null string. */
define(XML_HTMLSAX3, '');
// Include the class file.
require_once('classes/safehtml.php');
// Define some sample bad code.
$data = "This data would raise an alert <script>alert('XSS Attack')</script>";
// Create a safehtml object.
$safehtml = new safehtml();
// Parse and sanitize the data.
$safe_data = $safehtml->parse($data);
// Display result.
echo 'The sanitized data is <br />' . $safe_data;
?>

如果你想清理脚本中的任何其它数据,你不需要创建一个新的对象;在你的整个脚本中只需要使用 $safehtml->parse() 方法。

什么可能会出现问题?

你可能犯的最大错误是假设这个类能完全避免 XSS 攻击。SafeHTML 是一个相当复杂的脚本,几乎能检查所有事情,但没有什么是能保证的。你仍然需要对你的站点做参数验证。例如,该类不能检查给定变量的长度以确保能适应数据库的字段。它也不检查缓冲溢出问题。

XSS 攻击者很有创造力,他们使用各种各样的方法来尝试达到他们的目标。可以阅读 RSnake 的 XSS 教程http://ha.ckers.org/xss.html ,看一下这里有多少种方法尝试使代码跳过过滤器。SafeHTML 项目有很好的程序员一直在尝试阻止 XSS 攻击,但无法保证某些人不会想起一些奇怪和新奇的方法来跳过过滤器。

注意:XSS 攻击严重影响的一个例子 http://namb.la/popular/tech.html,其中显示了如何一步一步创建一个让 MySpace 服务器过载的 JavaScript XSS 蠕虫。

用单向哈希保护数据

该脚本对输入的数据进行单向转换,换句话说,它能对某人的密码产生哈希签名,但不能解码获得原始密码。为什么你希望这样呢?应用程序会存储密码。一个管理员不需要知道用户的密码,事实上,只有用户知道他/她自己的密码是个好主意。系统(也仅有系统)应该能识别一个正确的密码;这是 Unix 多年来的密码安全模型。单向密码安全按照下面的方式工作:

  1. 当一个用户或管理员创建或更改一个账户密码时,系统对密码进行哈希并保存结果。主机系统会丢弃明文密码。
  2. 当用户通过任何方式登录到系统时,再次对输入的密码进行哈希。
  3. 主机系统丢弃输入的明文密码。
  4. 当前新哈希的密码和之前保存的哈希相比较。
  5. 如果哈希的密码相匹配,系统就会授予访问权限。

主机系统完成这些并不需要知道原始密码;事实上,原始密码完全无所谓。一个副作用是,如果某人侵入系统并盗取了密码数据库,入侵者会获得很多哈希后的密码,但无法把它们反向转换为原始密码。当然,给足够时间、计算能力,以及弱用户密码,一个攻击者还是有可能采用字典攻击找出密码。因此,别轻易让人碰你的密码数据库,如果确实有人这样做了,让每个用户更改他们的密码。

加密 Vs 哈希

技术上来来说,哈希过程并不是加密。哈希和加密是不同的,这有两个理由:

不像加密,哈希数据不能被解密。

是有可能(但非常罕见)两个不同的字符串会产生相同的哈希。并不能保证哈希是唯一的,因此别像数据库中的唯一键那样使用哈希。

function hash_ish($string) {
    return md5($string);
}

上面的 md5() 函数基于 RSA 数据安全公司的消息摘要算法(即 MD5)返回一个由 32 个字符组成的十六进制串。然后你可以将那个 32 位字符串插入到数据库中和另一个 md5 字符串相比较,或者直接用这 32 个字符。

破解脚本

几乎不可能解密 MD5 数据。或者说很难。但是,你仍然需要好的密码,因为用一整个字典生成哈希数据库仍然很简单。有一些在线 MD5 字典,当你输入 06d80eb0c50b49a509b49f2424e8c805 后会得到结果 “dog”。因此,尽管技术上 MD5 不能被解密,这里仍然有漏洞,如果某人获得了你的密码数据库,你可以肯定他们肯定会使用 MD5 字典破译。因此,当你创建基于密码的系统的时候尤其要注意密码长度(最小 6 个字符,8 个或许会更好)和包括字母和数字。并确保这个密码不在字典中。

用 Mcrypt 加密数据

如果你不需要以可阅读形式查看密码,采用 MD5 就足够了。不幸的是,这里并不总是有可选项,如果你提供以加密形式存储某人的信用卡信息,你可能需要在后面的某个地方进行解密。

最早的一个解决方案是 Mcrypt 模块,这是一个用于允许 PHP 高速加密的插件。Mcrypt 库提供了超过 30 种用于加密的计算方法,并且提供口令确保只有你(或者你的用户)可以解密数据。

让我们来看看使用方法。下面的脚本包含了使用 Mcrypt 加密和解密数据的函数:

<?php
$data = "Stuff you want encrypted";
$key = "Secret passphrase used to encrypt your data";
$cipher = "MCRYPT_SERPENT_256";
$mode = "MCRYPT_MODE_CBC";
function encrypt($data, $key, $cipher, $mode) {
// Encrypt data
return (string)
            base64_encode
                (
                mcrypt_encrypt
                    (
                    $cipher,
                    substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),
                    $data,
                    $mode,
                    substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))
                    )
                );
}
function decrypt($data, $key, $cipher, $mode) {
// Decrypt data
    return (string)
            mcrypt_decrypt
                (
                $cipher,
                substr(md5($key),0,mcrypt_get_key_size($cipher, $mode)),
                base64_decode($data),
                $mode,
                substr(md5($key),0,mcrypt_get_block_size($cipher, $mode))
                );
}
?>

mcrypt() 函数需要几个信息:

  • 需要加密的数据
  • 用于加密和解锁数据的口令,也称为键。
  • 用于加密数据的计算方法,也就是用于加密数据的算法。该脚本使用了 MCRYPT\_SERPENT\_256,但你可以从很多算法中选择,包括 MCRYPT\_TWOFISH192、MCRYPT\_RC2、MCRYPT\_DES、和 MCRYPT\_LOKI97。
  • 加密数据的模式。这里有几个你可以使用的模式,包括电子密码本(Electronic Codebook) 和加密反馈(Cipher Feedback)。该脚本使用 MCRYPT\_MODE\_CBC 密码块链接。
  • 一个 初始化向量-也称为 IV 或者种子,用于为加密算法设置种子的额外二进制位。也就是使算法更难于破解的额外信息。
  • 键和 IV 字符串的长度,这可能随着加密和块而不同。使用 mcrypt\_get\_key\_size() 和 mcrypt\_get\_block\_size() 函数获取合适的长度;然后用 substr() 函数将键的值截取为合适的长度。(如果键的长度比要求的短,别担心,Mcrypt 会用 0 填充。)

如果有人窃取了你的数据和短语,他们只能一个个尝试加密算法直到找到正确的那一个。因此,在使用它之前我们通过对键使用 md5() 函数增加安全,就算他们获取了数据和短语,入侵者也不能获得想要的东西。

入侵者同时需要函数,数据和口令,如果真是如此,他们可能获得了对你服务器的完整访问,你只能大清洗了。

这里还有一个数据存储格式的小问题。Mcrypt 以难懂的二进制形式返回加密后的数据,这使得当你将其存储到 MySQL 字段的时候可能出现可怕错误。因此,我们使用 base64encode() 和 base64decode() 函数转换为和 SQL 兼容的字母格式和可检索行。

破解脚本

除了实验多种加密方法,你还可以在脚本中添加一些便利。例如,不用每次都提供键和模式,而是在包含的文件中声明为全局常量。

生成随机密码

随机(但难以猜测)字符串在用户安全中很重要。例如,如果某人丢失了密码并且你使用 MD5 哈希,你不可能,也不希望查找回来。而是应该生成一个安全的随机密码并发送给用户。为了访问你站点的服务,另外一个用于生成随机数字的应用程序会创建有效链接。下面是创建密码的一个函数:

<?php
 function make_password($num_chars) {
    if ((is_numeric($num_chars)) &&
        ($num_chars > 0) &&
        (! is_null($num_chars))) {
        $password = '';
        $accepted_chars = 'abcdefghijklmnopqrstuvwxyz1234567890';
        // Seed the generator if necessary.
        srand(((int)((double)microtime()*1000003)) );
        for ($i=0; $i<=$num_chars; $i++) {
            $random_number = rand(0, (strlen($accepted_chars) -1));
            $password .= $accepted_chars[$random_number] ;
        }
        return $password;
     }
}
?> 

使用脚本

make\_password() 函数返回一个字符串,因此你需要做的就是提供字符串的长度作为参数:

<?php
$fifteen_character_password = make_password(15);
?> 

函数按照下面步骤工作:

  • 函数确保 $num\_chars 是非零的正整数。
  • 函数初始化 $accepted\_chars 变量为密码可能包含的字符列表。该脚本使用所有小写字母和数字 0 到 9,但你可以使用你喜欢的任何字符集合。(LCTT 译注:有时候为了便于肉眼识别,你可以将其中的 0 和 O,1 和 l 之类的都去掉。)
  • 随机数生成器需要一个种子,从而获得一系列类随机值(PHP 4.2 及之后版本中并不需要,会自动播种)。
  • 函数循环 $num\_chars 次,每次迭代生成密码中的一个字符。
  • 对于每个新字符,脚本查看 $accepted\_chars** 的长度,选择 0 和长度之间的一个数字,然后添加 **$accepted\_chars 中该数字为索引值的字符到 $password。
  • 循环结束后,函数返回 $password。

许可证

本篇文章,包括相关的源代码和文件,都是在 The Code Project Open License (CPOL) 协议下发布。


via: http://www.codeproject.com/Articles/363897/PHP-Security

作者:SamarRizvi 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

毋庸置疑,对于系统管理员,提高服务器的安全性是最重要的事情之一。因此,也就有了许多针对这个话题而生的文章、博客和论坛帖子。

一台服务器由大量功能各异的部件组成,这一点使得很难根据每个人的需求去提供定制的解决方案。这篇文章尽可能涵盖一些有所裨益的小技巧来帮助管理员保证服务器和用户安全。

有一些常识是每个系统管理员都应该烂熟于心的,所以下面的几点在本文将不会提及:

  • 务必保证系统是最新的
  • 经常更换密码 - 使用数字、字母和非字母的符号组合
  • 给予用户最小的权限,满足他们日常使用所需即可
  • 只安装那些真正需要的软件包

下面是一些更有意思的内容:

更改SSH默认端口

在搭建好一台全新的服务器后要做的第一件事情就是更改SSH的默认端口。这个小小的改动能够使你的服务器避免受到成千上万的暴力攻击(LCTT 译注:不更改默认端口相当于黑客们知道你家的门牌号,这样他们只需要一把一把的试钥匙就可能打开你家的锁)。

要更改默认的SSH端口,先打开sshd\_config文件:

sudo vim /etc/ssh/sshd_config

找到下面这行:

#Port 22

“#”号表示这行是注释。首先删除#号,然后把端口号改成目的端口。端口号不能超过65535,确保要指定的端口号没有被系统或其它服务占用。建议在[维基百科]上查看常用端口号列表。在本文中,使用这个端口号:

Port 16543

然后保存并关闭文件。

接下来的一步是:

使用SSH密钥认证

在通过SSH访问服务器时,使用SSH密钥进行认证是尤其重要的。这样做为服务器增加了额外的保护,确保只有那些拥有密钥的人才能访问服务器。

在本地机器上运行下面命令以生成SSH密钥:

ssh-keygen -t rsa

你会看到下面的输出,询问要将密钥写到哪一个文件里,并且设置一个密码:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): my_key
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in my_key.
Your public key has been saved in my_key.pub.
The key fingerprint is:
SHA256:MqD/pzzTRsCjZb6mpfjyrr5v1pJLBcgprR5tjNoI20A

完成之后,就得到两个文件:

my\_key

my\_key.pub

接下来把my\_key.pub拷贝到~/.ssh/authorized\_key中

cp my_key.pub ~/.ssh/authorized_keys

然后使用下面命令将密钥上传到服务器:

scp -P16543 authorized_keys user@yourserver-ip:/home/user/.ssh/

至此,你就可以从这台本地机器上无密码地访问服务器了。

关闭SSH的密码认证

既然已经有了SSH密钥,那么关闭SSH的密码认证就会更安全了。再次打开并编辑sshd\_config,按如下设置:

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

关闭Root登录

下面关键的一步是关闭root用户的直接访问,而使用sudo或su来执行管理员任务。首先需要添加一个有root权限的新用户,所以编辑这个路径下的sudoers文件:

/etc/sudoers/

推荐使用如visudo这样的命令编辑该文件,因为它会在关闭文件之前检查任何可能出现的语法错误。当你在编辑文件时出错了,这就很有用了。

接下来赋予某个用户root权限。在本文中,使用用户sysadmin。确保在编辑后这个文件时使用的用户是系统已有的用户。找到下面这行:

root ALL=(ALL) ALL

拷贝这行,然后粘贴在下一行,然后把root更改为“sysadmin”,如下所示:

root ALL=(ALL) ALL
sysadmin ALL=(ALL) ALL

现在解释一下这行的每一个选项的含义:

(1) root  (2)ALL=(3)(ALL) (4)ALL

(1) 指定用户

(2) 指定用户使用sudo的终端

(3) 指定用户可以担任的用户角色

(4) 这个用户可以使用的命令

(LCTT 译注:所以上面的配置是意思是:root 用户可以在任何终端担任任何用户,执行任何命令。)

使用这个配置可以给用户访问一些系统工具的权限。

这时,可以放心保存文件了。

为了关闭通过SSH直接访问root,需要再次打开sshd\_config,找到下面这行:

#PermitRootLogin yes

更改为:

PermitRootLogin no

然后保存文件,重启sshd守护进程使改动生效。执行下面命令即可:

sudo /etc/init.d/sshd restart

设置防火墙

防火墙有助于过滤出入端口和阻止使用暴力法的登录尝试。我倾向于使用SCF(Config Server Firewall)这个强力防火墙。它使用了iptables,易于管理,而且对于不擅于输入命令的用户提供了web界面。

要安装CSF,先登录到服务器,切换到这个目录下:

cd /usr/local/src/

然后以root权限执行下面命令:

wget https://download.configserver.com/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh

只需等待安装程序完成,然后编辑CSF的配置文件:

/etc/csf/csf.conf

默认情况下CSF是以测试模式运行。通过将“TESTING”的值设置成0,切换到product模式。

TESTING = "0"

下面要设置的就是服务器上允许通过的端口。在csf.conf中定位到下面的部分,根据需要修改端口:

# 允许入站的 TCP 端口
TCP_IN = "20,21,25,53,80,110,143,443,465,587,993,995,16543"
# 允许出站的 TCP 端口
TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,16543"
# 允许入站的 UDP 端口
UDP_IN = "20,21,53"
# 允许出站的 UDP 端口
# 要允许发出 traceroute 请求,请加 33434:33523 端口范围到该列表 
UDP_OUT = "20,21,53,113,123"

请根据需要逐一设置,推荐只使用那些需要的端口,避免设置对端口进行大范围设置。此外,也要避免使用不安全服务的不安全端口。比如只允许端口465和587来发送电子邮件,取代默认的SMTP端口25。(LCTT 译注:前提是你的邮件服务器支持 SMTPS)

重要:千万不要忘记允许自定义的 ssh 端口。

允许你的IP地址通过防火墙,而绝不被屏蔽,这一点很重要。IP地址定义在下面的文件中:

/etc/csf/csf.ignore

被屏蔽了的IP地址会出现在这个文件中:

/etc/csf/csf.deny

一旦完成更改,使用这个命令重启csf:

sudo /etc/init.d/csf restart

下面是在某台服务器上的csf.deny文件的部分内容,来说明CSF是很有用的:

211.216.48.205 # lfd: (sshd) Failed SSH login from 211.216.48.205 (KR/Korea, Republic of/-): 5 in the last 3600 secs - Fri Mar 6 00:30:35 2015
103.41.124.53 # lfd: (sshd) Failed SSH login from 103.41.124.53 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:06:46 2015
103.41.124.42 # lfd: (sshd) Failed SSH login from 103.41.124.42 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:59:04 2015
103.41.124.26 # lfd: (sshd) Failed SSH login from 103.41.124.26 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 02:48:26 2015
109.169.74.58 # lfd: (sshd) Failed SSH login from 109.169.74.58 (GB/United Kingdom/mail2.algeos.com): 5 in the last 3600 secs - Fri Mar 6 03:49:03 2015

可以看到,尝试通过暴力法登录的IP地址都被屏蔽了,真是眼不见心不烦啊!

锁住账户

如果某个账户在很长一段时间内都不会被使用了,那么可以将其锁住以防止其它人访问。使用如下命令:

passwd -l accountName

当然,这个账户依然可以被root用户使用(LCTT 译注:可用 su 切换为该账号)。

了解服务器上的服务

服务器的本质是为各种服务提供访问功能。使服务器只运行所需的服务,关闭没有使用的服务。这样做不仅会释放一些系统资源,而且也会使服务器变得更加安全。比如,如果只是运行一个简单的服务器,显然不需要X显示或者桌面环境。如果不需要Windows网络共享功能,则可以放心关闭Samba。

使用下面的命令能查看伴随系统启动而启动的服务:

chkconfig --list | grep "3:on"

如果系统运行了systemd,执行这条命令:

systemctl list-unit-files --type=service | grep enabled

然后使用下面的命令关闭服务:

chkconfig service off
或
systemctl disable service

在上面的例子中,把“service”替换成真正想要停止的服务名称。实例如下:

chkconfig httpd off
或
systemctl disable httpd

小结

这篇文章的目的是涵盖一些通用的安全步骤以便帮助你保护服务器。你可以采取更多方式去增强对服务器的保护。请记住保证服务器安全是你的责任,在维护服务器安全时尽量做出明智的选择,尽管并没有什么容易的方式去完成这件事情,而建立“完善的”安全需要花费大量的时间和测试直到达到想要的结果。


via: http://www.linuxveda.com/2015/06/03/secure-linux-server/

作者:Marin Todorow 译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出