浅谈如何保障服务器安全

2022-09-28 12:35:01 浏览数 (2)


浅谈如何保障服务器安全

前言

通常,我们拿到一台服务器后使用338端口远程桌面登录windows系统,使用22端口ssh登录linux系统。如果隔一段时间稍微留意一下爆破日志,通常能够看到来自全球各地的ip在爆破我们的登录账号密码。

爆破日志

前言中说到的爆破日志,我们可以通过查看Windows的日志id:4625查看登录失败的日志(登录成功日志id:4624)。Linux的登录失败日志,centos在/var/log/secure,ubuntu在/var/log/auth.log。我们也可以使用以下命令查看登录失败的ip账号密码。

登录失败用户

代码语言:javascript复制
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1n";}'|uniq -c|sort -nr
grep "Failed password" /var/log/auth.log|perl -e 'while($_=<>){ /for(.*?) from/; print "$1n";}'|uniq -c|sort -nr
代码语言:javascript复制
root错误登录密码
代码语言:javascript复制
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr

登录失败ip

代码语言:javascript复制
grep "Failed password" /var/log/secure | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
grep "Failed password" /var/log/auth.log | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

当然,以上命令在笔者的应急响应脚本均已包含,有兴趣的可以使用笔者的应急脚本跑一遍然后分析输出结果。

浅谈服务器登录管理

通常,国企对于服务器管理会要求所有服务器只能由堡垒机登录。

堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时处理及审计定责。

堡垒机会对用户权限进行细分,对用户行为进行记录。用户使用root权限连接服务器需要审批等。而堡垒机自身也做加固,同时所有服务器设置黑白名单限制仅能通过堡垒机ip登录,在一定程度上能够保障服务器安全,减少暴露面。

那么,对于我们个人用户而言,可以使用以下手段保障服务器安全。

  1. 使用私钥 密码登录服务器。
  2. 限制服务器登录ip。
  3. 非正常服务端口不开放
  4. 日志或系统信息采集传输设置黑白名单
  5. 使用中间件拦截垃圾蜘蛛,python等恶意ua头
  6. 使用waf限制访问路径

私钥登录

使用腾讯云,阿里云,ucloud,百度智能云等服务器可以绑定密钥对,在安装系统镜像前生成并绑定密钥对即可启用私钥登录。部分云厂商开启密钥登录后并不会关闭密码登录功能,此时需要进入/etc/ssh/sshd_config文件编辑并关闭密码登录。

代码语言:javascript复制
vim /etc/ssh/sshd_config
代码语言:javascript复制
将PasswordAuthentication yes改为PasswordAuthentication no

:wq保存并退出。

运行systemctl restart sshd或者service sshd restart重启ssh服务。

私钥 密码登录

这里使用xshell进行演示。

打开xshell,选择“工具”-“新建用户密钥生成向导”

选择密钥类型和密钥长度,默认RSA,长度2048即可。

点击下一步,生成公钥对。

点击下一步,填写密钥信息。

为了方便区分服务器,这里建议密钥名称命名为服务器备注。笔者的话是每个服务器规则命名,包括监控系统在内的所有标记备注的地方统一命名。如 中国-百度-广州-备注。

密钥加密密码建议设置,设置后在使用私钥登录服务器的时候需要使用私钥 密码。此处跳过则直接使用私钥登录服务器。

注册公钥,公钥格式默认为SSH2 - OpenSSH,默认即可。

公钥生成后切记将公钥保存为文件,格式位pub,文件名同样建议为服务器备注。

完成后保存导出私钥并保存为PEM。

进入服务器后,切换到root目录下,机内.ssh文件夹

代码语言:javascript复制
cd /root/.ssh

使用rz命令将密钥对.pub文件上传至服务器。将密钥对写入authorized_keys。(注意,若使用云服务器厂商控制台的webshell登录,请使用云服务器厂商的文件上传,或使用ftp/sftp将文件上传至/home/目录下,然后使用mv命令将密钥对移动至/root/目录下。通常因权限管理,ftp/sftp不可直接将文件上传至/root/目录下)

为了保证连接成功以及避免公钥泄露,使用chmod命令控制文件权限。

代码语言:javascript复制
rz -a example.pub
cat example.pub > authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh

进入/etc/ssh/sshd_config文件并更改配置

代码语言:javascript复制
vim /etc/ssh/sshd_config

以下配置若不存在则新增,若存在则更改。

代码语言:javascript复制
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes

配置解释: RSAAuthentication yes 启用RSA认证 PubkeyAuthentication yes 使用密钥对认证 PermitRootLogin yes 允许root用户使用ssh登录

运行systemctl restart sshd或者service sshd restart重启ssh服务。

测试使用私钥登录服务器。成功后编辑/etc/ssh/sshd_config文件并更改配置,关闭密码登录。

代码语言:javascript复制
vim /etc/ssh/sshd_config
代码语言:javascript复制
PasswordAuthentication no

以上则启用密钥对 密码登录教程。

限制ip登录

若云服务厂商控制台有防火墙设置功能,关闭“允开放所有tcp连接”后,新增规则,允许指定ip访问22端口。(有堡垒机的话,指定的ip填写堡垒机的ip,没有的话详见下文教程)

若云服务厂商没有控制台防火墙,则使用iptables限制连接ip。

通常情况下,提供控制台防火墙服务的云服务厂商是默认关闭iptables功能的。

查看现有规则:

代码语言:javascript复制
iptables -L -n

限制22端口连接ip

代码语言:javascript复制
iptables -I INPUT -p tcp --dport 22 -j DROP && iptables -I INPUT -s <登录ip> -p tcp --dport 22 -j ACCEPT

上方命令将按照顺序写入规则“禁止所有22端口连接”,“仅允许<登录ip>连接22端口”。此顺序不可更改,顺序调换会影响优先级,导致无法连接。

非正常服务端口不开放

与限制ip登录同样的,我们可以通过使用iptables仅开放服务端口即可。

默认情况下,iptables规定没有写入ACCEPT规则的为禁止连接。我们可以通过以下命令写入入站规则。主站默认无限制。

代码语言:javascript复制
iptables -I INPUT -p tcp --dport <端口> -j ACCEPT

同样的,日志或系统信息采集传输设置黑白名单也可使用云服务厂商提供的控制台防火墙,或使用iptables设置白名单。

利用iptables简单防御

禁止MAC地址访问本机的任何应用

代码语言:javascript复制
iptables -A INPUT -m mac --mac-source 00:50:2e:cf:44:3f -j DROP

丢弃通过icmp协议访问本机的数据包

代码语言:javascript复制
iptables -I INPUT -p icmp -j DROP

允许转发除了icmp协议之外的数据包

代码语言:javascript复制
iptables -A FORWARD ! -p icmp -j ACCEPT //

防止Xmas扫描

代码语言:javascript复制
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

防止Xmas扫描

代码语言:javascript复制
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

防止TCP Null扫描

代码语言:javascript复制
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

拒绝TCP标记为SYN/ACK,但连接状态为NEW的

代码语言:javascript复制
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP

禁止从其他主机ping本机,但允许本机ping其他主机

代码语言:javascript复制
iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT

使用nginx防护

nginx可以做反向代理,负载均衡等。从安全角度上,nginx也可以作waf。github上也有基于nginx的图形化waf管理,当然,笔者还是建议自行配置文件做限制。

使用nginx拦截垃圾蜘蛛,python等恶意ua头

服务器上使用nginx的,可以写入以下配置禁止部分占用资源的垃圾蜘蛛访问。禁止的ua头可以自定义。

代码语言:javascript复制
if ($http_user_agent ~* "MJ12bot|Scrapy|python|AhrefsBot|BLEXBot|DotBot|^$") {
    return 403; break;
}

限制ip访问

禁止所有ip访问

代码语言:javascript复制
deny all;

允许指定ip访问(示例)

代码语言:javascript复制
allow 192.168.0.1/24;
allow 192.168.1.2;
allow 192.168.2.3;
deny all;

注意,dney all;必须写在最后,否则优先级错误,allow配置不生效。

ip限制可在以下位置写入:

  • http: Nginx中所有服务起效
  • server: 指定的服务起效
  • location: 满足的location下起效
  • limit_except: 指定的http方法谓词起效

使用waf限制访问路径

云上环境有条件的可以使用云服务厂商的waf,企事业单位可购买安全厂商的waf。

预算不足的可以使用nginx防护

于server{}下禁止访问指定路径,如:

代码语言:javascript复制
    location /upload.php {
        return 403;
    }

没有堡垒机怎么办?

没有堡垒机的可以购买腾讯云、阿里云的堡垒机,也可以购买一台windows server云服务器,指定所有服务器ip只能由该wendows服务器访问。当然,也可以购买一台linux的服务器。就笔者而言,作堡垒机还是windows方便,但从安全角度上linux的暴露面更小,更容易防护。

使用Windows云服务器作堡垒机前,需要为系统加固。如开密钥对登录,使用rsa传输,防火墙关闭端口,仅开放需要使用的端口。服务器内需要使用密码进入连接管理,如使用密码进入xshell。

对于资源使用和账号权限,可以使用管理员分配权限,并使用权限管理工具作审批等。行为审计可以使用windows自带的行为记录,也可使用第三方软件。


红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。

1 人点赞