Linux系统管理员视角下的主机安全
作者: 日期:2021年10月19日 阅:3,499

随着现在的 Linux 系统各种桌面发行版越来越易用,适配的软件也越来越多,使用者增加。而linux系统安全也需要重视。本篇内容将带大家了解在Linux系统管理员视角下的主机安全。

一、账户安全

linux下系统安全,首先应该考虑系统账号的安全管控。一般情况下,非必要不新增用户。减少登陆入口.另外要求系统采用密码策略,linux下对密码策略的配置在/etc/login.defs文件中,我们可以针对密码的长度和过期时间进行控制。

比如在文件/etc/login.defs中进行设置,我们可以配置如下参数,来增强密码的强度

PASS_MAX_DAYS 360

PASS_MIN_DAYS 30

PASS_MIN_LEN 16

PASS_WARN_AGE 20

同时,我们修改/etc/pam.d/system-auth 对系统密码做一些密码复杂度的强制要求

password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 minlen=12

注解:

minlen  密码长度

dcredit 必须包含多少个数字

ucredit 必须包含多少个大写字母;

lcredit 必须包含多少个小写字母;

ocredit 必须包含多少个特殊字符

一般情况下,如果密码的强度是足够的。那么通过控制台来破解的可能性就非常小。

另外如果用户不必要登陆系统,且仅作为程序运行时的身份, 请在/etc/passwd中,配置nologin的shell,使其不能使用bash shell。

除了通过控制台来登陆,常见的对于系统的登陆,还可以是通过SSH,这个是基于网络的一个加密的shell。传输的数据是已经加密的,保证了传输内容和认证过程的安全。因为SSH是基于网络, 也就导致很多服务器将端口暴露在了公网上。即便有密码保护,但是因为人为的不可控(比如密码无法按照足够的要求来增加复杂度等等)和一些脆弱算法的原因(可能导致加密数据被破解),SSH还是面临非常多的威胁。

对于跨公网访问主机。一般建议如下

第一,通过VPN来实现接入主机所在的网络。

第二,设置相关的白名单IP来控制主机的访问源的合法性。

第三,启用公钥认证的方案来代替密码认证。应该将ssh的密码登陆完全禁用。同时,建议对私钥加口令来保护私钥文件。以免私钥遗失被盗产生的安全隐患。

第四,应该默认禁止root这种知名的用户访问,应该建立非知名的用户登陆,这样能极大的提高账号入侵的难度,然后普通用户可以通过sudo的方式来切换到root下。

第五,应用的运行账户,可以设置登陆bash为nologin的方式禁止shell登陆。

第六,应该将ssh的默认端口修改为大于30000以上的端口,避开nmap类似软件的扫描。

第七,设置终端超时时间,以免人为疏漏造成主机被意外访问。

条件允许,最好通过堡垒机来管理主机,同时增加用户身份确认的双因素认证。

以上的操作可以防止绝大部分的系统入侵。对于极端的一些场景,比如网络链路可能存在监听,数据存在被主机暴力破解的情况,我们一般建议针对ssh的部分过时的不安全算法,做一些配置。

我们可以通过nmap来扫描本机的ssh服务,是否存在Arcfour算法.在一些centos5、6等过时的操作系统中,为了保持兼容性,依旧再使用一些不安全的算法。

我们通过以下命令查看是否使用了arcfour算法

nmap –script ssh2-enum-algos -sV  -p 22 127.0.0.1|grep -i arcfour

通过配置sshd_config文件的Ciphers指令,来配置使用的加密算法.比如配置如下的算法

Ciphers aes256-ctr

重启服务,然后再通过nmap扫描,查看算法列表是否已经变更。

对于算法的取舍,可以参考linux发行版比如centos,最新大版本和老版本的算法列表差异,这些差异代表了发行版厂商对算法安全性的研究成果.是重要的参考指标。

过时的算法,往往是为了兼容一些老的客户端版本。如果登陆客户端的软件版本都保持最新。那么兼容性就可以不考虑。你可以尽可能的使用版本新的,强度大的算法。

二、应用安全

从运行的应用的角度看,我们应该尽可能使用较低权限的用户,比如很多应用默认使用的nobody账户,我们可以设置nginx,php-fpm等运行在这个用户下,而这个用户默认是不允许登陆的。

同时,对于应用的文件和系统的文件要区分开,方便管理员针对应用自身的文件,做chown和chmod的权限限制,使用chmod 需要将代码目录的权限都设置为0600。这样既可以让服务可以正常执行请求,其他的普通账户也不能对网站目录进行随意访问。

从配置应用的角度来说,我们应该给应用尽可能的减少支持模块的数量,以防止非必要模块的漏洞增加安全风险。比如,php我们就不应该启用类似ssh这种模块,除非特殊情况不要开启,另外比如phpunit的开源库,本身因为是测试使用,生产环境,也不应该包含这样的支持库。phpunit版本已经被爆出存在远程执行漏洞。而且因为开发人员的不注意,可能会被打包到代码中,这需要尤其注意。另外,对于php.ini文件的配置,要保证复合生产条件,一些debug选项需要关闭。类似的情况也极容易出现在一些开源框架中,比如python的Django,生产环境需要考虑将setting的debug都关闭。

三、linux的防火墙

对于主机防火墙,使用iptables就够用了。它可以对3层、4层做灵活的防护配置,可以基于端口的,可以基于源和目的的,也可以基于连接状态的等等。生产环境下,我们只放开业务的端口给公网,这样减少其他端口可能存在的安全隐患。对于ssh的访问,我们可以基于IP做一些黑白名单,再基于端口做一些应用的访问授权。同时,因为业务软件经常存在被渗透的情况,主机的管理员应该重视webshell和反弹shell的攻击。对于反弹shell,我们应该从原理上入手,因为是主动外联,我们可以通过iptables的防火墙策略,来禁止这种主动外联的网络请求,仅允许被动外联的业务数据包发送请求。

四、关于主机抗拒绝服务攻击的能力

这块一般是通过调整内核参数和ulimit参数,调整相关的参数,用于放开系统对账户所能使用资源的诸多限制。比如进程数量、文件句柄数量等等,以提高应用的并发能力和抗ddos攻击的能力。

比如可以调大/proc/sys/fs/file-max 这个内核参数,可以让我们应用程序打开更多的文件。

 编辑/etc/security/limits.conf增加

* soft nproc  4096

* hard nproc  8192

* soft nofile 65535    

* hard nofile 65535

不建议nproc设置太大,因为大量的进程会极大增加cpu内核级的开销,最终影响系统的正常使用。

这里给出的参数也只是参考,而非普遍适用,需要根据服务器自身的硬件条件做调整,更不能无限调整这个上限,否则最终可能导致在极端的网络攻击下,导致系统完全奔溃。

那么一般建议是针对调整的参数做一些压力测试。以对可能发生的大并发情况有一些结果上的预期。

总结:

1.使用VPN管理我们的站点;

2.只暴露业务端口出去;

3.账号密码应该尽量复杂,远程登陆应该使用公钥认证;

4.应用程序应该使用最低权限运行;

5.防火墙应该封禁非业务端口, 开放管理端口给白名单IP, 同时考虑限制业务随意外联,以防止反弹shell的攻击;

6.应用程序需要做一些交互查询的内容验证,包括字符串和上传文件类型的验证。sql编写应该使用绑定变量,且需要对变量做正则严判.以抵御渗透攻击和木马上传;

7.目录权限和文件权限控制,达到代码防篡改的目的;

8.应用环境的DEBUG功能,测试模块,要严格关闭;

9.放开系统权限,提高应用并发,抵御Ddos攻击。

关键词:


相关文章