预期目标:

通过配置或者服务实现防止sshd服务被暴力破解

实现方法:

1.更改默认端口
2.禁止root登录
3.禁止密码登录
4.采用fail2ban服务
5.采用denyhosts服务
6.采用双因子登录认证
7.采取强密码

配置步骤:

更改默认端口

vi /etc/ssh/sshd_config

PORT 22 #先保留22端口,成功后注释掉默认端口
PORT 6666 #添加自定义端口

systemctl restart sshd

禁止root登录

vi /etc/ssh/sshd_config

#PermitRootLogin yes 注释原有配置在下面新增
PermitRootLogin no

systemctl restart sshd

禁止密码登录

vi /etc/ssh/sshd_config

PasswordAuthentication no #禁止密码登录
PubkeyAuthentication yes #使用密钥登陆
RSAAuthentication yes
#公钥存放路径
AuthorizedKeysFile .ssh/authorized_keys

TIP:禁止密码登录前一定要先将公钥放入配置定义的路径,建议先前打开的会话窗口不要关闭,以防配置错误远程登陆失败

systemctl restart sshd

采用fail2ban服务

fail2ban部署以及使用请查看以下链接:
https://www.wakamizu.club/fail2ban/

采用denyhosts服务

下载服务包

cd /usr/local/src
git clone https://github.com/denyhosts/denyhosts.git

安装部署

cd denyhosts
python3 setup.py install

配置服务

vim /etc/denyhosts.conf

#日志文件
SECURE_LOG = /var/log/auth.log 
#被禁止IP
HOSTS_DENY = /etc/hosts.deny
#恢复IP访问时间(w表示周,d表示天,h表示小时,m表示分钟)
PURGE_DENY = 4h 
#禁止服务名称
BLOCK_SERVICE  = sshd 
#不存在的用户尝试次数,n次之后即被锁定
DENY_THRESHOLD_INVALID = 5
#存在的普通用户尝试次数,n次之后即被锁定
DENY_THRESHOLD_VALID = 10
#root用户尝试次数,n次之后即被锁定
DENY_THRESHOLD_ROOT = 1       
#默认配置
DENY_THRESHOLD_RESTRICTED = 1    
WORK_DIR = /var/lib/denyhosts      
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
# 域名解析
HOSTNAME_LOOKUP=YES     
LOCK_FILE = /var/lock/subsys/denyhosts
#邮箱通知配置
ADMIN_EMAIL = root
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_FROM = DenyHosts <[email protected]>
SMTP_SUBJECT = DenyHosts Report from $[HOSTNAME]
# 存在的普通用户登录次数记录重置周期
AGE_RESET_VALID=5d           
#root用户登录次数记录重置周期
AGE_RESET_ROOT=25d        
#/etc/hosts.deny文件清除数据时间
AGE_RESET_RESTRICTED=25d     
AGE_RESET_INVALID=10d
DAEMON_LOG = /var/log/denyhosts
DAEMON_SLEEP = 30s
DAEMON_PURGE = 1h

启动

ln -s /usr/local/srcdenyhosts/daemon-control-diest /etc.init.d/denyhosts
chkconfig --add denyhosts
chkconfig denyhosts on
systemctl start denyhosts

黑白名单

/etc/hosts.allow 白名单
cat /etc/hosts.deny 黑名单

采用双因子登录认证

双因子认证部署以及使用请查看以下链接:
https://www.wakamizu.club/ssh-2fa/

采取强密码

强密码应该具有如下特征:
强密码长度至少有 8 个字符,
不包含全部或部分用户帐户名,
至少包含以下四类字符中的三类:大写字母、小写字母、数字,以及键盘上的符号(如 !、@、#)。
字典中查不到。
不是命令名。
不是人名。
不是用户名。
不是计算机名。
没有规则的大小写字母、数字、符号的组合,部分登录系统支持全角符号以及中文、其他语言等特殊符号的输入。
不是容易被猜测到的密码(例如:[email protected] qazwsxedc iloveyou 这样的)。
定期更改。
与以前的密码明显不同。