1 sshd 服务安装
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
2 sshd 服务配置和管理
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
3 sshd 优化安全参数
修改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
4 sshd 服务防止暴力破解
防止暴力破解方法有两种
配置安全的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