本文汇总整理一些Linux服务器安全相关的知识,有一些常识是每个系统管理员都应该烂熟于心的,就不多说了,比如
- 务必保证系统是最新的
- 经常更换密码 - 使用数字、字母和非字母的符号组合
- 给予用户最小的权限,满足他们日常使用所需即可
- 只安装那些真正需要的软件包
下面是一些容易被新手忽视的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
更多Linux安全相关
在如今的技术领域中,做一个完全安全的系统是一个不可能实现的目标。正如 FBI 的 Dennis Hughes 所说,“真正安全的计算机是没有连线、锁在一个保险箱中、埋藏在一个秘密场所的地下 20 英尺处的计算机……我甚至不确定这样是否安全。”在不能选择通过拔掉线缆、锁住和掩埋计算机来保护系统的世界里,可通过以下步骤缩小 您系统的攻击面。Open Web Application Security Project (OWASP) 的 攻击面分析备忘录 提供了有关攻击面的更多信息。
sane 系统配置等流程可缩小攻击面,而渗透测试和模糊测试可帮助工程师加固系统,通过熟练利用漏洞和意外输入来攻破系统,从而查找可修复的漏洞。这些技术通过在有机会利用恶意实体之前检测和消除漏洞,提高了系统的安全性。
Sane 配置
Sane 配置是加固任何系统的关键,因为任何漏洞都可以在某种程度上被利用。例如,SSH(比如 arcfour)或一些协议(比如用于 Web 服务器的 TLSv1.0)对遗留密码的支持,是攻击者获取访问权并且损害系统的一种途径。为了阻止这些和其他漏洞,在执行用户授权时请遵循最少特权原则;为用户或进程提供能够完成需要任务所需的最小访问权和许可。关闭未用端口,以减少网络攻击者可访问的入口点,从而阻止来自网络的入侵。此外,确保启用了防火墙协议,从而进一步限制可能的网络攻击。使用某种工具(比如 seccomp)过滤系统调用对进程的可用性,减少暴露的内核表面。
未用的包没有提供任何额外功能,但却是潜在的攻击载体。确认安装的应用程序和包是必需的,删除不必要的应用程序和包。一个简单示例是,如果一个系统仅通过控制台访问,则删除所有未用的 GUI 支持。Center for Internet Security (CIS-CAT) 提供的 Configuration Assessment Tool 是一个有用的应用程序,允许用户运行不同深度的加固基准测试,以指出系统在哪些地方未满足想要的标准。强烈推荐使用 CIS-CAT 帮助您发现系统的细微配置加固漏洞。
除了系统加固之外,软件发布者还为用户提供了重要的软件和安全更新。代码修复和改进对系统安全有一定的影响。过时的系统是攻击者更容易攻击的目标。依据 United States Computer Emergency Readiness Team,如果受害者拥有恰当更新的系统,可以避免高达 85% 的针对性攻击 (https://www.us-cert.gov/ncas/alerts/TA15-119A)。如果系统得到恰当更新,可显著减少攻击成功率。普遍攻击,包括恶意的实体,都是众所周知的。尽责的供应商会努力及时发布补丁。但是,如果系统管理员未能应用更新,这些补丁就无法保护他们提供的系统和服务。必须尽力确保所有系统得到及时更新。
渗透测试
渗透测试是一种使用自动化工具或自定义攻击查找系统漏洞的方法。渗透测试的目标是破坏系统安全防护,在没有期望的权限或凭据的情况下通过非故意操作模式获得数据的访问权。这些攻击使用目标系统中存在的已知利用手段和漏洞。渗透测试需要一种与传统验证方法(比如验证测试)不同的思维。不同于更加传统的测试,渗透测试人员尝试使用恶意攻击者的工具和方法访问系统组件和数据。尽管渗透测试的原理看起来比较落后,但它提供了比单一传统测试更加透明和完整的系统安全概况。
渗透测试工具链包含一些示例,比如 Metasploit,这是一个功能全面的渗透测试框架,其中包含数据库中已知的漏洞和用于扫描网络和已暴露系统的工具。其他示例还有 Nmap 和 Wireshark,它们分别使用端口扫描或包检查来测试网络。这两个工具都提供了系统操作和响应网络的情况的详细信息。端口扫描显示可通过网络获得哪些应用程序和系统实用程序,显示哪些端口未用并应考虑阻止访问。可从网络访问的任何实体都是可能的目标,所以需要优先考虑禁止访问。以下工具非常有用,能在各种目标上执行自动化的漏洞检测:
- IBM Security AppScan
- Nexpose
- OpenVAS
- Nessus
除了扫描和工具之外,深入了解正在遭受攻击的系统始终有利无弊。创建特定的利用手段并手动执行有效负载,比定义许多形式的渗透测试的自动化过程复杂得多。一旦找到某种利用手段,就可以创建自动化测试和有效负载传送系统,但寻找这类攻击是一个艰苦的过程。
确定攻击的潜在目标可能很难。当尝试利用一个复杂系统时,需要确定哪些攻击载体比其他攻击载体更富有成效。如果一个正在运行的进程有一个 Web 接口或连网组件,它可能是比暴露面更小的应用程序更好的目标。一个额外的指标是:是否存在专业软件。无需尝试使用拥有既定社区和支持历史的载体,寻找符合特定用途的软件或为在冷门环境中运行而构建的软件可能是更好的选择。
模糊测试
OWASP 将模糊测试定义为 “以自动化方式注入格式错误/格式部分错误的数据来寻找实现漏洞” (https://www.owasp.org/index.php/Fuzzing),这是验证系统和支持的应用程序的稳定性的另一种方法。在应用程序上执行模糊测试的一个示例,可能是在仅接受整数作为输入的程序上执行测试。当输入是浮点、字符串或其他任何不想要的格式的数据时,会发生什么?理想情况下,应用程序可处理格式错误的输入。如果应用程序崩溃或出现其他意外情况,系统的稳定性和安全性可能面临风险。强烈推荐采用的一种应用程序模糊测试工具是 american fuzzy lop (AFL),它能在 QEMU、Clang、OpenSSH、Bash 和 Mozilla Firefox 等流行应用程序中找到多个 bug。AFL 可在任何可执行的应用程序上运行,使用用户提供的 “良好” 输入执行测试,这使用户能够自定义 AFL 执行模糊测试的初始环境。另一个工具是 OWASP Zap,它既是一个 Web 漏洞扫描器,也是一个 Web 应用程序模糊测试器。该应用程序在可用链接上抓取信息,发送模糊化的输入以及已知的恶意攻击。IBM Security Appscan 在 Web 应用程序上执行类似功能,但该软件还提供了使用模糊化输入测试应用程序源代码的版本。
运行任何模糊化应用程序,都会给系统资源造成巨大负担。除了系统资源需求之外,模糊化还需要一定时间才能交付结果。但是,即使拥有大量时间,使用的伪随机输入也无法确保能够发现所有潜在问题。
结束语
服务器加固和验证需要不断努力。随着每天都能发现新的利用手段和漏洞,您系统的安全时常处于危险之中。系统审计、渗透测试和模糊测试分别从独特的视角提供了系统状态信息。除了测试标准(比如单元测试和功能测试)之外,还应使用这些方法来帮助提高您对系统的信心。
另外,
我们的Linux肯定不会只是一台裸机,上边是运行了apache、nginx、mysql、php等各种应用或数据库的,它们的安全配置同样是非常重要的,而且也是linux系统安全的重要组成部分,所以我们也要对这些应用或数据库进行必要的安全设置。