Linux

禁止SSH空密码用户登录 SSH服务配置

禁止SSH空密码用户登录

加固建议

编辑文件/etc/ssh/sshd_config,将PermitEmptyPasswords配置为no:

PermitEmptyPasswords no

设置密码失效时间身份鉴别

设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项。

加固建议

使用非密码登陆方式如密钥对,请忽略此项。 在 /etc/login.defs 中将 PASS_MAX_DAYS 参数设置为 60-180之间,如:

PASS_MAX_DAYS 90 需同时执行命令设置root密码失效时间:

chage --maxdays 90 root

设置密码修改最小间隔时间身份鉴别

设置密码修改最小间隔时间,限制密码更改过于频繁

加固建议

/etc/login.defs 中将 PASS_MIN_DAYS 参数设置为7-14之间,建议为7

PASS_MIN_DAYS 7 需同时执行命令为root用户设置:

chage --mindays 7 root

设置SSH空闲超时退出时间服务配置

设置SSH空闲超时退出时间,可降低未授权用户访问其他用户ssh会话的风险

加固建议

编辑/etc/ssh/sshd_config,将ClientAliveInterval 设置为300到900,即5-15分钟,将ClientAliveCountMax设置为0-3之间。

ClientAliveInterval 600
ClientAliveCountMax 2

密码复杂度检查身份鉴别

检查密码长度和密码是否使用多种字符类型

加固建议

编辑/etc/security/pwquality.conf,把minlen(密码最小长度)设置为8-32位,把minclass(至少包含小写字母、大写字母、数字、特殊字符等4类字符中等3类或4类)设置为3或4。如:

minlen=10
minclass=3

检查密码重用是否受限制身份鉴别

强制用户不重用最近使用的密码,降低密码猜测攻击风险

加固建议

/etc/pam.d/password-auth/etc/pam.d/system-authpassword sufficient pam_unix.so 这行的末尾配置remember参数为5-24之间,原来的内容不用更改,只在末尾加了remember=5

nginx

检查Nginx进程启动账号

Nginx进程启动账号状态,降低被攻击概率

加固建议

修改Nginx进程启动账号:

  1. 打开conf/nginx.conf配置文件;
  2. 查看配置文件的user配置项,确认是非root启动的;
  3. 如果是root启动,修改成nobody或者nginx账号;

备注:修改完配置文件之后需要重新启动Nginx。

Nginx后端服务指定的Header隐藏状态服务配置

隐藏Nginx后端服务X-Powered-By头

加固建议

隐藏Nginx后端服务指定Header的状态: 1、打开conf/nginx.conf配置文件; 2、在http下配置proxy_hide_header项; 增加或修改为 proxy_hide_header X-Powered-By; proxy_hide_header Server;

隐藏Nginx服务的Banner服务配置

Nginx服务的Banner隐藏状态

加固建议

Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态:

  1. 打开conf/nginx.conf配置文件;
  2. 在server栏目下,配置server_tokensserver_tokens off; 如出现多项不支持,执行ln <conf_path> /etc/nginx/nginx.conf

Nginx SSL协议的加密策略进行加固

加固建议

Nginx SSL协议采用TLSv1.2:

  1. 打开conf/nginx.conf配置文件(或主配置文件中的inlude文件);
  2. 配置
server { 
    ...
    ssl_protocols TLSv1.2;
    ...
}

备注:配置此项请确认nginx支持OpenSSL,运行nginx -V 如果返回中包含built with OpenSSL则表示支持OpenSSL。 如不支持,可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 如果尚未配置ssl协议,请尽快配置(参考连接https://www.nginx.cn/doc/optional/ssl.html)

mySQL

确保没有用户配置了通配符主机名身份鉴别

避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网

加固建议

执行SQL更新语句,为每个用户指定允许连接的host范围。

登录数据库,执行use mysql; ; 执行语句select user,Host from user where Host='%';查看HOST为通配符的用户; 删除用户或者修改用户host字段,删除语句:DROP USER 'user_name'@'%'; 。更新语句:update user set host = <new_host> where host = '%';。 执行SQL语句:

OPTIMIZE TABLE user;
flush privileges;

删除’test’数据库服务配置

测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少MySQL服务器的攻击面。

加固建议

登录数据库执行以下SQL语句删除test数据库:

DROP DATABASE test;
flush privileges;

确保配置了log-error选项安全审计

启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略。

加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld_safe] 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:

log-error=<log_path>

禁用local-infile选项访问控制

禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力

加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置local-infile参数为0,并重启mysql服务:

local-infile=0

禁用symbolic-links选项服务配置

禁用符号链接以防止各种安全风险

加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置symbolic-links=0,5.6及以上版本应该配置为skip_symbolic_links=yes,并重启mysql服务。

Redis

##禁止监听在公网 访问控制

Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。

加固建议

在redis的配置文件redis.conf中配置如下: bind 127.0.0.1或者内网IP,然后重启redis

Redis未授权访问身份鉴别

Redis端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。

加固建议

可以使用以下方法修复: 1.为Redis服务配置认证,在配置文件redis.conf中requirepass 配置复杂密码,然后重启redis。

  1. 在Redis的配置文件redis.conf中配置如下: bind 127.0.0.1,只允许本机访问,然后重启redis

##禁止使用root用户启动 访问控制

使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的

加固建议

使用root切换到redis用户启动服务:

useradd -s /sbin/nolog -M redis 
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &   

限制redis 配置文件访问权限 文件权限

因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600,

加固建议

执行以下命令修改配置文件权限:

chmod 600 /<filepath>/redis.conf

修改默认6379端口 服务配置

避免使用熟知的端口,降低被初级扫描的风险

加固建议

编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis

禁用或者重命名危险命令 入侵防范

Redis中线上使用keys *命令,也是非常危险的。因此线上的Redis必须考虑禁用一些危险的命令,或者尽量避免谁都可以使用这些命令,Redis没有完整的管理系统,但是也提供了一些方案。

加固建议

修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command FLUSHDB  ""
rename-command CONFIG   ""
rename-command KEYS     ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""

然后重启redis。 重命名为"" 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC

打开保护模式 访问控制

redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。

加固建议

redis.conf安全设置: # 打开保护模式 protected-mode yes

开启redis密码认证,并设置高复杂度密码 身份鉴别

redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。 redis因查询效率高,auth这种命令每秒能处理9w次以上,简单的redis的密码极容易为攻击者暴破。

加固建议

打开redis.conf,找到requirepass所在的地方,修改为指定的密码,密码应符合复杂性要求:

  1. 长度8位以上
  2. 包含以下四类字符中的三类字符: 英文大写字母(A 到 Z) 英文小写字母(a 到 z) 10 个基本数字(0 到 9) 非字母字符(例如 !、$、#、%、@、^、&)
  3. 避免使用已公开的弱口令,如:abcd.1234admin@123

再去掉前面的#号注释符,然后重启redis