云服务器安全你都了解了吗linux
通常来讲云服务器,都绑定了公网ip,天天都无时无刻的被恶意扫描,这种问题,咱们避免不了,可是咱们能够主动防御。近日,在升级服务时,偶尔想到这个,就记录下来了,让咱们一块儿把服务器变得更加安全吧。nginx
1、Nmap扫描web
nmap -A 10.10.0.45 -p-
个人服务器开启了 redis的,就算我改了默认端口,经过 nmap 一扫描就暴露了。redis
扫描出来了,没关系张,接下来咱们安全
如何防止nmap恶意扫描呢?经过iptables防火墙防御?bash
经过把SYN,RST SYN,RST/ALL FIN,URG,PSH SYN/FIN SYN,FIN 设置禁止访问规则后。服务器
Namp结果:ssh
nmap -A 172.25.0.30 -p1-10000
根据这个结果的发现,设置禁止访问规则,一样能扫描服务器开放的端口。tcp
对于防止扫描,效果不尽人意,我的暂时没有找到更好的防火墙,防nmap扫描,暂时无解。ide
Nmap(侦探)的使用方法太多 ,能够隐藏ip,扫漏洞,扫端口,做为一个良好的网民,应该拒绝拿它干坏事。
俗话说的好;与其担忧受怕,不如主动防御!
首先,咱们的sshd服务是必须开启的,因此对ssh服务的安全防御,就很是重要了。
限制不必的用户登录
cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin redis:x:1000:1000::/home/redis:/sbin/nologin test:x:1002:1001::/home/test:/sbin/nologin
好比个人test,redis用户,是被服务器运行调用的,咱们是不容许它登录,因此咱们把该用户的权限改成/sbin/nologin
这样配置了redis和test 用户是没法登录的
lastb命令用于列出登入系统失败的用户相关信息,经过它,咱们能够正确的获取登陆失败的ip
经过脚本,把ip追加到/etc/hosts.deny,脚本能够追加到计划任务
方式一:
#!/bin/bash #author:xiaozhang #sed -i '/^sshd.*/d' /etc/hosts.deny #删除全部sshd开头的ip ipdeny=`lastb |awk '{print $3}' | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort|uniq -c |sort -nr | awk '{if ($1 > 10) print "sshd:"$2}'` #获取ip for i in $ipdeny;do #轮询ip grep -q $i /etc/hosts.deny if [ $? != 0 ] ; then echo $i >> /etc/hosts.deny #追加到到hosts.deny文件 fi done
方式二:
#!/bin/bash #author:xiaozhang #获取***的ip lastb |awk '{print $3}' | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort|uniq -c |sort -nr | \ while read a b #读取 $1 $2值 do grep -q $b /etc/hosts.deny #判断ip是否存在 if [ $? != 0 ] ; then if [ $a -ge 10 ] ; then #统计的次数大于10 echo "sshd:$b" >> /etc/hosts.deny #添加IP到黑名单 fi fi done
OpenSSH命令注入漏洞(CvE-2020-15778),在8.3p1前的版本中存在这个漏洞。而咱们使用的版本(7.x)来讲大部分都存在这个危险。固然,你的服务器是大型云商的,是有防御的。
为了安全,更可靠,因此咱们升级版本
注意:升级后hosts.deny再也不支持,推荐使用防火墙
升级sshd更新到8.5版本,推荐方式rpm升级
升级脚本都给你写好啦,往下看:
#!/bin/bash #author: xiaozhang showGreen() { content=$1 echo -e "> \033[32m$content\033[0m" } showRed() { content=$1 echo -e "> \033[31m$content\033[0m" } #------关闭selinux------ setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config #---下载包安装解压安装----- install() { wget https://cikeblog.com/s/openssh-8.5p1-1.el7.tar.gz tar -zxvf openssh-8.5p1-1.el7.tar.gz cp /etc/pam.d/sshd /etc/pam.d/sshd.bak yum -y install `ls /ssh8.5/*.rpm` #-----文件授予权限------- chmod 600 /etc/ssh/ssh_host_ed25519_key chmod 600 /etc/ssh/ssh_host_ecdsa_key chmod 600 /etc/ssh/ssh_host_rsa_key rm -rf /etc/pam.d/sshd mv /etc/pam.d/sshd.bak /etc/pam.d/sshd #------修改相关配置 sed -i 's/#UsePAM no/UsePAM yes/g' /etc/ssh/sshd_config sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g' /etc/ssh/sshd_config sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no/g' /etc/ssh/sshd_config sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/g' /etc/ssh/sshd_config } $1 mkdir -p /ssh8.5 cd /ssh8.5 ls /ssh8.5 | grep openssh-8.5p1-1.el7.tar.gz if [ $? -gt 0 ];then install fi systemctl restart sshd if [ $? -eq 0 ]; then showGreen 'upgrade success' else showRed 'Upgrade failed' fi source /etc/profile ssh -V
重复执行演示结果:
拒绝IP访问,添加防火墙,能够这样
经过iptables限制只容许某些网段和主机链接Linux机器的 22/TCP端口。IP地址在一分钟以内对Linux主机22/TCP端口新发起的链接超过10次,以后的新发起的链接将被丢弃.
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 --name SSH --rsource -j DROP -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource -j ACCEPT
这里举例nignx
这里列举一下状态码
4XX:
401 (未受权) 请求要求身份验证。 对于须要登陆的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
444 (错误)ERR_EMPTY_RESPONSE 该网页没法正常运做。
5XX:
500 (服务器内部错误) 服务器遇到错误,没法完成请求。
501 (还没有实施) 服务器不具有完成请求的功能。例如,服务器没法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器做为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前没法使用(因为超载或停机维护)。一般,这只是暂时状态。
问题来了,禁止服务器IP直接访问,咱们返回怎么最好呢。我的以为,若是需求是屏蔽死这个IP禁止web访问,那么就直接用444,访问直接报错。
配置以下:
server {
listen 80;
server_name _;
access_log /data/wwwlogs/nginx.log combined;
root /data/www/;
…
}
配置效果以下:
Nginx.conf
http {
server_tokens off; #关闭nginx的版本显示
}
访问效果:
怎么端口严控?
对于,服务端口,咱们采起严格控制 ,通常来讲,服务器只开放2二、80、443端口,其余的端口,咱们禁止它外网访问。这个咱们能够在云上的安全组里面
设置规则。
须要开放其它的端口,须要怎么办?
有须要开放的服务端口,在对应的服务里面设置帐号密码配置:如redis es 等等服务,经过设置复杂帐号密码,来防止恶意调用挖矿,固然,设置了,你的服务性能对应的降低。
对服务器,进行资源的监控,咱们能够经过脚本,第三方服务软件等等,对服务器进行监控,让你随时掌握服务器的状况。
写的很差的地方,欢迎指出。更多关注公众,让咱们一块儿交流技术心得吧。