sshd服务搭建与管理

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协议版本,1版本有漏洞

[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 15

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

 

 

posted @ 2020-07-29 10:39  z寒江雪  阅读(1387)  评论(0编辑  收藏  举报