跟高手学习LINUX笔记-22

基础教程在前面已经介绍完成了,下面的笔记会进入到第二阶段--开源服务
第一章sshd服务和防止暴力破解
本节课所讲内容:
1.1、sshd服务安装-ssh命令使用方法
1.2、sshd服务配置、管理和安全优化
1.3、免密码登录linux服务器
1.4、防止SSHD服务暴力破解的几种方式
正文部分:
1.1 SSHD服务安装-ssh命令使用方法
1.1-1 SSHD服务:是基于openssl加密的网络协议,相比telnet明文传输的不安全,sshd这种密文通讯的服务更受欢迎,也是远程连接Linux服务器的重要服务。
注意:在日常运维当中,CentOS/RHEL等操作系统即使最小化安装也会安装openssh-server服务,以方便客户管理,但Ubuntu/Debian这两种操作系统默认是不安装的,需要手工选择安装上去,否则无法对操作系统进行远程管理
[root@node-2 ~]# yum list |grep ^openssh ##仅查看以openssh开头的文件
openssh.x86_64 7.4p1-16.el7 @base
openssh-clients.x86_64 7.4p1-16.el7 @base
openssh-server.x86_64 7.4p1-16.el7 @base
openssh.x86_64 7.4p1-21.el7 base
.........
一般来说只用yum安装就可以了
[root@node-2 ~]# yum install openssh openssh-clients openssh-server
[root@node-2 ~]#systemctl start sshd && systemctl enable sshd
1.1-2 对SSHD配置文件重要选项的说明
配置文件位置:
服务端:/etc/ssh/sshd_config
客户端:/etc/ssh/ssh_config
[root@node-2 ~]# cat /etc/ssh/sshd_config

$OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

This is the sshd server system-wide configuration file. See

........

If you want to change the port on a SELinux system, you have to tell

SELinux about this change.

semanage port -a -t ssh_port_t -p tcp #PORTNUMBER

#
#Port 22
#AddressFamily any
.........

关于此配置文件说明如下:
1、如果#与后面的字符有空格则说明是注释说明如:# SELinux about this change.
2、如果#与后面的字符无空格则说明是默认选项如:#Port 22
因此:
1、修改默认选项的时候需要把此行前#符号去掉,再修改相应的值
2、修改保存退出后,需要重启SSHD服务才能生效
下面以修改远程端口为例进行说明:
[root@node-2 ~]# cp /etc/ssh/sshd_config{,.bak} ##修改配置文件需要备份,最好加上日期及说明
[root@node-2 ~]# vim /etc/ssh/sshd_config
修改部分如下:
.......
#Port 22
Port 2256
#AddressFamily any
.......
[root@node-2 ~]# systemctl restart sshd
[root@node-2 ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2256 0.0.0.0: LISTEN 1332/sshd
tcp6 0 0 :::2256 :::
LISTEN 1332/sshd
1.1-3 使用ssh客户端连接远程ssh服务器
如果是默认端口:[root@node-2 ~]# ssh [email protected]
如果非默认端口:[root@node-1 ~]# ssh [email protected] -p 2256
1.2、sshd服务配置安全优化
1.2-1sshd服务配置安全优化
1)配置SSH 服务器-禁用ROOT远程登录。
Linux的默认管理员名即是root,只需要知道ROOT密码即可直接登录SSH。禁止Root从SSH直接登录可以提高服务器安全性。
[root@node-2 ~]#vim /etc/ssh/sshd_config
约37行//找到#PermitRootLogin yes,将前面的“#”去掉,尾部“Yes”改为“No”
2)修改默认22远程端口
说个小笑话:同行有个哥们儿维护的linux服务器远程端口修改为3389,结果让其他得知远程端口同事一直远程桌面连接这台“windows”服务器
约17行//找到#Port 22,将前面的“#”去掉,尾部“22”改为“特定端口”
3)为了提高SSH连接速度,可以调整以下选项
约114行//找到#UseDNS yes,将前面的“#”去掉,尾部“Yes”改为“No”
约80行//找到GSSAPIAuthentication yes, 尾部“Yes”改为“No”
最后要重启SSHD服务
[root@node-2 ~]#systemctl restart sshd
1.3、免密码登录linux服务器
1.3-1通过设置使node-2免密码登录node-1
[root@node-2 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 直接回车
Enter passphrase (empty for no passphrase): 直接回车
Enter same passphrase again: 直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XMAy/LpOTtAp51CfXmh2qH7shrvHk7qVTrd0CqWR9bE root@node-2
The key's randomart image is:
+---[RSA 2048]----+
| . .. |
| + .. |
| .+ o . |
| o +.B . o |
| + +.S + E |
| *.= B |
| ==B.o . |
| =o+O+ + |
| .OXo.o |
+----[SHA256]-----+
[root@node-2 ~]# ll -al .ssh/
total 12
drwx------ 2 root root 36 Apr 7 22:46 .
dr-xr-x---. 3 root root 4096 Apr 8 21:16 ..
-rw------- 1 root root 1679 Apr 8 21:17 id_rsa
-rw-r--r-- 1 root root 393 Apr 8 21:17 id_rsa.pub
[root@node-2 ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
如果node-1的远程端口不是默认:ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 222 [email protected]"
输入密码后再远程登录node-1就不需要密码了
[root@node-2 ~]# ssh 192.168.26.71
[root@node-1 ~]#
1.4、防止SSHD服务暴力破解的几种方式
三种防止SSH暴力破解的方法
1、脚本加定时任务
[root@node-1 ~]# vim denysshscan.sh
[root@node-1 ~]# cat denysshscan.sh
#!/bin/bash
cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2"="$1;}' > /root/blackip.txt
DEFINE="5"
for i in cat /root/blackip.txt
do
IP=echo $i | awk -F = '{print $1}'
NUM=echo $i | awk -F = '{print $2}'

if [ $NUM -gt $DEFINE ];then
grep $IP /etc/hosts.deny > /dev/null

if [ $? -gt 0 ];then
echo "sshd : $IP " >> /etc/hosts.deny
fi
fi
Done
[root@node-1 ~]# chmod +x /root/denysshscan.sh
[root@node-1 ~]# crontab -e
/3 * /usr/bin/sh /root/denysshscan.sh &> /dev/null

2、通过denyhosts防止暴力破解
1)安装软件
[root@node-1 ~]# wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/denyhosts-2.6-5.el7.rf.noarch.rpm
[root@node-1 ~]# rpm -ivh denyhosts-2.6-5.el7.rf.noarch.rpm ## 安装软件
2)启动denyhosts服务并设置开机启动
[root@node-1 ~]# systemctl start denyhosts
[root@node-1 ~]# systemctl enable denyhosts
denyhosts.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig denyhosts on
[root@node-1 ~]# chkconfig denyhosts on
3)关于配置文件的说明
[root@node-1 ~]# vim /etc/denyhosts/denyhosts.cfg
一些常用配置,通常取默认值即可:
SECURE_LOG = /var/log/secure
HOSTS_DENY = /etc/hosts.deny
PURGE_DENY = 5w // ip被禁止之后,多久可以释放(w表示周,d表示天,h表示小时,m表示分钟)
PURGE_THRESHOLD = 2 如果自动被清除超过2次后就不被清理
BLOCK_SERVICE = sshd // 检测的服务
DENY_THRESHOLD_INVALID = 5 // 无效用户尝试次数之后即被锁定
DENY_THRESHOLD_VALID = 5 // 有效普通用户尝试次数
DENY_THRESHOLD_ROOT = 3 // root用户尝试次数
DENY_THRESHOLD_RESTRICTED = 1 // 设定denyhosts将数据写入到/etc/hosts.deny文件中
WORK_DIR = /var/lib/denyhosts //denyhosts工作数据目录
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
HOSTNAME_LOOKUP=NO // 域名解析
LOCK_FILE = /var/lock/subsys/denyhosts
4)修改配置后,重新启动denyhosts服务
[root@node-1 ~]# systemctl restart denyhosts
5)测试用错误的root密码登录三次后,查看/etc/hosts.deny
[root@node-1 ~]# cat /etc/hosts.deny
........

DenyHosts: Wed Apr 8 09:34:26 2020 | sshd: 192.168.26.1

DenyHosts: Wed Apr 8 10:01:28 2020 | sshd: 192.168.26.1

sshd: 192.168.26.1

3、通过fail2ban+firewalld防止SSHD暴力破解
网上很多教程是基于以前的centos6带的iptables结合的教程,但在centos7自带的firewalld的防火墙,两者有机结合加强防御。
1)停止iptables并检查Firewalld是否启用
[root@node-1 ~]# systemctl status firewalld #如果没有启动则启动且设置开机自启
在启动前一定要把修改后的远程端口加入firewalld许可
#放行新的SSHD服务的2222端口
[root@node-1 ~]# firewall-cmd --zone=public --add-port=2222/tcp --permanent
[root@node-1 ~]# firewall-cmd --zone=public --add-port=2222/tcp
[root@node-1 ~]# firewall-cmd --list-ports
2222/tcp
[root@node-1 ~]# firewall-cmd --reload
[root@node-1 ~]#systemctl start firewalld && systemctl enable firewalld
2)安装fail2ban
CentOS内置源并未包含fail2ban,需要先安装epel源再安装fial2ban
[root@node-1 ~]# yum -y install epel-release && yum -y install fail2ban
[root@node-1 ~]#systemctl start fail2ban && systemctl enable fail2ban
3)配置规则
[root@node-1 ~]#vim /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter = sshd
port = 2222
action = %(action_mwl)s
logpath = /var/log/secure

*参数说明:
ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔
bantime:屏蔽时间,单位为秒(s)
findtime:时间范围
maxretry:最大次数
banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口

[sshd]:名称,可以随便填写
filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则
port:对应的端口
action:采取的行动
logpath:需要监视的日志路径

上面的配置意思是如果同一个IP,在10分钟内,如果连续超过5次错误,则使用Firewalld将他IP ban了。输入systemctl start fail2ban启动fail2ban来试试效果。
使用另一台服务器不断尝试连接SSH,并且不断的将密码输入错误,你会发现连续超过5次后直接连不上,说明IP被ban了,可以输入:fail2ban-client status sshd查看被ban的IP,如下图。
[root@node-1 ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 35
| - Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd<br/>- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.26.1

4、常用命令
#启动:systemctl start fail2ban
#停止:systemctl stop fail2ban
#开机启动:systemctl enable fail2ban
#查看被ban IP,其中sshd为名称,比如上面的[wordpress]
[root@node-1 ~]# fail2ban-client status sshd
#删除被ban IP
[root@node-1 ~]# fail2ban-client set sshd unbanip 192.168.26.1
#查看日志:[root@node-1 ~]# tailf /var/log/fail2ban.log

扩展其他方面的应用:
1、防止CC***
以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用。
#需要先新建一个nginx日志匹配规则
[root@node-1 ~]# vim /etc/fail2ban/filter.d/nginx-cc.conf
#填写如下内容
[Definition]
failregex = -.- .HTTP/1. . .*$
ignoreregex =
继续修改jail.local追加如下内容:
[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log
说明:上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx访问日志路径。

2、防止Wordpress爆破
#需要先新建一个nginx日志匹配规则
[root@node-1 ~]# vim /etc/fail2ban/filter.d/wordpress.conf
#填写如下内容
[Definition]
failregex = ^ -. /wp-login.php. HTTP/1.."
ignoreregex =
继续修改jail.local追加如下内容:
[wordpress]
enabled = true
port = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log
当然,别忘记输入systemctl restart fail2ban重启fail2ban使其生效。

参考文档链接:
https://www.centos.bz/2018/01/centos-7%E5%AE%89%E8%A3%85fail2banfirewalld%E9%98%B2%E6%AD%A2ssh%E7%88%86%E7%A0%B4%E4%B8%8Ecc%E6%94%BB%E5%87%BB/

猜你喜欢

转载自blog.51cto.com/450955/2485865