SSH(Secure Shell)建立在应用层和传输层基础上的安全协议。它使用加密验证来确认用户身份,并对两台主机之间的所有通信加密。
SSH主要的组件有:一个服务器守护进程sshd,一个用于远程登录的ssh,还有用户主机之间复制文件的 sftp/scp。SSH其它组件:生成公钥对的 ssh-keygen 命令。
SSHD服务安装
方法一:利用挂载系统镜像软件包 openssh 软件包提供了服务端后台程序与客户端工具,用来加密远程控制和文件传输过程的数据,并由此来代替原来类似服务 telnet、ftp。 需要安装 openssh 三个安装包: openssh-8.0p1-3.el8.x86_64.rpm 包含openssh服务端和客户端需要的核心文件 openssh-clients-8.0p1-3.el8.x86_64.rpm openssh 客户端软件包 openssh-server-8.0p1-3.el8.x86_64.rpm openssh 服务端软件包
方法二:yum安装 yum install openssh openssh-clients openssh-server -y
openssh的配置文件 /etc/ssh/ssh_config 与客户端相关的配置文件 /etc/sshd/sshd_config 与服务端相关的配置文件 注:sshd在配置文件中,参数前面#号表示是默认值,当然也表示注释。
ssh启动与开机自启 如果不是显示enabled,则执行systemctl enable sshd.service命令
[root@web ~]# systemctl list-unit-files|grep sshd.service
sshd.service enabled
[root@web ~]# systemctl status sshd.service
修改sshd默认监听端口 大家都知道sshd预设22端口,容易被黑客利用进行扫描22端口进行暴力破解服务器的账户密码。最安全的做法是修改成非22端口。 [root@web ~]# grep Port /etc/ssh/sshd_config Port 22999 注:比如我的sshd改成监听22999端口,也可以使用多个端口。
Protocol 使用最新的SSH 2协议版本
[root@web ~]# grep Protocol /etc/ssh/ssh_config
# Protocol 2
SyslogFacility AUTHPRIV 当客户端使用ssh登录系统,ssh会记录日志,这个日志类型为AUTHPRIV,ssh服务日志存放:/var/log/secure
[root@web ~]# grep SyslogFacility /etc/ssh/sshd_config
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
LoginGraceTime 当客户端内规定时间内没有成功登录就强迫断线,若无单位则默认为秒
[root@web ~]# grep LoginGraceTime /etc/ssh/sshd_config
#LoginGraceTime 2m
PermitRootLogin no 是否允许root直接登录系统,默认是允许的,真实的生产环境服务器是不允许root账户直接登录,仅允许普通用户登录,需要用到root再从切换到root用户,或者给普通用户提权。
[root@web ~]# grep PermitRootLogin /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication yes
是否需要密码验证,默认是yes,根据不同安全级别要求,有的通过秘钥验证登录,有时候设置不需要密码登录。
PermitEmptyPasswords no 默认no,不允许空密码登录。
[root@web ~]# grep PermitEmptyPasswords /etc/ssh/sshd_config
#PermitEmptyPasswords no
防止暴力破解方法有两种
配置安全的sshd服务(方法一)
1) 设置复杂密码 2) 修改默认端口 3) 不予许root直接登录到系统 4) 不予许密码登录,设置秘钥认证登录系统
通过秘钥认证实现sshd认证
实例环境
服务端ip:192.168.136.131
客户端ip:192.168.136.132
服务端操作
[root@localhost ~]# 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:u8KmvbOAJXxGIUjU1rPbSctsgEJJKcoD/g5E60qqdtg root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|+== o |
|+= + + |
|O o o o |
|.O o o . |
|o * + B S |
| + B . B . |
|+ * ... . |
|oo E o= . |
|+ . .o+=. |
+----[SHA256]-----+
[root@localhost ~]# ls ~/.ssh # id_rsa是私钥,id_rsa.pub是公钥
id_rsa id_rsa.pub known_hosts
[root@localhost ~]# ssh-copy-id -i 192.168.136.131 # 把公钥复制给服务端
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.136.131 (192.168.136.131)' can't be established.
ECDSA key fingerprint is SHA256:RrtsYZi3En9ZT5Xw6PJfu0MyJYhjnSQgWn3tvJj3q7k.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.136.131's password: # 这里输入的是服务端主机的密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.136.131'"
and check to make sure that only the key(s) you wanted were added.
[root@localhost ~]#
登录服务端验证
[root@localhost ~]# cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSZShpC4YV0aI4gEUabkNwFPAX+BAQmNqUDNMx7DyAi0yw2IDwSZ+InaUqAnY1KYTQxfUaTfj2om9zXQBthUwpKhmofn0rsP0SSKMm/wZq98g9NhCBkRPAwDYRSLEseHIdvXKcQFLP/V209bIMAdFnf9nk5W6jtmh4uLUrl5gCXSqtNwh+Pn0iQTAT+bvbl+qvyyX/PTjczS6Ex7CUp/B6F/O5rLm4qCEae8cDEMzUhSa8jj2LcckyVkOXtaoBFoejFoISPqDFcRNRk3O4+xvqkjeUQ63aI10OU3NeVP/dqGiVlyGChj7cSuSBMAJYUdbUl0SQMHYBNNAyTCLqQJhCw0zyFSQF/GrYMzD74m6gdChlpUGg+F1dHivQBX1lDGyHRziTOMx0owFRyFMqwDAtXMePPpfW7tBNnMQT/BA14Y2Fezzzh44/mvdycNVcxFBr58fzy+c0S97pQZTWndAOfCenCjRsbcHzg+UYOc2qkjJ/D+FncN/eUYXYz0YSoEs= root@localhost.localdomain
登录客户端主机192.168.136.132,验证是否可以正常连接登录服务端192.168.136.131
[root@localhost ~]# ssh root@192.168.136.131
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Mon Jun 1 09:34:28 2020 from 192.168.136.1
[root@localhost ~]# hostname -I #正常登录,不需要密码验证
192.168.136.131 192.168.122.1
通过开源的防护软件来防护安全(方法二)
优点:使用简单、灵活、功能强大
实战背景:
最近公司网站一直被别人暴力破解sshd服务密码。虽然没有成功,但会导致系统负载很高,原因是在暴力破解的时候,系统会不断认证用户,从而增加了系统资源额外开销,导致访问公司网站速度很慢。然后fail2ban程序可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员,很实用、很强大!
简单来说其功能就是防止暴力破解。工作的原理是通过分析一定时间内相关服务日志,将满足动作的相关ip利用iptables/firewalld加入到drop列表一定时间。
官方地址:http://www.fail2ban.org
安装
[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum --enablerepo=epel install -y fail2ban
相关主要文件说明
[root@localhost ~]# ls /etc/fail2ban/
action.d fail2ban.conf fail2ban.d filter.d jail.conf jail.d paths-common.conf paths-fedora.conf
/etc/fail2ban/action.d #动作文件夹,内含默认文件。firewall以及mail等动作配置 /etc/fail2ban/fail2ban.conf #定义了fail2ban日志级别,日志位置及sock文件位置 /etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置。 /etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值。
应用实例
设置条件:ssh远程登录5分钟3次密码验证失败,禁止用户ip访问主机1小时,1小时该限制自动解除,用户可重新登录。
因为动作文件(action.d/firewallcmd-ipset)以及日志条件匹配(filter.d/sshd.conf)安装后是默认存在的,基本不用做任何修改,所有主要需要配置的就只有jail.conf文件。启用sshd服务的日志分析,指定动作阀值即可。
vim /etc/fail2ban/jail.conf
[DEFAULT]
ignoreip = 127.0.0.1/8 #忽略的ip列表,不受设置限制
bantime = 86400 #屏蔽时间,单位秒
findtime = 600 #在这个时间段内超过规定次数会被ban掉
maxretry = 3 #最大尝试次数
banaction = firewallcmd-ipset #禁止的动作,iptables-multiport
backend = auto #日志检测机制(gamin、polling、auto三种)
[sshd]
enabled = true
filter = sshd
port = 22
logpath = /var/log/secure
action = firewallcmd-ipset[name=SSH, port=ssh, protocol=tcp] #动作的相关参数,对应action.d/firewallcmd-ipset文件
bantime = 3600
findtime = 300
maxretry = 3
启动
systemctl restart fail2ban
systemctl restart firewalld
测试
故意输错三次密码
[root@server01 ~]# ssh root@192.168.136.131
root@192.168.136.131's password:
Permission denied, please try again.
root@192.168.136.131's password:
Permission denied, please try again.
root@192.168.136.131's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@server01 ~]# ssh root@192.168.136.131
ssh: connect to host 192.168.136.131 port 22: Connection refused